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:
parent
d3c5e06fdd
commit
2c00d53db2
7 changed files with 101 additions and 41 deletions
|
|
@ -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`;
|
||||
|
|
|
|||
|
|
@ -363,14 +363,24 @@ IsHook(object):
|
|||
return PublicWeenieDesc.HookType != 0
|
||||
and PublicWeenieDesc.HookItemTypes != TYPE_UNDEF
|
||||
|
||||
UnpackCapacityByte(wireByte):
|
||||
# PublicWeenieDesc::UnPack uses MOVSX at 0x005AD530 and 0x005AD545.
|
||||
# The generated pseudocode's uint8_t temporary is misleading.
|
||||
return sign_extend_int8_to_int32(wireByte)
|
||||
|
||||
ShowCapacity(object, profile):
|
||||
if object is not a hook or profile does not contain a HookProfile:
|
||||
append authored item/container capacity as a new paragraph
|
||||
if profile contains PageCount (175) and PageUsed (174):
|
||||
append "<used> of <count> pages full." as a new paragraph
|
||||
|
||||
# A hook with a HookProfile describes its mounted item. Its sentinel
|
||||
# 255/255 PublicWeenieDesc capacities are not player-facing capacity.
|
||||
# A hook with a HookProfile describes its mounted item, so the hook's own
|
||||
# capacity is not player-facing capacity.
|
||||
|
||||
# Ordinary creature/NPC-lookalike templates can carry -1/-1 capacity
|
||||
# sentinels. They travel as FF/FF but UnpackCapacityByte restores -1/-1,
|
||||
# so the routine's > 0 tests emit no capacity prose. Black Phyntos Hive
|
||||
# (WCID 28249) is this case: Creature, not Hook.
|
||||
|
||||
ShowLock(object, profile):
|
||||
if object is a hook:
|
||||
|
|
|
|||
|
|
@ -411,8 +411,8 @@ if (Behavior & 0x04000000 IncludesSecondHeader):
|
|||
|
||||
Per-flag (in exact order):
|
||||
0x00000001 PluralName : WString16L
|
||||
0x00000002 ItemsCapacity : byte
|
||||
0x00000004 ContainersCapacity: byte
|
||||
0x00000002 ItemsCapacity : int8, sign-extended to int32
|
||||
0x00000004 ContainersCapacity: int8, sign-extended to int32
|
||||
0x00000100 AmmoType : uint16
|
||||
0x00000008 Value : uint32
|
||||
0x00000010 Usable : uint32 (Usable enum)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue