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 { override name: States = States.EDIT_TRACK; override validTransitions: Set = new Set([ States.RUNNING, States.PAUSED, ]); private heldEvents: Map void) | undefined> = new Map(); override update(dt: number): void { const inputManager = getContextItem("inputManager"); const track = getContextItem("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"); this.heldEvents.set("e", inputManager.offKey("e")); this.heldEvents.set("Escape", inputManager.offKey("Escape")); inputManager.onKey("e", () => { const state = getContextItem>("state"); state.transitionTo(States.RUNNING); }); const track = getContextItem("track"); setContextItem("trackCopy", track.copy()); inputManager.onKey("Escape", () => { const trackCopy = getContextItem("trackCopy"); setContextItem("track", trackCopy); const state = getContextItem>("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").onKey(key, cb); } this.heldEvents.delete(key); } } } }