ba3ebe7ff3031c0d7621bff9ecf738bf78189b83
3 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ba3ebe7ff3 |
M6.3: Trait popovers — shared PopoverLayer + TraitChip triggers
Per GODOT_PORTING_GUIDE.md §6 (and §12 build order — popovers before
the easy card-grid steps because traits/skills/bonuses surface them
everywhere). One reusable popover panel; lightweight chip triggers.
Scenes/Widgets/PopoverLayer.cs:
CanvasLayer added once as a child of Wizard.tscn. Owns one
PanelContainer + close Timer; static Instance for chip-side access.
ShowFor(trigger, ...) populates and positions the popover at the
trigger's global rect with viewport clamp + flip-above logic
(mirrors src/trait-hint.jsx). 80 ms grace period when moving from
trigger to popover so the popover stays open across the gap.
Detriment popovers get a red Modulate as a placeholder for the
seal-coloured StyleBox the theming pass will install.
Scenes/Widgets/TraitChip.cs:
Lightweight PanelContainer + Label trigger. On MouseEntered asks
PopoverLayer.Instance to show; on MouseExited schedules close.
Pill styling deferred to theming (default Godot panel for now;
TraitChip / TraitChipDetriment styleboxes will land alongside
the parchment Theme pass).
Wizard.tscn:
PopoverLayer added as a top-level CanvasLayer child so popovers
float above every step's content regardless of where the trigger
is in the tree.
Steps/StepClade.cs:
Replaces the placeholder "{n} traits, {m} detriments" line with an
HFlowContainer of TraitChip per trait + per detriment. Hover any
chip → popover shows name + description (+ DETRIMENT tag for the
detriment chips).
Also: cards switched from Button to PanelContainer for content-
driven height. Button isn't a Container, so its intrinsic min
size didn't aggregate from the inner vbox — at higher trait
counts the chips overflowed into the cards below. PanelContainer
is a Container, so the card grows with its content. GuiInput
handles the click-to-select; selected state shown via Modulate
tint until the proper StyleBox swap lands in theming.
Closes M6.3. Per guide §12, next is M6.4 — easy card-grid steps
(Species / Calling / Subclass / History) variations on the StepClade
pattern, then StepSkills, then StepReview.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|
|
4d3db17a89 |
M6.2: Step V Abilities — drag-drop assignment + roll/auto-assign
Per GODOT_PORTING_GUIDE.md §7, the highest-risk piece in the wizard.
Three reusable widgets + the orchestrating step.
Scenes/Widgets/AbilityToken.cs:
Draggable Control with Value + Origin metadata. _GetDragData returns
a Dictionary payload {kind, value, from, ability, idx} per guide
§7.1. MouseFilter = Pass so clicks propagate to the parent slot
for the click-to-return affordance (later removed; see commit body).
Drag preview is a dimmed duplicate.
Scenes/Widgets/AbilitySlot.cs:
PanelContainer drop target per guide §7.2. Accepts any
ability_value payload via _CanDropData / _DropData and emits
Dropped(payload). Each slot owns one ability id (STR/DEX/CON/INT/
WIS/CHA).
Scenes/Widgets/AbilityPool.cs:
HBoxContainer drop target per guide §7.3. Accepts only slot→pool
drops (returning an assigned value to the pool); pool→pool drops
are no-ops.
Scenes/Steps/StepStats.cs:
Direct port of StepStats in steps.jsx per guide §7.4. Standard
array (default) and roll-4d6-drop-lowest method tabs; Reroll
button visible in roll mode; Auto Assign sorts the remaining pool
descending and places the largest values into empty slots ordered
by class.PrimaryAbility. Three drag-drop cases (pool→slot,
slot→slot swap, slot→pool) all delegate to a single Patch call,
then the entire token tree rebuilds from the new draft state on
the Changed signal — handlers don't reparent anything manually.
Issues hit during development and resolved before commit:
- Initial click-to-return on slot pre-empted drag-from-slot every
time (the GuiInput fired on mouse-down, before Godot detected
the drag). Removed click-to-return — drag is the canonical
interaction; that matches the React prototype anyway.
- Token MouseFilter = Stop blocked clicks from reaching the slot
layer; switched to Pass which still works as a drag source.
- Refresh() teardown + rebuild reset the parent ScrollContainer's
scroll to 0 every drop. CallDeferred / SetDeferred / CreateTimer
all raced because layout settles over multiple frames; the fix
that worked was capturing scroll position pre-rebuild and
restoring in _Process the next frame.
Wizard.cs:
StepTypes[5] = typeof(StepStats); the Abilities step is now
reachable. (StepTypes[1..4, 6..7] still null — coming in M6.3+.)
Verified: all three drag scenarios + click handling + auto-assign
+ method switch + reroll work; scroll position holds across drops.
Closes M6.2. Next per guide §12: M6.3 — popover system (TraitChip +
shared PopoverLayer) before adding more easy card-grid steps.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|
|
ee5439285c |
M6.1: Character creation wizard foundation (.tscn + Resource-based draft)
Pivots from M5's code-built UI to the editor-authorable .tscn pattern
recommended in GODOT_PORTING_GUIDE.md, after a session of fighting
Godot idioms with code-only layout. Default theme only; the parchment
Theme lands last per the guide's §12 build order so layout bugs surface
as layout bugs, not theming bugs.
GODOT_PORTING_GUIDE.md:
Authored by Claude Design as the canonical port reference. Maps the
React prototype's structure onto Godot 4.6 with concrete code sketches
and a build-order recommendation. Drove the M6 architecture.
Fonts/:
Cormorant Garamond (Medium + MediumItalic) and Crimson Pro (Regular +
Italic + SemiBold) under OFL — the React prototype's serif-display
and serif-body families. Not yet wired through CodexTheme.Build()
because theming is deferred; CodexTheme.LoadFontFromFonts already
picks them up automatically when the Theme pass lands.
Scenes/Wizard.tscn + Wizard.cs:
Wizard shell per guide §4: codex-header (title + folio counter) +
Stepper + Page (StepHost + Aside) + NavBar (Back / validation / Next).
All node lookups via unique-name (%) syntax; layout authored as a
scene file you can open in the editor. Step lifecycle drives the
Aside via signal binding. Stepper logic mirrors app.jsx — locked
iff some EARLIER step is unsatisfied; "type not yet implemented"
doesn't lock.
Scenes/Aside.tscn + Aside.cs:
Right-rail summary per guide §10. Single Refresh() rebuild on
CharacterDraft.Changed; cheap enough not to bother with partial
updates. Width 320 (was 380 before the layout overflow fix).
Scenes/Steps/IStep.cs + StepClade.cs:
Per-step Bind(draft) + Validate() contract. StepClade renders the
3-column clade card grid; click commits via CharacterDraft.Patch
which triggers the Resource.Changed signal that Aside and Wizard
both subscribe to.
UI/CharacterDraft.cs:
Resource (not Node) per guide §2.1. Mirrors app.jsx's `state` shape
exactly. Patch(dictionary) emits the inherited Resource.Changed
signal — listeners use `draft.Changed += handler` regardless of
which field changed. CodexContent provides lazy-loaded immutable
content tables (Clades, Species, Classes, Subclasses, Backgrounds).
Main.{cs,tscn}: Node → Control
When Main was a Node, Control children couldn't anchor to a real
parent rect — they sat at (0,0) at intrinsic min size. With wide
step content (3-column 200-px-card grid), the Wizard's min size
pushed the navbar beyond the viewport's right edge, hiding the Next
button on smaller windowed viewports. Making Main a full-rect-
anchored Control gives child scenes a proper rect to lay out in.
UI/Widgets/CodexStepper.cs:
Anchored the inner vbox to fill the button rect. Without this, the
vbox sat at the button's top-left at intrinsic size and labels
rendered in the corner — visible as the active-step label being
off-center from the highlight bar.
Verified at 1152x720 windowed and (separately) at fullscreen:
- 3-column card grid fits inside Wrap margins + Aside without
horizontal overflow
- Stepper labels centered under their highlight bars
- Next button visible after clade selection; future steps switch
to "coming soon" placeholder when clicked
- Aside summary fills in CLADE block on selection
Closes M6.1. Next per guide §12 build order: M6.2 — StepStats with
drag-drop (highest-risk piece, de-risk before easy steps).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|