diff --git a/bundle.js b/bundle.js index af6a32d..d9008bc 100644 --- a/bundle.js +++ b/bundle.js @@ -2043,8 +2043,7 @@ this.ghostSegment = void 0; this.closestEnd = void 0; } else if (this.selectedSegment) { - track2.registerSegment(this.selectedSegment); - this.selectedSegment = new StraightTrack(); + track2.registerSegment(this.selectedSegment.cleanCopy()); } else { this.selectedSegment = void 0; } @@ -2056,13 +2055,32 @@ this.ghostRotated = false; this.ghostSegment = void 0; }); - this.currentSegment = track.lastSegment; + inputManager2.onKey("z", () => { + if (inputManager2.getKeyState("Control")) { + const segment = track.lastSegment; + if (!segment) return; + this.redoBuffer.push(segment); + if (this.redoBuffer.length > 100) { + this.redoBuffer.shift(); + } + track.unregisterSegment(segment); + } + }); + inputManager2.onKey("y", () => { + if (inputManager2.getKeyState("Control")) { + const segment = this.redoBuffer.pop(); + if (!segment) return; + track.registerSegment(segment); + } + }); } + redoBuffer = []; stop() { const inputManager2 = getContextItem("inputManager"); inputManager2.offKey("e"); inputManager2.offKey("w"); inputManager2.offKey("Escape"); + inputManager2.offMouse("left"); if (this.heldEvents.size > 0) { for (const [key, cb] of this.heldEvents) { if (cb) { diff --git a/state/states/EditTrackState.ts b/state/states/EditTrackState.ts index c70ee89..f80d166 100644 --- a/state/states/EditTrackState.ts +++ b/state/states/EditTrackState.ts @@ -324,8 +324,8 @@ export class EditTrackState extends State { this.ghostSegment = undefined; this.closestEnd = undefined; } else if (this.selectedSegment) { - track.registerSegment(this.selectedSegment); - this.selectedSegment = new StraightTrack(); + track.registerSegment(this.selectedSegment.cleanCopy()); + // this.selectedSegment = new StraightTrack(); } else { this.selectedSegment = undefined; } @@ -355,16 +355,36 @@ export class EditTrackState extends State { this.ghostSegment = undefined; }); - this.currentSegment = track.lastSegment; + // this.currentSegment = track.lastSegment; + inputManager.onKey("z", () => { + if (inputManager.getKeyState("Control")) { + const segment = track.lastSegment; + if (!segment) return; + this.redoBuffer.push(segment); + if (this.redoBuffer.length > 100) { + this.redoBuffer.shift(); + } + track.unregisterSegment(segment); + } + }); + inputManager.onKey("y", () => { + if (inputManager.getKeyState("Control")) { + const segment = this.redoBuffer.pop(); + if (!segment) return; + track.registerSegment(segment); + } + }); // TODO // Cache trains and save } + redoBuffer: TrackSegment[] = []; override stop(): void { const inputManager = getContextItem("inputManager"); inputManager.offKey("e"); inputManager.offKey("w"); inputManager.offKey("Escape"); + inputManager.offMouse("left"); if (this.heldEvents.size > 0) { for (const [key, cb] of this.heldEvents) { if (cb) {