v0.5.33-dev · 2026-08-04
Reliquary
Housekeeping: this is also the first shipped build to carry v0.5.32's engine work (ultimates are one-shots; Ether) — that section's notes published at 19:15 local and the code landed at 19:29, so the v0.5.32 zip predates it by fourteen minutes.
The UI repaint. One idea underneath all of it: the cream paper the watercolor portraits are painted on is not a mistake to hide — it is FFT's own parchment. The client's look becomes two materials and one edge: dark chamfered lacquer plates for systems and numbers, warm parchment for people and stories, and gilt edging binding the two.
The Reliquary theme layer
Eleven 9-patch plate textures (tools/gen_theme_plates.py →
assets/theme/plates/), authored inside the ThorVG constraints v0.5.17
recorded: flat fills and stacked opacities only, no gradients, no defs.
tools/build_theme.gd wires them into the project theme, so most of the
game re-dresses with zero code edits: every plain Button and
OptionButton becomes a lacquer plate with hover/pressed/disabled
states and a lit gold top lip; tooltips become small manuscripts
(parchment plate, ink text) — which instantly re-dresses every item-spec
and ability-spec hover in the game; PopupMenu dropdowns match their
buttons. Panels opt in per site via new type variations (ScPlate,
ScParchment, ScParchLabel, ScGoldButton for the warm CTA) rather
than restyling every PanelContainer — status chips and bars build tiny
panels a 30px 9-patch would mangle, and no site should change by surprise.
Guard net tools/smoke_theme.tscn (49): wiring keys, a live Button probe,
and — the v0.5.17 lesson — per-plate INK COUNTS with each plate's
load-bearing property checked (the vignette's transparent centre, the
parchment's dark rule, the gold lip), plus state-distinctness so shipping
the same SVG three times cannot pass. Verified by reverting: duplicating
hover as normal fails exactly one named check.
The battle dressed
Same information, same positions — different material. Every HUD panel
(_fft_panel_style) is now the lacquer plate. The turn order became
FFT's portrait rail — number badge, bust in a thin parchment window,
team-colour spine, the acting unit's chip enlarged inside a gold rim —
because faces read faster than the text rows it replaces, which is why FFT
never used text rows. The unit card's bust is a framed miniature
(PortraitWidget.make_framed): bronze frame, vignette, Marcellus name in
team colour. The command menu gained a header band naming the acting
unit with a bronze hairline; MOVE/WAIT/UNDO keep the plate, ability rows
render FLAT with a gold-wash hover (a column of ten chamfered plates reads
as armour, not a menu). The battle log is the CHRONICLE — titled plate,
slightly translucent so the board corner still reads through it. And
exactly ONE thing on the battlefield is parchment: the damage forecast,
ink text and ink-weight factor colours on cream — FFT's own register for
its ability card, kept to a single use so it stays an event. Verified by
windowed capture (shot_board) — the portrait rail, framed card and
chronicle all render in a real battle.
The War Room
The army builder turned sideways (army_builder.gd, full relayout — the
loadout data flow is untouched). Roster is a horizontal band of lacquer
slot plates (framed miniature bust, Roman numeral, compact SUB/REACT/
SUPPORT/MOVE pickers, the gold ⚔ TO BATTLE CTA at the band's end); the
eighteen jobs hang as a two-row gallery of parchment miniatures — the
portrait's own cream paper IS the card surface, so the pasted-in rectangle
edge physically disappears (treatment B working as designed) — each with a
dark nameplate and tier pips. The bottom of the screen is the Hall: a
detail pane answering whatever job the cursor touches with the job's
stats in engraved cells, its FULL action catalog grouped by rarity with
the real roll odds beside each tier, the gear-roll odds line (read from
the engine's equipment snapshot — which promptly showed 55/30/10/5, not
the 60/30/9/1 the mock assumed), and a REGALIA rail showing the account's
equipped aura/halo/title plus the reserved SKIN slot. On the Hall's left,
the Stage: a live SubViewport running the actual rigged battle
UnitModel on a slow turntable, cycling idle → walk → attack → cast.
The stage normalises each body from its measured AABB — the first capture
shipped a mage the size of the alcove because the model's scale was not
what the code believed. Verified by windowed capture (shot_war_room,
committed as a tool): two frames a beat apart show the turntable turning,
and the second frame caught the desktop cursor resting on a gallery card
— rim lit, Hall answered, model swapped — the whole hover loop live.
The sweep begins — keyed figures land in the Codex
All 18 portraits now ship a paper-free cut
(tools/build_keyed_portraits.py → assets/portraits/keyed/, cut by the
summon-plate keyer at its default tolerances — the portraits carry the
same ink outlines that protect the summon subjects; every cut verified
in-band by ink fraction). PortraitWidget.make_keyed floats the figure
over a radial wash of the job's own colour (a GradientTexture2D built
in code — re-tints per job, no shader, no asset), and the Codex job
pane wears it as splash art — treatment D exactly where the proposal
said it earns its keep: a champion in space, not a painting on a card.
The Codex also never opens onto an empty pane now — the jobs tab
lands on the first champion instead of "Pick an entry from the list."
smoke_portraits guards the keyed set both ways: all 18 present AND
carrying alpha (an RGB re-export would ship its cream paper straight
back — the v0.5.24 lesson). Main-menu subtitles joined Marcellus; the
menu column, store, codex lists and leaderboards re-dressed themselves
through the theme layer with zero edits. New tools/shot_screen.tscn
captures any full-screen scene for the rest of the sweep.
The board, the fates, and the website
Results-board team panels and the roll-reveal fate cards ride the lacquer
plate (new shared ui/reliquary.gd for code-built panels; the jackpot
card keeps its loud gold flat-box on purpose — its job is to look like
nothing else on the table). And shatteredcrowns.gg wears the same
coat: a Reliquary layer appended to the site's design system — the
chamfered bronze-shell plate on every card and panel (two-gradient
border-box trick + octagon clip), the gilt CTA, the lit gold top edge on
stat blocks, and the .note aside becoming the site's one parchment
surface with ink text and umber links (same rationing rule as the battle
HUD's forecast). All 282 pages rebuilt and verified locally before push;
the game and its website now speak one visual language.