struct Spell
{
	key "Name" => String value "Name of Spell"
	key "None" => SpellRank struct for spell with no ranks
	key 0 => Spell attributes (optional)
			 Optional values:
			 	string School -- "Shadow", "Holy", "Fire", "Frost", "Arcane", "Nature", "Healing", "Ranged", "Physical"
			 					 "Nuke", "Shock", "OffensiveTotem", "Affliction", "Destruction"
			 	list School -- table including two or more of the schools listed above (ie. School = {"Holy", "Healing})
			 	boolean eDot -- true for damage-over-time spell, defaults to false
			 	float eDuration -- time in seconds that spell lasts on target, defaults to 0
			 	float BonusFactor -- damage coefficient for multiplying Spellpower into the spell damage.
			 					   Use if spell has a special coefficient that doesn't follow standard formulas.
			 	float castTime -- time in seconds to cast the spell
			 	float Cooldown -- time in seconds of spell cooldown period
			 	float sTicks -- time in seconds between each application of the spell effect (ie. a DoT doing damage).
			 	boolean NoDownRank -- ??? (downranking is no longer possible in WoW, so this might be unneeded now).
			 	boolean canCrit -- true if this spell can crit, defaults to false
			 	boolean BaseIncrease -- true if the base damage of this spell increases each level, defaults to false
			 	int LevelIncrease -- how many levels between each Rank of the spell.  This must be defined if BaseIncrease is true.
			 	boolean Healing -- true for healing effects, defaults to false
			 	boolean NoDPS -- no DPS/HPS calc are done for spells it is useless for
			 	boolean NoDebuffs -- ??? (no idea what this is for)
			 	boolean NoDoom -- mana calculations until OOM aren't done
			 	float sFactor -- coefficient added to the spelldamage coefficient
			 	float sFactor_Base -- used for exceptions.  ex: frostbolt gets a 5% penalty but only to the base spell damage multiplier
			 	float hybridFactor -- spellpower coefficient for the instant portion of a hybrid damage/DoT or 
			 						  healing/HoT spells.
			 	float hybridDotFactor -- spellpower coefficient for the DoT/HoT portion of a hybrid effect.
			 	boolean NoLowLevelPenalty -- true if the "Below Level 20" penalty does not apply.  Defaults to false.
			 	boolean NoSchoolTalents -- abilities that don't get bonuses from a multiplier to the school
			 	int Stacks -- number of charges on a stacking effect
			 	int sHits -- Number of hits in a channeled spell?  Not sure how this is different than sTicks (one for channel, one for DoTs?)
                          -- channeling time can be decreased/stopped by damage, but that can be mitigated through talents, so maybe it is doing some averaging based on that?
				boolean Unresistable -- ??? (not sure...presumably for unresistable effects)
				boolean NoAura -- No buff/debuff effects
				boolean NoDPM -- No Damage per Minute calcs
				boolean NoTooltip -- Does not show a tooltip
				float WeaponDamage -- percentage (0.0 - 1.0) of weapon damage that adds to attack damage
				boolean Melee -- true if a melee attack
				boolean Shot -- true if a ranged bow/gun attack
				boolean OffhandAttack -- true if attack uses offhand weapon
				float SpellAPBonus -- ??? (influences how much spell power and attack power affect damage, not sure how exactly)
				float BoilSpellAPBonus -- ??? (think is just for the DK spell Blood Boil)
				int Runic -- cost of spell in Runic Power (for Deathknight spells).
				float APBonus -- percentage of attack power (0.0 - 1.0) that adds to attack damage
				list APBonus -- list of attack power coefficients (is this for combo point attacks that scale with number of CPs?)
				boolean NextMelee -- spell replaces next melee attack
				float CastMod -- remnant from old talents that affected cast time while boosting damage
				int DotStacks -- how many times the DoT/HoT can stack on a target
				float nourishBonus -- % bonus for having a HoT on the target (this will likely need to change as Glyph of Nourish gives additional % increase per HoT...I think the T7 bonus also does something similar, so total healing will depend on how many HoTs are on the target...should probably show calculation for each of 0-4 if they have the glyph/tier bonus)
				int RequiresForm -- used on Druid powers that require a specific form.  Bear = 1, Cat = 3, 
				int Rage -- cost of spell in Rage (for Warrior / Druid Bear spells).
				int Energy -- cost of spell in Energy (for Rogue / Druid Cat spells).
				boolean NoCrits -- true if spell can not crit (how does this work with canCrit?  canCrit is true by default for melee hits.  Melee and casts are calculated differently.)
				boolean ComboPoints -- true if spell benefits from Combo Points
				boolean Bleed -- spell gives a Bleed effect on target
				float ExtraDamage -- damage done after the initial damage of the attack
				float E_eDuration -- duration of ExtraDamage DoT
				boolean DPSrg -- ??? (something to do with Hunter powers)
				boolean NoWeapon -- ??? (no idea what this does)
				boolean NoNormalization -- for abilities that use weapondamage as the damage calculation but aren't normalized for weapon speeds
				float chainFactor -- Reduction of effect as effect chains.  Ex: Chain Heal, Avenger's Shield
				boolean SpellDmgBonus -- For melee types that gain a spell damage bonus (in Paladin's Seal of Righteousness)
				boolean WeaponDPS -- Uses weapon speed directly for DPS calc (in Paladin's Seal of Righteousness)
				float Hits -- determine avg damage/hit (in Paladin's Seal of Command)
				int PPM -- Procs Per Minute of effect (in Paladin's Seal of Command)
				float StacksDuration -- ??? (duration in seconds of each effect in a stack?)
				string Weapon -- required weapons for spell ("Daggers", "Swords", "Axes", etc.)
				list ExtraPerCombo -- list of ints indicating extra damage for each Combo Point (I think...)
				int DurationPerCombo -- number of seconds of additional duration for each Combo Point
				boolean DualAttack -- true if spell does damage with main hand and off hand weapons
				int Downrank -- probably deprecated.  Used for downrank spell penalties
				boolean Leech -- true if spell transfers health from target to caster
				boolean SpellCrit -- Used when crit effect is spelllike (1.5 instead of 2) (seen in Warrior class)
				float SpamDPS -- abilities that require offhand damage for the DPS calc.  Gagorian couldn't remember how it was used.  (seen in Warrior class)
				string Offhand -- spell requires item equipped in off-hand ("Shields", "Daggers", etc.)
				
				
				
	
	key [1 - N] => SpellRank struct (Rank N has key "N")
	
	key "Secondary" => indicates a secondary spell effect.  Nest another Spell structure after the primary effect.  See example.
}


struct SpellRank
{
	// Non-keyed integer values should be first and in listed order.
	int minDamage;		// REQUIRED
	int maxDamage;		// OPTIONAL -- use if spell has a damage range (min to max).
	int minDamageLevelBonus;		//OPTIONAL -- use if BaseIncrease is true
	int maxDamageLevelBonus;		//OPTIONAL -- use if BaseIncrease is true
	key hybridDotDmg = int dotDmg;	//OPTIONAL -- use if hybridFactor/hybridDotFactor are set
	key castTime = int castInSecs;	//OPTIONAL -- use if cast time varies between different ranks
	key perCombo = int dmgPerComboPoint;	// OPTIONAL -- use if power benefits from Combo points
	key Extra = int amountExtra;			// OPTIONAL -- use if power uses with Combo points and scales with AP
	key Downrank = int ranks;				// OPTIONAL -- not sure what this is for (seen in Shaman class)
	key sunderDmg = int damage;				// OPTIONAL -- not sure what this is for (seen in Warrior class)
	key PowerBonus = int rageBonus;			// OPTIONAL -- use if power converts Rage into damage (number is damage per Rage point)
	key diseaseBonus = int diseaseBonusDmg;	// OPTIONAL -- use if power gets bonus damage for diseases on target.
	key spellLevel = int levelRequired;		// REQUIRED
	
}