merge(core): the enum verification campaign, onto the post-deletion tree

Brings `github/overnight/enums` (`c19680fd`) forward onto the V11 tree. The
branch was cut at `b70b9832`, before the OpenGL deletion, and the two lines of
work turned out to be disjoint: the enum campaign lives entirely in
`AcDream.Core` and its tests, while V11 emptied `AcDream.App`. The merge is
clean — no conflicting file on either side.

What it carries: names for AC's seven property tables verified against two
oracles, a correction to `DamageType`'s rotated bits and `ItemType`'s shifted
craft ladder, the retail members the equipment and physics enums were missing,
and names for `AmmoType`, `CombatUse` and `ItemUseable`. Five commits, seventeen
files, +3,767 / -27 lines.

Verified on the merge result rather than on the branch: Release build 0 errors,
no new warning attributable to any file the branch touches, and
`AcDream.Core.Tests` at 3,893 passed / 2 skipped / 3,895. The campaign's
claimed +597 is exact — the `Properties` namespace alone runs 597 tests, all
passing.

The campaign's open decision items — whether to adopt `WeenieError` wholesale,
whether the `SoundId` subset is the right cut, and the re-clone of the ACE and
Chorizite references that `references/` no longer holds — are not settled here.
They are carried into the morning report as questions for the user.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-29 03:29:16 +02:00
commit cd2f3feae2
17 changed files with 3767 additions and 27 deletions

View file

@ -398,22 +398,24 @@ public static class ItemAppraisalTextFormatter
if (ammoType == 0u)
return;
uint baseAmmoType = ammoType switch
// Retail gives the crystal and chorizite variants their own bits
// (acclient.h:4221); each folds back to the base kind for this sentence.
AmmoType baseAmmoType = (AmmoType)ammoType switch
{
0x08u or 0x40u => 1u,
0x10u or 0x80u => 2u,
0x20u or 0x100u => 4u,
_ => ammoType,
AmmoType.ArrowCrystal or AmmoType.ArrowChorizite => AmmoType.Arrow,
AmmoType.BoltCrystal or AmmoType.BoltChorizite => AmmoType.Bolt,
AmmoType.AtlatlCrystal or AmmoType.AtlatlChorizite => AmmoType.Atlatl,
var other => other,
};
bool launcher = (validLocations & (uint)EquipMask.MissileWeapon) != 0;
string? description = (launcher, baseAmmoType) switch
{
(true, 1u) => "Uses arrows as ammunition.",
(true, 2u) => "Uses quarrels as ammunition.",
(true, 4u) => "Uses atlatl darts as ammunition.",
(false, 1u) => "Used as ammunition by bows.",
(false, 2u) => "Used as ammunition by crossbows.",
(false, 4u) => "Used as ammunition by atlatls.",
(true, AmmoType.Arrow) => "Uses arrows as ammunition.",
(true, AmmoType.Bolt) => "Uses quarrels as ammunition.",
(true, AmmoType.Atlatl) => "Uses atlatl darts as ammunition.",
(false, AmmoType.Arrow) => "Used as ammunition by bows.",
(false, AmmoType.Bolt) => "Used as ammunition by crossbows.",
(false, AmmoType.Atlatl) => "Used as ammunition by atlatls.",
_ => null,
};
if (description is not null)

View file

@ -22,8 +22,14 @@ public enum CombatMode
CombatCombat = Melee | Missile | Magic,
}
/// <summary>
/// Verbatim retail <c>ATTACK_HEIGHT</c> (<c>docs/research/named-retail/acclient.h:4371</c>).
/// The three real heights are 1-based; retail reserves 0 for "not chosen yet", which the
/// wire does send, so it is named rather than left to fall through as an undefined cast.
/// </summary>
public enum AttackHeight
{
Undef = 0,
High = 1,
Medium = 2,
Low = 3,
@ -204,6 +210,18 @@ public enum AttackType : uint
| OffhandDoubleThrust | OffhandTripleThrust,
}
/// <summary>
/// Verbatim retail <c>DAMAGE_TYPE</c> (<c>docs/research/named-retail/acclient.h:3788</c>).
///
/// <para>The four drain/restore bits used to be rotated here: Nether/Mana/Health/Stamina
/// were assigned 0x80/0x100/0x200/0x400 where retail assigns Health/Stamina/Mana/Nether.
/// Retail, the vendored client-side enum catalog, and the ACE weenie corpus all agree on
/// retail's order (the corpus attests 0x100=Stamina, 0x200=Mana, 0x400=Nether directly),
/// and both of acdream's live damage-type name tables — <c>CombatChatTranslator</c> and
/// <c>ItemAppraisalTextFormatter</c> — were already reading the retail order off the raw
/// wire uint. Nothing consumed the rotated members, so this corrects a latent trap rather
/// than a live mislabel.</para>
/// </summary>
[Flags]
public enum DamageType : uint
{
@ -215,10 +233,11 @@ public enum DamageType : uint
Fire = 0x0010,
Acid = 0x0020,
Electric = 0x0040,
Nether = 0x0080,
Mana = 0x0100,
Health = 0x0200,
Stamina = 0x0400,
Health = 0x0080,
Stamina = 0x0100,
Mana = 0x0200,
Nether = 0x0400,
Base = 0x10000000,
}
/// <summary>

View file

@ -10,9 +10,17 @@ namespace AcDream.Core.Items;
/// <summary>
/// AC's <c>ItemType</c> is a 32-bit flags enum — a single dat weenie can
/// assert multiple type bits. From <c>ACE.Entity.Enum.ItemType</c>
/// cross-checked against the decompile paperdoll tooltip dispatcher.
/// Full bit list in the research doc §1.
/// assert multiple type bits. Verbatim retail <c>ITEM_TYPE</c>
/// (<c>docs/research/named-retail/acclient.h:3300</c>).
///
/// <para>The craft ladder used to be shifted: <c>CraftAlchemyIntermediate</c> sat on
/// 0x02000000 (retail leaves that bit unused and puts alchemy-intermediate on
/// 0x04000000), and an invented <c>CraftCookingIntermediate</c> occupied the real
/// alchemy-intermediate bit. The ACE weenie corpus attests 0x04000000 =
/// Craft_Alchemy_Intermediate 235 times and contains no cooking-intermediate at all.
/// The composite masks were likewise recomputed locally rather than transcribed, which
/// made <c>Weapon</c> an alias of <c>WeaponOrCaster</c> and left <c>Item</c> two orders
/// of magnitude narrower than retail's. Full bit list in the research doc §1.</para>
/// </summary>
[Flags]
public enum ItemType : uint
@ -43,17 +51,27 @@ public enum ItemType : uint
CraftCookingBase = 0x00400000,
CraftAlchemyBase = 0x00800000,
CraftFletchingBase = 0x01000000,
CraftAlchemyIntermediate= 0x02000000,
CraftCookingIntermediate= 0x04000000,
// 0x02000000 is deliberately unused in retail's ladder.
CraftAlchemyIntermediate= 0x04000000,
CraftFletchingIntermediate = 0x08000000,
LifeStone = 0x10000000,
TinkeringTool = 0x20000000,
TinkeringMaterial = 0x40000000,
Gameboard = 0x80000000u,
Vestements = Armor | Clothing,
Weapon = MeleeWeapon | MissileWeapon | Caster,
WeaponOrCaster = Weapon,
Item = Weapon | Armor | Clothing | Jewelry | Container,
// Composite masks, transcribed verbatim rather than recomputed from the bits
// above — retail's TYPE_ITEM in particular is far broader than any obvious
// union, and deriving these locally is how the craft ladder drifted.
Vestements = 0x00000006, // TYPE_VESTEMENTS
Weapon = 0x00000101, // TYPE_WEAPON: melee | missile, no caster
WeaponOrCaster = 0x00008101, // TYPE_WEAPON_OR_CASTER
LockableMagicTarget = 0x00000280, // TYPE_LOCKABLE_MAGIC_TARGET
RedirectableItemEnchantmentTarget = 0x00008107,
PortalMagicTarget = 0x10010000, // TYPE_PORTAL_MAGIC_TARGET
ItemEnchantableTarget = 0x00088B8F, // TYPE_ITEM_ENCHANTABLE_TARGET
Item = 0x002DFBEF, // TYPE_ITEM
VendorShopkeep = 0x480467A7, // TYPE_VENDOR_SHOPKEEP
VendorGrocer = 0x00446220, // TYPE_VENDOR_GROCER
}
/// <summary>
@ -61,8 +79,10 @@ public enum ItemType : uint
/// (docs/research/named-retail/acclient.h:3193; identical to ACE's EquipMask).
/// The wire (ValidLocations / CurrentWieldedLocation / WieldObject EquipLoc) delivers
/// these exact bits. Pinned by EquipMaskTests — do NOT renumber.
/// (The header's <c>CLOTHING_LOC</c> composite also sets bit 31, 0x80000000, which is
/// not a named INVENTORY_LOC primitive and has no member here; <c>ALL_LOC</c> tops out at bit 30.)
/// (A remark here used to claim the header's <c>CLOTHING_LOC</c> composite sets an
/// unnamed bit 31. It does not: <c>CLOTHING_LOC</c> is 0x080001FF, the nine wear slots
/// plus bit 27, which is the named <see cref="EquipMask.Cloak"/> slot. <c>ALL_LOC</c>
/// tops out at bit 30, so no INVENTORY_LOC member uses bit 31 at all.)
/// </summary>
[Flags]
public enum EquipMask : uint
@ -99,6 +119,23 @@ public enum EquipMask : uint
SigilOne = 0x10000000,
SigilTwo = 0x20000000,
SigilThree = 0x40000000,
// Retail's composite slot groups, transcribed verbatim from the same header
// block rather than recomputed from the primitives above. Clothing in
// particular is not the union of the wear slots — it also carries the cloak
// slot (bit 27).
Clothing = 0x080001FF, // CLOTHING_LOC: the nine wear slots | Cloak
Armor = 0x00007E00, // ARMOR_LOC
Jewelry = 0x7C0F8000, // JEWELRY_LOC
WristWear = 0x00030000, // WRIST_WEAR_LOC
FingerWear = 0x000C0000, // FINGER_WEAR_LOC
Sigil = 0x70000000, // SIGIL_LOC
ReadySlot = 0x03F00000, // READY_SLOT_LOC
Weapon = 0x02500000, // WEAPON_LOC
WeaponReadySlot = 0x03500000, // WEAPON_READY_SLOT_LOC
All = 0x7FFFFFFF, // ALL_LOC
/// <summary>Retail gives CAN_GO_IN_READY_SLOT_LOC the same value as ALL_LOC.</summary>
CanGoInReadySlot = 0x7FFFFFFF,
}
/// <summary>

View file

@ -0,0 +1,104 @@
using System;
namespace AcDream.Core.Items;
/// <summary>
/// Verbatim retail <c>AMMO_TYPE</c> (<c>docs/research/named-retail/acclient.h:4221</c>).
/// Arrives on the wire as <c>PublicWeenieDesc._ammo_type</c> (CreateObject weenie flag
/// 0x00000100) and in the appraisal weapon profile.
///
/// <para>The three base kinds each have a crystal and a chorizite variant on their own
/// bit, so a launcher's "uses arrows" test must fold the variants back to the base — see
/// <c>ItemAppraisalTextFormatter</c>, which does exactly that.</para>
/// </summary>
[Flags]
public enum AmmoType : uint
{
None = 0x000,
Arrow = 0x001,
Bolt = 0x002,
Atlatl = 0x004,
ArrowCrystal = 0x008,
BoltCrystal = 0x010,
AtlatlCrystal = 0x020,
ArrowChorizite = 0x040,
BoltChorizite = 0x080,
AtlatlChorizite = 0x100,
}
/// <summary>
/// Verbatim retail <c>COMBAT_USE</c> (<c>docs/research/named-retail/acclient.h:6523</c>) —
/// how a wieldable participates in combat. This is a plain sequence, not a bitfield.
/// Arrives as <c>PropertyInt.CombatUse</c> (51).
/// </summary>
public enum CombatUse : uint
{
None = 0,
Melee = 1,
Missile = 2,
Ammo = 3,
Shield = 4,
TwoHanded = 5,
}
/// <summary>
/// Verbatim retail <c>ITEM_USEABLE</c> (<c>docs/research/named-retail/acclient.h:6478</c>) —
/// where an object must be, and where its target must be, for a use attempt to be legal.
/// Arrives as <c>PropertyInt.ItemUseable</c> (16).
///
/// <para>The layout is two 16-bit halves: the low half (<see cref="SourceMask"/>) constrains
/// the object being used, the high half (<see cref="TargetMask"/>) constrains its target.
/// Retail names the useful combinations explicitly rather than expecting callers to compose
/// them, and they are transcribed here the same way — several are not the obvious union
/// (<see cref="SourceContainedTargetObjSelfOrContained"/> is 0x880008, not
/// <c>ObjSelf | Contained | (Contained &lt;&lt; 16)</c>).</para>
/// </summary>
[Flags]
public enum ItemUseable : uint
{
Undef = 0x0,
No = 0x1,
Self = 0x2,
Wielded = 0x4,
Contained = 0x8,
Viewed = 0x10,
Remote = 0x20,
NeverWalk = 0x40,
ObjSelf = 0x80,
ContainedViewed = 0x18,
ViewedRemote = 0x30,
ContainedViewedRemote = 0x38,
RemoteNeverWalk = 0x60,
ViewedRemoteNeverWalk = 0x70,
ContainedViewedRemoteNeverWalk = 0x78,
SourceWieldedTargetWielded = 0x00040004,
SourceWieldedTargetContained = 0x00080004,
SourceWieldedTargetViewed = 0x00100004,
SourceWieldedTargetRemote = 0x00200004,
SourceWieldedTargetRemoteNeverWalk = 0x00600004,
SourceContainedTargetWielded = 0x00040008,
SourceContainedTargetContained = 0x00080008,
SourceContainedTargetSelfOrContained = 0x000A0008,
SourceContainedTargetViewed = 0x00100008,
SourceContainedTargetRemote = 0x00200008,
SourceContainedTargetRemoteOrSelf = 0x00220008,
SourceContainedTargetRemoteNeverWalk = 0x00600008,
SourceContainedTargetObjSelfOrContained = 0x00880008,
SourceViewedTargetWielded = 0x00040010,
SourceViewedTargetContained = 0x00080010,
SourceViewedTargetViewed = 0x00100010,
SourceViewedTargetRemote = 0x00200010,
SourceRemoteTargetWielded = 0x00040020,
SourceRemoteTargetContained = 0x00080020,
SourceRemoteTargetViewed = 0x00100020,
SourceRemoteTargetRemote = 0x00200020,
SourceRemoteTargetRemoteNeverWalk = 0x00600020,
SourceMask = 0x0000FFFF,
TargetMask = 0xFFFF0000,
}

View file

@ -27,6 +27,12 @@ public enum PhysicsStateFlags : uint
{
None = 0x00000000,
Static = 0x00000001,
/// <summary>
/// Retail declares 0x2 and 0x2000 as UNUSED1_PS / UNNUSED2_PS (acclient.h:2818,
/// 2830) — reserved, never set. Named here so neither bit gets repurposed for an
/// acdream-local flag and then collides with a server that starts using it.
/// </summary>
ReservedUnused1 = 0x00000002,
Ethereal = 0x00000004,
ReportCollisions = 0x00000008,
IgnoreCollisions = 0x00000010,
@ -38,6 +44,8 @@ public enum PhysicsStateFlags : uint
Gravity = 0x00000400,
Lighting = 0x00000800,
ParticleEmitter = 0x00001000,
/// <summary>Retail UNNUSED2_PS — reserved, never set. See <see cref="ReservedUnused1"/>.</summary>
ReservedUnused2 = 0x00002000,
Hidden = 0x00004000,
ScriptedCollision = 0x00008000,
/// <summary>
@ -88,6 +96,11 @@ public enum TransientStateFlags : uint
StationaryStop = 0x00000020, // bit 5 — fsf == 2
StationaryStuck = 0x00000040, // bit 6 — fsf == 3
Active = 0x00000080, // bit 7 — object needs per-frame update
// Declared to complete retail's TransientState (acclient.h:3688). Neither bit is
// produced or consumed by acdream's transition yet; they are here so the two free
// slots cannot be reused for something else and quietly collide with the wire.
WaterContact = 0x00000008, // bit 3 — WATER_CONTACT_TS
CheckEthereal = 0x00000100, // bit 8 — CHECK_ETHEREAL_TS
}
/// <summary>

View file

@ -0,0 +1,221 @@
// <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>PropertyBool</c> property table — the numeric keys the server sends in
/// <c>PrivateUpdatePropertyBool (0x02C9) / PublicUpdatePropertyBool (0x02CA)</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>bool</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>BoolId</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. 59 of these 131 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 PropertyBool : uint
{
Undef = 0,
/// <summary>21884 weenie attestations.</summary>
Stuck = 1,
/// <summary>1077 weenie attestations.</summary>
Open = 2,
/// <summary>646 weenie attestations.</summary>
Locked = 3,
RotProof = 4,
AllegianceUpdateRequest = 5,
/// <summary>1282 weenie attestations.</summary>
AiUsesMana = 6,
/// <summary>16 weenie attestations.</summary>
AiUseHumanMagicAnimations = 7,
/// <summary>853 weenie attestations.</summary>
AllowGive = 8,
CurrentlyAttacking = 9,
AttackerAi = 10,
/// <summary>6212 weenie attestations.</summary>
IgnoreCollisions = 11,
/// <summary>9020 weenie attestations.</summary>
ReportCollisions = 12,
/// <summary>15282 weenie attestations.</summary>
Ethereal = 13,
/// <summary>7376 weenie attestations.</summary>
GravityStatus = 14,
/// <summary>3382 weenie attestations.</summary>
LightsStatus = 15,
/// <summary>139 weenie attestations.</summary>
ScriptedCollision = 16,
/// <summary>475 weenie attestations.</summary>
Inelastic = 17,
/// <summary>1677 weenie attestations.</summary>
Visibility = 18,
/// <summary>3972 weenie attestations.</summary>
Attackable = 19,
SafeSpellComponents = 20,
AdvocateState = 21,
/// <summary>15455 weenie attestations.</summary>
Inscribable = 22,
/// <summary>7755 weenie attestations.</summary>
DestroyOnSell = 23,
/// <summary>6728 weenie attestations.</summary>
UiHidden = 24,
IgnoreHouseBarriers = 25,
HiddenAdmin = 26,
PkWounder = 27,
PkKiller = 28,
/// <summary>262 weenie attestations.</summary>
NoCorpse = 29,
UnderLifestoneProtection = 30,
ItemManaUpdatePending = 31,
GeneratorStatus = 32,
/// <summary>831 weenie attestations.</summary>
ResetMessagePending = 33,
/// <summary>831 weenie attestations.</summary>
DefaultOpen = 34,
/// <summary>511 weenie attestations.</summary>
DefaultLocked = 35,
DefaultOn = 36,
OpenForBusiness = 37,
IsFrozen = 38,
/// <summary>1049 weenie attestations.</summary>
DealMagicalItems = 39,
LogoffImDead = 40,
/// <summary>2208 weenie attestations.</summary>
ReportCollisionsAsEnvironment = 41,
/// <summary>1327 weenie attestations.</summary>
AllowEdgeSlide = 42,
AdvocateQuest = 43,
IsAdmin = 44,
IsArch = 45,
IsSentinel = 46,
IsAdvocate = 47,
CurrentlyPoweringUp = 48,
GeneratorEnteredWorld = 49,
/// <summary>890 weenie attestations.</summary>
NeverFailCasting = 50,
/// <summary>264 weenie attestations.</summary>
VendorService = 51,
/// <summary>1421 weenie attestations.</summary>
AiImmobile = 52,
/// <summary>1 weenie attestations.</summary>
DamagedByCollisions = 53,
/// <summary>34 weenie attestations.</summary>
IsDynamic = 54,
/// <summary>81 weenie attestations.</summary>
IsHot = 55,
IsAffecting = 56,
/// <summary>49 weenie attestations.</summary>
AffectsAis = 57,
SpellQueueActive = 58,
GeneratorDisabled = 59,
IsAcceptingTells = 60,
/// <summary>1 weenie attestations.</summary>
LoggingChannel = 61,
/// <summary>5 weenie attestations.</summary>
OpensAnyLock = 62,
/// <summary>20 weenie attestations.</summary>
UnlimitedUse = 63,
GeneratedTreasureItem = 64,
/// <summary>97 weenie attestations.</summary>
IgnoreMagicResist = 65,
/// <summary>87 weenie attestations.</summary>
IgnoreMagicArmor = 66,
AiAllowTrade = 67,
/// <summary>2 weenie attestations.</summary>
SpellComponentsRequired = 68,
/// <summary>4617 weenie attestations.</summary>
IsSellable = 69,
/// <summary>4 weenie attestations.</summary>
IgnoreShieldsBySkill = 70,
/// <summary>6275 weenie attestations.</summary>
NoDraw = 71,
ActivationUntargeted = 72,
HouseHasGottenPriorityBootPos = 73,
/// <summary>12 weenie attestations.</summary>
GeneratorAutomaticDestruction = 74,
HouseHooksVisible = 75,
/// <summary>8 weenie attestations.</summary>
HouseRequiresMonarch = 76,
HouseHooksEnabled = 77,
HouseNotifiedHudOfHookCount = 78,
/// <summary>15 weenie attestations.</summary>
AiAcceptEverything = 79,
IgnorePortalRestrictions = 80,
/// <summary>5 weenie attestations.</summary>
RequiresBackpackSlot = 81,
/// <summary>444 weenie attestations.</summary>
DontTurnOrMoveWhenGiving = 82,
/// <summary>442 weenie attestations.</summary>
NpcLooksLikeObject = 83,
/// <summary>210 weenie attestations.</summary>
IgnoreCloIcons = 84,
/// <summary>178 weenie attestations.</summary>
AppraisalHasAllowedWielder = 85,
ChestRegenOnClose = 86,
LogoffInMinigame = 87,
/// <summary>17 weenie attestations.</summary>
PortalShowDestination = 88,
/// <summary>30 weenie attestations.</summary>
PortalIgnoresPkAttackTimer = 89,
/// <summary>43 weenie attestations.</summary>
NpcInteractsSilently = 90,
/// <summary>230 weenie attestations.</summary>
Retained = 91,
/// <summary>1 weenie attestations.</summary>
IgnoreAuthor = 92,
Limbo = 93,
AppraisalHasAllowedActivator = 94,
ExistedBeforeAllegianceXpChanges = 95,
IsDeaf = 96,
IsPsr = 97,
Invincible = 98,
/// <summary>1068 weenie attestations.</summary>
Ivoryable = 99,
/// <summary>687 weenie attestations.</summary>
Dyable = 100,
CanGenerateRare = 101,
CorpseGeneratedRare = 102,
/// <summary>14 weenie attestations.</summary>
NonProjectileMagicImmune = 103,
ActdReceivedItems = 104,
Unknown105 = 105,
FirstEnterWorldDone = 106,
RecallsDisabled = 107,
/// <summary>13 weenie attestations.</summary>
RareUsesTimer = 108,
ActdPreorderReceivedItems = 109,
Afk = 110,
IsGagged = 111,
ProcSpellSelfTargeted = 112,
IsAllegianceGagged = 113,
EquipmentSetTriggerPiece = 114,
Uninscribe = 115,
WieldOnUse = 116,
ChestClearedWhenClosed = 117,
NeverAttack = 118,
SuppressGenerateEffect = 119,
TreasureCorpse = 120,
EquipmentSetAddLevel = 121,
BarberActive = 122,
TopLayerPriority = 123,
NoHeldItemShown = 124,
LoginAtLifestone = 125,
OlthoiPk = 126,
Account15Days = 127,
HadNoVitae = 128,
NoOlthoiTalk = 129,
/// <summary>14 weenie attestations.</summary>
AutowieldLeft = 130,
}

View file

@ -0,0 +1,134 @@
// <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>PropertyDataId</c> property table — the numeric keys the server sends in
/// <c>PrivateUpdatePropertyDataId (0x02E1) / PublicUpdatePropertyDataId (0x02E2)</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 (DAT file id)</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>DataId</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. 41 of these 62 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 PropertyDataId : uint
{
Undef = 0,
/// <summary>38985 weenie attestations.</summary>
Setup = 1,
/// <summary>12219 weenie attestations.</summary>
MotionTable = 2,
/// <summary>23696 weenie attestations.</summary>
SoundTable = 3,
/// <summary>4319 weenie attestations.</summary>
CombatTable = 4,
/// <summary>2 weenie attestations.</summary>
QualityFilter = 5,
/// <summary>13875 weenie attestations.</summary>
PaletteBase = 6,
/// <summary>9049 weenie attestations.</summary>
ClothingBase = 7,
/// <summary>38985 weenie attestations.</summary>
Icon = 8,
/// <summary>741 weenie attestations.</summary>
EyesTexture = 9,
/// <summary>741 weenie attestations.</summary>
NoseTexture = 10,
/// <summary>741 weenie attestations.</summary>
MouthTexture = 11,
DefaultEyesTexture = 12,
DefaultNoseTexture = 13,
DefaultMouthTexture = 14,
/// <summary>741 weenie attestations.</summary>
HairPalette = 15,
/// <summary>741 weenie attestations.</summary>
EyesPalette = 16,
/// <summary>741 weenie attestations.</summary>
SkinPalette = 17,
HeadObject = 18,
/// <summary>4 weenie attestations.</summary>
ActivationAnimation = 19,
/// <summary>4 weenie attestations.</summary>
InitMotion = 20,
ActivationSound = 21,
/// <summary>23266 weenie attestations.</summary>
PhysicsEffectTable = 22,
/// <summary>138 weenie attestations.</summary>
UseSound = 23,
/// <summary>48 weenie attestations.</summary>
UseTargetAnimation = 24,
/// <summary>4 weenie attestations.</summary>
UseTargetSuccessAnimation = 25,
/// <summary>2 weenie attestations.</summary>
UseTargetFailureAnimation = 26,
/// <summary>232 weenie attestations.</summary>
UseUserAnimation = 27,
/// <summary>3696 weenie attestations.</summary>
Spell = 28,
/// <summary>156 weenie attestations.</summary>
SpellComponent = 29,
/// <summary>794 weenie attestations.</summary>
PhysicsScript = 30,
/// <summary>497 weenie attestations.</summary>
LinkedPortalOne = 31,
/// <summary>861 weenie attestations.</summary>
WieldedTreasureType = 32,
/// <summary>5 weenie attestations.</summary>
UnknownGuessedname = 33,
UnknownGuessedname2 = 34,
/// <summary>2000 weenie attestations.</summary>
DeathTreasureType = 35,
/// <summary>2276 weenie attestations.</summary>
MutateFilter = 36,
/// <summary>1253 weenie attestations.</summary>
ItemSkillLimit = 37,
/// <summary>1 weenie attestations.</summary>
UseCreateItem = 38,
DeathSpell = 39,
VendorsClassId = 40,
/// <summary>13 weenie attestations.</summary>
ItemSpecializedOnly = 41,
/// <summary>6274 weenie attestations.</summary>
HouseId = 42,
AccountHouseId = 43,
/// <summary>6274 weenie attestations.</summary>
RestrictionEffect = 44,
CreationMutationFilter = 45,
/// <summary>584 weenie attestations.</summary>
TsysMutationFilter = 46,
LastPortal = 47,
/// <summary>1 weenie attestations.</summary>
LinkedPortalTwo = 48,
OriginalPortal = 49,
/// <summary>1000 weenie attestations.</summary>
IconOverlay = 50,
/// <summary>16 weenie attestations.</summary>
IconOverlaySecondary = 51,
/// <summary>554 weenie attestations.</summary>
IconUnderlay = 52,
AugmentationMutationFilter = 53,
AugmentationEffect = 54,
/// <summary>84 weenie attestations.</summary>
ProcSpell = 55,
AugmentationCreateItem = 56,
AlternateCurrency = 57,
BlueSurgeSpell = 58,
YellowSurgeSpell = 59,
RedSurgeSpell = 60,
OlthoiDeathTreasureType = 61,
}

View file

@ -0,0 +1,289 @@
// <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,
}

View file

@ -0,0 +1,79 @@
// <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,
}

View file

@ -0,0 +1,611 @@
// <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>PropertyInt</c> property table — the numeric keys the server sends in
/// <c>PrivateUpdatePropertyInt (0x02CD) / PublicUpdatePropertyInt (0x02CE)</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>int</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>IntId</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. 189 of these 391 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 PropertyInt : uint
{
Undef = 0,
/// <summary>UtilityBelt catalog calls this <c>ObjectType</c>; 37329 weenie attestations.</summary>
ItemType = 1,
/// <summary>6140 weenie attestations.</summary>
CreatureType = 2,
/// <summary>8344 weenie attestations.</summary>
PaletteTemplate = 3,
/// <summary>1597 weenie attestations.</summary>
ClothingPriority = 4,
/// <summary>25793 weenie attestations.</summary>
EncumbranceVal = 5,
/// <summary>8633 weenie attestations.</summary>
ItemsCapacity = 6,
/// <summary>8618 weenie attestations.</summary>
ContainersCapacity = 7,
/// <summary>23605 weenie attestations.</summary>
Mass = 8,
/// <summary>20797 weenie attestations.</summary>
ValidLocations = 9,
CurrentWieldedLocation = 10,
/// <summary>4373 weenie attestations.</summary>
MaxStackSize = 11,
/// <summary>4373 weenie attestations.</summary>
StackSize = 12,
/// <summary>3181 weenie attestations.</summary>
StackUnitEncumbrance = 13,
/// <summary>3181 weenie attestations.</summary>
StackUnitMass = 14,
/// <summary>3181 weenie attestations.</summary>
StackUnitValue = 15,
/// <summary>37280 weenie attestations.</summary>
ItemUseable = 16,
/// <summary>21 weenie attestations.</summary>
RareId = 17,
/// <summary>5705 weenie attestations.</summary>
UiEffects = 18,
/// <summary>25852 weenie attestations.</summary>
Value = 19,
/// <summary>1 weenie attestations.</summary>
CoinValue = 20,
TotalExperience = 21,
AvailableCharacter = 22,
TotalSkillCredits = 23,
AvailableSkillCredits = 24,
/// <summary>6140 weenie attestations.</summary>
Level = 25,
/// <summary>28 weenie attestations.</summary>
AccountRequirements = 26,
/// <summary>5476 weenie attestations.</summary>
ArmorType = 27,
/// <summary>1657 weenie attestations.</summary>
ArmorLevel = 28,
AllegianceCpPool = 29,
/// <summary>1 weenie attestations.</summary>
AllegianceRank = 30,
ChannelsAllowed = 31,
ChannelsActive = 32,
/// <summary>6252 weenie attestations.</summary>
Bonded = 33,
MonarchsRank = 34,
AllegianceFollowers = 35,
/// <summary>997 weenie attestations.</summary>
ResistMagic = 36,
/// <summary>575 weenie attestations.</summary>
ResistItemAppraisal = 37,
/// <summary>677 weenie attestations.</summary>
ResistLockpick = 38,
DeprecatedResistRepair = 39,
/// <summary>1634 weenie attestations.</summary>
CombatMode = 40,
CurrentAttackHeight = 41,
CombatCollisions = 42,
/// <summary>1 weenie attestations.</summary>
NumDeaths = 43,
/// <summary>3717 weenie attestations.</summary>
Damage = 44,
/// <summary>3357 weenie attestations.</summary>
DamageType = 45,
/// <summary>2973 weenie attestations.</summary>
DefaultCombatStyle = 46,
/// <summary>2364 weenie attestations.</summary>
AttackType = 47,
/// <summary>3393 weenie attestations.</summary>
WeaponSkill = 48,
/// <summary>3394 weenie attestations.</summary>
WeaponTime = 49,
/// <summary>972 weenie attestations.</summary>
AmmoType = 50,
/// <summary>4499 weenie attestations.</summary>
CombatUse = 51,
/// <summary>440 weenie attestations.</summary>
ParentLocation = 52,
/// <summary>440 weenie attestations.</summary>
PlacementPosition = 53,
WeaponEncumbrance = 54,
WeaponMass = 55,
ShieldValue = 56,
ShieldEncumbrance = 57,
MissileInventoryLocation = 58,
FullDamageType = 59,
/// <summary>545 weenie attestations.</summary>
WeaponRange = 60,
AttackersSkill = 61,
DefendersSkill = 62,
AttackersSkillValue = 63,
AttackersClass = 64,
Placement = 65,
/// <summary>179 weenie attestations.</summary>
CheckpointStatus = 66,
/// <summary>219 weenie attestations.</summary>
Tolerance = 67,
/// <summary>2151 weenie attestations.</summary>
TargetingTactic = 68,
/// <summary>48 weenie attestations.</summary>
CombatTactic = 69,
HomesickTargetingTactic = 70,
NumFollowFailures = 71,
/// <summary>494 weenie attestations.</summary>
FriendType = 72,
FoeType = 73,
/// <summary>UtilityBelt catalog calls this <c>MerchandiseObjectTypes</c>; 1049 weenie attestations.</summary>
MerchandiseItemTypes = 74,
/// <summary>1049 weenie attestations.</summary>
MerchandiseMinValue = 75,
/// <summary>1049 weenie attestations.</summary>
MerchandiseMaxValue = 76,
NumItemsSold = 77,
NumItemsBought = 78,
MoneyIncome = 79,
MoneyOutflow = 80,
/// <summary>2195 weenie attestations.</summary>
MaxGeneratedObjects = 81,
/// <summary>2195 weenie attestations.</summary>
InitGeneratedObjects = 82,
/// <summary>787 weenie attestations.</summary>
ActivationResponse = 83,
OriginalValue = 84,
NumMoveFailures = 85,
/// <summary>815 weenie attestations.</summary>
MinLevel = 86,
/// <summary>115 weenie attestations.</summary>
MaxLevel = 87,
/// <summary>10 weenie attestations.</summary>
LockpickMod = 88,
/// <summary>525 weenie attestations.</summary>
BoosterEnum = 89,
/// <summary>532 weenie attestations.</summary>
BoostValue = 90,
/// <summary>800 weenie attestations.</summary>
MaxStructure = 91,
/// <summary>713 weenie attestations.</summary>
Structure = 92,
/// <summary>38985 weenie attestations.</summary>
PhysicsState = 93,
/// <summary>3570 weenie attestations.</summary>
TargetType = 94,
/// <summary>2668 weenie attestations.</summary>
RadarBlipColor = 95,
/// <summary>472 weenie attestations.</summary>
EncumbranceCapacity = 96,
LoginTimestamp = 97,
/// <summary>119 weenie attestations.</summary>
CreationTimestamp = 98,
/// <summary>4 weenie attestations.</summary>
PkLevelModifier = 99,
/// <summary>575 weenie attestations.</summary>
GeneratorType = 100,
/// <summary>1265 weenie attestations.</summary>
AiAllowedCombatStyle = 101,
LogoffTimestamp = 102,
/// <summary>158 weenie attestations.</summary>
GeneratorDestructionType = 103,
ActivationCreateClass = 104,
/// <summary>693 weenie attestations.</summary>
ItemWorkmanship = 105,
/// <summary>4213 weenie attestations.</summary>
ItemSpellcraft = 106,
/// <summary>4173 weenie attestations.</summary>
ItemCurMana = 107,
/// <summary>4211 weenie attestations.</summary>
ItemMaxMana = 108,
/// <summary>3091 weenie attestations.</summary>
ItemDifficulty = 109,
/// <summary>1043 weenie attestations.</summary>
ItemAllegianceRankLimit = 110,
/// <summary>2940 weenie attestations.</summary>
PortalBitmask = 111,
AdvocateLevel = 112,
/// <summary>749 weenie attestations.</summary>
Gender = 113,
/// <summary>4502 weenie attestations.</summary>
Attuned = 114,
/// <summary>1640 weenie attestations.</summary>
ItemSkillLevelLimit = 115,
GateLogic = 116,
/// <summary>66 weenie attestations.</summary>
ItemManaCost = 117,
Logoff = 118,
/// <summary>365 weenie attestations.</summary>
Active = 119,
AttackHeight = 120,
NumAttackFailures = 121,
AiCpThreshold = 122,
AiAdvancementStrategy = 123,
Version = 124,
/// <summary>1 weenie attestations.</summary>
Age = 125,
/// <summary>1048 weenie attestations.</summary>
VendorHappyMean = 126,
/// <summary>1048 weenie attestations.</summary>
VendorHappyVariance = 127,
CloakStatus = 128,
VitaeCpPool = 129,
NumServicesSold = 130,
/// <summary>586 weenie attestations.</summary>
MaterialType = 131,
NumAllegianceBreaks = 132,
/// <summary>10541 weenie attestations.</summary>
ShowableOnRadar = 133,
/// <summary>3138 weenie attestations.</summary>
PlayerKillerStatus = 134,
VendorHappyMaxItems = 135,
/// <summary>5 weenie attestations.</summary>
ScorePageNum = 136,
/// <summary>5 weenie attestations.</summary>
ScoreConfigNum = 137,
/// <summary>5 weenie attestations.</summary>
ScoreNumScores = 138,
DeathLevel = 139,
/// <summary>1411 weenie attestations.</summary>
AiOptions = 140,
OpenToEveryone = 141,
/// <summary>297 weenie attestations.</summary>
GeneratorTimeType = 142,
/// <summary>51 weenie attestations.</summary>
GeneratorStartTime = 143,
/// <summary>50 weenie attestations.</summary>
GeneratorEndTime = 144,
/// <summary>257 weenie attestations.</summary>
GeneratorEndDestructionType = 145,
/// <summary>4361 weenie attestations.</summary>
XpOverride = 146,
NumCrashAndTurns = 147,
ComponentWarningThreshold = 148,
/// <summary>7 weenie attestations.</summary>
HouseStatus = 149,
/// <summary>4715 weenie attestations.</summary>
HookPlacement = 150,
/// <summary>6799 weenie attestations.</summary>
HookType = 151,
/// <summary>UtilityBelt catalog calls this <c>HookObjectType</c>; 5 weenie attestations.</summary>
HookItemType = 152,
AiPpThreshold = 153,
GeneratorVersion = 154,
/// <summary>6274 weenie attestations.</summary>
HouseType = 155,
/// <summary>10 weenie attestations.</summary>
PickupEmoteOffset = 156,
/// <summary>1 weenie attestations.</summary>
WeenieIteration = 157,
/// <summary>2557 weenie attestations.</summary>
WieldRequirements = 158,
/// <summary>2557 weenie attestations.</summary>
WieldSkilltype = 159,
/// <summary>2557 weenie attestations.</summary>
WieldDifficulty = 160,
/// <summary>654 weenie attestations.</summary>
HouseMaxHooksUsable = 161,
HouseCurrentHooksUsable = 162,
/// <summary>8 weenie attestations.</summary>
AllegianceMinLevel = 163,
AllegianceMaxLevel = 164,
HouseRelinkHookCount = 165,
/// <summary>537 weenie attestations.</summary>
SlayerCreatureType = 166,
ConfirmationInProgress = 167,
ConfirmationTypeInProgress = 168,
/// <summary>728 weenie attestations.</summary>
TsysMutationData = 169,
/// <summary>36 weenie attestations.</summary>
NumItemsInMaterial = 170,
/// <summary>228 weenie attestations.</summary>
NumTimesTinkered = 171,
/// <summary>358 weenie attestations.</summary>
AppraisalLongDescDecoration = 172,
/// <summary>133 weenie attestations.</summary>
AppraisalLockpickSuccessPercent = 173,
/// <summary>103 weenie attestations.</summary>
AppraisalPages = 174,
/// <summary>103 weenie attestations.</summary>
AppraisalMaxPages = 175,
/// <summary>355 weenie attestations.</summary>
AppraisalItemSkill = 176,
/// <summary>281 weenie attestations.</summary>
GemCount = 177,
/// <summary>281 weenie attestations.</summary>
GemType = 178,
/// <summary>495 weenie attestations.</summary>
ImbuedEffect = 179,
AttackersRawSkillValue = 180,
ChessRank = 181,
ChessTotalGames = 182,
ChessGamesWon = 183,
ChessGamesLost = 184,
/// <summary>71 weenie attestations.</summary>
TypeOfAlteration = 185,
/// <summary>71 weenie attestations.</summary>
SkillToBeAltered = 186,
SkillAlterationCount = 187,
/// <summary>807 weenie attestations.</summary>
HeritageGroup = 188,
/// <summary>30 weenie attestations.</summary>
TransferFromAttribute = 189,
/// <summary>30 weenie attestations.</summary>
TransferToAttribute = 190,
AttributeTransferCount = 191,
FakeFishingSkill = 192,
/// <summary>3 weenie attestations.</summary>
NumKeys = 193,
DeathTimestamp = 194,
PkTimestamp = 195,
VictimTimestamp = 196,
/// <summary>22 weenie attestations.</summary>
HookGroup = 197,
AllegianceSwearTimestamp = 198,
HousePurchaseTimestamp = 199,
RedirectableEquippedArmorCount = 200,
MeleedefenseImbuedEffectTypeCache = 201,
MissileDefenseImbuedEffectTypeCache = 202,
MagicDefenseImbuedEffectTypeCache = 203,
/// <summary>121 weenie attestations.</summary>
ElementalDamageBonus = 204,
ImbueAttempts = 205,
ImbueSuccesses = 206,
CreatureKills = 207,
PlayerKillsPk = 208,
PlayerKillsPkl = 209,
RaresTierOne = 210,
RaresTierTwo = 211,
RaresTierThree = 212,
RaresTierFour = 213,
RaresTierFive = 214,
AugmentationStat = 215,
AugmentationFamilyStat = 216,
AugmentationInnateFamily = 217,
AugmentationInnateStrength = 218,
AugmentationInnateEndurance = 219,
AugmentationInnateCoordination = 220,
AugmentationInnateQuickness = 221,
AugmentationInnateFocus = 222,
AugmentationInnateSelf = 223,
AugmentationSpecializeSalvaging = 224,
AugmentationSpecializeItemTinkering = 225,
AugmentationSpecializeArmorTinkering = 226,
AugmentationSpecializeMagicItemTinkering = 227,
AugmentationSpecializeWeaponTinkering = 228,
AugmentationExtraPackSlot = 229,
AugmentationIncreasedCarryingCapacity = 230,
AugmentationLessDeathItemLoss = 231,
AugmentationSpellsRemainPastDeath = 232,
AugmentationCriticalDefense = 233,
AugmentationBonusXp = 234,
AugmentationBonusSalvage = 235,
AugmentationBonusImbueChance = 236,
AugmentationFasterRegen = 237,
AugmentationIncreasedSpellDuration = 238,
AugmentationResistanceFamily = 239,
AugmentationResistanceSlash = 240,
AugmentationResistancePierce = 241,
AugmentationResistanceBlunt = 242,
AugmentationResistanceAcid = 243,
AugmentationResistanceFire = 244,
AugmentationResistanceFrost = 245,
AugmentationResistanceLightning = 246,
RaresTierOneLogin = 247,
RaresTierTwoLogin = 248,
RaresTierThreeLogin = 249,
RaresTierFourLogin = 250,
RaresTierFiveLogin = 251,
RaresLoginTimestamp = 252,
RaresTierSix = 253,
RaresTierSeven = 254,
RaresTierSixLogin = 255,
RaresTierSevenLogin = 256,
/// <summary>1 weenie attestations.</summary>
ItemAttributeLimit = 257,
/// <summary>1 weenie attestations.</summary>
ItemAttributeLevelLimit = 258,
ItemAttribute2ndLimit = 259,
ItemAttribute2ndLevelLimit = 260,
/// <summary>2 weenie attestations.</summary>
CharacterTitleId = 261,
/// <summary>1 weenie attestations.</summary>
NumCharacterTitles = 262,
/// <summary>93 weenie attestations.</summary>
ResistanceModifierType = 263,
FreeTinkersBitfield = 264,
/// <summary>316 weenie attestations.</summary>
EquipmentSetId = 265,
PetClass = 266,
/// <summary>119 weenie attestations.</summary>
Lifespan = 267,
/// <summary>119 weenie attestations.</summary>
RemainingLifespan = 268,
UseCreateQuantity = 269,
/// <summary>62 weenie attestations.</summary>
WieldRequirements2 = 270,
/// <summary>62 weenie attestations.</summary>
WieldSkilltype2 = 271,
/// <summary>62 weenie attestations.</summary>
WieldDifficulty2 = 272,
/// <summary>3 weenie attestations.</summary>
WieldRequirements3 = 273,
/// <summary>3 weenie attestations.</summary>
WieldSkilltype3 = 274,
/// <summary>3 weenie attestations.</summary>
WieldDifficulty3 = 275,
/// <summary>17 weenie attestations.</summary>
WieldRequirements4 = 276,
/// <summary>17 weenie attestations.</summary>
WieldSkilltype4 = 277,
/// <summary>17 weenie attestations.</summary>
WieldDifficulty4 = 278,
/// <summary>14 weenie attestations.</summary>
Unique = 279,
/// <summary>365 weenie attestations.</summary>
SharedCooldown = 280,
/// <summary>177 weenie attestations.</summary>
Faction1Bits = 281,
Faction2Bits = 282,
Faction3Bits = 283,
Hatred1Bits = 284,
Hatred2Bits = 285,
Hatred3Bits = 286,
/// <summary>61 weenie attestations.</summary>
SocietyRankCelhan = 287,
/// <summary>60 weenie attestations.</summary>
SocietyRankEldweb = 288,
/// <summary>56 weenie attestations.</summary>
SocietyRankRadblo = 289,
HearLocalSignals = 290,
HearLocalSignalsRadius = 291,
/// <summary>67 weenie attestations.</summary>
Cleaving = 292,
AugmentationSpecializeGearcraft = 293,
AugmentationInfusedCreatureMagic = 294,
AugmentationInfusedItemMagic = 295,
AugmentationInfusedLifeMagic = 296,
AugmentationInfusedWarMagic = 297,
AugmentationCriticalExpertise = 298,
AugmentationCriticalPower = 299,
AugmentationSkilledMelee = 300,
AugmentationSkilledMissile = 301,
AugmentationSkilledMagic = 302,
/// <summary>124 weenie attestations.</summary>
ImbuedEffect2 = 303,
/// <summary>124 weenie attestations.</summary>
ImbuedEffect3 = 304,
/// <summary>117 weenie attestations.</summary>
ImbuedEffect4 = 305,
/// <summary>117 weenie attestations.</summary>
ImbuedEffect5 = 306,
/// <summary>1403 weenie attestations.</summary>
DamageRating = 307,
/// <summary>729 weenie attestations.</summary>
DamageResistRating = 308,
AugmentationDamageBonus = 309,
AugmentationDamageReduction = 310,
ImbueStackingBits = 311,
HealOverTime = 312,
/// <summary>880 weenie attestations.</summary>
CritRating = 313,
/// <summary>843 weenie attestations.</summary>
CritDamageRating = 314,
/// <summary>713 weenie attestations.</summary>
CritResistRating = 315,
/// <summary>732 weenie attestations.</summary>
CritDamageResistRating = 316,
HealingResistRating = 317,
DamageOverTime = 318,
/// <summary>79 weenie attestations.</summary>
ItemMaxLevel = 319,
/// <summary>79 weenie attestations.</summary>
ItemXpStyle = 320,
EquipmentSetExtra = 321,
AetheriaBitfield = 322,
HealingBoostRating = 323,
/// <summary>29 weenie attestations.</summary>
HeritageSpecificArmor = 324,
AlternateRacialSkills = 325,
AugmentationJackOfAllTrades = 326,
AugmentationResistanceNether = 327,
AugmentationInfusedVoidMagic = 328,
WeaknessRating = 329,
NetherOverTime = 330,
NetherResistRating = 331,
LuminanceAward = 332,
LumAugDamageRating = 333,
LumAugDamageReductionRating = 334,
LumAugCritDamageRating = 335,
LumAugCritReductionRating = 336,
LumAugSurgeEffectRating = 337,
LumAugSurgeChanceRating = 338,
LumAugItemManaUsage = 339,
LumAugItemManaGain = 340,
LumAugVitality = 341,
LumAugHealingRating = 342,
LumAugSkilledCraft = 343,
LumAugSkilledSpec = 344,
LumAugNoDestroyCraft = 345,
RestrictInteraction = 346,
OlthoiLootTimestamp = 347,
OlthoiLootStep = 348,
UseCreatesContractId = 349,
DotResistRating = 350,
LifeResistRating = 351,
/// <summary>13 weenie attestations.</summary>
CloakWeaveProc = 352,
/// <summary>492 weenie attestations.</summary>
WeaponType = 353,
MeleeMastery = 354,
RangedMastery = 355,
SneakAttackRating = 356,
RecklessnessRating = 357,
DeceptionRating = 358,
CombatPetRange = 359,
WeaponAuraDamage = 360,
WeaponAuraSpeed = 361,
SummoningMastery = 362,
HeartbeatLifespan = 363,
UseLevelRequirement = 364,
LumAugAllSkills = 365,
/// <summary>259 weenie attestations.</summary>
UseRequiresSkill = 366,
/// <summary>259 weenie attestations.</summary>
UseRequiresSkillLevel = 367,
/// <summary>36 weenie attestations.</summary>
UseRequiresSkillSpec = 368,
/// <summary>271 weenie attestations.</summary>
UseRequiresLevel = 369,
/// <summary>869 weenie attestations.</summary>
GearDamage = 370,
/// <summary>868 weenie attestations.</summary>
GearDamageResist = 371,
/// <summary>854 weenie attestations.</summary>
GearCrit = 372,
/// <summary>854 weenie attestations.</summary>
GearCritResist = 373,
/// <summary>955 weenie attestations.</summary>
GearCritDamage = 374,
/// <summary>953 weenie attestations.</summary>
GearCritDamageResist = 375,
/// <summary>610 weenie attestations.</summary>
GearHealingBoost = 376,
/// <summary>602 weenie attestations.</summary>
GearNetherResist = 377,
/// <summary>602 weenie attestations.</summary>
GearLifeResist = 378,
/// <summary>640 weenie attestations.</summary>
GearMaxHealth = 379,
Unknown380 = 380,
/// <summary>616 weenie attestations.</summary>
PKDamageRating = 381,
/// <summary>602 weenie attestations.</summary>
PKDamageResistRating = 382,
/// <summary>643 weenie attestations.</summary>
GearPKDamageRating = 383,
/// <summary>640 weenie attestations.</summary>
GearPKDamageResistRating = 384,
Unknown385 = 385,
/// <summary>766 weenie attestations.</summary>
Overpower = 386,
/// <summary>602 weenie attestations.</summary>
OverpowerResist = 387,
/// <summary>602 weenie attestations.</summary>
GearOverpower = 388,
/// <summary>602 weenie attestations.</summary>
GearOverpowerResist = 389,
/// <summary>2 weenie attestations.</summary>
Enlightenment = 390,
}

View file

@ -0,0 +1,43 @@
// <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>PropertyInt64</c> property table — the numeric keys the server sends in
/// <c>PrivateUpdatePropertyInt64 (0x02D1)</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>long</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>Int64Id</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. 3 of these 9 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 PropertyInt64 : uint
{
Undef = 0,
TotalExperience = 1,
AvailableExperience = 2,
/// <summary>7 weenie attestations.</summary>
AugmentationCost = 3,
/// <summary>79 weenie attestations.</summary>
ItemTotalXp = 4,
/// <summary>79 weenie attestations.</summary>
ItemBaseXp = 5,
AvailableLuminance = 6,
MaximumLuminance = 7,
InteractionReqs = 8,
}

View file

@ -0,0 +1,112 @@
// <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>PropertyString</c> property table — the numeric keys the server sends in
/// <c>PrivateUpdatePropertyString (0x02DD) / PublicUpdatePropertyString (0x02DE)</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>string</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>StringId</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. 28 of these 53 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 PropertyString : uint
{
Undef = 0,
/// <summary>38984 weenie attestations.</summary>
Name = 1,
Title = 2,
/// <summary>1697 weenie attestations.</summary>
Sex = 3,
/// <summary>1693 weenie attestations.</summary>
HeritageGroup = 4,
/// <summary>1622 weenie attestations.</summary>
Template = 5,
AttackersName = 6,
/// <summary>93 weenie attestations.</summary>
Inscription = 7,
/// <summary>93 weenie attestations.</summary>
ScribeName = 8,
VendorsName = 9,
/// <summary>1 weenie attestations.</summary>
Fellowship = 10,
MonarchsName = 11,
/// <summary>449 weenie attestations.</summary>
LockCode = 12,
/// <summary>238 weenie attestations.</summary>
KeyCode = 13,
/// <summary>3219 weenie attestations.</summary>
Use = 14,
/// <summary>5597 weenie attestations.</summary>
ShortDesc = 15,
/// <summary>7107 weenie attestations.</summary>
LongDesc = 16,
/// <summary>109 weenie attestations.</summary>
ActivationTalk = 17,
/// <summary>10 weenie attestations.</summary>
UseMessage = 18,
/// <summary>45 weenie attestations.</summary>
ItemHeritageGroupRestriction = 19,
/// <summary>1318 weenie attestations.</summary>
PluralName = 20,
MonarchsTitle = 21,
/// <summary>96 weenie attestations.</summary>
ActivationFailure = 22,
ScribeAccount = 23,
/// <summary>591 weenie attestations.</summary>
TownName = 24,
/// <summary>2 weenie attestations.</summary>
CraftsmanName = 25,
/// <summary>4 weenie attestations.</summary>
UsePkServerError = 26,
ScoreCachedText = 27,
/// <summary>5 weenie attestations.</summary>
ScoreDefaultEntryFormat = 28,
/// <summary>5 weenie attestations.</summary>
ScoreFirstEntryFormat = 29,
/// <summary>5 weenie attestations.</summary>
ScoreLastEntryFormat = 30,
/// <summary>5 weenie attestations.</summary>
ScoreOnlyEntryFormat = 31,
/// <summary>5 weenie attestations.</summary>
ScoreNoEntry = 32,
/// <summary>859 weenie attestations.</summary>
Quest = 33,
/// <summary>249 weenie attestations.</summary>
GeneratorEvent = 34,
PatronsTitle = 35,
HouseOwnerName = 36,
/// <summary>170 weenie attestations.</summary>
QuestRestriction = 37,
AppraisalPortalDestination = 38,
TinkerName = 39,
ImbuerName = 40,
HouseOwnerAccount = 41,
DisplayName = 42,
DateOfBirth = 43,
ThirdPartyApi = 44,
KillQuest = 45,
Afk = 46,
AllegianceName = 47,
AugmentationAddQuest = 48,
KillQuest2 = 49,
KillQuest3 = 50,
UseSendsSignal = 51,
GearPlatingName = 52,
}