feat(net): AppraiseInfoParser — ArmorProfile/CreatureProfile/WeaponProfile + enchantment bitfields
Completes the deferred-in-previous-commit profile blob deserializers.
The AppraiseInfo wire format has 10 flags; previous commit handled the
6 property tables + SpellBook; this adds the 7 remaining structured
blobs:
- ArmorProfile: 8× f32 per-damage-type protection values
(Slashing / Piercing / Bludgeoning / Cold / Fire / Acid / Nether /
Lightning).
- ArmorLevel: 9× i32 per-body-part AL
(Head / Chest / Abdomen / UpperArm / LowerArm / Hand / UpperLeg /
LowerLeg / Foot).
- WeaponProfile: 10 mixed fields — u32 DamageType / WeaponTime /
WeaponSkill / Damage, f64 DamageVariance / DamageMod / WeaponLength /
MaxVelocity / WeaponOffense, u32 MaxVelocityEstimated.
- CreatureProfile: flag-gated — always u32 Flags + Health + HealthMax,
optional 10× u32 attributes + vitals (flag 0x08 = ShowAttributes),
optional 2× u16 highlight/color (flag 0x01 = HasBuffsDebuffs).
- Enchantment bitfields (ArmorEnchantmentBitfield /
WeaponEnchantmentBitfield / ResistEnchantmentBitfield): each 2× u16
(highlight, color).
HookProfile (flag 0x200) still deferred — needs its own structure port.
Parsed record expanded to carry all these; callers that previously
consumed PropertyBundle + SpellBook keep working, new fields are
nullable record-struct payloads.
Tests (+6): ArmorProfile round-trip, ArmorLevels, WeaponProfile with
mixed primitives, CreatureProfile with + without attributes flag,
ArmorEnchantment bitfield.
Build green, 172 Core.Net tests pass (up from 166).
Ref: ACE AppraiseInfo.cs:735-778 (writer), ArmorProfile.cs / ArmorLevel.cs /
WeaponProfile.cs / CreatureProfile.cs (structure writers).
Ref: r08 §4 opcode 0x00C9.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>