just so much groundwork

This commit is contained in:
2025-02-05 04:00:40 -07:00
parent b3772052f5
commit 952b5dd57f
22 changed files with 1003 additions and 2081 deletions

53
state/machine.ts Normal file
View File

@@ -0,0 +1,53 @@
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);
}
}

139
state/states.ts Normal file
View File

@@ -0,0 +1,139 @@
import { State } from "./machine.ts";
enum States {
LOAD,
RUNNING,
PAUSED,
EDIT_TRACK,
EDIT_TRAIN,
}
export class LoadState extends State<States> {
override name: States = States.LOAD;
override validTransitions: Set<States> = new Set([
States.RUNNING,
]);
override update(dt: number): void {
throw new Error("Method not implemented.");
// TODO
// Do nothing
}
override start(): void {
throw new Error("Method not implemented.");
// TODO
// load track into context
// Load trains into context
// Load resources into context
// Switch to running state
}
override stop(): void {
throw new Error("Method not implemented.");
// TODO
// Do nothing
}
}
export class RunningState extends State<States> {
override name: States = States.RUNNING;
override validTransitions: Set<States> = new Set([
States.PAUSED,
States.EDIT_TRACK,
]);
override update(dt: number): void {
throw new Error("Method not implemented.");
// TODO
// Update trains
// Update world
// Handle input
// Draw (maybe via a layer system that syncs with doodler)
// Monitor world events
}
override start(): void {
throw new Error("Method not implemented.");
// TODO
// Do nothing
}
override stop(): void {
throw new Error("Method not implemented.");
// TODO
// Do nothing
}
}
export class PausedState extends State<States> {
override name: States = States.PAUSED;
override validTransitions: Set<States> = new Set([
States.LOAD,
States.RUNNING,
States.EDIT_TRACK,
States.EDIT_TRAIN,
]);
override update(dt: number): void {
throw new Error("Method not implemented.");
// TODO
// Handle input
// Draw ui
}
override start(): void {
throw new Error("Method not implemented.");
// TODO
// Save tracks to cache
// Save trains to cache
// Save resources to cache
}
override stop(): void {
throw new Error("Method not implemented.");
// TODO
// Do nothing
}
}
export class EditTrackState extends State<States> {
override name: States = States.EDIT_TRACK;
override validTransitions: Set<States> = new Set([
States.RUNNING,
States.PAUSED,
]);
override update(dt: number): void {
throw new Error("Method not implemented.");
// TODO
// Handle input
// Draw ui
// Draw track
// Draw track points
// Draw track tangents
}
override start(): void {
throw new Error("Method not implemented.");
// TODO
// Cache trains and save
// Stash track in context
}
override stop(): void {
throw new Error("Method not implemented.");
}
}
export class EditTrainState extends State<States> {
override name: States = States.EDIT_TRAIN;
override validTransitions: Set<States> = new Set([
States.RUNNING,
States.PAUSED,
]);
override update(dt: number): void {
throw new Error("Method not implemented.");
}
override start(): void {
throw new Error("Method not implemented.");
// TODO
// Cache trains
// Stash train in context
// Draw track
// Draw train (filtered by train ID)
}
override stop(): void {
throw new Error("Method not implemented.");
}
}