41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
@ecs.registerSystem()
|
|
export class CombatSystem extends ecs.System {
|
|
filter(): ecs.IMatcher {
|
|
return ecs.allOf(Combat, HeroModel);
|
|
}
|
|
|
|
update(entities: ecs.Entity[]) {
|
|
entities.forEach(attacker => {
|
|
if (attacker.has(HeroModel)) {
|
|
this.processHeroAttack(attacker);
|
|
}
|
|
});
|
|
}
|
|
|
|
private processHeroAttack(attacker: ecs.Entity) {
|
|
const combat = attacker.get(Combat);
|
|
const model = attacker.get(HeroModel);
|
|
|
|
if (combat.target && model.hp > 0) {
|
|
// 攻击逻辑
|
|
combat.attackTimer += this.dt;
|
|
if (combat.attackTimer >= combat.attackInterval) {
|
|
this.executeAttack(attacker, combat.target);
|
|
combat.attackTimer = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
private executeAttack(attacker: ecs.Entity, target: ecs.Entity) {
|
|
// 伤害计算逻辑
|
|
const attack = attacker.get(HeroModel).attack;
|
|
const defense = target.get(HeroModel).defense;
|
|
const damage = Math.max(attack - defense, 1);
|
|
|
|
oops.message.dispatch('CombatEvent', {
|
|
attacker,
|
|
target,
|
|
damage
|
|
});
|
|
}
|
|
}
|