UNPKG

fsmgasm-js

Version:

Port of FSMgasm by Minikloon for JS

188 lines (181 loc) 3.51 kB
// src/states/State.ts var State = class { started = false; ended = false; frozen = false; #updating = false; constructor() { } start() { if (this.started || this.ended) return; this.started = true; try { this.onStart(); } catch (err) { console.warn(err); } } onStart() { } update() { if (!this.started || this.ended || this.#updating) return; this.#updating = true; if (this.isReadyToEnd() && !this.frozen) { this.end(); return; } try { this.onUpdate(); } catch (err) { console.warn(err); } this.#updating = false; } onUpdate() { } end() { if (!this.started || this.ended) return; this.ended = true; try { this.onEnd(); } catch (err) { console.warn(err); } } onEnd() { } isReadyToEnd() { return this.ended; } }; // src/states/StateConditional.ts var StateConditional = class extends State { constructor(condition) { super(); this.isReadyToEnd = condition; } }; // src/states/StateHolder.ts var StateHolder = class extends State { states = []; constructor() { super(); } add(state) { this.states.push(state); } addAll(states) { this.states = this.states.concat(states); } }; // src/states/StateGroup.ts var StateGroup = class extends StateHolder { constructor() { super(); } onUpdate() { for (const state of this.states) { if (!state.started) state.start(); if (state.isReadyToEnd() && !state.ended && !this.frozen) { state.end(); continue; } try { state.update(); } catch (err) { console.warn(err); } } } isReadyToEnd() { for (const state of this.states) { if (!state.ended) return false; } return true; } }; // src/states/StateSeries.ts var StateSeries = class extends StateHolder { #index = 0; constructor() { super(); } onUpdate() { if (this.isReadyToEnd()) return; const currentState = this.currentState(); if (!currentState.started) currentState.start(); if (currentState.isReadyToEnd() && !this.frozen) { currentState.end(); this.#index++; return; } try { currentState.update(); } catch (err) { console.warn(err); } } currentState() { return this.states[this.#index]; } isReadyToEnd() { return this.#index == this.states.length; } }; // src/states/StateProxy.ts var StateProxy = class extends StateSeries { createStates; constructor(createStates) { super(); this.createStates = createStates; } onStart() { this.addAll(this.createStates()); } }; // src/states/StateSwitch.ts var StateSwitch = class extends State { currentState; constructor() { super(); } changeState(state) { if (this.currentState) { this.currentState.end(); } state.start(); this.currentState = state; } onUpdate() { if (!this.currentState || this.currentState.ended || this.currentState.frozen || !this.currentState.started) return; if (this.currentState.isReadyToEnd() && !this.currentState.ended) { this.currentState.end(); return; } try { this.currentState.update(); } catch (err) { console.warn(err); } } isReadyToEnd() { return false; } }; export { State, StateConditional, StateGroup, StateHolder, StateProxy, StateSeries, StateSwitch };