mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-16 17:02:42 +00:00
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:
75
internal/plugin/zone_graph_last_meridian.go
Normal file
75
internal/plugin/zone_graph_last_meridian.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package plugin
|
||||
|
||||
// The Last Meridian branching graph (Tier 6, Phase P4).
|
||||
//
|
||||
// A necropolis-observatory being decommissioned hour by hour. Regions: The
|
||||
// Dusk Colonnade → Gallery of Spent Hours → The Escapement → One Minute To
|
||||
// Midnight, on the shared T6 skeleton. Longest walk = 46, in band.
|
||||
//
|
||||
// A time zone: the forks gate on reading the clockwork's rhythm (INT for the
|
||||
// escapement's rule, DEX to slip a stolen turn, WIS to keep your own hour
|
||||
// when the Hour Thief reaches for it). The locked spurs are pockets of
|
||||
// unspent time — high LootBias hours the Custodian hasn't dismantled yet.
|
||||
|
||||
func zoneLastMeridianGraph() ZoneGraph {
|
||||
stat := func(s string, dc int, hint string) pgLock {
|
||||
return pgLock{kind: LockStatCheck, lockData: map[string]any{"stat": s, "dc": dc}, hint: hint}
|
||||
}
|
||||
perc := func(dc int, hint string) pgLock {
|
||||
return pgLock{kind: LockPerception, lockData: map[string]any{"dc": dc}, hint: hint}
|
||||
}
|
||||
return buildPostgameZoneGraph(pgZoneSpec{
|
||||
zoneID: ZoneLastMeridian,
|
||||
regions: [4]string{"meridian_dusk_colonnade", "meridian_gallery_spent_hours", "meridian_escapement", "meridian_one_minute"},
|
||||
entry: "The Dusk Gate",
|
||||
preamble: [12]string{
|
||||
"The Dusk Colonnade", "Hall of Winding Nothing", "The Hour Thief's Trail", "Candle-Shortened Walk",
|
||||
"Horologist's Ghost-Aisle", "The Stolen Present", "Pickpocket's Snare", "Colonnade of Spent Light",
|
||||
"The Gallery Approach", "Gallery Mouth", "Hall of Spent Hours", "First Struck Bell",
|
||||
},
|
||||
fork1: pgFork{
|
||||
label: "The First Hour",
|
||||
freeLabel: [3]string{"On-Time Passage", "The Kept Hour", "Gallery Floor"},
|
||||
lockLabel: [3]string{"Guarded Recess", "The Unspent Hour-Pocket", "Ticking Alcove"},
|
||||
lock: stat("WIS", 16, "keep your own hour when the Thief reaches for it and a door stays open"),
|
||||
},
|
||||
r2gate: "Gallery of Spent Hours",
|
||||
r2build: [6]string{
|
||||
"Rows of Stopped Clocks", "The Twin Wardens' Door", "Changing of the Guard",
|
||||
"Shift-Schedule Hall", "The Nothing Behind", "Escapement Threshold",
|
||||
},
|
||||
fork2: pgFork{
|
||||
label: "The Second Hour",
|
||||
freeLabel: [3]string{"Steady Escapement Walk", "The Even-Round Hall", "Escapement Floor"},
|
||||
lockLabel: [3]string{"Gear-Seam", "The Unwound Vault", "Pendulum Niche"},
|
||||
lock: stat("INT", 17, "the pendulum only swings on even rounds — read the rhythm and slip past"),
|
||||
},
|
||||
r3gate: "The Escapement",
|
||||
r3build: [6]string{
|
||||
"The Original Pendulum", "Gallery of Its Legs", "Verdigris Colossus Walk",
|
||||
"Orrery-Ring Landing", "Midnight Antechamber", "Threshold of the Last Hour",
|
||||
},
|
||||
capstone: pgCapstone{
|
||||
label: "The Midnight Fork",
|
||||
freeLabel: [3]string{"Direct Midnight-Walk", "The Open Escapement", "Midnight Floor"},
|
||||
lockALabel: [3]string{"Borrowed Second", "The Slipped Turn", "Stolen-Time Path"},
|
||||
lockA: stat("DEX", 18, "steal a second from the clock and step through before it notices"),
|
||||
lockBLabel: [3]string{"Unwound Seam", "The Hour Never Struck", "Unspent Shortcut"},
|
||||
lockB: perc(18, "one hour on the great face was never dismantled — it is still open"),
|
||||
},
|
||||
merge: "One Minute To Midnight",
|
||||
approach: [5]string{
|
||||
"The Apologizing Golem", "Orrery of the Last Hour", "Chime Approach", "The Rewinding Second", "The Clock Stops",
|
||||
},
|
||||
boss: "The Custodian of the Last Hour",
|
||||
overrides: map[string]pgNodeOverride{
|
||||
"f1b2": {kind: NodeKindSecret, bias: 2.25},
|
||||
"f2b2": {kind: NodeKindSecret, bias: 2.25},
|
||||
"cap32": {kind: NodeKindSecret, bias: 2.5},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func init() {
|
||||
registerZoneGraph(zoneLastMeridianGraph())
|
||||
}
|
||||
Reference in New Issue
Block a user