Skip to content
Shattered Crowns

v0.5.35-dev · 2026-08-05

Chorus

The zodiac steps into the light

The wheel has multiplied every hit since the beginning and said almost nothing about itself. Now: 12 original sigil glyphs (tools/gen_zodiac_glyphs.py, ThorVG-safe strokes) tinted by element family — same colour = mutual ×1.5 best, a claim derived from zodiac::compatibility itself and pinned both engine-side (trine ⇔ element equivalence test) and client-side (the smoke re-verifies it through the served matrix). New ScEngine.zodiac_table() ships order, elements, and the full 12×12 matrix — the Codex's new ZODIAC tab, the badge tooltips, and the website's /codex/zodiac/ page (exported to site/data/zodiac.json by the site test) all render that one table, so none of them can drift. Note for chart-readers: our wheel deliberately diverges from FFT's — 90° "squares" are GOOD (×1.25) here, opposition is worst, same sign is neutral.

The fates now spin the wheel over every champion. Each reveal card carries its keyed paper-free figure standing above the plate (the proposal's treatment D, exactly where Joe pointed), with a zodiac badge at its shoulder that flickers through the wheel and LANDS on the sign that battle drew — staggered left-to-right so the table reads as one gesture. The battle unit card wears the same badge beside the job name. Guard tools/smoke_zodiac.tscn (43): sigil ink + pairwise shape distinctness, the colour claim against the live matrix, and the spin landing on the rolled sign.

Innate abilities — the chemist throws, the ninja dual-wields

The innate system lands: a job can be BORN with a support, no slot spent. The FFT-checked generic-job pair ships first — Chemist with Throw Item (lob a potion 3 tiles; FFT says 4, but at 4 the throw outreached most attacks and made the healer's positioning game trivial — measured at 3, the chemist holds 49.4%, because the value was "heal without standing in the melee", not the fourth tile) and Ninja with Dual Wield (two blades, every battle, no support slot). The chronomancer follows as the first non-FFT innate: born with Short Charge, so the time mage's own spells finally resolve fast (temporal_collapse 3→1 ct, demi and quickening 2→1, stop 3→2). JOB_INNATES is where the every-class-gets-an-innate direction lands next.

Magic Faith is the caster's alone, and the monk steps down

FFT's two-sided Faith product was why every caster ran 10-15 points under the melee tier: a physical hit pays ONE Brave term, magic paid Faith TWICE before MDEF's cut. Magic DAMAGE now reads the attacker's Faith only; the two-sided trade survives in ACCURACY, where it was always baked in — so Atheist stopped being magic armour and became accuracy protection plus a self-nerf to your own casting, which is closer to what the fiction says. And the monk came down a step at a time across three same-day passes — PA 15→11, HP 120→105, evade 20→12, the kit and the fist brave-sharpening never touched — riding the measured ladder 77.5 → 68.4 win rate, now 3.3 over the ninja. Further tuning deliberately parked for real playtesting.

The battlefield breathes, and the jackpots ring

Second audio pass, five features. Battlefield ambience, EVENT-ONLY after the first draft's noise beds read as static (Joe's call — the noise is gone completely, not turned down): five looping beds of discrete tonal events over silence, keyed by the visual theme the board is dressed in. Forest is five bird voices with doublets and one far-off answer; the crypt is a deep funeral toll with a sub swell under each strike; stone interiors drip and echo; the desert is one lonely falling cry and a fainter reply. Town is DELIBERATELY silent — its distant bells sat too close to the turn chime, and bells must mean YOUR TURN and nothing else (the crypt toll survives two octaves below where the chime speaks). All beds run at half the first draft's level: ambient means under the music, not beside it. Undressed maps get honest silence — a default that can only be built out of noise is a default we don't ship. Loops are seamless (events placed clear of the crossfade wrap) and the smoke demands they LOOP — the exact opposite of what it demands from the cries. Crystal absorb and revive chime — the two jackpot moments that used to pass in silence: an ascending sparkle for the full-restore crystal, a warm two-note bloom for a unit standing back up (rides a new GameState.unit_revived signal from the shared event applier). Per-element cast releases: a fire spell now crackles as it gathers, ice tinkles in, lightning climbs as static, dark hums — eight elemental gathers derived exactly like the impacts; element-less magic keeps the generic release. The eidolon's entrance: a summon's delivery is summon_swell — a riser out of the ground with choir partials lighting bottom-up — keyed on the summon archetype the FX plan already carries. The refusal buzz: the amber no-effect popup now has a voice, one dull detuned knock meaning "your command produced nothing", covering refusals and whiffs alike on the same beat as the text. smoke_music 205 → 283.