acdream/src/AcDream.App
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
..
Audio fix(audio): keep unavailable world slots quiescent 2026-07-24 19:49:25 +02:00
Combat refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
Composition feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
Diagnostics refactor(runtime): acknowledge exact world host projections 2026-07-26 18:27:41 +02:00
Input feat(headless): hydrate isolated collision worlds 2026-07-27 09:25:58 +02:00
Interaction refactor(runtime): unify generation reset for direct hosts 2026-07-27 00:43:26 +02:00
Net feat(headless): hydrate isolated collision worlds 2026-07-27 09:25:58 +02:00
Physics fix(interaction): restore retail loot placement and world-drop projection 2026-07-27 00:03:15 +02:00
Platform feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
Plugins feat(ui): centralize retail selection state 2026-07-11 00:51:20 +02:00
Rendering feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
Runtime feat(headless): complete deterministic bot command parity 2026-07-27 08:23:36 +02:00
Settings feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
Spells feat(headless): share immutable gameplay content 2026-07-27 09:00:48 +02:00
Streaming feat(headless): hydrate isolated collision worlds 2026-07-27 09:25:58 +02:00
Studio feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
UI fix(ui): #267 character panel reflects vitae/buffed skills and attributes 2026-07-30 18:08:55 +02:00
Update refactor(runtime): cut graphical host over to canonical root 2026-07-26 19:06:09 +02:00
World refactor(runtime): unify generation reset for direct hosts 2026-07-27 00:43:26 +02:00
AcDream.App.csproj feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
GlobalUsings.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
Program.cs feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
RuntimeOptions.cs refactor(runtime): own world environment state 2026-07-26 16:45:04 +02:00