acdream/src
Erik 37055bddce fix(vtank): slice 7 fix round C items F7+F12 — materialize ItemHandsColumn once
ItemHandsColumn ran a fresh .Select(...).ToArray() over _itemRows, PLUS a
per-row BaseItemName suffix-strip to recover the undecorated name, on
every single retained-UI draw. Folded per item F12: RefreshItemEditors
now captures the raw SortedCombatItemNames() result once as
_itemBaseNames — the SAME array used both to build the decorated
_itemRows (append "   [no buffs]" where it applies) and to compute
_itemHandsColumn directly, so the "   [no buffs]" suffix has exactly one
definition (added going forward) instead of two (added in RefreshItemEditors,
parsed back off in the old ItemHandsColumn getter).

CycleItemHandsAtCore (the grid's own "click cycles handedness" cell
action) mutates _itemHandedness but did not call RefreshItemEditors —
unlike the Monsters grid's mutators, which all already refresh after
mutating. Added the call so the cached column stays correct; also
switched it to read the cached _itemBaseNames instead of a second
SortedCombatItemNames() call.

Mutation named: temporarily restored the old live-recomputing
ItemHandsColumn getter (with a local copy of the suffix-stripping helper)
and confirmed the new
ItemHandsColumnDoesNotReallocateOnEveryReadAndNoBuffSuffixNeverLeaks pin
fails (Assert.Same throws — different array instances per read) before
restoring the fix. The same test also proves the no-buffs case still
resolves handedness correctly through the folded base-name array.

MossTank suite 680 -> 681 (one new pin). Full solution build green; App
markup/plugin filter 203/203.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-07 15:37:26 +02:00
..
AcDream.App fix(vtank): slice 7 fix round B item 16 — small ones (dedupe, tab-switch cleanup, slider validation) 2026-09-07 14:09:58 +02:00
AcDream.Bake Optimize prepared asset package v2 2026-08-27 20:09:09 +02:00
AcDream.Cli fix: make locale-independence real, not assumed — parsing, casing, comparison 2026-08-19 20:11:32 +02:00
AcDream.Content fix(rendering): carry retail SetSurface state to detail draws 2026-09-05 02:03:13 +02:00
AcDream.Core fix(vt): F host-composed VtankProfiles storage replaces raw path string 2026-09-06 23:03:04 +02:00
AcDream.Core.Net fix: complete retail parity stability pass 2026-08-28 20:01:39 +02:00
AcDream.Headless fix(headless): N5 dim only lifecycle/command/portal lines 2026-09-07 08:13:24 +02:00
AcDream.Launcher Optimize prepared asset package v2 2026-08-27 20:09:09 +02:00
AcDream.Launcher.Core fix(rendering): carry retail SetSurface state to detail draws 2026-09-05 02:03:13 +02:00
AcDream.Platform feat(render): implement Campaign AR and terrain fidelity 2026-08-22 13:13:29 +02:00
AcDream.Plugin.Abstractions fix #363: route plugin system text to the chat window, not SpewBox 2026-09-07 08:22:22 +02:00
AcDream.Plugins.MossTank fix(vtank): slice 7 fix round C items F7+F12 — materialize ItemHandsColumn once 2026-09-07 15:37:26 +02:00
AcDream.Runtime fix #363/#367: route unknown-command refusals to chat, not SpewBox 2026-09-07 08:22:06 +02:00
AcDream.UI.Abstractions feat(rendering): port retail building degrade walk 2026-09-04 22:29:18 +02:00