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>
79 lines
2.7 KiB
C#
79 lines
2.7 KiB
C#
// <auto-generated-source>
|
|
// Regenerate with the 2026-07-29 enum verification campaign tooling; see
|
|
// docs/research/2026-07-29-enum-verification-campaign.md for the oracle set,
|
|
// the extraction method, and the open-question ledger.
|
|
// Hand edits are pinned by PropertyEnumConformanceTests — change the oracle,
|
|
// not the enum.
|
|
// </auto-generated-source>
|
|
|
|
namespace AcDream.Core.Properties;
|
|
|
|
/// <summary>
|
|
/// AC's <c>PropertyInstanceId</c> property table — the numeric keys the server sends in
|
|
/// <c>PrivateUpdatePropertyInstanceId (0x02E5) / PublicUpdatePropertyInstanceId (0x02E6)</c>
|
|
/// and in the property bundles carried by <c>CreateObject</c> / <c>PlayerDescription</c> /
|
|
/// <c>IdentifyResponse</c>. The CLR payload for this table is <c>uint (object guid)</c>.
|
|
///
|
|
/// <para>Verified 2026-07-29 against two independent oracles: the vendored
|
|
/// client-side enum catalog (<c>references/acclientlib/UtilityBelt.Common/Enums/Enums.cs</c>,
|
|
/// which names this table <c>InstanceId</c>) and the 38,985-file ACE weenie export corpus
|
|
/// (<c>references/weenies/</c>), whose per-stat <c>_comment</c> carries the enum member
|
|
/// name beside the numeric key. 2 of these 46 members are attested by BOTH
|
|
/// oracles with zero value conflicts; the remainder are single-sourced from the
|
|
/// catalog because no weenie in the corpus sets them.</para>
|
|
///
|
|
/// <para>This enum is a <b>vocabulary</b>, not a parser contract: the wire carries a raw
|
|
/// <c>uint</c> and unknown keys must still round-trip untouched, so never assume a
|
|
/// received key is a defined member.</para>
|
|
/// </summary>
|
|
public enum PropertyInstanceId : uint
|
|
{
|
|
Undef = 0,
|
|
Owner = 1,
|
|
Container = 2,
|
|
Wielder = 3,
|
|
Freezer = 4,
|
|
Viewer = 5,
|
|
Generator = 6,
|
|
Scribe = 7,
|
|
CurrentCombatTarget = 8,
|
|
CurrentEnemy = 9,
|
|
ProjectileLauncher = 10,
|
|
CurrentAttacker = 11,
|
|
CurrentDamager = 12,
|
|
CurrentFollowTarget = 13,
|
|
CurrentAppraisalTarget = 14,
|
|
CurrentFellowshipAppraisalTarget = 15,
|
|
/// <summary>130 weenie attestations.</summary>
|
|
ActivationTarget = 16,
|
|
Creator = 17,
|
|
Victim = 18,
|
|
Killer = 19,
|
|
Vendor = 20,
|
|
Customer = 21,
|
|
Bonded = 22,
|
|
Wounder = 23,
|
|
Allegiance = 24,
|
|
Patron = 25,
|
|
Monarch = 26,
|
|
CombatTarget = 27,
|
|
HealthQueryTarget = 28,
|
|
LastUnlocker = 29,
|
|
CrashAndTurnTarget = 30,
|
|
AllowedActivator = 31,
|
|
HouseOwner = 32,
|
|
House = 33,
|
|
Slumlord = 34,
|
|
ManaQueryTarget = 35,
|
|
CurrentGame = 36,
|
|
RequestedAppraisalTarget = 37,
|
|
/// <summary>2 weenie attestations.</summary>
|
|
AllowedWielder = 38,
|
|
AssignedTarget = 39,
|
|
LimboSource = 40,
|
|
Snooper = 41,
|
|
TeleportedCharacter = 42,
|
|
Pet = 43,
|
|
PetOwner = 44,
|
|
PetDevice = 45,
|
|
}
|