Skip to content
Shattered Crowns

v1.4.11-beta · 2026-08-13

Armistice

A truce for the battle neither side can win, the way back in after a crash, laurels that pop the moment you earn them, and a body-paint language for every turn-stealing status. MP regen is gone — mana is played for now, not granted by the clock. Underneath: counters and mana drains that finally emit real events, a WARDS panel on the unit sheet, bots that walk the real route up a rooftop stair, and the forensic harness that proved the lot — 6,600+ audited matches and 190,000+ damage events reconciled across the passes, ending on a 5,000-battle gate with zero findings.

Call a truce (draws exist now)

  • From turn 50, every player holds a ⚔ TRUCE button in the battle top bar. If at least one player on EACH side presses it, the battle ends as a DRAW — a TRUCE banner instead of VICTORY or DEFEAT, no crown on the results board, base-rate spoils for both sides, and neither a win nor a loss on anyone's record. Win streaks survive a truce too.
  • Mutual consent is the whole design. Your call is a standing offer the other side can see — their button becomes ACCEPT TRUCE and the battle log names who asked. Nobody can impose a draw, nobody can withdraw an offer once made, and declining costs nothing: a side that thinks it is winning simply keeps playing.
  • Bots have no pride. Offline — and online for any side with no human seats — the truce completes the moment you ask.
  • Born from the 5,000-battle audit's rarest find: two teams whose healing genuinely out-paces each other's damage can fight forever. Now they can also agree to stop.

Rejoin battle

  • A crashed client can come back. The server has always held a dropped player's seat for the whole match — same token, same seat, any time — but only a client that never restarted could use it. The client now stashes the way back in (user://live_match.cfg) the moment an online match starts, and the main menu checks it on boot: if your match is still running and your seat is waiting, a gold ⟳ REJOIN BATTLE button appears at the top of the menu. One press and you're back on the board mid-battle, exactly where the bots were holding your line.
  • The button never lies. Before it appears, the client asks the server (POST /api/match_status) whether that match is still live and the seat still yours. A match that ended while you were gone retires the stash silently — no button that bounces.
  • Rejoining resyncs, it doesn't re-open. A cross-process rejoin lands as a mid-match resync: no second roll ceremony, no entrance march, no BATTLE COMMENCES banner played into the middle of a live fight.
  • The in-session auto-reconnect (5 tries over ~10s with the HUD banner) is unchanged — this covers the restarts that path could never reach, including "the retries ran out and it bailed to the menu": the menu now offers the way back instead of shrugging.

The drop guard

  • Abandoning matches now has a memory. When a real match (two or more human seats) settles, every seated account is stamped: still disconnected at the end = an abandon, finished connected = a clean record. A mid-match blip that reconnected — or rejoined after a crash — is automatically washed; only players who never came back are counted. Practice against bots never counts.
  • Three abandons in your last ten real matches locks quickmatch — 15 minutes at first, doubling with each further abandon while your record stays bad (capped at 4 hours). The queue refusal says how long and why. Finishing the matches you start pushes old abandons out of the window, which is also how the escalation cools back down.
  • Friend lobbies stay open. The lock guards strangers in the queue — a host who invites you has chosen to; that consent is theirs to give.
  • Guests can't be tracked (no account) and aren't gated — a guest seat also earns nothing and is never rated, so the queue already treats it as the lowest-stakes seat in the game.

Laurels unlock at the moment, not the morgue

  • The banner lands ON the third KO. Online matches now announce a laurel the instant its requirement is met: a gold LAUREL UNLOCKED banner for the earner (name, the N/N requirement line, the bounty waiting at the spoils, any regalia it unlocks), a battle-log line for everyone in the room, and the crystal chime. The counts were always live — only the evaluation waited for the results screen.
  • The reward shows its face. When the laurel unlocks a TITLE, the banner draws the emblem itself between LAUREL UNLOCKED and the name — the same sprite that will float over your champion — not just the title's name in text. Non-title regalia (halos are color rings, not sprites) keeps the "unlocks …" text line.
  • The banner is a promise, not a payment. The authoritative award still settles at match end (bounty, cosmetic, ledger line), so the SPOILS screen repeats it as the permanent record and nothing can be paid twice. Anything that depends on the match's OUTCOME (Without a Scratch, the win-count gates landing on this very win, every standing laurel) stays a results-screen reveal, because mid-match it simply isn't true yet.
  • Turn 4 means turn 4. A deed done early pops the moment it happens — no waiting for the match to "count" — and settlement keeps that promise even if the match ends short. The under-10-turns gate still zeroes everything repeatable (match EXP/Crowns/JP and the lifetime deed accumulators); a one-time laurel has nothing to farm, so it is exempt.
  • Once per account, ever. A laurel you already hold can never pop again, in this match or any other — the same held-laurel rule that makes settlement pay each bounty exactly once.
  • Offline practice still earns nothing, as ever — laurels live on the server's accounts, so the banner is an online moment.

The battle-1 review batch (four fixes from one reconciled log)

  • A begins-with Reraise no longer expires unspent — the perk's status now lasts until it fires, and the healer's cast keeps (and finally states) its 3-turn window.
  • Immunity says IMMUNE. A Ribbon shrugging off Gravity Well used to eat the cast in total silence; now StatusBlocked reaches the log and an IMMUNE popup slides where the damage number would rise. A blocked always-on perk states the standoff once, not every turn.
  • Kingsworn finally feeds its own blade — Strengthen reaches physical damage off the weapon's element, in the forecast, the log and the AI's own valuations.
  • The match-log roster prints a PASSIVES line (R/S/M by name), so Concentrate no longer has to be inferred from five recomputed hit chances.

Every hidden number gets an event (the counter/MP contract)

  • Counters hit like attacks now. A Chakra Counter or Arrow Guard blow used to carry its damage only inside the reaction event — no number on the board, no way to audit the math. Every counter is now a real damage event: a popup where the blow lands, a line the log can check against itself. (The narrator's "counters for N" line became announcement-only, since the damage event beside it owns the number.)
  • MP never moves silently anymore. Mana Shield's spend, both halves of an Absorb MP transfer, and a drain victim's loss all emit events — before this, mana_leech could empty a 35-MP pool while announcing only the caster's "+5".
  • Mana drains cap at 20, taken at the cast: a 12-MP pool yields 12, never a flat 20, the caster gains only what actually moved, and the forecast, tooltip and resolver all read the same constant.

The unit sheet answers "what CAN'T be done to them"

  • Right-click's unit sheet gains a WARDS row — every immunity the unit's rolled gear grants, unioned across slots — and G rows for gear-granted passives with their descriptions, read off the same perk data the reveal card ships. A Ribbon'd target now says so before you spend the cast finding out.

The forensic audit harness (how all of the above was found)

  • Plays complete AI-vs-AI matches on the production path and RECONCILES everything: every damage event against its own stated factors, every HP/MP ledger against the turn snapshots. First run caught two display-contract lies (Vehemence claimed on magic, Backstab's ×1.5 omitted) and four event-model gaps — the counter/MP work above closed all four, under a dissector that now flags any unevented counter as a regression.
  • The 100-battle pass: 3,322 of 3,322 damage events reconcile, zero findings. Every anomaly investigated decoded to the engine being right (absorbs are their own HP-went-up event; a Break art shrinks max pools mid-match and regen respects the new max). First at-scale live verification of reflected spells, gear destruction, 201 evented counters, 163 capped drains, until-spent Reraise gear beside 3-turn cast Reraises, and the backstab factor on a live crit.

The status paints the body (read the board at a glance)

  • Every status that skips a unit's turn or takes it over now colours the whole character, loudly enough to read from across the board on the 45-second clock: Petrify is a stone statue, frozen mid-pose. Stop is a dark-golden statue — the two statuses that pull a unit out of time are the two statues, told apart by hue. Sleep washes pale butter-yellow (still breathing — only stone and stopped time hold still). Charm is unmistakably pink, Berserk deep red, Confuse light purple beside Undead's dark-purple pallor — the altered-mind family. Toad is bright green and squashed, Poison a dark frog-green body, Regen a soft mint breath, and Oil drenches the unit head-to-toe in a slick dark sheen a fire caster can spot at a glance.
  • The tint vanishes the instant the status breaks — Esuna a statue, break a charm with an ally's blow, shake a sleeper awake — through the same repaint that applied it, so the body can never claim a condition the unit no longer has. A charmed undead paints pink; the blow that frees them hands the body back to purple.

Mana is played for now — MP regen is OFF

  • The free +5 MP every turn is gone. Recovery is a build choice: crystals restore in full, Ether pours, Move-MP Up pays every march, Ki Stride trickles, Absorb MP and Mana Leech take it from somebody else. Measured across 20,000 battles before shipping: match length and draw rates unchanged — the monk's free Chakra loop was the main thing the allowance was subsidising.
  • Turning it off caught Elixir red-handed: with pools genuinely sitting at 0 for the first time, the audit saw Elixir restore a full mana pool in total silence — its HP half had been honest since v0.5.15 while the MP half never emitted a thing. Both halves speak now.

The 500-battle hunt (three bugs too rare for any smaller net)

  • A petrified unit could freeze the entire match, forever. Once a statue drifted to a full CT bar, the scheduler kept asking it to act, it never could, and nobody on either side ever got another turn — 2 matches in 500 locked exactly there. The clock now flows past anything that cannot take the turn.
  • Healing an undead unit hurt them in silence at six different places — a Ki Stride monk in a Cursed Ring bled on every march, and one undead mystic was seared by its own Life Leech siphon with nothing in the log but the blow it dealt. Every heal now speaks its outcome whichever way it lands, and the log says "SEARED by the blessing" instead of "recovers −3 HP".
  • A mutual wipe with no recorded blow now ends the match instead of hanging it — the last corner of the both-sides-down rule, closed.
  • Final board across the hunt: 500 of 500 matches complete, 16,000+ damage events reconciled, zero findings — and the per-battle caps held everywhere: no ultimate ever fired twice, no consumable past its count.

The 5,000-battle gate (one more order of magnitude before release)

  • The books held at scale: 5,000 fresh matches, 170,974 damage events reconciled, zero deviations, zero findings. Every counter evented, every mana move spoken, every death clock monotone, no ultimate ever fired twice.
  • Bots walk the real route now. The sweep's rarest find (2 matches in 5,000): the last two units of a match parked either side of a Highspire Rooftops cliff for THREE HUNDRED turns — each hugging the tile that looked closest to an enemy neither could reach, because the AI scored its steps by flat distance, and every step of the crate-stair detour begins by walking away. Movement is now priced by true walking distance over the mover's own step rules, so a bot climbs the stair instead of pressing its face to the cliff. Both wedged boards replayed to a winner on the fix (50 and 106 turns).
  • "Warded" no longer trims until-cured statuses. Its "one turn less" was shaving Petrify's until-cured mark from 99 to 98 — mechanically identical, except the log would print "(98 turns)" over a statue: a number that is never true.