boardgame-core/src/samples/slay-the-spire-like/system/combat/effects.ts

50 lines
1.9 KiB
TypeScript

import {CombatEntity, EffectTable} from "./types";
import {EffectData} from "@/samples/slay-the-spire-like/system/types";
import {PlayerEntity} from "@/samples/slay-the-spire-like/system/combat/types";
export function addEffect(effects: EffectTable, effect: EffectData, stacks: number){
let current = effects[effect.id];
if(!current) current = {data: effect, stacks};
else current.stacks += stacks;
if(current.stacks === 0 && effects[effect.id])
delete effects[effect.id];
else if(current.stacks !== 0 && !effects[effect.id])
effects[effect.id] = current;
}
export function addEntityEffect(entity: CombatEntity, effect: EffectData, stacks: number){
addEffect(entity.effects, effect, stacks);
}
export function addItemEffect(entity: PlayerEntity, itemKey: string, effect: EffectData, stacks: number){
entity.itemEffects[itemKey] = entity.itemEffects[itemKey] || {};
addEffect(entity.itemEffects[itemKey], effect, stacks);
}
export function onEntityEffectUpkeep(entity: CombatEntity){
for(const effect of Object.values(entity.effects)){
const lifecycle = effect.data.lifecycle;
if(lifecycle === 'temporary')
addEntityEffect(entity, effect.data, -effect.stacks);
else if(lifecycle === 'lingering')
addEntityEffect(entity, effect.data, effect.stacks >= 0 ? -1 : 1);
}
}
export function onPlayerItemEffectUpkeep(entity: PlayerEntity){
for(const [itemKey, itemEffects] of Object.entries(entity.itemEffects)){
for(const effect of Object.values(itemEffects)){
const lifecycle = effect.data.lifecycle;
if(lifecycle === 'itemTemporary')
addItemEffect(entity, itemKey, effect.data, -effect.stacks);
}
}
}
// TODO
export function onDraw(entity: PlayerEntity, cardId:string ){}
// TODO
export function onDiscard(entity: PlayerEntity, cardId: string){}