feat: effect and triggers

This commit is contained in:
2026-04-17 12:58:12 +08:00
parent aa36f3ea67
commit f775d51a58
5 changed files with 47 additions and 4 deletions
@@ -79,3 +79,7 @@ export function* getAliveEnemies(state: CombatState) {
}
}
}
export function getCombatEntity(state: CombatState, entityKey: string){
return entityKey === 'player' ? state.player : state.enemies.find(e => e.id === entityKey);
}
@@ -24,7 +24,7 @@ type TriggerTypes = {
onDraw: {count: number},
onEffectApplied: { effect: EffectData, entityKey: "player" | string, stacks: number, cardId?: string },
onHpChange: { entityKey: "player" | string, amount: number},
onDamage: { entityKey: "player" | string, amount: number, dealt?: number, prevented?: number},
onDamage: { entityKey: "player" | string, amount: number, prevented?: number},
onEnemyIntent: { enemyId: string },
onIntentUpdate: { enemyId: string },
}
@@ -126,12 +126,11 @@ function createTriggers(){
onDamage: createTrigger("onDamage", async ctx => {
const entity = ctx.entityKey === "player" ? ctx.game.value.player : ctx.game.value.enemies.find(e => e.id === ctx.entityKey);
if(!entity || !entity.isAlive) return;
const dealt = ctx.dealt = Math.min(Math.max(0,entity.hp), ctx.amount);
ctx.prevented = ctx.amount - ctx.dealt;
const dealt = Math.min(Math.max(0,entity.hp), ctx.amount - (ctx.prevented || 0));
await ctx.game.produceAsync(draft => {
onEntityPostureDamage(entity, dealt);
});
await triggers.onHpChange.execute(ctx.game,{entityKey: ctx.entityKey, amount: -ctx.amount});
await triggers.onHpChange.execute(ctx.game,{entityKey: ctx.entityKey, amount: -dealt});
}),
onEnemyIntent: createTrigger("onEnemyIntent", async ctx => {
const enemy = ctx.game.value.enemies.find(e => e.id === ctx.enemyId);