Daeseon Yoo
Back to project
·UX retro·3 min

Character-specific ultimate finishers + real fighter PNGs on select

Replaced the one generic match-end beam with six per-character signature ultimates, swapped the emoji placeholders on character-select for the real fighter PNGs under global-friendly names, and closed the 6×6 fighter sprite matrix with seokjin + yuri's pose sets.

The finale used to fire the same generic energy-beam regardless of who won, and the character-select cards still showed emoji symbols instead of the sprites we'd already shipped. This session fixed both, and finished the last 10 pose PNGs.

What

Three commits, all on 2026-06-02:

Changes

Real PNGs on character select (c05b83e). web/src/components/CharacterSelect.tsx was rendering the symbol emoji as the avatar because the old card pointed at /characters/<id>/portrait.png, which never existed. The card now loads /fighters/<id>/idle.png — the sprites already in the repo — with an onError handler that falls back to the symbol emoji, plus a per-character aura halo behind the sprite and a hover lift.

Global-friendly names (c05b83e). web/src/lib/characters.ts got an international name field with the Korean name kept as a koreanName subtitle. The mapping (id stays untouched — it's the stable key for URLs / Redis / asset paths):

Six character-specific finishers (2eff315). New web/src/components/finale/CharacterFinishers.tsx (721 LOC added) introduces a dispatcher that maps character id → a signature multi-phase finisher, swapped into MatchFinale's FinalBlowStage in place of the generic beam. Each finisher runs through the same phase gates (charge → fire → hit → fly → land):

The shared skeleton — winner sprite, loser fly, chromatic split, screen shake, the 3-wave confetti barrage, vignette — is unchanged; only the FX identity layer is per-character (web/src/components/finale/MatchFinale.tsx).

Apocalyptic generic finisher (c05b83e). Before the per-character split landed, the shared FinalBlowStage itself was rebuilt from a tame shockwave into a longer (1.9s → 2.4s), full-screen-flash, multi-layer plasma column finisher with a crater and debris swarm (web/src/components/finale/MatchFinale.tsx, ~399 lines changed).

Pose-PNG sets completed (2eff315, 2f71b59). 2eff315 carried the bora / danbi / haneul pose batches plus a regenerated taeyang set. 2f71b59 added the final 10 PNGs — seokjin and yuri, five poses each (windup / impact / hit / ko / victory) — closing every fighter's full pose set. No code change was needed; FighterSprite already picks the pose-specific PNG through its existing fallback chain.

Why

The character-select swap and the per-character finishers are both driven by direct user feedback that the finale and roster felt generic. The international-name layer is a global-launch readiness move — the Korean names were kept as heritage subtitles rather than dropped, and the stable id was deliberately left alone so nothing in URLs, Redis keys, or asset paths breaks.

Decisions

Notes