From 6ef40a5739f1723ec26cc32dfc48fe764f776dca Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Wed, 16 Sep 2026 19:57:45 -0400 Subject: fix: durable payouts survive journal failure, cap bank withdrawals, hash passwords off the owner loop. --- internal/game/hacking/wumpus.go | 7 +++++-- internal/game/hacking/wumpus_regression_test.go | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 internal/game/hacking/wumpus_regression_test.go (limited to 'internal/game/hacking') diff --git a/internal/game/hacking/wumpus.go b/internal/game/hacking/wumpus.go index 1f0a434..1d4b371 100644 --- a/internal/game/hacking/wumpus.go +++ b/internal/game/hacking/wumpus.go @@ -200,9 +200,12 @@ func (w *WumpusGame) checkRoom() (string, bool, bool) { if cur == i { sb.WriteString("ICE detected! You're relocated to a random node...\n") w.player = rand.Intn(20) - chained, _, _ := w.checkRoom() + // The chained check can terminate the game (landing on the + // rogue AI or a data trap): propagate its result instead of + // discarding the terminal state. + chained, done, won := w.checkRoom() sb.WriteString(chained) - return sb.String(), false, false + return sb.String(), done, won } } sb.WriteString(w.roomDesc()) diff --git a/internal/game/hacking/wumpus_regression_test.go b/internal/game/hacking/wumpus_regression_test.go new file mode 100644 index 0000000..b27a7f9 --- /dev/null +++ b/internal/game/hacking/wumpus_regression_test.go @@ -0,0 +1,20 @@ +package hacking + +import "testing" + +// A teleport into a terminal hazard (rogue AI or data trap) must end the +// hacking session: the chained room check's terminal result is propagated +// instead of discarded. +func TestICETeleportTerminalResultIsPropagated(t *testing.T) { + for i := 0; i < 2000; i++ { + w := &WumpusGame{player: 0, wumpus: 19, pits: [2]int{2, 3}, ice: [2]int{1, 4}, probes: 5} + text, done, won := w.HandleInput("move 2") + if w.gameOver { + if !done || won != w.won { + t.Fatalf("terminal state not propagated: done=%v won=%v internal gameOver=%v; output=%s", done, won, w.gameOver, text) + } + return + } + } + t.Fatal("probe never encountered a terminal teleport") +} -- cgit v1.2.3