sneak f7670cf86a docs,save: correct a stale TODO claim and rename encodeSnapshot (closes #27)
Four cleanups recorded as advisories during the PR #26 review and
deliberately kept out of it. No behaviour change.

The 2026-08-09 sig-leave (closes #12) TODO entry still argued in the
present tense that declining to save on SIGINT/SIGQUIT was also the safe
choice, "because AutoSave gob-encodes live state that the main goroutine
is still mutating, after removing the old file". Both halves stopped
being true with #24: the encode runs on the game goroutine and saveFile
is CreateTemp/Sync/Chmod/Rename with no Remove. The paragraph is now in
the past tense and marked superseded, pointing at the fix/autosave-race
entry, and says the split stands on C and on semantics alone — which is
what the current savesOnSignal comment says. The false claim was in the
#12 entry, not the #24 one; the latter's account of the old
remove-then-write is correctly historical and is untouched, as is the
err113 mention in the 2026-07-06 entry.

encodeSnapshot becomes writeSnapshotFile: it encodes, fsyncs, chmods
0400 and closes, and the old name claimed only the first of those. Its
doc comment now names all four and why the fsync is there.

TestAutoSaveOnSignalWhileInShellEscape used t.Error for a precondition,
so a save that was never taken fell through into assertRestorable, which
can then only report a second, derived failure. t.Fatal, matching the
identical assertion in the blocked-on-input test.

serviceAutoSaveRequest's doc comment carried a 24-column stub line
("The result is still a") left by an earlier edit. gofmt does not rewrap
comments, so fmt-check was legitimately green and nothing would have
caught it; the paragraph is rewrapped to the block's width.

Next Step deliberately not rotated: out-of-band issue work.
2026-08-09 08:05:30 +00:00
2016-07-23 03:24:54 +01:00
2016-07-23 03:24:54 +01:00
2016-07-23 03:24:54 +01:00

Rogue: Exploring the Dungeons of Doom (Go port)

License

Rogue is the original dungeon-crawling adventure game that spawned an entire genre. This branch is a faithful Go port of Rogue 5.4.4: explore procedurally generated dungeons, fight monsters, collect treasure, and attempt to retrieve the Amulet of Yendor.

Original authors: Michael Toy, Ken Arnold, and Glenn Wichman (19801983, 1985, 1999).

The port is function-by-function faithful to the classic C sources — same dungeon generation (seed-compatible RNG), same combat math, same item tables, same messages. The C reference implementation lives on the master and modern-rogue branches; ARCHITECTURE.md documents both the original program structure and the design of this port.

Building and running

Requires Go 1.25 or later and a terminal at least 80x24.

go build ./cmd/rogue
./rogue
# Restore a saved game
./rogue ~/rogue.save

# View high scores
./rogue -s

# Test the death screen (demo mode)
./rogue -d

In-game commands

Press ? in game for the full list.

  • arrows or h/j/k/l/y/u/b/n — move (shift to run, ctrl to run until adjacent)
  • . rest, s search for hidden doors and traps
  • i inventory, , pick up, d drop
  • q quaff potion, r read scroll, e eat food
  • w wield weapon, W wear armor, P/R put on / remove ring
  • t throw, z zap a wand, f/F fight
  • >/< take the stairs
  • S save, Q quit

Environment

# Game options, as in the original
export ROGUEOPTS="name=YourName,terse,jump,fruit=mango"

# Wizard (debug) mode, with a reproducible dungeon
ROGUE_WIZARD=1 SEED=12345 ./rogue

The scoreboard is kept in ~/.rogue.scores. Save files are Go gob snapshots and, as in the original, are deleted when restored.

Code layout

game/        the game engine: one Go file per original C file,
             function-by-function (see ARCHITECTURE.md for the mapping)
term/        tcell-backed terminal, replacing curses
cmd/rogue/   the executable

The engine package is fully headless-testable: make test runs scripted command sequences, dungeon-generation golden checks, and an RNG compatibility test against the original C generator.

For development, the Makefile wraps the toolchain: make fmt (gofmt + prettier), make lint (golangci-lint), make test (the suite, under the race detector with coverage and a timeout), and make check (all three). Use the targets rather than invoking go test directly — they carry the flags the project relies on.

License

BSD-style; see LICENSE.TXT.

Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman. All rights reserved.

Description
No description provided
Readme 3.4 MiB
Languages
Go 99.3%
Makefile 0.5%
Shell 0.2%