The three boss types in this game used to fight like every other
mob. Bigger HP, bigger numbers, same chase-and-melee AI. The Stone
Golem couldn't slam, the Trialmaster couldn't summon phantom blades,
and the Lich didn't even cast a fireball. This week each boss
becomes its own dance.
Every boss now has 2-3 special attacks, every special is telegraphed
600-1500ms before impact (so a dash window exists), and at half HP
each one transitions into a phase 2 with extra moves and a faster
tempo. There's a Souls-like HP banner across the bottom of the
screen with the boss's name, a damage smear that flashes orange
when you take a chunk off, and a phase pip that lights red when
the boss enrages. The fight gets an intro stinger + camera shake +
zoom punch when you walk in, and a death cinematic with white flash,
slow-mo, gold rain, and a guaranteed reward chest when it falls.
The roster:
The Stone Golem (Forest, Ruined, Hellpit) ground-slams a 96px
ring around itself, lobs boulders that arc across the room, and at
half HP starts erupting earth-spike lines that walk toward you in
sequence. The slam has the longest telegraph in the game — a
growing red ring you can sprint out of if you read it.
The Trialmaster (Crypt, Void) phases between three quick
spectral slashes that fan out 120° each, summons four phantom blades
that home onto your last position, and at half HP starts vanishing
into purple smoke and reappearing behind you for a heavy strike.
The teleport has no telegraph at the destination — only the vanish
puff, so you have to predict.
The Lich (Crypt, Void, Hellpit) fans five fireballs in a 90°
arc, charges a death beam that takes 1.5s to fire and stretches
across the room with a 3s burn DoT on hit, and at half HP starts
summoning skeleton minions in pairs (max 4 on the field). The
Death Beam telegraph is the most dangerous — line of red, the
longest windup, but also the most damage if you eat it.
The hub got a save/resume fix too. If you save mid-run on floor 1
and come back, you can now use the stairs-up to drop your run and
return to the overworld. Previously you were stuck in the dungeon
until you cleared the boss or died. The new prompt reads
"[E] Return to Overworld" — your XP, gold, and gear stay; only
the dungeon progress is lost.
Achievement haul: ten new boss-themed unlocks, including
Trinity Slayer (kill all three boss types on one character),
Boss Master (10 cumulative kills), Untouchable (zero damage from
specials in a fight), Lightning Round (60-second clear), Dance of
Blades (5 phantom-blade dodges in a Trialmaster fight),
Earth-Shaker Survivor (3 ground slams dodged in a Golem fight),
Calm in the Storm (zero damage during phase 2), and per-boss
slayer entries.
For dev / play-testing, three boss-arena URLs let you skip the
overworld and drop straight into a 1v1 with the chosen boss:
/game?bossTest=golem
/game?bossTest=trial
/game?bossTest=lich
Single floor, no minor enemies, full-HP boss in the center room.
First load is slow (~15s — the engine pre-fetches all 21 boss SFX
- 4 BGM tracks + 13 telegraph/special VFX); subsequent fights in
the same session boot instantly.
What landed
BossController + telegraph helpers + per-boss configs —
new lib/phaser/bosses/ module. Controller handles weighted-
random scheduling with cooldowns, phase transition at <50% HP,
mobile windup ×1.3 multiplier, host-authoritative MP scheduling.
- Boss HP HUD banner —
BossHpBar mounts on boss-engaged
via Phaser registry polling (chosen over event-emitter binding
to dodge a HMR/StrictMode race that was eating the one-shot
setdata emit), three-layer fill composite, lag-bar trails 700ms,
damage smear flash, phase pip pulse.
- Per-boss specials wired — Golem ground slam / boulder /
earth spike, Trialmaster triple slash / phantom volley /
teleport strike, Lich fireball volley / death beam / summon
skeletons. Damage paths reuse the regular dodge + class
reduction pipeline.
- Encounter cinematic — camera shake + zoom pulse + intro
stinger on engage, BGM crossfade to per-boss theme, boss-room
cleanup despawns minor enemies on engagement.
- Phase 2 transition — sprite tint shift gold→red, ember aura
emitter trailing the boss, BGM rate ×1.15, dramatic synth
swell stinger.
- Death cinematic — white flash, 600ms screen shake, slow-mo
(timeScale 0.3) for 800ms, 8-frame radial particle burst,
24-coin gold rain, reward chest spawn 1.2s delay. Skipable via
Space/Enter/E/click.
- 10 new achievements —
boss_trinity boss_master
untouchable_boss speedrun_boss dance_of_blades
earth_shaker_survivor phase2_no_damage plus per-boss
slayer trio (already existed). EN+PL i18n.
- Boss test arena URLs —
?bossTest=<id> skips menu /
character select / overworld, sets warrior default, picks
matching themed dungeon for theme + bestiary, forces floor 0
as the boss floor, skips minor enemies.
- Floor-0 stairs-up exits to overworld —
[E] Return to Overworld prompt + endActiveRun() flush + scene start.
The hand-built escape hatch for "I loaded a save and just
want to back out of this run."
- Pack A — Boss Telegraphs & Specials VFX (9 sheets,
public/assets/vfx/{telegraphs,specials,status}/)
- Pack B — Boss HP HUD Banner (7 layers,
public/assets/hud/boss/)
- Pack C — Boss Encounter Cinematic (6 assets,
public/assets/vfx/boss_death/ + public/assets/props/)
- 4 Suno BGM tracks + 21 SFX files
(
public/assets/audio/bgm/ + public/assets/audio/sfx/boss/)
Bugs killed
- Boss specials passing through walls — projectiles (boulder,
fireball, phantom blade) had no wall collider; line/cone damage
(death beam, earth spike, triple slash) used pure geometry with
no LOS check. Projectiles now collide+destroy on
wallGroup /
doorGroup, line/cone damage uses a Bresenham raycast over the
tile grid before applying.
- Boss HP HUD never appearing — Phaser's
setdata-<key> is a
one-shot emit on first set; React Strict Mode + HMR mount/unmount
cycles meant our listener bound after the registry was already
populated, missing the event. Replaced event-emitter subscription
with 100ms polling of registry.get — bulletproof but a few
cycles slower; latency invisible to the player.
- Boss test arena spawning random mob enemies —
spawnEnemies and loadMap had local isBossLevel calculations
that didn't see the bossTestMode override (only the helper did).
Routed both through isCurrentFloorBossLevel().
- Floor-0 save softlock — saving on floor 1 (display) of a
themed dungeon and reloading dropped the player back at floor 0
with no way to leave: stairs-up was gated
currentFloor > 0,
stairs-down only progresses deeper. Fixed via the new floor-0
exit-to-overworld path above.