All files / games/src/engine loop.ts

100% Statements 54/54
100% Branches 10/10
100% Functions 6/6
100% Lines 54/54

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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 551x 1x 1x 1x 1x 1x 1x 1x 1x 31x 31x 31x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 5x 1x 1x 1x 1x 1x 3x 3x 3x 6x 6x 2x 6x 4x 4x 6x 1x 1x 6x 3x 3x 3x 1x 1x 1x 4x 4x 1x  
import { Scheduler } from "./scheduler";
import { Actor } from "./entities";
 
export class Loop {
    private readonly scheduler: Scheduler;
 
    private locked: boolean;
 
    public constructor(scheduler: Scheduler) {
        this.scheduler = scheduler;
        this.locked = true;
    }
 
    /**
     * Start the main loop. When this call returns, the loop is locked.
     */
    public start(): Loop {
        return this.unlock();
    }
 
    /**
     * Interrupt the engine by an asynchronous action
     */
    public lock(): Loop {
        this.locked = true;
        return this;
    }
 
    /**
     * Resume execution (paused by a previous lock)
     */
    public unlock(): Loop {
        this.locked = false;
        // eslint-disable-next-line no-loops/no-loops
        while (!this.locked) {
            const actor = this.scheduler.next();
            if (!actor) {
                break;
            } /* no more actors */
            this.act(actor);
 
            if (actor.getLockLoop()) {
                break;
            }
        }
 
        return this.lock();
    }
 
    // eslint-disable-next-line class-methods-use-this
    private act(actor: Actor): void {
        actor.act();
    }
}