using Godot; using Theriapolis.GodotHost.UI; namespace Theriapolis.GodotHost.Scenes; /// /// Right-rail summary of the in-progress character. Single /// rebuilds every section per /// GODOT_PORTING_GUIDE.md §10 — the panel is small enough that full /// rebuild is cheap and partial-update logic isn't worth it. Connect /// the draft via ; the Wizard does this on _Ready. /// public partial class Aside : MarginContainer { private CharacterDraft? _draft; private VBoxContainer _content = null!; public override void _Ready() { AddThemeConstantOverride("margin_left", 18); AddThemeConstantOverride("margin_right", 18); AddThemeConstantOverride("margin_top", 18); AddThemeConstantOverride("margin_bottom", 18); _content = new VBoxContainer(); _content.AddThemeConstantOverride("separation", 18); AddChild(_content); } public void SetDraft(CharacterDraft draft) { _draft = draft; _draft.Changed += Refresh; Refresh(); } private void Refresh() { if (_draft is null || _content is null) return; foreach (var c in _content.GetChildren()) c.QueueFree(); _content.AddChild(new Label { Text = "SUMMARY" }); if (_draft.IsHybrid) { AddBlock("Origin", "Hybrid"); AddBlock(_draft.DominantParent == "sire" ? "Sire (dominant)" : "Sire", FormatLineage(_draft.SireCladeId, _draft.SireSpeciesId)); AddBlock(_draft.DominantParent == "dam" ? "Dam (dominant)" : "Dam", FormatLineage(_draft.DamCladeId, _draft.DamSpeciesId)); } else { AddBlock("Clade", CodexContent.Clade(_draft.CladeId)?.Name); AddBlock("Species", CodexContent.SpeciesById(_draft.SpeciesId)?.Name); } AddBlock("Calling", CodexContent.Class(_draft.ClassId)?.Name); AddBlock("Background", CodexContent.Background(_draft.BackgroundId)?.Name); AddBlock("Name", string.IsNullOrEmpty(_draft.CharacterName) ? null : _draft.CharacterName); } private static string? FormatLineage(string cladeId, string speciesId) { var clade = CodexContent.Clade(cladeId); var species = CodexContent.SpeciesById(speciesId); if (clade is null && species is null) return null; if (species is not null) return $"{species.Name} ({clade?.Name ?? cladeId})"; return clade?.Name; } private void AddBlock(string label, string? value) { var v = new VBoxContainer(); v.AddThemeConstantOverride("separation", 4); _content.AddChild(v); v.AddChild(new Label { Text = label.ToUpperInvariant() }); v.AddChild(new Label { Text = value ?? "—" }); } }