71 lines
2.2 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
}
|
|
}
|