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 Ossuary Ascendant branching graph (Tier 6, Phase P4).
//
// Valdris's inverted bone-cathedral. Four regions — Bonefall Steps →
// Cathedral of Marrow → Reliquary Vaults → The Apotheosis Engine — on the
// shared T6 skeleton (buildPostgameZoneGraph). Longest walk = 46, in band.
//
// Signature set-piece: the three Phylactery Verses. Each is a NodeKindSecret
// reached through a LockPerception spur (one per fork), matching the plan's
// "three SECRET nodes, Verses found before the boss strip a Legendary
// Resistance / rebirth proc." The gate rides the fork→threshold edge; the
// edge into the Verse itself is unlocked. Full-clear explorers who find all
// three fight a mortal; speedrunners fight a god. Secret suffixes: f1b2,
// f2b2, cap32 (the middle node of each Perception spur).
func zoneOssuaryAscendantGraph() ZoneGraph {
perc := func(dc int, hint string) pgLock {
return pgLock{kind: LockPerception, lockData: map[string]any{"dc": dc}, hint: hint}
}
return buildPostgameZoneGraph(pgZoneSpec{
zoneID: ZoneOssuaryAscendant,
regions: [4]string{"ossuary_bonefall_steps", "ossuary_cathedral_marrow", "ossuary_reliquary_vaults", "ossuary_apotheosis_engine"},
entry: "The Inverted Threshold",
preamble: [12]string{
"Bonefall Steps", "The Rising Ossuary", "Marrow Stair", "Chancel of Ash",
"Ribvault Landing", "The Patient Gallery", "Reliquary Snare", "Choirless Nave",
"Ascending Transept", "The Counted Dead", "Vertebral Climb", "First Landing",
},
fork1: pgFork{
label: "The First Ascent",
freeLabel: [3]string{"Open Stair", "Bonelit Passage", "Cathedral Approach"},
lockLabel: [3]string{"Hairline Recess", "Verse of the Waiting Grave", "Sealed Alcove"},
lock: perc(16, "a seam in the marrow where the wall was never quite finished"),
},
r2gate: "Cathedral of Marrow",
r2build: [6]string{
"Nave of Fused Clergy", "The Censer Walk", "Grave-Smoke Aisle",
"Choir of the Pre-Blessed", "Cardinal's Approach", "The Marrow Altar",
},
fork2: pgFork{
label: "The Second Ascent",
freeLabel: [3]string{"Vault Stair", "Donor-Bone Hall", "Reliquary Approach"},
lockLabel: [3]string{"Cracked Reliquary", "Verse of the Bait Long Set", "Dust-Sealed Niche"},
lock: perc(17, "one reliquary is hollow where the others are full"),
},
r3gate: "Reliquary Vaults",
r3build: [6]string{
"The Coffin-Lid Wall", "Hall of Riveted Knights", "Gallery of the Crypt-Fallen",
"The Unoccupied Armor", "Engine Antechamber", "Threshold of Ascension",
},
capstone: pgCapstone{
label: "The Apotheosis Fork",
freeLabel: [3]string{"Direct Ascent", "The Final Stair", "Engine Floor"},
lockALabel: [3]string{"Deacon's Whisper", "The Named Dead", "Consecrated Path"},
lockA: pgLock{kind: LockStatCheck, lockData: map[string]any{"stat": "WIS", "dc": 18}, hint: "the choir sings your name in rounds — answer it and it opens"},
lockBLabel: [3]string{"Vertebral Fault", "Verse of the Homecoming", "The Last Recess"},
lockB: perc(18, "the highest vertebra of the cathedral was set wrong on purpose"),
},
merge: "The Apotheosis Engine",
approach: [5]string{
"Marrow Conduit", "The Ascending Choir", "Phylactery Cradle", "Vertebra of Godhood", "The Final Blessing",
},
boss: "Valdris, At Last",
overrides: map[string]pgNodeOverride{
"f1b2": {kind: NodeKindSecret, bias: 2.0},
"f2b2": {kind: NodeKindSecret, bias: 2.0},
"cap32": {kind: NodeKindSecret, bias: 2.0},
},
})
}
func init() {
registerZoneGraph(zoneOssuaryAscendantGraph())
}