Bundle of uncommitted working-tree edits across combat engine, expedition cycle, flavor pools, and TwinBee/zone narration. Includes new files: combat_debug.go, dnd_boss_consumables.go, dnd_dex_floor.go, plus CHANGES_24H.md and REBALANCE_NOTES.md scratch notes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.7 KiB
24-Hour Change Summary — 2026-05-08 → 2026-05-09
139 commits since midnight 2026-05-09 plus an active uncommitted set. Grouped by theme below; commit hashes in parentheses for traceability.
1. Phase L — Legacy AdventureCharacter retirement (final wave)
The multi-day plan to retire AdvCharacter/CombatLevel/combat_engine reached its close-out. After today, dnd_character + player_meta are the canonical stores; the legacy table is cold and gated behind GOGOBEE_LEGACY_PURGE.
- L2 — Arena boss flow (
62eed7a→3b4dfa4): extractedrenderBossOutcome, addedZoneArenasynthetic ID, built boss-shaped arena bestiary, wiredARENA_BOSS_FLOW, migrated arena counters/render/tier-gates toDnDCharacter+player_meta, then ripped the legacy arena combat path — boss flow is now the only path. - L3 (
d300008): co-op dungeons deleted; in-flight runs auto-refunded on startup. - L4a–L4f (
730f165→c719b30): per-feature dual-write + reader flips offAdvCharacter— hospital, rival, masterwork, pet, housing, render/twinbee. DisplayName migration scaffold (5000c3d,cc6fb7d) preceded the L5 work. - L5a–L5h (
79e5d19→1c7939c): final teardown sub-phases — skills, babysit, NPC counters, streak/lifecycle, death state, misc fields, mass DnDCharacter backfill, thensaveAdvCharacterfan-outs toplayer_meta. Table goes cold. - L5 close-out (
36e14c6,c0f03a4,5d98e56,9d6e8f6,c8849fd,35fa2b8): §7.4 doc reconciled, last 3CombatLevelreaders retired, loader rewired with bootstrap, redundant dual-writes dropped,!expedition listforked offzoneCmdList, and the daily report migrated to a D&D-native renderer with unified activity source.
Memory state: project_phase_L_progress.md now reads "deployed to prod; legacy table cold; operator can flip GOGOBEE_LEGACY_PURGE=1 anytime."
2. Phase G — Branching zone graphs (greenfield rebuild)
End-to-end shipped today. Old linear room-sequence model retired in favor of explicit graph nodes per zone.
- G1–G4 (
a413c92): schema, graph types, legacy compiler, run-state dual-write. - G5 (
2d249d7): navigation surface gated behindGOGOBEE_BRANCHING_ZONES=1. - G6 (
893d3da): dependent surfaces re-keyed onto graph nodes. - G7 (
90ff766,b3d3db9): Crypt of Valdris POC graph; empty columns collapse in!zone map. - G8a–G8i (
9312ef5→304ad27): all 9 zones authored with deliberately varied map shapes (per playtester feedback that uniform shapes felt rote) — Goblin Warrens diamond, Forest Shadows asymmetric fork, Sunken Temple sequential, Manor Blackspire stacked 3-way, Underforge late triple fork, Feywild woven, Dragon's Lair converging+capstone, Abyss Portal three sequential, Underdark convergent triangle. - G9a–G9c (
103cf30,a5c0a83,7ec78f3): feature flag removed,current_room/room_seq_jsonno longer persisted, legacy columns dropped behind a purge gate.
Memory: project_phase_G_progress.md — G1–G8 shipped; G9 column purge / merge to main complete this session.
3. Hospital flavor + economy
2454f5f: revival cost cut to 5k/level + new CHA-based haggle roll (!hospital).374d5ea,b8e8f99,97e4a50: discharge-bill descriptor variety (USA-standards quip, prep fix, "a lot" swap).- Merge:
feat/hospital-bill-flavor→ main (3446103).
4. Misc admin / UX
8e8d378: Space inviter now DMs admin to confirm invites for Space-less local users; merged via86c6736.3cf83e3:!eurograntadmin command for granting EUR balance.
5. Combat — Sudden Death + HP precision
de02907: Sudden Death phase added to all combat. Tiebreak now uses absolute HP (was % of max — fixed an edge case where a wounded high-HP fighter would lose to an undamaged low-HP enemy).c5217e9: wounded-carry HP display fixed (the "100/100 instead of 100/123" bug); auto-crit narration cleaned.9ce82f7: round half-up on HP wound persistence to fix the 101→100 round-trip drift through the dndChar HP scale. This was the patch that exposed the deeper dual-scale problem fixed by today's session work below.
6. Today's session (uncommitted as of writing)
6a. Combat HP unification — kill the dual scale
Drift bug 9ce82f7 only papered over: combat ran on 50 + CombatLevel*2 + equip + arena_sets + housing (~123 for an L8 char) and bridged to dnd_character.hp_max (~78) via percentage scaling each fight. Now:
- New
CombatStats.HPBonus intfield captures the equipment / arena-set / housing HP buff as an absolute number (legacyTotal − (50 + CombatLevel*2)) — DerivePlayerStats keeps writing it for tests, but production combat ignores itsMaxHP. applyDnDPlayerLayernow reseatsstats.MaxHP = c.HPMax + stats.HPBonus. Single canonical HP scale; gear/arena/housing buffs preserved as a flat add-on.applyDnDHPScalingis a direct integer copy: wounded entry =c.HPCurrent + HPBonus(no percent math, nodndWoundFloor).persistDnDHPAfterCombatis a direct integer copy: clampsendHPto[0, c.HPMax]. Gear cushion is fight-only, doesn't carry over.- Penalty zone HP scaling moved from before to after
applyDnDPlayerLayerso the penalty applies on the unified scale. - Dropped the unused
legacyStartHPparameter frompersistDnDHPAfterCombat. - Stale "legacy HP / legacy combat-engine" comments swept;
dndWoundFloorconstant deleted.
Files: combat_engine.go, combat_stats.go, combat_bridge.go, dnd_combat.go, dnd_zone_combat.go + tests (dnd_plugs_test.go, dnd_combat_test.go, dnd_audit_fixes_test.go, dnd_proddb_integration_test.go).
Memory: project_unify_combat_hp.md flipped to shipped.
6b. Stats card cleanup
!stats (super-stats EX+α) now drops two stale references:
- The "Combat Lv.X (XP)" column — legacy
combat_levelfromplayer_metais no longer rendered (the survivor inadventure_render.goreads fromdndLeveland is correct under the unified model). - The "🤖 Lost to TwinBee: N times" line — entire
bot_defeatsblock dropped.
Files: stats.go.
6c. Zone combat consumables wiring
Bug: runZoneCombat (zone elite/boss + arena + expedition path) never loaded, selected, or applied consumables — players' healing potions / wards / damage tonics sat in inventory while they died at 21/56 → 0/56 to a Wight.
- Wired
loadConsumableInventory→SelectConsumables→ApplyConsumableMods→injectConsumableEvents→removeAdvInventoryItemintorunZoneCombat, mirroringrunDungeonCombat's shape. - Added
allowSkipTrivial boolparameter toSelectConsumables. Zone/arena passfalse(those are never chump fights, and the legacy threat assessor underestimates d20 lethality — one nat-20 streak ends the run). Dungeon path keepstrueso trivial rooms still skip.
Files: dnd_zone_combat.go, combat_bridge.go, adventure_consumables.go (+test).
6d. TwinBee voice — surgical third-person trim
User flagged TwinBee flavor as overusing third-person self-reference ("TwinBee X. TwinBee Y. TwinBee Z." density across the same entry). Sweep across 14 flavor files, surgical rule: trim only entries with 3+ "TwinBee" mentions or genuine subject-stack tics; leave 1–2 mentions alone; never switch to first-person "I"; preserve all jokes/references/length.
| File | Entries trimmed |
|---|---|
twinbee_gm_flavor.go |
7 |
twinbee_expedition_flavor.go |
17 |
twinbee_resource_flavor.go |
5 |
6 of 11 zone_*flavor.go files |
1 each |
zone_dragons_lair, zone_underdark, zone_forest_shadows, zone_goblin_warrens, +1 |
0 (already sparse) |
~35 entries touched out of ~600+. Memory: new feedback_twinbee_voice.md documents the rule for future authoring; the // DO NOT REWRITE headers on flavor files now treated as soft (override required for sweeps, but standing for incidental edits).
Headline numbers
- 139 commits since midnight 2026-05-09 (most landed before this session).
- Two long-running phases closed today: Phase L (legacy adv-character retirement) and Phase G (branching zone graphs).
- One new refactor shipped this session: combat HP unification — round-trip drift gone, single canonical HP scale.
- Two production bugs fixed this session: stats card stale columns; zone combat consumables not firing.
- One creative QA pass: ~35 TwinBee flavor entries trimmed across 14 files.
Next on deck
- Per
project_consumable_crafting.md: foraging-level auto-crafting consumables from ingredients. - Per
project_adv_dm_window_tiers.md: splitadvDMResponseWindowinto high-pri vs low-pri constants. - Per
project_human_race_bonus.md: wire Human race's floating +1 stat bonus. - Phase G done → optional
GOGOBEE_LEGACY_PURGE=1flip whenever operator wants the cold table gone.