From 700ff463d0e6263212906bffcce098f7df91655d Mon Sep 17 00:00:00 2001 From: samtcifihi <43021399+samtcifihi@users.noreply.github.com> Date: Sun, 13 Sep 2026 19:48:13 -0400 Subject: [PATCH] Preserve Mirador challenge placements after invalid clicks --- src/games/mirador.ts | 2 +- test/games/mirador.test.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/games/mirador.ts b/src/games/mirador.ts index bbf06870..0b96e2f3 100644 --- a/src/games/mirador.ts +++ b/src/games/mirador.ts @@ -200,7 +200,7 @@ export class MiradorGame extends GameBase { const newmove = move ? `${move}-${cell}` : cell; const result = this.validateMove(newmove) as IClickResult; if (!result.valid) { - result.move = ""; + result.move = move; } else { result.move = newmove; } diff --git a/test/games/mirador.test.ts b/test/games/mirador.test.ts index 2de17c12..43faf302 100644 --- a/test/games/mirador.test.ts +++ b/test/games/mirador.test.ts @@ -74,6 +74,38 @@ describe("Mirador", () => { expect(game.validateMove("a38-c37").valid).to.equal(false); }); + it("preserves earlier challenge placements after rejecting orthogonal adjacency", () => { + for (const variants of [[], ["size-40"]]) { + const game = new MiradorGame(undefined, variants); + game.move("declare"); + + const first = game.handleClick("", 1, 1); + expect(first.valid).to.equal(true); + + const illegal = game.handleClick(first.move, 2, 3); + expect(illegal.valid).to.equal(false); + expect(illegal.move).to.equal(first.move); + } + }); + + it("preserves earlier challenge placements after rejecting diagonal contact with an opponent", () => { + for (const variants of [[], ["size-40"]]) { + const game = new MiradorGame(undefined, variants); + game.board[0][0] = 1; + game.board[0][1] = 1; + game.board[1][0] = 1; + game.board[1][1] = 1; + game.move("declare"); + + const first = game.handleClick("", 5, 5); + expect(first.valid).to.equal(true); + + const illegal = game.handleClick(first.move, 3, 3); + expect(illegal.valid).to.equal(false); + expect(illegal.move).to.equal(first.move); + } + }); + it("checks connections against the enlarged board edge", () => { const game = new MiradorGame(undefined, ["size-40"]); game.board[0][0] = 1;