mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Long expeditions D1-d: T4 zones to new 28-34 room band
Both T4 zones follow the D1-a/b/c pattern: extend the graph so the longest entry→boss walk lands in band, keep the zone's authored topology intact. underdark (T4): 10 → 46 nodes, longest 30 (band 28-34) feywild_crossing (T4): 9 → 53 nodes, longest 30 (band 28-34) Topology preserved per zone: - Underdark: 4-region authoring intact (every node carries a valid RegionID); 3-way fork1 (drow R2 / illithid R3 / deep_chasm R1) with LockNone / LockPerception / LockStatCheck CON; deep_chasm intentionally stays R1; all three arms converge at the R4 throne_approach merge. Adds the missing Trap anchor (Collapsed Arch) in the R1 preamble. - Feywild Crossing: woven forks intact — hag_circle still has two incoming edges (one per first-stage path), time_eddy stays grove-exclusive, illusion_garden stays marsh-exclusive, fork1 remains CHA-vs-Perception with no LockNone option. Adds the missing Trap anchor (Cursed Thicket) and a fae_court MERGE so the three second-stage endings converge into one final boss approach instead of triplicating it. MinRooms/MaxRooms re-pitched 8-10 → 28-34 so the dice fallback also lands in band for any future graphless variant. T5 zones (dragons_lair, abyss_portal) deferred to D1-e — those need a RegionID backfill on top of the length extension since their regionsByZone entries are not currently honored by their graphs.
This commit is contained in:
@@ -7,8 +7,18 @@ func TestFeywildCrossingGraph_Registered(t *testing.T) {
|
||||
if !ok {
|
||||
t.Fatal("zoneFeywildCrossingGraph not registered")
|
||||
}
|
||||
if len(g.Nodes) != 9 {
|
||||
t.Errorf("nodes = %d, want 9", len(g.Nodes))
|
||||
// Long-expedition D1-d widened this zone from 9 → 53 nodes so the
|
||||
// longest entry→boss walk lands in the T4 [28,34] traversal band.
|
||||
if len(g.Nodes) != 53 {
|
||||
t.Errorf("nodes = %d, want 53", len(g.Nodes))
|
||||
}
|
||||
}
|
||||
|
||||
func TestFeywildCrossingGraph_LongestPathInBand(t *testing.T) {
|
||||
g := zoneFeywildCrossingGraph()
|
||||
got := graphLongestPath(g)
|
||||
if got < 28 || got > 34 {
|
||||
t.Errorf("longest path = %d, want in T4 band [28,34]", got)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,3 +83,38 @@ func TestFeywildCrossingGraph_FirstCHALock(t *testing.T) {
|
||||
t.Error("expected at least one LockStatCheck CHA edge — Feywild theme")
|
||||
}
|
||||
}
|
||||
|
||||
// TestFeywildCrossingGraph_TrapAnchor verifies D1-d added the missing
|
||||
// Trap node. Original G8f graph had elite/secret but no trap.
|
||||
func TestFeywildCrossingGraph_TrapAnchor(t *testing.T) {
|
||||
g := zoneFeywildCrossingGraph()
|
||||
var trapCount int
|
||||
for _, n := range g.Nodes {
|
||||
if n.Kind == NodeKindTrap {
|
||||
trapCount++
|
||||
}
|
||||
}
|
||||
if trapCount != 1 {
|
||||
t.Errorf("trap nodes = %d, want 1", trapCount)
|
||||
}
|
||||
}
|
||||
|
||||
// TestFeywildCrossingGraph_FaeCourtMerge verifies all three second-
|
||||
// stage endings (hag_circle, time_eddy, illusion_garden) converge at
|
||||
// the fae_court merge before the final boss approach. D1-d added this
|
||||
// merge to avoid triplicating the long pre-boss walk.
|
||||
func TestFeywildCrossingGraph_FaeCourtMerge(t *testing.T) {
|
||||
g := zoneFeywildCrossingGraph()
|
||||
for _, ending := range []string{
|
||||
"feywild_crossing.hag_circle",
|
||||
"feywild_crossing.time_eddy",
|
||||
"feywild_crossing.illusion_garden",
|
||||
} {
|
||||
if !reachable(g, ending, "feywild_crossing.fae_court") {
|
||||
t.Errorf("%s does not reach fae_court merge", ending)
|
||||
}
|
||||
}
|
||||
if !reachable(g, "feywild_crossing.fae_court", "feywild_crossing.boss") {
|
||||
t.Error("fae_court → boss path missing")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user