trainsim/state/states/EditTrackState.ts

71 lines
2.2 KiB
TypeScript

import { Vector } from "@bearmetal/doodler";
import { getContextItem, setContextItem } from "../../lib/context.ts";
import { InputManager } from "../../lib/input.ts";
import { TrackSystem } from "../../track/system.ts";
import { State, StateMachine } from "../machine.ts";
import { States } from "./index.ts";
export class EditTrackState extends State<States> {
override name: States = States.EDIT_TRACK;
override validTransitions: Set<States> = new Set([
States.RUNNING,
States.PAUSED,
]);
private heldEvents: Map<string | number, (() => void) | undefined> =
new Map();
override update(dt: number): void {
const inputManager = getContextItem<InputManager>("inputManager");
const track = getContextItem<TrackSystem>("track");
const firstSegment = track.firstSegment;
if (firstSegment) {
const firstPoint = firstSegment.points[0].copy();
const { x, y } = inputManager.getMouseLocation();
firstSegment.points.forEach((p, i) => {
const relativePoint = Vector.sub(p, firstPoint);
p.set(x, y);
p.add(relativePoint);
});
}
track.draw(true);
// TODO
// Draw ui
// Draw track points
// Draw track tangents
}
override start(): void {
const inputManager = getContextItem<InputManager>("inputManager");
this.heldEvents.set("e", inputManager.offKey("e"));
this.heldEvents.set("Escape", inputManager.offKey("Escape"));
inputManager.onKey("e", () => {
const state = getContextItem<StateMachine<States>>("state");
state.transitionTo(States.RUNNING);
});
const track = getContextItem<TrackSystem>("track");
setContextItem("trackCopy", track.copy());
inputManager.onKey("Escape", () => {
const trackCopy = getContextItem<TrackSystem>("trackCopy");
setContextItem("track", trackCopy);
const state = getContextItem<StateMachine<States>>("state");
state.transitionTo(States.RUNNING);
});
// TODO
// Cache trains and save
// Stash track in context
}
override stop(): void {
if (this.heldEvents.size > 0) {
for (const [key, cb] of this.heldEvents) {
if (cb) {
getContextItem<InputManager>("inputManager").onKey(key, cb);
}
this.heldEvents.delete(key);
}
}
}
}