Patch Notes · Dispatches from the Dungeon

The Chronicle

What we've built, what we've broken, what we've quietly buried on floor 4. Newest first.

◀Page 6 of 11 · v0.74.0 — v0.66.0▶
v0.74.0#May 5, 2026Polish

Enemies Wind Up, Flinch, And Generally Show They're Alive

Sprint 71 wired up per-direction idle and walk for every enemy in the bestiary. The attack and hurt animations also got generated — they just never played, because no codepath actually called them. That's fixed now.

Hurt flash on every hit

Land a melee hit, an arrow, a charge dash, a fireball, or even splash damage from an AoE — the enemy briefly snaps into the directional hurt pose. ~180ms, just long enough to read as flinch without holding too long. Stacks across all damage sources because every enemy.hp -= site routes through the same helper.

Attack windup before each strike

Ranged enemies now visibly wind up before firing. Cultists, harpies, necromancers, fire elementals, plaguebearers — they all face the target and play the attack anim during the windup window, so you can see the strike coming. Same for melee enemies: when one closes in to hit you, it faces you and plays its attack anim instead of just sliding into your hitbox while playing its walk loop.

The priority is hurt > attack > the AI's normal walk/idle pick, so hitting a windup mid-swing visibly interrupts it.

v0.73.0#May 5, 2026Polish

Ten Slots, A Memorial Wall, And A Migration Prompt That Takes No For An Answer

A roster pass on the character-select screen.

Ten slots instead of five

The cap doubled. More room for class experiments, daily-tower attempts, and the inevitable "what if I just made one more archer."

Dead heroes don't count anymore

Hardcore characters who fell in the dungeon used to occupy a slot forever — your roster filled up with tombstones and you had to delete beloved corpses to make room. Now fallen hardcore heroes move to a separate Memorial section under the active list. They don't count toward the slot cap. Active runs only fight for the ten slots.

(Resurrection is, in the loose sense, a future possibility.)

"Main" name fix, take two

Brand-new characters created via legacy paths used to land in the DB named "Main." If you saw a roster full of identical "MAIN" entries, that's why. The fallback now writes "Hero" — same default as the proper character-creation flow uses. Existing rows already named "Main" stay until you rename them (double-click the slot).

Migration prompt won't haunt you

If you played as a guest, then logged in, the screen would offer to import your local characters into your account. Decline once and the prompt would reappear on every visit. Now declining sticks — we remember the choice and don't ask again.

v0.72.0#May 4, 2026Polish

Projectiles Pick a Side, Tower Numbers Get a Microscope

Two unrelated polish passes that fit in one shipment.

Class-tinted projectiles

Every arrow / bolt / volley spread that leaves the player's spritesheet now wears the class colour. Mage shoots fireball red-orange, archer shoots forest green, warrior shoots steel grey. Light shots, charged shots, archer's volley — all four spawn paths flow through the same tint helper, so the visual signature is consistent across the whole class kit.

Same procedural arrow texture, just tinted on top — costs nothing on the rendering side and reads cleanly against every dungeon floor. Old hard-coded gold (charged) and lavender (mage bolt) tints are gone; class colour wins everywhere.

Tower funnel — the elite frontier

The Hidden Tower analytics card used to show three numbers (runs, deaths, forfeits). It now also surfaces:

  • Unique climbers (30d) — distinct users who entered, separate from raw run count.
  • Depth percentiles P50 / P90 / P99 — the median floor, the top-10% floor, and the elite-1% floor. P99 reads "where the hardcore live"; one freak run can pump max_floor but it can't budge P99 by much.
  • Average runs per climber — quick read on whether the tower attracts dedicated grinders (>1.5×) or broad one-and-done exposure (≈1.0).

All five numbers come from one extra percentile_cont call in the existing tower query. No new tables, no new indices.

v0.71.0#May 4, 2026Polish

Enemies Finally Look Where They're Going

Every enemy in the bestiary has had a four-direction sprite sheet since Sprint 25. The code never used it — every enemy played the "down" row regardless of which way they were actually moving. Slimes chasing left looked like they were sliding sideways. Goblins sprinting up looked like they were moonwalking down.

Enemies now track facing from their velocity vector and play the matching animation row. Down, up, left, right — same four cardinals the player uses. Idle, walk, and (when implemented) attack each have the directional variant; death stays direction-less since the collapse reads the same regardless. Bosses with the bigger 64×64 sheet share the same row layout, so they get it for free.

When an enemy stops moving they hold their last facing, so a slime that just chased you and now stares from a metre away keeps looking at you instead of snapping back to "down."

Mostly cosmetic, but it's the kind of thing you don't notice when it's right and you can't unsee once you do.

v0.70.0#May 4, 2026Polish

Mobile Gets the Special Ability Button It Was Missing

If you'd been playing on a phone and wondering why mages had a fireball you could never throw — yeah, the on-screen control cluster just had ATK / SHOOT / GRAB / HEAL plus the dash pill. The class ability ([G] on keyboard) had no mobile button at all. You could unlock Shield Bash / Volley / Fireball in the skill tree and then not have a way to fire it.

A new amber button now sits stacked above the SHOOT button on the right side of the control cluster, mirroring the [G] keybind. Tap to fire your class ability. Same gates as desktop — silent if you haven't unlocked the ability node, silent on cooldown.

The cluster gained a column but the existing buttons stayed in place, so muscle memory carries over.

v0.69.0#May 4, 2026Polish

Heavy Shots Aim Themselves, Dead Archers Stop Shouting, And A Few Loose Ends

A grab bag of small things that all add up to "the game stops doing the obviously wrong thing."

Charged shots aim like the regular shot does

The held-attack version of the archer's charged shot and the mage's channeled bolt were still flying in 4-way cardinals — left, right, up, down. Light tap shots got auto-aim back in v0.65; the heavy versions were left behind. Now they use the same logic: cursor angle on mouse-and-keyboard, closest enemy on touch.

Dead ranged enemies stop yelling "!"

When a cultist or imp died mid-windup, the orange warning icon floating above their head stayed in the dungeon as a ghost decoration. The kill path didn't tear it down. Now it gets cleaned up the moment the enemy dies, regardless of which AI state they were in.

Privacy + Terms speak Polish

Both pages used to be EN-only hardcoded JSX. They now load from content/legal/<page>.<locale>.md, render through ReactMarkdown, and swap based on the player's language. PL versions ship today.

Heroes section reads from markdown

The /lore page's "The Three Who Still Descend" block had the hero prose hardcoded next to inline-SVG portraits. Bio + name + role + base stats now live in content/heroes/<class>.<locale>.md so editing a hero's flavour doesn't mean opening JSX. Portraits stay in code (they're SVG, not text).

Five new achievements

  • Among the Clouds — reach floor 100 in the Hidden Tower
  • He Came, He Went — complete the Mysterious Stranger's quest
  • Identifier Apprentice — identify 25 mystery items
  • Merchant's Best Friend — sell 50 items
  • (the fifth was already there waiting for the wiring catch-up)
v0.68.0#May 4, 2026Feature

Daily Tower Challenge — Everyone Climbs the Same Tower Today

The Hidden Tower has a new toggle.

What it is

Walk up to the Hidden Tower gate, press E, and the popover now shows a "Daily Challenge" row above Difficulty. Flip it on and:

  • The run uses today's seed instead of a fresh random one. Every player who hits the Daily this UTC day gets the same tower — identical floor layouts, identical mini-bosses, identical loot rolls, all the way up.
  • Difficulty and Hardcore lock to Hard + Hardcore. Daily is meant to be the sharp version of the climb.
  • The card lights up with the ★ DAILY ribbon and the CTA reads "Run Daily" instead of "Enter."

Why it matters

The Tower already has a depth leaderboard, but until now your number was meaningless next to anyone else's — different seed, different luck, different difficulty. Daily collapses all of that to a single shared dungeon for the day, so the leaderboard becomes a real ladder. Filter the Tower depth leaderboard with ?daily=true to see only today's attempts.

What stays the same

  • The toggle is off by default. Casual climbers keep the random seed they're used to.
  • Tower key still required. Daily isn't a cheat past the gate.
  • A new tower rolls every UTC midnight.
v0.67.1#May 4, 2026Fix

Character Names Stop Turning Into "Main"

If you logged in and noticed every character on the Continue screen was suddenly named "Main" — yeah, that was us. The autosave route took the character's name as optional and, when the autosave didn't include one (it never did), filled the blank with "Main" and wrote that back to the database. One autosave tick was enough to overwrite whatever name the character had.

Now the route looks up the row's existing name when the caller doesn't supply one, and the conflict-update path only writes a name when an explicit one was passed. Renames stick. Autosaves don't touch the name field anymore.

If your characters already got renamed to "Main", their original names are gone — there's no backup to recover from. Double-click a slot on the Continue screen to rename it back.

v0.67.0#May 4, 2026Polish

One Hub Map, A Stranger Who Actually Leaves, And Mystery Gear That Stays Mysterious

A handful of fixes that fall into the "of course it should work like this" bucket.

One minimap, whichever floor you're on

The hub used to show two minimaps at once — the actual hub map you'd expect, plus an empty black box where the dungeon minimap would normally live. The dungeon minimap was always mounted; on the overworld it just cleared its canvas to black, which read as "second minimap." It now hides cleanly the moment you step out of a dungeon and reappears the moment you step back in. One minimap, always showing the floor you're standing on.

The Mysterious Stranger only visits once

He was supposed to be mysterious. He kept showing up. Now once you've claimed his quest reward, he packs up his hood and his dagger and doesn't reappear in the hub for that character — that's it, that was the encounter. New characters still meet him fresh.

Equipped gear can't be identified

Identify tab used to list your equipped items alongside everything in the bag, so you could pay 50g to identify the sword you were already swinging. Equipped gear is now hidden from the identify list with a short hint at the top — unequip first, then identify. Companion to the rule below.

Unidentified gear gives basic stats only

Equipping a mystery weapon used to hand you the full hidden stat block, so a 50g identify visit was a curiosity tax rather than a mechanic. Now your character "doesn't know how to use it yet" — unidentified weapons give a baseline (+3 ATK melee, +2 ATK ranged), unidentified armor gives a small HP cushion, unidentified accessories sit inert. Identify the thing and the real stats come online.

v0.66.0#May 4, 2026Polish

Shop Gets Filters and the Identify Toast Stops Lying

Two small fixes for the shop trip — one that hits you the moment you walk in with a fat bag, and one you only notice when the merchant has a lot to identify.

Filter and sort in Sell + Identify

Sell tab and Identify tab now wear the same filter pills + sort cycle as the bag — All, Weapons, Gear, Potions, Keys plus a sort toggle that cycles default → rarity → type → name. If you walked into the shop with a stack of mystery weapons and only wanted to identify those, scoping the list now takes one click instead of squinting through everything.

Buy keeps its shelf layout (potions, gear, specials) — there's not enough up there to need a filter, and the shelves already group what matters.

Identify toast stays visible across batches

The toast that pops up after each identify ("you got X — Rare — +stats") was anchored to a single CSS animation. The first identify started the 6-second clock, and the toast quietly faded to invisible when that clock ran out — even if you'd just paid to identify item number five. The text was technically still there, just at zero opacity, so subsequent reveals looked like nothing happened.

The toast now resets cleanly on every identify. Pay for ten in a row and the toast still shows each one, full duration, all the way through the batch.

▼ Older dispatches · Page 7