trainsim/state/machine.ts
2025-02-05 04:00:40 -07:00

54 lines
1012 B
TypeScript

export class StateMachine {
private _states: Map<string, State> = new Map();
private currentState: State;
constructor(states: State[]) {
this.currentState = states[0];
}
update(dt: number) {
this.currentState.update(dt);
}
get current() {
return this.currentState;
}
get states() {
return this._states;
}
addState(state: State) {
this.states.set(state.name, state);
}
transitionTo(state: State) {
if (this.current.canTransitionTo(state)) {
this.current.stop();
this.currentState = state;
this.current.start();
}
}
}
export abstract class State<T> {
private stateMachine: StateMachine;
protected abstract validTransitions: Set<T>;
abstract readonly name: T;
constructor(
stateMachine: StateMachine,
) {
this.stateMachine = stateMachine;
}
abstract update(dt: number): void;
abstract start(): void;
abstract stop(): void;
canTransitionTo(state: T) {
return this.validTransitions.has(state);
}
}