All files / packages/games/engine/src/systems damage.ts

100% Statements 12/12
100% Branches 4/4
100% Functions 2/2
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3116x       16x   16x         4x   4x 4x       3x 3x   3x 3x   3x 2x          
import { isAttackComponent, isDamageableComponent, ComponentName } from "../components";
 
import { Actor, Entity } from "../entities";
import { World } from "../world";
import { System } from "./system";
 
export class DamageSystem extends System {
    private readonly attacker: Actor;
    private readonly target: Entity;
 
    public constructor(attacker: Actor, target: Entity) {
        super(new Map(), [ComponentName.DAMAGEABLE]);
 
        this.attacker = attacker;
        this.target = target;
    }
 
    public run(world: World): void {
        const attack = this.attacker.getComponent(ComponentName.ATTACK);
        const component = this.target.getComponent(ComponentName.DAMAGEABLE);
 
        if (isAttackComponent(attack) && isDamageableComponent(component)) {
            const remainingHitPoints = component.takeDamage(attack.getValue());
 
            if (remainingHitPoints <= 0) {
                world.removeEntity(this.target);
            }
        }
    }
}