Two big drops on the same commit since they fell in the same review pass:

  1. UnlockPicker still rendered as a vertical 1-char-wide column even after the canvas RT-stretch fix. Root cause was deeper: every element inside the picker goes through SciFiMenuKit.CreateAnchored, which used the unsafe pattern: new GameObject(name) // plain Transform SetParent(parent, false) // sometimes auto-RT, sometimes not AddComponent() // returns existing or new

    When the result is “new RT with default 100x100 size”, subsequent anchor changes don’t reflow the rect — so the panel ends up tiny and all children render in a thin vertical strip.

    Fix: construct WITH RectTransform from the start using new GameObject(name, typeof(RectTransform)). Also explicitly zero anchoredPosition. Belt-and-suspenders.

    This is a root-cause fix for the whole kit — every popup that uses SciFiMenuKit.CreateAnchored gets the safer construction now, so we shouldn’t see the vertical-text bug anywhere ever again.

  2. Pre-boss hype screen (new feature). When a player clicks a Boss node on the map, instead of jumping straight to combat, a full- screen reveal screen plays first:

    • Class+act-specific raid art (9 images: 3 classes x 3 bosses) generated via Gemini 3 Pro Image and saved to Resources/BossArt/{class}_{boss}.png
    • Lower-third dark stripe with line-by-line type-on text
    • First line: class hook (e.g. “Your vibroblade hums to life — the first sound in a silent server farm.”)
    • Lines 2-5: act narrative escalating tension Act 1 (Sentinel Prime): AI escaping containment Act 2 (The Nexus): AI has spread, humanity desperate Act 3 (The Singularity): reality-warping final showdown
    • Boss name banner at the top: “ACT II / THE NEXUS” etc.
    • Click anywhere = advance to next line (fast-forward current line)
    • First-time players see the whole reveal; players who’ve already beaten that act’s boss get full click-to-skip (advances all lines instantly + dismisses on second click)

    Implementation:

    • BossHypeScreen.cs (new) — self-contained UI MonoBehaviour built with explicit RectTransform construction (no SciFiMenuKit dependency), Canvas at sortingOrder 500 above everything.
    • NodeMapUI.OnNodeClicked: split the Boss case out of the regular Combat path, route through BossHypeScreen.Show(class, act, onComplete) — onComplete then transitions to Combat scene.
    • PostCombatHandler: stamps PlayerPrefs flag boss_beaten_act{N}=1 when a Boss node is cleared, BEFORE incrementing currentAct, so BossHypeScreen can detect “this player has beaten this boss before” and enable click-to-skip.
    • tools/generate_boss_art.py — idempotent generator for the 9 images. Skip-if-exists, ASCII-only logging, 3-attempt retry.

Co-Authored-By: Claude Opus 4.7 (1M context) [email protected]


Commit 6628527 by astafford8488.