All files / projects-dev/libs/games/src/engine/systems damage.ts

100% Statements 32/32
100% Branches 4/4
100% Functions 3/3
100% Lines 32/32

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 31 32 331x 1x 1x 1x 1x 1x 1x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 7x 7x 7x 7x 7x 7x 7x 6x 6x 7x 7x 8x  
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) {
        // eslint-disable-next-line compat/compat
        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);
            }
        }
    }
}