All files / games/src/engine loop.ts

100% Statements 54/54
100% Branches 11/11
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 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 4x 4x 68x 68x 68x 68x 68x 17x 17x 17x 68x 68x 68x 68x 68x 14x 14x 14x 17x 17x 6x 6x 11x 11x 13x 8x 8x 17x 14x 14x 14x 68x 68x 68x 11x 11x 68x  
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();
    }
}