acdream/src/AcDream.Core/Properties
Erik 251dd68a92 feat(core): give AC's seven property tables names, verified against two oracles
acdream has carried property IDs as bare uints since the beginning. The wire
parsers read `u32 property` and hand it to a `Dictionary<uint, int>`, and every
call site that cared re-derived the meaning from a comment - `EncumbranceVal`
was spelled `private const uint EncumbranceValProperty = 5u` in two different
files, `UiEffects` lived as "ACE enum value 18" in a doc comment, and
`AetheriaBitfield` as "322 / 0x142". That is 864 pieces of vocabulary the
codebase was expected to remember in prose.

This adds the seven enums - PropertyInt, PropertyInt64, PropertyBool,
PropertyFloat, PropertyString, PropertyDataId, PropertyInstanceId - under
AcDream.Core.Properties.

Every member is transcribed from an oracle; none is invented. Two independent
sources were extracted and diffed against each other: the vendored client-side
enum catalog at references/acclientlib/UtilityBelt.Common/Enums/Enums.cs (which
names these tables IntId/BoolId/FloatId/...), and the 38,985-file ACE weenie
export corpus at references/weenies/, whose every stat entry carries the numeric
key beside the enum member name in its `_comment`. The corpus attests 408 of the
864 members directly. Across all seven tables the two oracles produced zero
value conflicts, and the corpus contained no key the catalog was missing - the
catalog is a strict superset of everything 38,985 weenies actually set.

Three members disagree on spelling, never on value: the catalog says
ObjectType/HookObjectType/MerchandiseObjectTypes where ACE says
ItemType/HookItemType/MerchandiseItemTypes. acdream takes ACE's spelling, which
is what the weenie corpus emits (37,329 attestations for ItemType alone) and
what acdream's own ItemType enum already calls it. The catalog's alias is
recorded on each member.

This commit is vocabulary only - no parser reads these enums yet, so no branch
changes and no wire behavior moves. The bundles stay `Dictionary<uint, ...>`
precisely because an unknown key must still round-trip untouched; the enums
describe the keys we know, they do not constrain the ones we receive.

PropertyEnumConformanceTests pins the result: the full name/value table per
family, the uint underlying type, no two members sharing a value, and a separate
408-case theory asserting each weenie-attested pairing individually. A hand edit
to any enum now fails loudly instead of quietly mis-reading the wire.

Core tests 3,297 -> 3,726.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 01:11:16 +02:00
..
PropertyBool.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyDataId.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyFloat.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyInstanceId.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyInt.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyInt64.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00
PropertyString.cs feat(core): give AC's seven property tables names, verified against two oracles 2026-07-29 01:11:16 +02:00