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