From b0738e8e0a99d0607f23165f596260a4013c3627 Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Sat, 9 May 2026 07:49:04 -0700 Subject: [PATCH] Adv 2.0 Phase L2 step 2: ZoneArena synthetic ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds ZoneArena to the ZoneID enum so the upcoming arena boss path can route renderBossOutcome's twinBeeLine calls without inventing a parallel flavor system. Synthetic by design — never registered via registerZone, so !zone enter arena is unreachable and allZones() / registry tests are unaffected. Mood pools (Nat20/Nat1/BossDeath/PlayerDeath) are already zone-agnostic in pickPool, so ZoneArena falls through to the generic defaults at zero cost. Phase-two and boss-entry pools default to nil/generic too — arena-specific overrides land alongside the bestiary work in step 3 only if existing flavor doesn't read right. Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/plugin/dnd_zone.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/plugin/dnd_zone.go b/internal/plugin/dnd_zone.go index f72a15e..31a4cc3 100644 --- a/internal/plugin/dnd_zone.go +++ b/internal/plugin/dnd_zone.go @@ -31,6 +31,15 @@ const ( ZoneFeywildCrossing ZoneID = "feywild_crossing" ZoneDragonsLair ZoneID = "dragons_lair" ZoneAbyssPortal ZoneID = "abyss_portal" + + // ZoneArena is a synthetic ID — never registered via registerZone, so + // !zone enter can't reach it. It exists to route renderBossOutcome's + // twinBeeLine calls when an arena fight (resolveArenaBoss, post-L2) + // reuses the boss-shaped narrative path. The Nat20/Nat1/BossDeath/ + // PlayerDeath pools are generic, so ZoneArena falls through the + // existing zoneRoomEntryPool / bossEntryPool / zoneLorePool / + // bossPhaseTwoPool switches to the right defaults. + ZoneArena ZoneID = "arena" ) // ZoneTier — 1..5. Player level ranges per design doc §2.