I believe the struct in /common/spdat.h has the fields in the order they are in the file (plus helpful comments):
Code:
struct SPDat_Spell_Struct
{
/* 000 */ int id; // not used
/* 001 */ char name[64]; // Name of the spell
/* 002 */ char player_1[32]; // "PLAYER_1"
/* 003 */ char teleport_zone[64]; // Teleport zone, pet name summoned, or item summoned
/* 004 */ char you_cast[64]; // Message when you cast
/* 005 */ char other_casts[64]; // Message when other casts
/* 006 */ char cast_on_you[64]; // Message when spell is cast on you
/* 007 */ char cast_on_other[64]; // Message when spell is cast on someone else
/* 008 */ char spell_fades[64]; // Spell fades
/* 009 */ float range;
/* 010 */ float aoerange;
/* 011 */ float pushback;
/* 012 */ float pushup;
/* 013 */ uint32 cast_time; // Cast time
/* 014 */ uint32 recovery_time; // Recovery time
/* 015 */ uint32 recast_time; // Recast same spell time
/* 016 */ uint32 buffdurationformula;
/* 017 */ uint32 buffduration;
/* 018 */ uint32 AEDuration; // sentinel, rain of something
/* 019 */ uint16 mana; // Mana Used
/* 020 */ int base[EFFECT_COUNT]; //various purposes
/* 032 */ int base2[EFFECT_COUNT]; //various purposes
/* 044 */ int32 max[EFFECT_COUNT];
/* 056 */ //uint16 icon; // Spell icon
/* 057 */ //uint16 memicon; // Icon on membarthing
/* 058 */ int32 components[4]; // reagents
/* 062 */ int component_counts[4]; // amount of regents used
/* 066 */ int NoexpendReagent[4]; // focus items (Need but not used; Flame Lick has a Fire Beetle Eye focus.)
// If it is a number between 1-4 it means components[number] is a focus and not to expend it
// If it is a valid itemid it means this item is a focus as well
/* 070 */ uint16 formula[EFFECT_COUNT]; // Spell's value formula
/* 082 */ //int LightType; // probaly another effecttype flag
/* 083 */ int8 goodEffect; //0=detrimental, 1=Beneficial, 2=Beneficial, Group Only
/* 084 */ int Activated; // probably another effecttype flag
/* 085 */ int resisttype;
/* 086 */ int effectid[EFFECT_COUNT]; // Spell's effects
/* 098 */ SpellTargetType targettype; // Spell's Target
/* 099 */ int basediff; // base difficulty fizzle adjustment
/* 100 */ SkillUseTypes skill;
/* 101 */ int8 zonetype; // 01=Outdoors, 02=dungeons, ff=Any
/* 102 */ int8 EnvironmentType;
/* 103 */ int8 TimeOfDay;
/* 104 */ uint8 classes[PLAYER_CLASS_COUNT]; // Classes, and their min levels
/* 120 */ uint8 CastingAnim;
/* 121 */ //uint8 TargetAnim;
/* 122 */ //uint32 TravelType;
/* 123 */ uint16 SpellAffectIndex;
/* 124 */ int8 disallow_sit; // 124: high-end Yaulp spells (V, VI, VII, VIII [Rk 1, 2, & 3], & Gallenite's Bark of Fury
/* 125 */ // 125: Words of the Skeptic
/* 126 */ int8 deities[16]; // Deity check. 201 - 216 per http://www.eqemulator.net/wiki/wikka.php?wakka=DeityList
// -1: Restrict to Deity; 1: Restrict to Deity, but only used on non-Live (Test Server "Blessing of ...") spells; 0: Don't restrict
/* 142 */ // 142: between 0 & 100
// 143: always set to 0
/* 144 */ //int16 new_icon // Spell icon used by the client in uifiles/default/spells??.tga, both for spell gems & buff window. Looks to depreciate icon & memicon
/* 145 */ //int16 spellanim; // Doesn't look like it's the same as #doanim, so not sure what this is
/* 146 */ int8 uninterruptable; // Looks like anything != 0 is uninterruptable. Values are mostly -1, 0, & 1 (Fetid Breath = 90?)
/* 147 */ int16 ResistDiff;
/* 148 */ int8 dot_stacking_exempt; // If 1 doesn't stack with self cast by others. If -1 (not implemented) doesn't stack with same effect (???)
/* 149 */ //int deletable;
/* 150 */ uint16 RecourseLink;
/* 151 */ bool no_partial_resist; // 151: -1, 0, or 1
// 152 & 153: all set to 0
/* 154 */ int8 short_buff_box; // != 0, goes to short buff box.
/* 155 */ int descnum; // eqstr of description of spell
/* 156 */ //int typedescnum; // eqstr of type description
/* 157 */ int effectdescnum; // eqstr of effect description
/* 158 */ //Category Desc ID 3
/* 159 */ //bool npc_no_los;
/* 161 */ bool reflectable;
/* 162 */ int bonushate;
/* 163 */
/* 164 */ // for most spells this appears to mimic ResistDiff
/* 166 */ int EndurCost;
/* 167 */ int8 EndurTimerIndex;
/* 168 */ //int IsDisciplineBuff; //Will goto the combat window when cast
/* 169 */
/* 173 */ int HateAdded;
/* 174 */ int EndurUpkeep;
/* 175 */ int numhitstype; // defines which type of behavior will tick down the numhit counter.
/* 176 */ int numhits;
/* 177 */ int pvpresistbase;
/* 178 */ int pvpresistcalc;
/* 179 */ int pvpresistcap;
/* 180 */ int spell_category;
/* 181 */
/* 185 */ int8 can_mgb; // 0=no, -1 or 1 = yes
/* 186 */ int dispel_flag;
/* 189 */ int MinResist;
/* 190 */ int MaxResist;
/* 191 */ uint8 viral_targets;
/* 192 */ uint8 viral_timer;
/* 193 */ int NimbusEffect;
/* 194 */ float directional_start; //Cone Start Angle:
/* 195 */ float directional_end; // Cone End Angle:
/* 196 */
/* 197 */ bool not_extendable;
/* 198- 199 */
/* 200 */ bool suspendable; // buff is suspended in suspended buff zones
/* 201 - 202 */
/* 203 */ //int songcap; // individual song cap (how live currently does it, not implemented)
/* 204 - 206 */
/* 207 */ int spellgroup;
/* 208 */ // int rank - increments AA effects with same name
/* 209 */ int powerful_flag; // Need more investigation to figure out what to call this, for now we know -1 makes charm spells not break before their duration is complete, it does alot more though
/* 210 */ // bool DurationFrozen; ???
/* 211 */ int CastRestriction; //Various restriction categories for spells most seem targetable race related but have also seen others for instance only castable if target hp 20% or lower or only if target out of combat
/* 212 */ bool AllowRest;
/* 213 */ bool NotOutofCombat; //Fail if cast out of combat
/* 214 */ bool NotInCombat; //Fail if cast in combat
/* 215 - 218 */
/* 219 */ //int maxtargets; // is used for beam and ring spells for target # limits (not implemented)
/* 220 - 223 */
/* 224 */ bool persistdeath; // buff doesn't get stripped on death
/* 225 - 236 */ // Not in DB
uint8 DamageShieldType; // This field does not exist in spells_us.txt
};