mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Adv 2.0 D&D Phase 11 D4c: Tier 3 zone flavor files
New additive flavor files (zone_manor_blackspire_flavor.go,
zone_underforge_flavor.go) with elite-room intros, boss ability
callouts, and zone lore. Manor reuses RoomEntryHauntedManor from
twinbee_gm_flavor.go; Underforge had no canonical RoomEntry/BossEntry
pools yet, so both are defined in the new zone file.
Aldric Blackspire: Multiattack (life drain) / Charm / Children of the
Night / Mist Form / Phase Two
Emberlord Thyrak: Molten Strike / Forge Breath / Living Forge /
Construct Resilience / Phase Two
Wires zoneRoomEntryPool, bossEntryPool, zoneLorePool,
bossSignaturePool, and eliteRoomEntryPool to the new tier-3 pools.
Adds Tier 3 routing tests for boss-entry, elite line, lore, and
room-entry overlays.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -81,6 +81,8 @@ func zoneRoomEntryPool(zoneID ZoneID) []string {
|
||||
return append(append([]string{}, flavor.RoomEntrySunkenTemple...), flavor.RoomEntryGeneric...)
|
||||
case ZoneManorBlackspire:
|
||||
return append(append([]string{}, flavor.RoomEntryHauntedManor...), flavor.RoomEntryGeneric...)
|
||||
case ZoneUnderforge:
|
||||
return append(append([]string{}, flavor.RoomEntryUnderforge...), flavor.RoomEntryGeneric...)
|
||||
case ZoneUnderdark:
|
||||
return append(append([]string{}, flavor.RoomEntryUnderdark...), flavor.RoomEntryGeneric...)
|
||||
case ZoneDragonsLair:
|
||||
@@ -101,6 +103,10 @@ func bossEntryPool(zoneID ZoneID) []string {
|
||||
return flavor.BossEntryHollowKing
|
||||
case ZoneSunkenTemple:
|
||||
return flavor.BossEntryDreamingAboleth
|
||||
case ZoneManorBlackspire:
|
||||
return flavor.BossEntryAldricBlackspire
|
||||
case ZoneUnderforge:
|
||||
return flavor.BossEntryEmberlordThyrak
|
||||
case ZoneDragonsLair:
|
||||
return flavor.BossEntryInfernax
|
||||
case ZoneAbyssPortal:
|
||||
@@ -155,6 +161,10 @@ func zoneLorePool(zoneID ZoneID) []string {
|
||||
return append(append([]string{}, flavor.LoreLinesForestShadows...), flavor.LoreLines...)
|
||||
case ZoneSunkenTemple:
|
||||
return append(append([]string{}, flavor.LoreLinesSunkenTemple...), flavor.LoreLines...)
|
||||
case ZoneManorBlackspire:
|
||||
return append(append([]string{}, flavor.LoreLinesManorBlackspire...), flavor.LoreLines...)
|
||||
case ZoneUnderforge:
|
||||
return append(append([]string{}, flavor.LoreLinesUnderforge...), flavor.LoreLines...)
|
||||
}
|
||||
return flavor.LoreLines
|
||||
}
|
||||
@@ -172,6 +182,10 @@ func bossSignaturePool(zoneID ZoneID) []string {
|
||||
return flavor.HollowKingSignatureCallouts
|
||||
case ZoneSunkenTemple:
|
||||
return flavor.AbolethSignatureCallouts
|
||||
case ZoneManorBlackspire:
|
||||
return flavor.AldricSignatureCallouts
|
||||
case ZoneUnderforge:
|
||||
return flavor.ThyrakSignatureCallouts
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -188,6 +202,10 @@ func eliteRoomEntryPool(zoneID ZoneID) []string {
|
||||
return flavor.EliteRoomEntryForestShadows
|
||||
case ZoneSunkenTemple:
|
||||
return flavor.EliteRoomEntrySunkenTemple
|
||||
case ZoneManorBlackspire:
|
||||
return flavor.EliteRoomEntryManorBlackspire
|
||||
case ZoneUnderforge:
|
||||
return flavor.EliteRoomEntryUnderforge
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -294,6 +294,64 @@ func TestRoomEntryPool_Tier2PrependsZoneSpecific(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Phase 11 D4c — Tier 3 zone flavor file routing ──────────────────────────
|
||||
|
||||
func TestComposeBossEntry_AppendsAbilityCalloutForTier3(t *testing.T) {
|
||||
got := composeBossEntry(ZoneManorBlackspire, "run-d4c", 5)
|
||||
if !strings.Contains(got, "Aldric") {
|
||||
t.Errorf("Manor boss-entry should mention Aldric: %q", got)
|
||||
}
|
||||
if n := strings.Count(got, "🎭 **TwinBee:**"); n != 2 {
|
||||
t.Errorf("Manor boss-entry expected 2 TwinBee blocks (entry+callout), got %d:\n%s", n, got)
|
||||
}
|
||||
|
||||
got = composeBossEntry(ZoneUnderforge, "run-d4c", 5)
|
||||
if !strings.Contains(got, "Thyrak") {
|
||||
t.Errorf("Underforge boss-entry should mention Thyrak: %q", got)
|
||||
}
|
||||
if n := strings.Count(got, "🎭 **TwinBee:**"); n != 2 {
|
||||
t.Errorf("Underforge boss-entry expected 2 TwinBee blocks (entry+callout), got %d:\n%s", n, got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEliteRoomEntryLine_Tier3Routes(t *testing.T) {
|
||||
m := eliteRoomEntryLine(ZoneManorBlackspire, "run-elite-t3", 3)
|
||||
if m == "" || !strings.HasPrefix(m, "🎭 **TwinBee:**") {
|
||||
t.Errorf("Manor elite line missing/no prefix: %q", m)
|
||||
}
|
||||
u := eliteRoomEntryLine(ZoneUnderforge, "run-elite-t3", 3)
|
||||
if u == "" || !strings.HasPrefix(u, "🎭 **TwinBee:**") {
|
||||
t.Errorf("Underforge elite line missing/no prefix: %q", u)
|
||||
}
|
||||
if m == u {
|
||||
t.Errorf("Manor and Underforge elite lines collided on same salt")
|
||||
}
|
||||
}
|
||||
|
||||
func TestZoneLorePool_Tier3PrependsZoneSpecific(t *testing.T) {
|
||||
m := zoneLorePool(ZoneManorBlackspire)
|
||||
if len(m) <= len(flavor.LoreLines) {
|
||||
t.Errorf("Manor lore pool should be larger than generic; got %d vs generic %d",
|
||||
len(m), len(flavor.LoreLines))
|
||||
}
|
||||
u := zoneLorePool(ZoneUnderforge)
|
||||
if len(u) <= len(flavor.LoreLines) {
|
||||
t.Errorf("Underforge lore pool should be larger than generic; got %d vs generic %d",
|
||||
len(u), len(flavor.LoreLines))
|
||||
}
|
||||
}
|
||||
|
||||
func TestRoomEntryPool_Tier3PrependsZoneSpecific(t *testing.T) {
|
||||
m := zoneRoomEntryPool(ZoneManorBlackspire)
|
||||
if len(m) <= len(flavor.RoomEntryGeneric) {
|
||||
t.Errorf("Manor room-entry pool should overlay zone-specific lines; got %d", len(m))
|
||||
}
|
||||
u := zoneRoomEntryPool(ZoneUnderforge)
|
||||
if len(u) <= len(flavor.RoomEntryGeneric) {
|
||||
t.Errorf("Underforge room-entry pool should overlay zone-specific lines; got %d", len(u))
|
||||
}
|
||||
}
|
||||
|
||||
func TestZoneCmd_AdvanceFinalRoomBumpsMood(t *testing.T) {
|
||||
setupAuditTestDB(t)
|
||||
uid := id.UserID("@zone-mood-complete:example")
|
||||
|
||||
Reference in New Issue
Block a user