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:
77
internal/plugin/zone_graph_unplace.go
Normal file
77
internal/plugin/zone_graph_unplace.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package plugin
|
||||
|
||||
// The Unplace branching graph (Tier 6, Phase P4).
|
||||
//
|
||||
// The unattended tear Belaxath left behind — geometry that gave up. Regions:
|
||||
// The Fray → Escher's Debt → The Stitchworks → The Seam, on the shared T6
|
||||
// skeleton. Longest walk = 46, in band.
|
||||
//
|
||||
// The Unplace's set-piece is its locks: every fork gates on a different way
|
||||
// of not-trusting-the-walls (Perception to see the true corner, INT to
|
||||
// out-think the geometry, DEX to move through a room that is also another
|
||||
// room). The secret spurs are high-LootBias impossible-geometry pockets
|
||||
// rather than named secrets — the reward is the shortcut nobody should be
|
||||
// able to take.
|
||||
|
||||
func zoneUnplaceGraph() ZoneGraph {
|
||||
perc := func(dc int, hint string) pgLock {
|
||||
return pgLock{kind: LockPerception, lockData: map[string]any{"dc": dc}, hint: hint}
|
||||
}
|
||||
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: ZoneUnplace,
|
||||
regions: [4]string{"unplace_the_fray", "unplace_eschers_debt", "unplace_stitchworks", "unplace_the_seam"},
|
||||
entry: "The Frayed Edge",
|
||||
preamble: [12]string{
|
||||
"The Fray", "Horizon Indoors", "The Borrowed Corner", "Room That Is Also",
|
||||
"Angleworn Passage", "The Miss You Took", "Fraying Snare", "Silhouette Hall",
|
||||
"The Uncounted Arms", "Escher's Approach", "Debt Landing", "The Owed Turn",
|
||||
},
|
||||
fork1: pgFork{
|
||||
label: "The First Impossibility",
|
||||
freeLabel: [3]string{"Straight Enough Line", "Plain Corridor", "Debt Floor"},
|
||||
lockLabel: [3]string{"Corner-Behind-You", "The Pocket That Isn't", "Folded Alcove"},
|
||||
lock: perc(16, "a corner you already passed is somehow ahead of you"),
|
||||
},
|
||||
r2gate: "Escher's Debt",
|
||||
r2build: [6]string{
|
||||
"Stair Up Into Down", "The Unpaid Landing", "Gallery of Wrong Angles",
|
||||
"Nalfeshnee Concourse", "The Recursive Hall", "Stitchworks Threshold",
|
||||
},
|
||||
fork2: pgFork{
|
||||
label: "The Second Impossibility",
|
||||
freeLabel: [3]string{"Threadbare Walk", "Loose-Weave Hall", "Stitchworks Floor"},
|
||||
lockLabel: [3]string{"Seam-Behind-Seam", "The Unstitched Pocket", "Needled Recess"},
|
||||
lock: stat("INT", 17, "the geometry has a rule; find it and the shortcut is legal"),
|
||||
},
|
||||
r3gate: "The Stitchworks",
|
||||
r3build: [6]string{
|
||||
"Rows of Half-Sewn Doors", "The Needle Gallery", "Marilith Loom",
|
||||
"Echo of Belaxath", "Seam Antechamber", "Threshold of the Tear",
|
||||
},
|
||||
capstone: pgCapstone{
|
||||
label: "The Seam Fork",
|
||||
freeLabel: [3]string{"Direct Seam-Walk", "The Open Tear", "Seam Floor"},
|
||||
lockALabel: [3]string{"Sideways Step", "The Room Behind This One", "Slipped Path"},
|
||||
lockA: stat("DEX", 18, "step through the wall while it is also a door"),
|
||||
lockBLabel: [3]string{"Hairline Unreality", "The Undone Pocket", "Impossible Shortcut"},
|
||||
lockB: perc(18, "there is a place that is not here, and it is closer than the door"),
|
||||
},
|
||||
merge: "The Seam",
|
||||
approach: [5]string{
|
||||
"The Far Half Speaking", "Sewn Into the Wound", "Needle-Rain Approach", "The Inside-Out Room", "The Last Stitch",
|
||||
},
|
||||
boss: "The Seamstress",
|
||||
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(zoneUnplaceGraph())
|
||||
}
|
||||
Reference in New Issue
Block a user