The wizard now produces a real runtime Character instead of just
persisting the draft Resource. New Theriapolis.Godot/UI/CharacterAssembler
bridges CharacterDraft → CharacterBuilder, picking the purebred Build
or hybrid TryBuildHybrid path, threading clade/species/class/background
lookups, ability scores, skill picks, dominant-parent, subclass id,
and the items table for the starting kit. The captured
PlayerCharacterState writes to user://character.json (resumability
before the M7 save format lands) and the live Character is held in
CharacterAssembler.LastBuilt for future PlayScreen pickup.
StepReview.OnConfirmPressed surfaces build errors on the status label
instead of crashing, logs HP/hybrid/skill totals on success, and
keeps emitting the existing CharacterConfirmed signal.
Hybrid lineage bonuses now match the wizard's preview math.
CharacterBuilder gains HybridSireChosenAbility / HybridDamChosenAbility;
TryBuildHybrid replaces the old "apply both clades' full mods + both
species mods" blend with "apply each parent's chosen mod only" —
species mods don't apply for hybrids per project decision. Picks
stack additively when both parents land on the same ability
(canidae +1 CON × ursidae +2 CON → +3 CON). Empty pick = no bonus
(defensive fallback for headless builds). HybridCharacterTests'
BlendsAbilityMods rewritten for the new rule, plus two new tests
for stacking and empty-pick fallback.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Lights up the M5 codex design system across the wizard. Default
palette swaps from dark leather to aged-parchment cream with
sealing-wax red selection emphasis, matching the React prototype's
default theme variant. CodexTheme.Build() is applied at the wizard
root so every step + Aside + popover cascades through it.
Theme additions:
- Parchment palette in CodexPalette (Dark retained as alt)
- Type variations registered for Card, CodexPopover, Pill,
PillDetriment, AbilityToken, AbilitySlot, SkillRow — without
SetTypeVariation, panel-stylebox lookup falls through to Godot's
default dark slate, which is what was happening to every bare
PanelContainer before this pass.
- panel_hover stylebox on Card (gild border) wired via CodexCard's
MouseEntered/Exited helper; panel_selected bumped to 3px seal-red
border + soft shadow so selection reads at a glance.
Card selection refactor:
- Replaced the warm-cream Modulate hint on cards with stylebox swaps
via the new CodexCard.SetSelected helper. The Modulate approach
was a no-op on cream-on-cream parchment; the stylebox swap looks
the same on either palette.
- Step intros + Aside section headers now use the existing Eyebrow /
H2 / H3 / CardName / CardMeta / CardBody label variations.
- Confirm button on Step VIII uses the PrimaryButton variation.
Popover + chip behaviour:
- PopoverLayer is now MouseFilter=Ignore so clicks/scroll/hover all
pass through. Adjacent chips fire reliably even when the previous
popover overlaps them spatially.
- Dropped the 80ms grace timer; chip MouseExited closes immediately.
- TraitChip MouseFilter Stop → Pass so clicks bubble up to the
parent card's GuiInput (selecting the card).
Misc:
- Wizard._Ready inserts a backing Panel so the parchment Bg fills
the canvas — Wizard root is a plain Control, which paints nothing.
- CodexTheme font lookup tries Cormorant-Medium before -Regular and
globalizes res://Fonts/ for runtime FontFile load (the previous
fallback used ContentPaths which points at a sibling data tree).
- StepStats final-score Label rendered at font_size 22 to match the
AbilityToken die.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- New Step VIII (Review): name input and Confirm button that
saves the finalized character to user://character.tres.
- Hybrid lineage rules simplified per project decision: drop
the "no-stack on overlap, take +1 free elsewhere" rule from
theriapolis-rpg-clades.md. Hybrids now pick one ability mod
from each parent clade and they sum if they overlap.
Removes HybridFreeAbility, the free-bonus picker row, and the
overlap special case from AbilityCalc + WizardValidation.
- StepClade bonus rows now mutate in place (sync ButtonPressed)
instead of tearing down on every Refresh — the old path freed
the very button mid-Pressed-signal, leaving stale buttons next
to the new ones.
- StepSkills drops the redundant "Calling: X · History: Y" meta
line; both are already shown in the Aside summary.
- Aside hybrid section adds dual-species traits and the
universal-hybrid detriment pills.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>