v0.5.32-dev · 2026-08-04
Countdown
Ether — the Apothecary carries mana now
New uncommon Item-kit ability: Ether restores 30% of an ally's MAXIMUM
MP — a percent, not a flat amount, so the same vial matters to a 30-MP
squire and a 100-MP summoner. Like the rest of the kit it costs no MP and
no charge time, and it never misses. It needed a new engine ability type
(RestoreMp — the parity audit had "MP restore" listed as a gap since the
audit was written): the forecast shows the exact MP that will land (capped
by what the target can hold, its own "restores N MP" wording rather than
borrowing the heal line), the log reports what actually went in, the AI
hands it to whichever neighbour is driest once someone drops below half,
and pointing it at an enemy is a spoken rejection, not a silently eaten
turn. Guard net tests/ether.rs (5). The client now also applies
MpRestored events to its mirrored units — offline the tick loop already
re-synced MP, but ONLINE that event was the only word the client ever got
and nothing was listening, so every Chakra since v0.5.10 left the unit
card's MP stale until the next full snapshot.
"Growth per level" is gone, because levelling up never existed
The website rendered a per-level stat-growth table on every job page —
read off growth_* fields that sat on the job registry from the first
commit with NO reader anywhere in combat or stat code. Units deliberately
never level inside a match: progression (EXP, Crowns, JP, job levels) is
an ACCOUNT property, and a unit's stats are per-battle rolls. So the
fields were the repo's signature failure again — dead registry data
dressed as a live mechanic by a renderer, fifth time (equipment, Movement
slot, evade, MDEF) — except this time the fix is deletion, not wiring:
the fields, the site section, the balance-CSV columns and the workbook
entries are all removed, and the JobDef struct now carries a note saying
where growth would belong if units ever do grow (the account roster).
Ultimates are one-shots
Every ultimate-rarity ability now carries exactly ONE charge per battle (Joe's rule: these matches are fast — you get one shot, if you even roll it). MP alone could never hold that line: pools run 39 to ~144 across the jobs, regen adds ~50 MP over a match, and Chakra, Murasame and crystal absorbs refill on top. The charge is immune to all of it; MP stays as the pacing for WHEN the shot is worth taking. Elixir drops from its 3-per- battle item allowance to 1 — it is the ultimate chase prize first and a consumable second.
And the attempt is the spend: a whiffed ultimate burns its charge. A lancer leaping clear of a locked Dragon Dive has out-played it, and that dodge now costs the ultimate rather than merely delaying it. The consumable kits keep their old rule (a fumbled potion is stock still in the bag). The ability menu shows the allowance on every capped row ("1/battle", then SPENT and greyed), the spec lines carry it into the Codex and roll cards, and the AI stops proposing an ultimate it has already spent — without that, a bot would burn its whole action slot on the refusal, every turn, for the rest of the match.
The death clock counts down where you can see it
A fallen unit now carries a big 3 → 2 → 1 floating over its body, popping each time the clock ticks, so both players can read at a glance how long remains before the body crystallizes — the number that decides whether a Raise is worth a turn. The digit existed before as a 28px label tucked beside the skull icon, which at board zoom was a speck. It is now unit-card sized and centered above the skull; the skull and the sinking body stay as they were.
The zoom spasm was never shadows — it was the ground fighting itself
The v0.5.31 shadow pass fixed the wide view, but zooming in still made the tiles writhe. Reproduced at close zoom and chased through every shadow setting before the real cause surfaced: since v0.5.23 the ground art has been sunk so its top came out EXACTLY coplanar with the tinted tile box under it, and two faces at the same depth z-fight — the renderer re-rolls which one wins per pixel, per frame, which reads as scratchy hatching that spasms with the camera. The surface art now sits a hair proud of the box, and the fight is gone at every zoom.
Better: the checkerboard the boards have shown since v0.5.23 was that bug — the dark box tint winning on alternate tiles. Fixing it turned the ground into one unreadable green sheet, so the checker is now drawn on purpose — a subtle dark film on alternate tiles, stable at every zoom, because a tactics board wants countable tiles. The sun also renders back faces into the shadow map now (solid boxes can't acne at any zoom) and board captures at close zoom ship in tools/shot_board.tscn, which is how this was reproduced and verified.