mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-16 17:02:42 +00:00
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.
78 lines
3.4 KiB
Go
78 lines
3.4 KiB
Go
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())
|
|
}
|