From c75af2ec223077adc5489a58977169f61acb17f5 Mon Sep 17 00:00:00 2001 From: sneak Date: Mon, 6 Jul 2026 22:01:33 +0200 Subject: [PATCH] Rotate TODO.md for completed refactor step 2 The rotation should have ridden the step-2 commit per the Workflow section, but the file was edited concurrently and the update was lost; recording it now. Step 3 (un-overload Object fields) is Next Step. --- TODO.md | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/TODO.md b/TODO.md index 9c6aa06..2edeccd 100644 --- a/TODO.md +++ b/TODO.md @@ -29,15 +29,21 @@ Refactor ground rules: # Next Step -Refactor step 2 (branch refactor/typed-kinds): typed kind enums — -PotionKind, ScrollKind, RingKind, WandKind, WeaponKind, ArmorKind, -TrapKind as iota enums with fmt.Stringer; Object.Which and the ObjInfo -tables move to the typed kinds; the object category glyph bytes ('!', -'?', ...) become an ObjectKind with a Glyph() method so item category -and map character stop sharing one byte namespace. +Refactor step 3 (branch refactor/object-fields): un-overload Object +fields — split Object.Arm into ArmorClass/Charges/GoldValue; parse +damage dice ("1x4/1x2") once into a DiceSpec type at table definition +instead of per swing; save-format update with round-trip test +migration. # Completed Steps +- 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, @@ -65,52 +71,48 @@ and map character stop sharing one byte namespace. # Future Steps -1. Refactor step 3: un-overload Object fields — split Object.Arm into - ArmorClass/Charges/GoldValue; parse damage dice ("1x4/1x2") once - into a DiceSpec type at table definition instead of per swing; - save-format update with round-trip test migration. -2. Adopt the house Go linting standards: copy .golangci.yml from the +1. Adopt the house Go linting standards: copy .golangci.yml from the prompts repo and bring game/, term/, and cmd/ lint-clean (the port is greenfield code, so no exemptions apply). -3. Refactor step 4: method renames, movement/world subsystem +2. Refactor step 4: method renames, movement/world subsystem (doMove→moveHero, beTrapped→springTrap, rndmove→randomStep, doRooms/doPassages/doMaze→digRooms/digPassages/digMaze, chgStr→changeStrength, ...); remove the goto/label flows in doMove, dispatch, and saveGame in favor of loops and helpers. -4. Refactor step 5: method renames, items/combat/UI subsystems +3. Refactor step 5: method renames, items/combat/UI subsystems (invName→inventoryName, rollEm→rollAttacks, doPot→applyPotionFuse, getItem→promptPackItem returning (obj, ok), getDir→promptDirection); int status codes (attack returning -1) become named results. Two or three commits, one subsystem each. -5. Refactor step 6: extract types from the god object — MessageLine +4. Refactor step 6: extract types from the god object — MessageLine owns the msg/addmsg/endmsg machinery; pack/inventory operations move onto *Player; monster/object list management and map queries consolidate onto *Level; RogueGame keeps turn orchestration and cross-system effects only. -6. Refactor step 7: effects dispatch — the giant quaff/readScroll/doZap +5. 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. -7. Refactor step 8: constructor and style pass per the house +6. 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. -8. Docs refresh: update ARCHITECTURE.md Part 2 and README.md for the +7. Docs refresh: update ARCHITECTURE.md Part 2 and README.md for the post-refactor names; add the C name → Go name rename table. -9. Playtest hardening pass: play several full games with the tcell +8. 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. -10. Verify the seed-compatibility claim against the C reference on +9. Verify the seed-compatibility claim against the C reference on c-master: same seed, same dungeon, same item tables, for several seeds. -11. Broaden unit test coverage where playtesting finds thin spots +10. Broaden unit test coverage where playtesting finds thin spots (rings, sticks, wizard commands). -12. Tag a release once a full game (Amulet retrieval and score entry) +11. Tag a release once a full game (Amulet retrieval and score entry) completes without defects. -13. Full-terminal-size support (deferred by explicit decision +12. 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. -14. Note: this repo is exempt from the standard policy scaffold. Do not +13. Note: this repo is exempt from the standard policy scaffold. Do not add Makefile, Dockerfile, or REPO_POLICIES.md.