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>
289 lines
10 KiB
C#
289 lines
10 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>PropertyFloat</c> property table — the numeric keys the server sends in
|
|
/// <c>PrivateUpdatePropertyFloat (0x02D5) / PublicUpdatePropertyFloat (0x02D6)</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>double</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>FloatId</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. 86 of these 172 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 PropertyFloat : uint
|
|
{
|
|
Undef = 0,
|
|
/// <summary>4243 weenie attestations.</summary>
|
|
HeartbeatInterval = 1,
|
|
/// <summary>4243 weenie attestations.</summary>
|
|
HeartbeatTimestamp = 2,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
HealthRate = 3,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
StaminaRate = 4,
|
|
/// <summary>7706 weenie attestations.</summary>
|
|
ManaRate = 5,
|
|
/// <summary>79 weenie attestations.</summary>
|
|
HealthUponResurrection = 6,
|
|
/// <summary>79 weenie attestations.</summary>
|
|
StaminaUponResurrection = 7,
|
|
/// <summary>79 weenie attestations.</summary>
|
|
ManaUponResurrection = 8,
|
|
StartTime = 9,
|
|
StopTime = 10,
|
|
/// <summary>1749 weenie attestations.</summary>
|
|
ResetInterval = 11,
|
|
/// <summary>3290 weenie attestations.</summary>
|
|
Shade = 12,
|
|
/// <summary>6001 weenie attestations.</summary>
|
|
ArmorModVsSlash = 13,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsPierce = 14,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsBludgeon = 15,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsCold = 16,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsFire = 17,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsAcid = 18,
|
|
/// <summary>6005 weenie attestations.</summary>
|
|
ArmorModVsElectric = 19,
|
|
CombatSpeed = 20,
|
|
/// <summary>2733 weenie attestations.</summary>
|
|
WeaponLength = 21,
|
|
/// <summary>3174 weenie attestations.</summary>
|
|
DamageVariance = 22,
|
|
CurrentPowerMod = 23,
|
|
AccuracyMod = 24,
|
|
StrengthMod = 25,
|
|
/// <summary>1386 weenie attestations.</summary>
|
|
MaximumVelocity = 26,
|
|
/// <summary>233 weenie attestations.</summary>
|
|
RotationSpeed = 27,
|
|
MotionTimestamp = 28,
|
|
/// <summary>3892 weenie attestations.</summary>
|
|
WeaponDefense = 29,
|
|
WimpyLevel = 30,
|
|
/// <summary>2169 weenie attestations.</summary>
|
|
VisualAwarenessRange = 31,
|
|
AuralAwarenessRange = 32,
|
|
PerceptionLevel = 33,
|
|
/// <summary>1987 weenie attestations.</summary>
|
|
PowerupTime = 34,
|
|
MaxChargeDistance = 35,
|
|
/// <summary>1892 weenie attestations.</summary>
|
|
ChargeSpeed = 36,
|
|
/// <summary>1049 weenie attestations.</summary>
|
|
BuyPrice = 37,
|
|
/// <summary>1049 weenie attestations.</summary>
|
|
SellPrice = 38,
|
|
/// <summary>18233 weenie attestations.</summary>
|
|
DefaultScale = 39,
|
|
/// <summary>10 weenie attestations.</summary>
|
|
LockpickMod = 40,
|
|
/// <summary>2195 weenie attestations.</summary>
|
|
RegenerationInterval = 41,
|
|
RegenerationTimestamp = 42,
|
|
/// <summary>2135 weenie attestations.</summary>
|
|
GeneratorRadius = 43,
|
|
/// <summary>66 weenie attestations.</summary>
|
|
TimeToRot = 44,
|
|
DeathTimestamp = 45,
|
|
PkTimestamp = 46,
|
|
VictimTimestamp = 47,
|
|
LoginTimestamp = 48,
|
|
CreationTimestamp = 49,
|
|
/// <summary>4 weenie attestations.</summary>
|
|
MinimumTimeSincePk = 50,
|
|
DeprecatedHousekeepingPriority = 51,
|
|
AbuseLoggingTimestamp = 52,
|
|
LastPortalTeleportTimestamp = 53,
|
|
/// <summary>9152 weenie attestations.</summary>
|
|
UseRadius = 54,
|
|
/// <summary>46 weenie attestations.</summary>
|
|
HomeRadius = 55,
|
|
ReleasedTimestamp = 56,
|
|
MinHomeRadius = 57,
|
|
Facing = 58,
|
|
ResetTimestamp = 59,
|
|
LogoffTimestamp = 60,
|
|
EconRecoveryInterval = 61,
|
|
/// <summary>3523 weenie attestations.</summary>
|
|
WeaponOffense = 62,
|
|
/// <summary>1223 weenie attestations.</summary>
|
|
DamageMod = 63,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistSlash = 64,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistPierce = 65,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistBludgeon = 66,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistFire = 67,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistCold = 68,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistAcid = 69,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistElectric = 70,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistHealthBoost = 71,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistStaminaDrain = 72,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistStaminaBoost = 73,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistManaDrain = 74,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistManaBoost = 75,
|
|
/// <summary>794 weenie attestations.</summary>
|
|
Translucency = 76,
|
|
/// <summary>269 weenie attestations.</summary>
|
|
PhysicsScriptIntensity = 77,
|
|
/// <summary>761 weenie attestations.</summary>
|
|
Friction = 78,
|
|
/// <summary>761 weenie attestations.</summary>
|
|
Elasticity = 79,
|
|
/// <summary>1076 weenie attestations.</summary>
|
|
AiUseMagicDelay = 80,
|
|
ItemMinSpellcraftMod = 81,
|
|
ItemMaxSpellcraftMod = 82,
|
|
ItemRankProbability = 83,
|
|
Shade2 = 84,
|
|
Shade3 = 85,
|
|
Shade4 = 86,
|
|
/// <summary>15 weenie attestations.</summary>
|
|
ItemEfficiency = 87,
|
|
ItemManaUpdateTimestamp = 88,
|
|
SpellGestureSpeedMod = 89,
|
|
SpellStanceSpeedMod = 90,
|
|
AllegianceAppraisalTimestamp = 91,
|
|
PowerLevel = 92,
|
|
AccuracyLevel = 93,
|
|
AttackAngle = 94,
|
|
AttackTimestamp = 95,
|
|
CheckpointTimestamp = 96,
|
|
SoldTimestamp = 97,
|
|
UseTimestamp = 98,
|
|
UseLockTimestamp = 99,
|
|
/// <summary>22 weenie attestations.</summary>
|
|
HealkitMod = 100,
|
|
FrozenTimestamp = 101,
|
|
HealthRateMod = 102,
|
|
AllegianceSwearTimestamp = 103,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ObviousRadarRange = 104,
|
|
/// <summary>81 weenie attestations.</summary>
|
|
HotspotCycleTime = 105,
|
|
/// <summary>74 weenie attestations.</summary>
|
|
HotspotCycleTimeVariance = 106,
|
|
SpamTimestamp = 107,
|
|
SpamRate = 108,
|
|
/// <summary>26 weenie attestations.</summary>
|
|
BondWieldedTreasure = 109,
|
|
/// <summary>1039 weenie attestations.</summary>
|
|
BulkMod = 110,
|
|
/// <summary>1039 weenie attestations.</summary>
|
|
SizeMod = 111,
|
|
GagTimestamp = 112,
|
|
GeneratorUpdateTimestamp = 113,
|
|
DeathSpamTimestamp = 114,
|
|
DeathSpamRate = 115,
|
|
WildAttackProbability = 116,
|
|
/// <summary>312 weenie attestations.</summary>
|
|
FocusedProbability = 117,
|
|
CrashAndTurnProbability = 118,
|
|
CrashAndTurnRadius = 119,
|
|
CrashAndTurnBias = 120,
|
|
/// <summary>186 weenie attestations.</summary>
|
|
GeneratorInitialDelay = 121,
|
|
/// <summary>575 weenie attestations.</summary>
|
|
AiAcquireHealth = 122,
|
|
/// <summary>6 weenie attestations.</summary>
|
|
AiAcquireStamina = 123,
|
|
/// <summary>6 weenie attestations.</summary>
|
|
AiAcquireMana = 124,
|
|
/// <summary>4361 weenie attestations.</summary>
|
|
ResistHealthDrain = 125,
|
|
LifestoneProtectionTimestamp = 126,
|
|
/// <summary>72 weenie attestations.</summary>
|
|
AiCounteractEnchantment = 127,
|
|
/// <summary>10 weenie attestations.</summary>
|
|
AiDispelEnchantment = 128,
|
|
TradeTimestamp = 129,
|
|
AiTargetedDetectionRadius = 130,
|
|
/// <summary>29 weenie attestations.</summary>
|
|
EmotePriority = 131,
|
|
LastTeleportStartTimestamp = 132,
|
|
EventSpamTimestamp = 133,
|
|
EventSpamRate = 134,
|
|
/// <summary>5 weenie attestations.</summary>
|
|
InventoryOffset = 135,
|
|
/// <summary>396 weenie attestations.</summary>
|
|
CriticalMultiplier = 136,
|
|
/// <summary>15 weenie attestations.</summary>
|
|
ManaStoneDestroyChance = 137,
|
|
/// <summary>351 weenie attestations.</summary>
|
|
SlayerDamageBonus = 138,
|
|
AllegianceInfoSpamTimestamp = 139,
|
|
AllegianceInfoSpamRate = 140,
|
|
NextSpellcastTimestamp = 141,
|
|
AppraisalRequestedTimestamp = 142,
|
|
AppraisalHeartbeatDueTimestamp = 143,
|
|
/// <summary>209 weenie attestations.</summary>
|
|
ManaConversionMod = 144,
|
|
LastPkAttackTimestamp = 145,
|
|
FellowshipUpdateTimestamp = 146,
|
|
/// <summary>395 weenie attestations.</summary>
|
|
CriticalFrequency = 147,
|
|
LimboStartTimestamp = 148,
|
|
/// <summary>356 weenie attestations.</summary>
|
|
WeaponMissileDefense = 149,
|
|
/// <summary>368 weenie attestations.</summary>
|
|
WeaponMagicDefense = 150,
|
|
/// <summary>87 weenie attestations.</summary>
|
|
IgnoreShield = 151,
|
|
/// <summary>135 weenie attestations.</summary>
|
|
ElementalDamageMod = 152,
|
|
StartMissileAttackTimestamp = 153,
|
|
LastRareUsedTimestamp = 154,
|
|
/// <summary>69 weenie attestations.</summary>
|
|
IgnoreArmor = 155,
|
|
ProcSpellRate = 156,
|
|
/// <summary>93 weenie attestations.</summary>
|
|
ResistanceModifier = 157,
|
|
AllegianceGagTimestamp = 158,
|
|
/// <summary>18 weenie attestations.</summary>
|
|
AbsorbMagicDamage = 159,
|
|
CachedMaxAbsorbMagicDamage = 160,
|
|
GagDuration = 161,
|
|
AllegianceGagDuration = 162,
|
|
GlobalXpMod = 163,
|
|
HealingModifier = 164,
|
|
/// <summary>391 weenie attestations.</summary>
|
|
ArmorModVsNether = 165,
|
|
ResistNether = 166,
|
|
/// <summary>369 weenie attestations.</summary>
|
|
CooldownDuration = 167,
|
|
WeaponAuraOffense = 168,
|
|
WeaponAuraDefense = 169,
|
|
WeaponAuraElemental = 170,
|
|
WeaponAuraManaConv = 171,
|
|
}
|