acdream/tests/AcDream.App.Tests/UI/Layout
Erik cf2605fa4a fix(ui): #267 character panel reflects vitae/buffed skills and attributes
Retail CACQualities::EnchantAttribute (0x00594570), EnchantAttribute2nd
(0x00594670, already ported for #6), and EnchantSkill (0x005947b0) are the
three enchantment-composition functions the Character window's Attributes
and Skills tabs depend on. Primary attributes never reference the vitae
singleton in retail (only Attribute2nd/Skill do) — confirmed directly from
the decompiled function bodies, not assumed.

EnchantmentMath.GetMod gains requiredType/includeVitae parameters (default
to the prior behavior) so a numeric StatMod key collision across domains
(e.g. key=1 is both Strength and MaxHealth) can't leak a buff into the
wrong computation. Spellbook.GetAttributeMod/GetSkillMod and
LocalPlayerState.GetEffectiveAttribute/GetEffectiveSkill/
GetSkillVitaeModifier wire the retail chain through to the panel.
CharacterSheetProvider now reports the effective value as the main number
and CharacterSkill.CurrentLevel is no longer an alias of BaseLevel (this
also activates the previously-dead SkillValueColor buffed/debuffed row
coloring). CharacterStatController's footer-title parenthetical is cited
from gmAttributeUI::DisplaySelectionFooter_Attribute (0x0049d280) and
gmSkillUI::DisplaySelectionFooter_Trained (0x0049b860) +
SkillInfoRegion::GetVitaeModifier (0x004f0fa0): skills show up to two
segments (vitae's own contribution, then the buff-only residual), while
vitae-immune attributes show at most one; no parenthetical when the delta
is zero. The panel now refreshes on Spellbook.EnchantmentsChanged, not only
raw property/attribute updates.

Core goldens cover the user-reported 33% vitae example (303->203, "(-100)"
exactly), buff+vitae composition, and the attribute vitae-immunity finding.
Provider/controller tests cover the full row-click -> footer-title path and
live refresh. Full solution suite passes with zero failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 18:08:55 +02:00
..
fixtures fix(ui): keep spell components in authored foreground 2026-07-24 08:08:29 +02:00
AppraisalUiControllerTests.cs feat(headless): share immutable gameplay content 2026-07-27 09:00:48 +02:00
CharacterControllerTests.cs perf(ui): retain shaped report text 2026-07-25 05:11:12 +02:00
CharacterLayoutImportProbe.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
CharacterSheetProviderTests.cs fix(ui): #267 character panel reflects vitae/buffed skills and attributes 2026-07-30 18:08:55 +02:00
CharacterStatControllerTests.cs fix(ui): #267 character panel reflects vitae/buffed skills and attributes 2026-07-30 18:08:55 +02:00
ChatLayoutConformanceTests.cs feat(ui): persist retained window layouts 2026-07-10 23:17:29 +02:00
ChatLayoutFixtureGenerator.cs test(D.2b): chat golden fixture + resolved-Type conformance (widget-generalization Task 1) 2026-06-16 16:55:51 +02:00
ChatWindowControllerTests.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
CombatLayoutConformanceTests.cs fix(combat): preserve authored meter child geometry 2026-07-12 21:57:53 +02:00
CombatUiControllerTests.cs refactor(runtime): own combat and magic intent 2026-07-26 11:56:40 +02:00
CreatureAppraisalRowsTests.cs feat(ui): complete retail creature appraisal details 2026-07-23 14:04:19 +02:00
DatWidgetFactoryFontResolveTests.cs feat(ui): importer Fix C — per-element dat FontDid resolver (studio path); character level uses its retail font 2026-06-26 10:30:13 +02:00
DatWidgetFactoryTests.cs fix(ui): match retail spell bar controls 2026-07-23 07:49:09 +02:00
EffectsUiControllerTests.cs fix(ui): restore effect detail scrolling 2026-07-17 13:28:18 +02:00
ElementReaderTests.cs feat(ui): D.2b item interaction + retail cursors + live character sheet 2026-07-03 09:18:43 +02:00
ExternalContainerControllerTests.cs refactor(runtime): own interaction transactions 2026-07-26 11:13:09 +02:00
FixtureLoader.cs fix(ui): keep spell components in authored foreground 2026-07-24 08:08:29 +02:00
IndicatorBarControllerTests.cs fix(ui): match retail vitae and character info 2026-07-17 12:06:14 +02:00
IndicatorDetailPanelControllerTests.cs fix(ui): restore effect detail scrolling 2026-07-17 13:28:18 +02:00
InventoryControllerTests.cs refactor(runtime): own interaction transactions 2026-07-26 11:13:09 +02:00
InventoryFrameImportProbe.cs feat(ui): centralize retail selection state 2026-07-11 00:51:20 +02:00
ItemAppraisalTextFormatterTests.cs fix(ui): preserve retail item titles and spacing 2026-07-24 05:21:01 +02:00
ItemCooldownUiControllerTests.cs perf(ui): scope cooldown heartbeat to visible items 2026-07-25 05:12:58 +02:00
ItemListCellTemplateTests.cs feat(items): port retail shared cooldown overlays 2026-07-23 10:41:16 +02:00
JumpPowerbarControllerTests.cs feat(ui): port retail jump power bar 2026-07-13 10:22:12 +02:00
JumpPowerbarLayoutConformanceTests.cs feat(ui): port retail jump power bar 2026-07-13 10:22:12 +02:00
LayoutConformanceTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
LayoutImporterTests.cs fix(ui): restore retail spell tabs and spellbook 2026-07-15 15:54:11 +02:00
PaperdollClickMapTests.cs fix(ui): port exact paperdoll body selection 2026-07-11 11:56:26 +02:00
PaperdollControllerTests.cs refactor(runtime): own interaction transactions 2026-07-26 11:13:09 +02:00
PaperdollSlotBackgroundTests.cs fix(paperdoll): port quest-gated Aetheria slots 2026-07-13 09:55:20 +02:00
PaperdollToggleTests.cs feat(D.2b): Slice 2 — paperdoll armor/non-armor partition + Slots toggle state 2026-06-23 08:57:50 +02:00
RadarControllerTests.cs feat(ui): port retail radar and compass 2026-07-10 16:14:37 +02:00
RadarLayoutConformanceTests.cs feat(ui): port retail radar and compass 2026-07-10 16:14:37 +02:00
RadarLayoutFixtureGenerator.cs feat(ui): port retail radar and compass 2026-07-10 16:14:37 +02:00
RadarSnapshotProviderTests.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
RetailDialogFactoryTests.cs refactor(net): converge live session state reset 2026-07-21 12:00:48 +02:00
RetailFixtureConformanceTests.cs feat(ui): port retail appraisal panel 2026-07-23 11:34:08 +02:00
RetailFpsControllerTests.cs fix #213: complete suicide and framerate presentation 2026-07-13 15:50:47 +02:00
RetailLayoutFixtureGenerator.cs fix(ui): keep spell components in authored foreground 2026-07-24 08:08:29 +02:00
RetailPanelUiControllerTests.cs fix(ui): complete retail indicator detail panels 2026-07-17 11:36:43 +02:00
RetailWindowFrameTests.cs fix(ui): match retail spell bar controls 2026-07-23 07:49:09 +02:00
SelectedObjectControllerTests.cs refactor(runtime): own combat and magic intent 2026-07-26 11:56:40 +02:00
SpellbookRowStyleTests.cs fix(ui): keep spellbook tab captions above chrome 2026-07-15 17:02:14 +02:00
SpellbookWindowControllerTests.cs feat(headless): share immutable gameplay content 2026-07-27 09:00:48 +02:00
SpellcastingUiControllerTests.cs refactor(runtime): own combat and magic intent 2026-07-26 11:56:40 +02:00
SpellExamineComponentTemplateFactoryTests.cs fix(ui): keep spell components in authored foreground 2026-07-24 08:08:29 +02:00
ToolbarControllerTests.cs refactor(runtime): own interaction transactions 2026-07-26 11:13:09 +02:00
ToolbarInputControllerTests.cs feat(ui): complete retail quick-slot input 2026-07-11 08:59:49 +02:00
UiDatElementTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
UiPropertyBagTests.cs fix(combat): restore retail power bar layers 2026-07-12 21:14:14 +02:00
UiTextLayoutCacheTests.cs perf(ui): retain shaped report text 2026-07-25 05:11:12 +02:00
UiViewportFactoryTests.cs feat(D.2b): Slice 2 — UiViewport widget (dat Type 0xD) + IUiViewportRenderer seam 2026-06-23 09:03:42 +02:00
VitalsBindingTests.cs feat(ui): port retained widget foundations 2026-07-10 17:55:41 +02:00
VividTargetIndicatorLayoutTests.cs feat(selection): port retail offscreen target indicator 2026-07-18 07:41:12 +02:00