fix(net): sign-extend retail capacity bytes

Mirror PublicWeenieDesc::UnPack MOVSX behavior so ACE's FF capacity sentinels remain -1 instead of becoming 255. This suppresses non-container capacity prose through the normal retail appraisal checks, with raw-wire and formatter regression coverage.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-23 18:25:17 +02:00
parent d3c5e06fdd
commit 2c00d53db2
7 changed files with 101 additions and 41 deletions

View file

@ -110,18 +110,18 @@ crafting, ratings, rare state, and prose. AP-110 records the remaining
specialized/player-dependent/DAT-name/creature-font/object-preview branches
explicitly.
The item-format conformance correction then fixed the live Black Phyntos Hive
counterexample at its source. CreateObject had walked past
`PublicWeenieDesc.HookItemTypes` and `HookType` without retaining them, so the
item formatter could not execute retail `ACCWeenieObject::IsHook`. It also
fell back from a deliberately incomplete appraisal to public Value/Burden and
printed the hook's 255/255 sentinel capacities as ordinary storage. Hook
identity now survives the wire/session/object-table path; Value/Burden use
only the appraisal profile and display `???`/`Unknown` when absent;
`HasHookedItem` suppresses the hook capacity; lock wording and page-count
property order match retail; and each report fragment preserves
`AddItemInfo`'s line/paragraph flag plus LayoutDesc `0x1B`'s white/green/red
font-color indices.
The item-format conformance correction first preserved
`PublicWeenieDesc.HookItemTypes` and `HookType`, stopped falling back from an
incomplete appraisal to public Value/Burden, and ported hook-profile capacity
suppression, lock wording, page-count order, `AddItemInfo` paragraph
boundaries, and the authored white/green/red font list. The connected
Black Phyntos Hive gate then exposed a separate wire-width error: WCID 28249
is an NPC-lookalike `Creature`, not a hook, and ACE sends its `-1/-1`
capacity sentinels as `FF/FF`. Retail `PublicWeenieDesc::UnPack @ 0x005AD470`
uses `MOVSX` at `0x005AD530` and `0x005AD545`; acdream had zero-extended those
bytes into `255/255`. CreateObject now sign-extends both capacity bytes, so
`Appraisal_ShowCapacity`'s existing positive tests naturally suppress the
sentinels without a name/type workaround.
**Files:** `src/AcDream.Core.Net/Messages/AppraiseInfoParser.cs`;
`src/AcDream.App/UI/RetailUiRuntime.cs`;