68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { Doodler, Vector } from "@bearmetal/doodler";
|
|
import { bootstrapInputs } from "../../inputs.ts";
|
|
import { getContextItem, setContextItem } from "../../lib/context.ts";
|
|
import { InputManager } from "../../lib/input.ts";
|
|
import { ResourceManager } from "../../lib/resources.ts";
|
|
import { StraightTrack } from "../../track/shapes.ts";
|
|
import { TrackSystem } from "../../track/system.ts";
|
|
import { State } from "../machine.ts";
|
|
import { States } from "./index.ts";
|
|
|
|
export class LoadState extends State<States> {
|
|
override name: States = States.LOAD;
|
|
override validTransitions: Set<States> = new Set([
|
|
States.RUNNING,
|
|
]);
|
|
|
|
layers: number[] = [];
|
|
|
|
override update(): void {
|
|
// noop
|
|
}
|
|
override start(): void {
|
|
const track = this.loadTrack() ?? new TrackSystem([new StraightTrack()]);
|
|
setContextItem("track", track);
|
|
|
|
const trains = this.loadTrains() ?? [];
|
|
setContextItem("trains", trains);
|
|
|
|
const resources = new ResourceManager();
|
|
setContextItem("resources", resources);
|
|
|
|
const inputManager = new InputManager();
|
|
setContextItem("inputManager", inputManager);
|
|
|
|
bootstrapInputs();
|
|
|
|
resources.set("engine-sprites", new Image());
|
|
resources.get<HTMLImageElement>("engine-sprites")!.src =
|
|
"/sprites/EngineSprites.png";
|
|
resources.ready().then(() => {
|
|
this.stateMachine.transitionTo(States.RUNNING);
|
|
});
|
|
|
|
const doodler = getContextItem<Doodler>("doodler");
|
|
this.layers.push(doodler.createLayer((_, __, dTime) => {
|
|
doodler.clearRect(new Vector(0, 0), doodler.width, doodler.height);
|
|
doodler.fillRect(new Vector(0, 0), doodler.width, doodler.height, {
|
|
color: "#302040",
|
|
});
|
|
}));
|
|
}
|
|
override stop(): void {
|
|
// noop
|
|
}
|
|
|
|
private loadTrack() {
|
|
const track = TrackSystem.deserialize(
|
|
JSON.parse(localStorage.getItem("track") || "[]"),
|
|
);
|
|
return track;
|
|
}
|
|
|
|
private loadTrains() {
|
|
const trains = JSON.parse(localStorage.getItem("trains") || "[]");
|
|
return trains;
|
|
}
|
|
}
|