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.