namespace AcDream.Core.Spells; /// /// Per-spell static metadata loaded once at startup from /// docs/research/data/spells.csv via . /// One record per known spell id (3,956 entries in the retail dump). /// /// /// Used for: /// /// /// Buff / debuff bar labels (, /// , ). /// Stacking aggregation ( — only one /// enchantment per family-bucket is active; this is what /// EnchantmentMath uses to filter out superseded /// buffs in LocalPlayerState.GetMaxApprox). /// Spell tooltips (, /// , , /// ). /// Cast-bar audio + animation cues /// ( drives the chant). /// /// /// /// Fields not exposed (yet) from the 35-column source CSV: SortKey, /// Difficulty, Flags, Generation, IsFastWindup, IsIrresistible, /// IsOffensive, IsUntargetted, Speed, CasterEffect, TargetEffect, /// TargetMask, Type, plus 10 anonymous Unknown1..10. Add them on /// demand as panels grow. /// /// public sealed record SpellMetadata( uint SpellId, string Name, string School, uint Family, uint IconId, string SpellWords, float Duration, int ManaCost, bool IsDebuff, bool IsFellowship, string Description, int SortKey, int Difficulty, uint Flags, int Generation, bool IsFastWindup, bool IsOffensive, bool IsUntargeted, float Speed, uint CasterEffect, uint TargetEffect, uint TargetMask, int SpellType) { public bool IsSelfTargeted => (Flags & 0x00000008u) != 0; public bool IsBeneficial => (Flags & 0x00000004u) != 0; public bool IsProjectile => (Flags & 0x00000100u) != 0; }