Hero panel system rolls out across map, party, and fight (2.1.3)
2026-04-30
HeroPanel is now a shared component family rather than five copies of similar UI. HeroPanelTrio handles fixed three-slot rows (fight field, rest popup); HeroPanelRow handles variable rows with multi-select (party selector, hero strip overlay); HeroStripOverlay drops the strip on top of the world map and the four base-menu locations (Ormron Street, Arena, Library, Bazar). Same skewed slot polygon, same selected scale, same stat-square row across all of them. Tutorial-added heroes show up reactively because the overlay reads playerObject.heroes directly.
Party selector got a real multi-select. Every party slot can carry the full selected treatment — 1.15× scale, purple border, sheen — at the same time. Default scale dialed down (0.85 default, 0.98 selected) so three adjacent selected panels don't bleed into each other. Stat squares can shrink to 3px width so 12-square energy bars still fit in the narrower 7-slot row. The selector also accepts a generic status field (icon + label) that takes precedence over the dead badge or activity tag.
Base popups (rest, daily rewards, party selector) now share the starfield backdrop the Aspects screen has had since the school rename. Info chip alpha bumped from 15% to 50% so gold/purple chips stay legible on the dark surface. Scene parallax got extracted into shared utilities — the layer translate and tile-count math is parameterised by parallaxFactor (0 = viewport-locked, 1 = scene-attached), and the mid layer is now factor 1.0 so it tracks the world coordinates of triggers and hero positions exactly instead of drifting.
2.1.2 quick-fix on the way through: an account-deletion bug introduced by the sign-in migration is resolved. A small balance bump came in alongside — Dryads tear starting amount went from 30 to 150 and the day-1 daily reward from 30 to 45, with all the player-state and reward unit tests updated to match.