Compare commits

2 Commits

Author SHA1 Message Date
8241cf4bee Merge add-make-targets (dev Makefile + markdown formatting) 2026-07-22 22:20:45 +07:00
35b538e888 Add dev Makefile; format all markdown with prettier
Adds a minimal Makefile wrapping the toolchain the way sneak's other
repos expose it:

- fmt        gofmt -w plus prettier (4-space tabs, proseWrap: always)
- fmt-check  fail if any Go or Markdown file is unformatted
- lint       golangci-lint run ./...
- test       go test ./...
- check      fmt-check + lint + test (the local pre-commit gate)

Running make fmt normalizes the four existing Markdown docs to the
shared prettier style (80-column proseWrap: always, aligned tables) —
a one-time reflow with no content change. The repo remains exempt from
the rest of the policy scaffold (no Dockerfile, CI, or REPO_POLICIES).
2026-07-22 22:20:34 +07:00
5 changed files with 939 additions and 773 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +1,41 @@
# Project Memory # Project Memory
Working notes for agents on this repo. Read this alongside TODO.md Working notes for agents on this repo. Read this alongside TODO.md (which holds
(which holds the step queue and workflow) before starting work. the step queue and workflow) before starting work.
## Error handling ## Error handling
Panicking on bad/unexpected errors is allowed and preferred over Panicking on bad/unexpected errors is allowed and preferred over threading
threading unlikely error returns through game code — e.g. write-side unlikely error returns through game code — e.g. write-side Close/encode failures
Close/encode failures where continuing would mean corrupt state. The where continuing would mean corrupt state. The game already unwinds C's exit()
game already unwinds C's exit() calls via a gameEnd panic recovered in calls via a gameEnd panic recovered in Run. Return errors where a caller
Run. Return errors where a caller genuinely handles them (save-file genuinely handles them (save-file prompts, restore validation). Reserve
prompts, restore validation). Reserve deliberate `_ =` discards for deliberate `_ =` discards for true best-effort paths (scorefile writes,
true best-effort paths (scorefile writes, signal-time autosave), always signal-time autosave), always with a comment saying why.
with a comment saying why.
## Linting ## Linting
The .golangci.yml is the house standard and may only be modified with The .golangci.yml is the house standard and may only be modified with sneak's
sneak's explicit permission. To disable a linter, ask, explaining what explicit permission. To disable a linter, ask, explaining what the linter does;
the linter does; he approves specific exceptions, which are recorded he approves specific exceptions, which are recorded in the config's
in the config's "Repo-specific exceptions" block with the approval "Repo-specific exceptions" block with the approval date. Approved so far:
date. Approved so far: paralleltest (2026-07-06); testpackage, paralleltest (2026-07-06); testpackage, exhaustive, and mnd (2026-07-07). The
exhaustive, and mnd (2026-07-07). The complexity linters (cyclop, complexity linters (cyclop, gocognit, nestif) are enabled and clean as of
gocognit, nestif) are enabled and clean as of refactor step 7 refactor step 7 (2026-07-07): the whole golangci-lint run is 0 issues, so keep
(2026-07-07): the whole golangci-lint run is 0 issues, so keep it that it that way — decompose new hot spots rather than reaching for a nolint.
way — decompose new hot spots rather than reaching for a nolint. Line-level //nolint with a reason is used sparingly for C-faithfulness (e.g. the
Line-level //nolint with a reason is used sparingly for C-faithfulness authentic "missle" message spellings) and provably-safe gosec conversions; each
(e.g. the authentic "missle" message spellings) and provably-safe gosec needs a justifying comment.
conversions; each needs a justifying comment.
## Faithfulness ## Faithfulness
Behavior must not change during the idiomatic-Go refactor unless a Behavior must not change during the idiomatic-Go refactor unless a TODO step
TODO step says so. The 80x24 seed-compatible gameplay, message text says so. The 80x24 seed-compatible gameplay, message text (including original
(including original typos), RNG call order, and C quirks (documented typos), RNG call order, and C quirks (documented in tests like
in tests like TestHoldScrollGreedyMonsterQuirk) are contract. Doc TestHoldScrollGreedyMonsterQuirk) are contract. Doc comments keep their "(file.c
comments keep their "(file.c func_name)" breadcrumbs. func_name)" breadcrumbs.
## Debugging ## Debugging
Write real, committed test files with t.Logf output and run plain Write real, committed test files with t.Logf output and run plain `go test -v`;
`go test -v`; no throwaway scratch scripts. Successful debug probes no throwaway scratch scripts. Successful debug probes become regression tests.
become regression tests.

35
Makefile Normal file
View File

@@ -0,0 +1,35 @@
# Development convenience targets. This repo is exempt from the standard
# policy scaffold (no Dockerfile, CI, or REPO_POLICIES.md); this Makefile
# is only a thin wrapper around the Go toolchain, golangci-lint, and
# prettier so `make fmt` / `make check` behave the same as in sneak's
# other repos.
GO_PKGS := ./...
MD_FILES := $(shell git ls-files '*.md')
PRETTIER := prettier --tab-width 4 --prose-wrap always
.PHONY: check fmt fmt-check lint test
# Format, lint, and test — the full local pre-commit gate.
check: fmt-check lint test
# Format Go and Markdown in place.
fmt:
gofmt -w .
$(PRETTIER) --write $(MD_FILES)
# Fail if any Go or Markdown file is not formatted.
fmt-check:
@unformatted="$$(gofmt -l .)"; \
if [ -n "$$unformatted" ]; then \
echo "gofmt needed on:"; echo "$$unformatted"; exit 1; \
fi
$(PRETTIER) --check $(MD_FILES)
# Run the house linter (config in .golangci.yml).
lint:
golangci-lint run $(GO_PKGS)
# Run the test suite.
test:
go test $(GO_PKGS)

View File

@@ -2,19 +2,19 @@
[![License](https://img.shields.io/badge/license-BSD-blue.svg)](LICENSE.TXT) [![License](https://img.shields.io/badge/license-BSD-blue.svg)](LICENSE.TXT)
**Rogue** is the original dungeon-crawling adventure game that spawned an **Rogue** is the original dungeon-crawling adventure game that spawned an entire
entire genre. This branch is a faithful Go port of Rogue 5.4.4: explore genre. This branch is a faithful Go port of Rogue 5.4.4: explore procedurally
procedurally generated dungeons, fight monsters, collect treasure, and generated dungeons, fight monsters, collect treasure, and attempt to retrieve
attempt to retrieve the Amulet of Yendor. the Amulet of Yendor.
**Original authors:** Michael Toy, Ken Arnold, and Glenn Wichman **Original authors:** Michael Toy, Ken Arnold, and Glenn Wichman (19801983,
(19801983, 1985, 1999). 1985, 1999).
The port is function-by-function faithful to the classic C sources — same The port is function-by-function faithful to the classic C sources — same
dungeon generation (seed-compatible RNG), same combat math, same item dungeon generation (seed-compatible RNG), same combat math, same item tables,
tables, same messages. The C reference implementation lives on the same messages. The C reference implementation lives on the `master` and
`master` and `modern-rogue` branches; [ARCHITECTURE.md](ARCHITECTURE.md) `modern-rogue` branches; [ARCHITECTURE.md](ARCHITECTURE.md) documents both the
documents both the original program structure and the design of this port. original program structure and the design of this port.
## Building and running ## Building and running
@@ -40,13 +40,12 @@ go build ./cmd/rogue
Press `?` in game for the full list. Press `?` in game for the full list.
- **arrows** or **h/j/k/l/y/u/b/n** — move (shift to run, ctrl to run - **arrows** or **h/j/k/l/y/u/b/n** — move (shift to run, ctrl to run until
until adjacent) adjacent)
- **`.`** rest, **`s`** search for hidden doors and traps - **`.`** rest, **`s`** search for hidden doors and traps
- **`i`** inventory, **`,`** pick up, **`d`** drop - **`i`** inventory, **`,`** pick up, **`d`** drop
- **`q`** quaff potion, **`r`** read scroll, **`e`** eat food - **`q`** quaff potion, **`r`** read scroll, **`e`** eat food
- **`w`** wield weapon, **`W`** wear armor, **`P`**/**`R`** put on / - **`w`** wield weapon, **`W`** wear armor, **`P`**/**`R`** put on / remove ring
remove ring
- **`t`** throw, **`z`** zap a wand, **`f`**/**`F`** fight - **`t`** throw, **`z`** zap a wand, **`f`**/**`F`** fight
- **`>`**/**`<`** take the stairs - **`>`**/**`<`** take the stairs
- **`S`** save, **`Q`** quit - **`S`** save, **`Q`** quit
@@ -61,8 +60,8 @@ export ROGUEOPTS="name=YourName,terse,jump,fruit=mango"
ROGUE_WIZARD=1 SEED=12345 ./rogue ROGUE_WIZARD=1 SEED=12345 ./rogue
``` ```
The scoreboard is kept in `~/.rogue.scores`. Save files are Go gob The scoreboard is kept in `~/.rogue.scores`. Save files are Go gob snapshots
snapshots and, as in the original, are deleted when restored. and, as in the original, are deleted when restored.
## Code layout ## Code layout
@@ -73,13 +72,13 @@ term/ tcell-backed terminal, replacing curses
cmd/rogue/ the executable cmd/rogue/ the executable
``` ```
The engine package is fully headless-testable: `go test ./game/` runs The engine package is fully headless-testable: `go test ./game/` runs scripted
scripted game sessions, dungeon-generation golden checks, and an RNG game sessions, dungeon-generation golden checks, and an RNG compatibility test
compatibility test against the original C generator. against the original C generator.
## License ## License
BSD-style; see [LICENSE.TXT](LICENSE.TXT). BSD-style; see [LICENSE.TXT](LICENSE.TXT).
Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman.
Wichman. All rights reserved. All rights reserved.

266
TODO.md
View File

@@ -1,164 +1,156 @@
# Workflow # Workflow
* branch (from `main`) - branch (from `main`)
* do the work in Next Step - do the work in Next Step
* move Next Step to the top of Completed Steps - move Next Step to the top of Completed Steps
* move the top item of Future Steps into Next Step - move the top item of Future Steps into Next Step
* commit (`TODO.md` changes in the same commit as the work) - commit (`TODO.md` changes in the same commit as the work)
* merge to `main` if the branch is not protected, otherwise open a PR - merge to `main` if the branch is not protected, otherwise open a PR
* push - push
# Status # Status
pre-1.0 pre-1.0
The port on main is complete and faithful (function-by-function from The port on main is complete and faithful (function-by-function from Rogue 5.4.4
Rogue 5.4.4 C; reference sources on c-master/modern-rogue). Current C; reference sources on c-master/modern-rogue). Current phase: refactor from a
phase: refactor from a transliterated port into idiomatic Go — one transliterated port into idiomatic Go — one feature branch per step below,
feature branch per step below, descriptive naming, real types, house descriptive naming, real types, house style per
style per ~/dev/prompts/prompts/CODE_STYLEGUIDE_GO.md. ~/dev/prompts/prompts/CODE_STYLEGUIDE_GO.md.
Refactor ground rules: Refactor ground rules:
- Behavior must not change unless a step says so. The full test suite - Behavior must not change unless a step says so. The full test suite (scripted
(scripted sessions, generation invariants, C-compatible RNG goldens) sessions, generation invariants, C-compatible RNG goldens) gates every step;
gates every step; 80x24 seed-compatible gameplay stays intact. 80x24 seed-compatible gameplay stays intact.
- Renames keep the C lineage greppable: doc comments retain their - Renames keep the C lineage greppable: doc comments retain their "(file.c
"(file.c func_name)" breadcrumbs, and the docs refresh step adds a func_name)" breadcrumbs, and the docs refresh step adds a C-name → Go-name
C-name → Go-name table to ARCHITECTURE.md. table to ARCHITECTURE.md.
# Next Step # Next Step
Refactor step 8: constructor and style pass per the house styleguide — Refactor step 8: constructor and style pass per the house styleguide —
game.New(game.Params{...}) replacing NewGame(Config); replace the game.New(game.Params{...}) replacing NewGame(Config); replace the gameEnd panic
gameEnd panic unwind with error-based turn results where feasible; unwind with error-based turn results where feasible; 77-column wrap sweep.
77-column wrap sweep.
# Completed Steps # Completed Steps
- 2026-07-07 Refactor step 7 (refactor/effects-dispatch): effects - 2026-07-07 Refactor step 7 (refactor/effects-dispatch): effects dispatch
dispatch tables plus a full decomposition sweep — the quaff / tables plus a full decomposition sweep — the quaff / readScroll / doZap
readScroll / doZap switches, the attack monster-power switch, the switches, the attack monster-power switch, the be_trapped switch, the daemon
be_trapped switch, the daemon d_func switch, and the command-key d_func switch, and the command-key switch all became handler tables on
switch all became handler tables on gameData (quaffHandlers, gameData (quaffHandlers, readHandlers, zapHandlers, hitHandlers, trapHandlers,
readHandlers, zapHandlers, hitHandlers, trapHandlers, daemonHandlers, daemonHandlers, commandHandlers), one small named method per case. Every
commandHandlers), one small named method per case. Every remaining remaining cyclop/gocognit/nestif hot spot was split into named helpers across
cyclop/gocognit/nestif hot spot was split into named helpers across fight, misc (look), command, chase, move, passages, options, pack, things,
fight, misc (look), command, chase, move, passages, options, pack, save, daemons, rooms, score, monsters, rings, rip, io, object, weapons,
things, save, daemons, rooms, score, monsters, rings, rip, io, wizard, and term/tcell, plus three test functions. Effect order and RNG call
object, weapons, wizard, and term/tcell, plus three test functions. sequence preserved throughout; the whole golangci-lint run is now 0 issues.
Effect order and RNG call sequence preserved throughout; the whole
golangci-lint run is now 0 issues.
- 2026-07-07 Refactor step 6 (refactor/god-object-extraction): - 2026-07-07 Refactor step 6 (refactor/god-object-extraction): MessageLine (was
MessageLine (was MsgLine) owns the msg/addmsg/endmsg machinery, MsgLine) owns the msg/addmsg/endmsg machinery, wired to its screen/look/input
wired to its screen/look/input needs via attach(); RogueGame keeps needs via attach(); RogueGame keeps one-line msg/addmsgf/endmsg shorthands so
one-line msg/addmsgf/endmsg shorthands so call sites are unchanged. call sites are unchanged. Player owns pack bookkeeping (nextPackChar,
Player owns pack bookkeeping (nextPackChar, removeFromPack — the removeFromPack — the state half of leave_pack; leavePack keeps only LastPick
state half of leave_pack; leavePack keeps only LastPick tracking). tracking). Level owns object/monster list management and lookup (ObjectAt
Level owns object/monster list management and lookup (ObjectAt replaces findObj; AddObject/RemoveObject/AddMonster/RemoveMonster replace
replaces findObj; AddObject/RemoveObject/AddMonster/RemoveMonster direct attachObj/detachObj/attachMon/detachMon on level lists).
replace direct attachObj/detachObj/attachMon/detachMon on level Inventory/pickup UI flows stay on RogueGame deliberately: they are display and
lists). Inventory/pickup UI flows stay on RogueGame deliberately: turn orchestration, not state surgery.
they are display and turn orchestration, not state surgery.
- 2026-07-07 Refactor step 5 (refactor/item-combat-ui-renames, three - 2026-07-07 Refactor step 5 (refactor/item-combat-ui-renames, three commits,
commits, one subsystem each): items — getItem→promptPackItem now one subsystem each): items — getItem→promptPackItem now returning (obj, ok),
returning (obj, ok), invName→inventoryName, doPot→applyPotionFuse; invName→inventoryName, doPot→applyPotionFuse; combat — rollEm→rollAttacks,
combat — rollEm→rollAttacks, attack/moveMonster/chaseStep return attack/moveMonster/chaseStep return (removed bool) instead of C -1/0 int
(removed bool) instead of C -1/0 int codes; UI — codes; UI — getDir→promptDirection. C breadcrumbs kept; suite green.
getDir→promptDirection. C breadcrumbs kept; suite green.
- 2026-07-07 Refactor step 4 (refactor/movement-renames): movement/world - 2026-07-07 Refactor step 4 (refactor/movement-renames): movement/world renames
renames (doMove→moveHero, beTrapped→springTrap, rndmove→randomStep, (doMove→moveHero, beTrapped→springTrap, rndmove→randomStep,
doRooms/doPassages/doMaze→digRooms/digPassages/digMaze, doRooms/doPassages/doMaze→digRooms/digPassages/digMaze, chgStr→changeStrength,
chgStr→changeStrength, doRun→startRun, moveStuff→finishMove, doRun→startRun, moveStuff→finishMove, turnref→turnRefresh,
turnref→turnRefresh, moveMonst→moveMonster, doChase→chaseStep, moveMonst→moveMonster, doChase→chaseStep, setOldch→setOldChar, cansee→canSee,
setOldch→setOldChar, cansee→canSee, roomin→roomIn, runto→runTo, roomin→roomIn, runto→runTo, conn→connectRooms, putpass→putPassage,
conn→connectRooms, putpass→putPassage, passnum→numberPassages, passnum→numberPassages, numpass→numberPassage, rndPos→randomPos,
numpass→numberPassage, rndPos→randomPos, rndRoom→randomRoom, rndRoom→randomRoom, treasRoom→treasureRoom, accntMaze→accountMaze); all
treasRoom→treasureRoom, accntMaze→accountMaze); all goto/label flows goto/label flows replaced with loops (moveHero retry loop + extracted
replaced with loops (moveHero retry loop + extracted passageTurn, passageTurn, dispatch re-dispatch loop, chaseStep passage loop, saveGame
dispatch re-dispatch loop, chaseStep passage loop, saveGame labeled labeled prompt loop); C breadcrumbs kept in doc comments.
prompt loop); C breadcrumbs kept in doc comments. - 2026-07-07 Lint adoption finished (refactor/no-package-globals): all 37
- 2026-07-07 Lint adoption finished (refactor/no-package-globals): all package-level vars moved into `gameData` (built by `newGameData`, hung on
37 package-level vars moved into `gameData` (built by `newGameData`, RogueGame as `g.data`, set in NewGame and Restore); ObjectKind
hung on RogueGame as `g.data`, set in NewGame and Restore); ObjectKind
Glyph()/objectKindForGlyph became switches; the table-reading subtype Glyph()/objectKindForGlyph became switches; the table-reading subtype
Stringers were removed; isMagic became a RogueGame method; goconst Stringers were removed; isMagic became a RogueGame method; goconst fixed with
fixed with named word constants (potionName, goldName, staffName, named word constants (potionName, goldName, staffName, ripWall, ...);
ripWall, ...); testpackage and exhaustive disabled in .golangci.yml testpackage and exhaustive disabled in .golangci.yml with sneak's approval
with sneak's approval (2026-07-07); misspell's corruption of the (2026-07-07); misspell's corruption of the "ther" scroll syllable reverted.
"ther" scroll syllable reverted. mnd disabled with sneak's approval mnd disabled with sneak's approval (2026-07-07, follow-up commit). Remaining
(2026-07-07, follow-up commit). Remaining red: cyclop (36), nestif red: cyclop (36), nestif (30), gocognit (23) stay until step 7 fixes them per
(30), gocognit (23) stay until step 7 fixes them per sneak's ruling. sneak's ruling.
- 2026-07-06 Lint adoption bulk (refactor/lint-adoption, 5ba9fe8): - 2026-07-06 Lint adoption bulk (refactor/lint-adoption, 5ba9fe8): .golangci.yml
.golangci.yml copied verbatim from the prompts repo (plus the copied verbatim from the prompts repo (plus the sneak-approved paralleltest
sneak-approved paralleltest exception, 2026-07-06); ~1,500 findings exception, 2026-07-06); ~1,500 findings fixed (autofix formatting sweep,
fixed (autofix formatting sweep, errcheck/err113/noinlineerr error errcheck/err113/noinlineerr error handling, forbidigo, funcorder, recvcheck
handling, forbidigo, funcorder, recvcheck pointer receivers, pointer receivers, goprintffuncname renames msg helpers to *f, revive doc
goprintffuncname renames msg helpers to *f, revive doc comments, comments, gocritic switch rewrites, gosec real fixes plus justified nolints,
gocritic switch rewrites, gosec real fixes plus justified nolints, unparam signature tightening, C-faithful "missle" spellings restored after
unparam signature tightening, C-faithful "missle" spellings restored misspell autofix changed game text).
after misspell autofix changed game text). - 2026-07-06 Module base path updated to git.eeqj.de/sneak/rgoue (go.mod, term/
- 2026-07-06 Module base path updated to git.eeqj.de/sneak/rgoue and cmd/ imports, ARCHITECTURE.md, version string).
(go.mod, term/ and cmd/ imports, ARCHITECTURE.md, version string). - 2026-07-06 Refactor step 3 (refactor/object-fields): Object.Arm split into
- 2026-07-06 Refactor step 3 (refactor/object-fields): Object.Arm split ArmorClass/Charges/GoldValue/Bonus (rings); Stats.Arm → ArmorClass; damage
into ArmorClass/Charges/GoldValue/Bonus (rings); Stats.Arm → strings parsed once into DiceSpec at table definition (ParseDice keeps C
ArmorClass; damage strings parsed once into DiceSpec at table roll_em parse semantics, incl. "%%%x0" and "000x0" edge cases,
definition (ParseDice keeps C roll_em parse semantics, incl. "%%%x0" regression-tested); save format 5.4.4-go3.
and "000x0" edge cases, regression-tested); save format 5.4.4-go3. - 2026-07-06 Refactor step 2 (refactor/typed-kinds, b940cfc): ObjectKind
- 2026-07-06 Refactor step 2 (refactor/typed-kinds, b940cfc): separates item category from map glyph (Object.Type byte → Kind ObjectKind
ObjectKind separates item category from map glyph (Object.Type byte with Glyph()); PotionKind/ScrollKind/RingKind/
→ Kind ObjectKind with Glyph()); PotionKind/ScrollKind/RingKind/ WandKind/WeaponKind/ArmorKind/TrapKind typed iota enums with Stringer; typed
WandKind/WeaponKind/ArmorKind/TrapKind typed iota enums with accessors on Object; getItem/inventory/whatis filters take ObjectKind
Stringer; typed accessors on Object; getItem/inventory/whatis (KindCallable/KindRingOrStick replace CALLABLE/R_OR_S); save format bumped to
filters take ObjectKind (KindCallable/KindRingOrStick replace 5.4.4-go2. Suite green.
CALLABLE/R_OR_S); save format bumped to 5.4.4-go2. Suite green. - 2026-07-06 Refactor step 1 (refactor/descriptive-constants): renamed all flag
- 2026-07-06 Refactor step 1 (refactor/descriptive-constants): renamed bits, trap types, item subtype constants, and Max* counts to descriptive names
all flag bits, trap types, item subtype constants, and Max* counts to (IsHuh→Confused, SeeMonst→SenseMonsters, WsHasteM→WandHasteMonster,
descriptive names (IsHuh→Confused, SeeMonst→SenseMonsters, MaxSticks→NumWandTypes, ...); Level.NTraps→TrapCount; C names kept as comment
WsHasteM→WandHasteMonster, MaxSticks→NumWandTypes, ...); breadcrumbs. Pure rename, suite green.
Level.NTraps→TrapCount; C names kept as comment breadcrumbs. Pure
rename, suite green.
- 2026-07-06 Made the rgoue branch Go-only: removed C sources and the - 2026-07-06 Made the rgoue branch Go-only: removed C sources and the
autoconf/VS build system (they remain on master and modern-rogue), autoconf/VS build system (they remain on master and modern-rogue), ported the
ported the last wizard command (item-probability listing), rewrote last wizard command (item-probability listing), rewrote README.md for the Go
README.md for the Go port (c0b533e) port (c0b533e)
- 2026-07-06 Ported the command loop, save/restore, the tcell terminal - 2026-07-06 Ported the command loop, save/restore, the tcell terminal layer,
layer, and the playable binary at cmd/rogue (41fc104) and the playable binary at cmd/rogue (41fc104)
- 2026-07-06 Ported item effects: potions, scrolls, options, call_it - 2026-07-06 Ported item effects: potions, scrolls, options, call_it (cdf9bf7)
(cdf9bf7) - 2026-07-06 Ported combat, the chase driver, traps, zapping, death and scores
- 2026-07-06 Ported combat, the chase driver, traps, zapping, death and (3c5add8)
scores (3c5add8) - 2026-07-06 Ported dungeon generation, base items, the pack, and monster
- 2026-07-06 Ported dungeon generation, base items, the pack, and creation (a69ef7d)
monster creation (a69ef7d) - 2026-07-06 Ported the foundation: types, seed-compatible RNG, item tables,
- 2026-07-06 Ported the foundation: types, seed-compatible RNG, item daemon scheduler (7fa2048)
tables, daemon scheduler (7fa2048) - 2026-07-06 Wrote ARCHITECTURE.md Parts 1 and 2: complete map of the C program
- 2026-07-06 Wrote ARCHITECTURE.md Parts 1 and 2: complete map of the C and the Go port design (91eeee0, 45dba95)
program and the Go port design (91eeee0, 45dba95) - Fork base: Davidslv/rogue C 5.4.4 with modernization fixes (C23 prototypes,
- Fork base: Davidslv/rogue C 5.4.4 with modernization fixes (C23 ncurses compat), preserved on master/modern-rogue
prototypes, ncurses compat), preserved on master/modern-rogue
# Future Steps # Future Steps
1. Docs refresh: update ARCHITECTURE.md Part 2 and README.md for the 1. Docs refresh: update ARCHITECTURE.md Part 2 and README.md for the
post-refactor names; add the C name → Go name rename table. post-refactor names; add the C name → Go name rename table.
2. Playtest hardening pass: play several full games with the tcell 2. Playtest hardening pass: play several full games with the tcell binary and
binary and extend run_test.go to script a deeper multi-level extend run_test.go to script a deeper multi-level playthrough (descend past
playthrough (descend past level 5, use potions, scrolls, zapping, level 5, use potions, scrolls, zapping, save/restore). Fix any panics,
save/restore). Fix any panics, message mismatches, or divergences message mismatches, or divergences from the C behavior that this uncovers,
from the C behavior that this uncovers, with regression tests. with regression tests.
3. Verify the seed-compatibility claim against the C reference on 3. Verify the seed-compatibility claim against the C reference on c-master: same
c-master: same seed, same dungeon, same item tables, for several seed, same dungeon, same item tables, for several seeds.
seeds. 4. Broaden unit test coverage where playtesting finds thin spots (rings, sticks,
4. Broaden unit test coverage where playtesting finds thin spots wizard commands).
(rings, sticks, wizard commands). 5. Tag a release once a full game (Amulet retrieval and score entry) completes
5. Tag a release once a full game (Amulet retrieval and score entry) without defects.
completes without defects. 6. Full-terminal-size support (deferred by explicit decision 2026-07-06):
6. Full-terminal-size support (deferred by explicit decision per-game dungeon dimensions instead of the 80x24 constants; open design
2026-07-06): per-game dungeon dimensions instead of the 80x24 questions are resize policy, gameplay tuning at larger sizes, and a --classic
constants; open design questions are resize policy, gameplay 80x24 mode.
tuning at larger sizes, and a --classic 80x24 mode. 7. Note: this repo is exempt from the standard policy scaffold. A minimal dev
7. Note: this repo is exempt from the standard policy scaffold. Do not Makefile (fmt/fmt-check/lint/test/check targets) exists per sneak's
add Makefile, Dockerfile, or REPO_POLICIES.md. 2026-07-07 request, but do not add a Dockerfile, CI config, or
REPO_POLICIES.md.