All files / games/src/engine/systems system.ts

100% Statements 38/38
100% Branches 8/8
100% Functions 4/4
100% Lines 38/38

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 33 34 35 36 37 38 391x 1x 1x 1x 1x 1x 1x 1x 1x 34x 34x 1x 1x 4x 4x 1x 1x 1x 1x 1x 55x 55x 55x 43x 43x 70x 37x 37x 43x 43x 43x 26x 26x 55x 55x 55x 55x 1x  
import { SystemInterface, WorldInterface } from "@jga/patterns";
 
import { ComponentName } from "../components";
import { Entity } from "../entities";
 
export abstract class System implements SystemInterface {
    protected entities: Map<string, Entity> = new Map<string, Entity>();
 
    public constructor(entities: Map<string, Entity>, filters: ComponentName[]) {
        this.entities = this.filterEntities(entities, filters);
    }
 
    public getEntities(): Map<string, Entity> {
        return this.entities;
    }
 
    public abstract run(world?: WorldInterface): void;
 
    // eslint-disable-next-line class-methods-use-this
    protected filterEntities(entities: Map<string, Entity>, filters: ComponentName[]): Map<string, Entity> {
        const filtered: Map<string, Entity> = new Map<string, Entity>();
 
        entities.forEach((entity, key): void => {
            let found = 0;
            filters.forEach((filter): void => {
                if (entity != null && entity.hasComponent(filter)) {
                    found += 1;
                }
            });
 
            if (found === filters.length) {
                filtered.set(key, entity);
            }
        });
 
        return filtered;
    }
}