Branching zones G6: dependent surfaces re-keyed on graph nodes

- Harvest tables (expedition + standalone) now keyed by node_id; legacy
  room-idx entries auto-migrate via read-fallback + drop-on-save.
- Narration salts swapped from run.CurrentRoom to narrationCadence(run)
  (= len(visited_nodes)-1) so flavor pickers survive G9 column drop.
- !zone map renders the graph (BFS by PosX/PosY) when the gate is on:
  ✓/▶/· status, ╳ for locked-only edges, secrets hidden until visited.
- Region-boundary hook in graph advance/!zone go updates expedition
  CurrentRegion + visited list when from/to nodes differ — without
  burning supplies or retiring runs (the graph IS the run state).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-05-09 15:17:30 -07:00
parent 2d249d7d0a
commit 893d3dacad
14 changed files with 562 additions and 64 deletions

View File

@@ -376,7 +376,7 @@ func feywildTemporalPostRollover(e *Expedition) []string {
// to the current room's nodes. Combat loot stays gone; only the
// renewable harvest nodes loop back.
out := []string{line}
if restored := restoreHarvestNodesInRoom(e, currentRoomIndexFor(e)); restored {
if restored := restoreHarvestNodesInRoom(e, currentNodeIDFor(e)); restored {
out = append(out, "_Harvest nodes in this room have re-emerged — the timeline isn't sure they were ever taken._")
}
return out