adventure: Tier 6 postgame "Mythic" dungeons (P1–P7 calibration)

Five post-game dungeons above the T5 ceiling, gated on both T5 bosses beaten
+ level 18. Opt-in endgame: deadly solo, clearable by a party with Pete + pets.

- P1 gating: postgameUnlocked (T5 clears + level floor), zonesForLevel excludes
  T6 unconditionally; wired into startZoneRun, !zone/!expedition, party accept,
  boredom picker, and the list dividers.
- P2 bestiary: 15 elites + 5 signature bosses (Layer-1 stat blocks).
- P3 zone defs + 4-region registries; ZoneLootEntry.BossOnly.
- P4 five zone graphs on a shared builder (44–52 rooms, no soft-lock; Ossuary
  secret Verse nodes).
- P5 loot: BossOnly enforced; signature items are real registry magic items;
  five Thom pity recipes off the per-zone crafting anchors.
- P6 narration/flavor (5 files), T6 achievements, Pete stays zone-parametric.
- P7 (in progress): sim can now reach gated T6 (SimRunner.SeedPostgameUnlock +
  IsPostgameZone). First calibration pass on millenia — hardened ossuary +
  drowned_star, softened first_hoard + unplace; last_meridian in band.

Fix: party members were refused from every T6 zone because expeditionCmdAccept
ran the level gate (which excludes T6) before the postgame check — the intended
party endgame was unreachable. Route T6 through postgameUnlocked. Regression
tests added.
This commit is contained in:
prosolis
2026-07-15 23:17:07 -07:00
parent 27c2b48007
commit d9541f07f1
41 changed files with 2487 additions and 29 deletions

View File

@@ -0,0 +1,75 @@
package plugin
// The First Hoard branching graph (Tier 6, Phase P4).
//
// Aurvandryx's gilded clutch under Infernus Peak. Regions: The Cooling
// Throne → Gilded Gullet → The Clutch Vaults → Cradle of the First Flame,
// on the shared T6 skeleton. Longest walk = 46, in band.
//
// Signature set-piece: the game-max LootBias route. Per the plan, the First
// Hoard carries the richest nodes in the game (2.53.0) because the boss's
// Layer-2 Greed Tax makes rich routes self-balancing — gild yourself and
// pay for it at Aurvandryx, or take the lean line. The free capstone (the
// deepest gilded vein, cap12) sits at the 3.0 ceiling; two buildup nodes
// carry 2.5/2.75. Forks gate on physical checks (STR/CON) — you force the
// vault, you don't sneak it.
func zoneFirstHoardGraph() ZoneGraph {
stat := func(s string, dc int, hint string) pgLock {
return pgLock{kind: LockStatCheck, lockData: map[string]any{"stat": s, "dc": dc}, hint: hint}
}
return buildPostgameZoneGraph(pgZoneSpec{
zoneID: ZoneFirstHoard,
regions: [4]string{"hoard_cooling_throne", "hoard_gilded_gullet", "hoard_clutch_vaults", "hoard_cradle_first_flame"},
entry: "The Still-Warm Gate",
preamble: [12]string{
"Infernax's Corpse-Terrain", "The Cooling Throne", "Scale-River Ford", "Ashfall Landing",
"The Guard-Dog's Rest", "Ember Colonnade", "Slag Pit", "Choir-Drake Roost",
"The Gilded Descent", "Minted Approach", "Coin-Drift Hall", "Throat of the Mountain",
},
fork1: pgFork{
label: "The First Swallow",
freeLabel: [3]string{"Lean Passage", "Bare Gullet", "Gullet Floor"},
lockLabel: [3]string{"Vault-Seam", "The Gilded Vein", "Coin-Choked Stair"},
lock: stat("STR", 16, "a wall of fused coin — force it and the hoard spills"),
},
r2gate: "Gilded Gullet",
r2build: [6]string{
"Hall of Minted Antibodies", "The Simulacrum Font", "Mirror-Mint Gallery",
"Executor's Approach", "The Scale-Debt Walk", "Vault Threshold",
},
fork2: pgFork{
label: "The Second Swallow",
freeLabel: [3]string{"Poverty's Line", "Empty Clutch-Walk", "Clutch Floor"},
lockLabel: [3]string{"Cracked Egg-Vault", "The Gilded Reliquary", "Gold-Sealed Nest"},
lock: stat("CON", 16, "the heat here would cook a lesser body — endure it for the richest vault"),
},
r3gate: "The Clutch Vaults",
r3build: [6]string{
"Rows of Gilded Eggs", "The Resonance Nursery", "Choir-Cracked Stone",
"Wyrm-Sworn Landing", "Cradle Antechamber", "Threshold of the First Flame",
},
capstone: pgCapstone{
label: "The Cradle Fork",
freeLabel: [3]string{"The Deep Vein", "Mother-Lode Gallery", "Cradle Floor"},
lockALabel: [3]string{"Ember Squeeze", "The Molten Reliquary", "Scale-Sworn Path"},
lockA: stat("STR", 18, "prise the last vault open before she wakes"),
lockBLabel: [3]string{"Heat-Shimmer Recess", "The Poverty Shrine", "Vowed Approach"},
lockB: stat("WIS", 18, "leave the gold — the lean route arrives unburdened"),
},
merge: "Cradle of the First Flame",
approach: [5]string{
"The Warming Nest", "Clutch of the First Wyrm", "Ember-Before-Fire Walk", "The Progenitor's Shadow", "The First Breath",
},
boss: "Aurvandryx, the Ember Before Fire",
overrides: map[string]pgNodeOverride{
"cap12": {bias: 3.0}, // deepest gilded vein — game-max
"f1b2": {bias: 2.75}, // The Gilded Vein
"r2b2": {bias: 2.5}, // The Simulacrum Font
},
})
}
func init() {
registerZoneGraph(zoneFirstHoardGraph())
}