public MajordomoStaghelm() { // If not listed here use values from defaults #region Info Name = "Majordomo Staghelm"; Instance = "Firelands"; Content = new BossHandler.TierLevels[] { BossHandler.TierLevels.T12_10, BossHandler.TierLevels.T12_25, BossHandler.TierLevels.T12_10H, BossHandler.TierLevels.T12_25H, BossHandler.TierLevels.T12_LFR }; Comment = "Not modeled in detail yet."; #endregion #region Basics Health = new float[] { 38221940f, 133927104f, 105990728f, 367274176f, 0 }; // TODO: Double check 25-man normal health value MobType = (int)MOB_TYPES.HUMANOID; BerserkTimer = new int[] { 10 * 60, 10 * 60, 10 * 60, 10 * 60, 0 }; SpeedKillTimer = new int[] { 5 * 60, 5 * 60, 5 * 60, 5 * 60, 0 }; InBackPerc_Melee = new double[] { 0.95f, 0.95f, 0.95f, 0.95f, 0 }; InBackPerc_Ranged = new double[] { 0.00f, 0.00f, 0.00f, 0.00f, 0 }; Max_Players = new int[] { 10, 25, 10, 25, 0 }; Min_Tanks = new int[] { 1, 1, 1, 1, 0 }; Min_Healers = new int[] { 3, 5, 3, 5, 0 }; #endregion #region Offensive //MaxNumTargets = new double[] { 1, 1, 0, 0 }; //MultiTargsPerc = new double[] { 0.00d, 0.00d, 0.00d, 0.00d }; #region Attacks for (int i = 0; i < 4; i++) { Phase NEPhase = new Phase() { Name = "Night Elf Phase" }; Phase ShapeshiftingPhase1 = new Phase() { Name = "Shapeshifting Phase One" }; Phase ShapeshiftingPhase2 = new Phase() { Name = "Shapeshifting Phase Two" }; Phase ShapeshiftingPhase3 = new Phase() { Name = "Shapeshifting Phase Three" }; Phase ShapeshiftingPhase4 = new Phase() { Name = "Shapeshifting Phase Four" }; Phase ShapeshiftingPhase5 = new Phase() { Name = "Shapeshifting Phase Five" }; Phase ShapeshiftingPhase6 = new Phase() { Name = "Shapeshifting Phase Six" }; Phase ScorpionPhase1 = new Phase() { Name = "Scorpion Phase One" }; Phase CatPhase1 = new Phase() { Name = "Cat Phase One" }; Phase ScorpionPhase2 = new Phase() { Name = "Scorpion Phase Two" }; Phase CatPhase2 = new Phase() { Name = "Cat Phase Two" }; Phase ScorpionPhase3 = new Phase() { Name = "Scorpion Phase Three" }; Phase CatPhase3 = new Phase() { Name = "Cat Phase Three" }; Phase ScorpionPhase4 = new Phase() { Name = "Scorpion Phase Four" }; Phase CatPhase4 = new Phase() { Name = "Cat Phase Four" }; Phase ScorpionPhase5 = new Phase() { Name = "Scorpion Phase Five" }; Phase CatPhase5 = new Phase() { Name = "Cat Phase Five" }; Phase ScorpionPhase6 = new Phase() { Name = "Scorpion Phase Six" }; Phase CatPhase6 = new Phase() { Name = "Cat Phase Six" }; float SevenStackLength = 17.3f + 13.4f + 11f + 8.6f + 7.4f + 7.4f + 6.1f + 6.1f; float SevenStackAverageLength = SevenStackLength / 8f; float FiveStackLength = 17.3f + 13.4f + 11f + 8.6f + 7.4f + 7.4f; float FiveStackAverageLength = FiveStackLength / 6f; float ThreeStackLength = 17.3f + 13.4f + 11f + 8.6f; // Spread once the bar reaches 70% float ZeroStackLength = 17.3f * 0.7f; #region Main Tank Damage Attack MTMelee0Stacks = GenAStandardMelee(Content[i]); MTMelee0Stacks.Name = "Main Taink Melee - Zero Stacks"; MTMelee0Stacks.DamagePerHit *= 0.80f; MTMelee0Stacks.AffectsRole[PLAYER_ROLES.OffTank] = false; MTMelee0Stacks.AffectsRole[PLAYER_ROLES.MainTank] = true; ScorpionPhase1.Attacks.Add(MTMelee0Stacks); Attack MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - One Stack"; MTMeleeTemp.DamagePerHit *= 1.10f; CatPhase1.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Two Stacks"; MTMeleeTemp.DamagePerHit *= 1.20f; ScorpionPhase2.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Three Stacks"; MTMeleeTemp.DamagePerHit *= 1.30f; CatPhase2.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Four Stacks"; MTMeleeTemp.DamagePerHit *= 1.40f; ScorpionPhase3.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Five Stacks"; MTMeleeTemp.DamagePerHit *= 1.50f; CatPhase3.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Six Stacks"; MTMeleeTemp.DamagePerHit *= 1.60f; ScorpionPhase4.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Seven Stacks"; MTMeleeTemp.DamagePerHit *= 1.70f; CatPhase4.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Eight Stacks"; MTMeleeTemp.DamagePerHit *= 1.80f; ScorpionPhase5.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Nine Stacks"; MTMeleeTemp.DamagePerHit *= 1.90f; CatPhase5.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Ten Stacks"; MTMeleeTemp.DamagePerHit *= 2.00f; ScorpionPhase6.Attacks.Add(MTMeleeTemp); MTMeleeTemp = MTMelee0Stacks.Clone(); MTMeleeTemp.Name = "Main Taink Melee - Eleven Stacks"; MTMeleeTemp.DamagePerHit *= 2.10f; CatPhase6.Attacks.Add(MTMeleeTemp); #endregion #region Concentration [Heroic Only] /* Each player who engages Fandral on heroic difficulty is granted a Concentration power bar. * This bar fills over time, increasing damage and healing done by 25% for every 25 Concentration * up to 100. Players hit by a damaging attack or spell will lose all currently accumulated * Concentration.*/ // http://ptr.wowhead.com/spell=98229 // Uncommon (25%) - http://ptr.wowhead.com/spell=98254 // Rare (50%) - http://ptr.wowhead.com/spell=98254 // Epic (75%) - http://ptr.wowhead.com/spell=98252 // Legendary (100%) - http://ptr.wowhead.com/spell=98245 Stats ConcentrationStat = new Stats(); SpecialEffect ConcentrationSpecialEffect = new SpecialEffect ( Trigger.Use, new Stats() { BonusDamageMultiplier = 0.25f, BonusHealingDoneMultiplier = 0.25f }, BerserkTimer[i], 5f, 1, 4 ); ConcentrationStat.AddSpecialEffect(ConcentrationSpecialEffect); if (i > 1) { BuffState Concentration = new BuffState { Name = "Concentration", Frequency = 1f, Duration = BerserkTimer[i] * 1000f, Chance = 1f, Breakable = false, Stats = ConcentrationStat, }; // Do to the fact that this only triggers when NOT getting hit, the tank will not be able to gain any stacks Concentration.SetAffectsRoles_DPS(); Concentration.SetAffectsRoles_Healers(); ShapeshiftingPhase1.BuffStates.Add(Concentration); ShapeshiftingPhase2.BuffStates.Add(Concentration); ShapeshiftingPhase3.BuffStates.Add(Concentration); ShapeshiftingPhase4.BuffStates.Add(Concentration); ShapeshiftingPhase5.BuffStates.Add(Concentration); ShapeshiftingPhase6.BuffStates.Add(Concentration); } #endregion #region Behold the Rage of the Firelands! /* Fandral transforms into a Cat when his enemies are not clustered together or into a Scorpion when * 7 or more of his enemies are clustered together.*/ #region Cat Form // Fandral transforms into a Cat when his enemies are not clustered together. // http://db.mmo-champion.com/c/53145/ #region Leaping Flames /* Fandral leaps at an enemy, inflicting 36404 to 40846 Fire damage in a small area and * creating a Spirit of the Flame. This attack costs 100 energy.*/ // 10 man - http://ptr.wowhead.com/spell=98535 // 25 man - http://ptr.wowhead.com/spell=100206 // 10 man heroic - http://ptr.wowhead.com/spell=100207 // 25 man heroic - http://ptr.wowhead.com/spell=100208 // Move but assume the person get hit with four ticks of the AOE Impedance LeapingFlames_Move = new Impedance { Name = "Leaping Flames Movement", Duration = 2f * 1000f, Frequency = SevenStackAverageLength, Chance = 1f / Max_Players[i], Breakable = false, }; LeapingFlames_Move.SetAffectsRoles_Healers(); LeapingFlames_Move.AffectsRole[PLAYER_ROLES.RangedDPS] = true; CatPhase1.Moves.Add(LeapingFlames_Move); CatPhase2.Moves.Add(LeapingFlames_Move); CatPhase3.Moves.Add(LeapingFlames_Move); CatPhase4.Moves.Add(LeapingFlames_Move); CatPhase5.Moves.Add(LeapingFlames_Move); CatPhase6.Moves.Add(LeapingFlames_Move); Attack LeapingFlames = new Attack { Name = "Leaping Flames", DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, DamagePerTick = new float[] { (17671f + 19828f), (17671f + 19828f), (26036f + 29213f), (26036f + 29213f), 0f }[i] / 2f, Duration = 2f, TickInterval = 0.5f, IsDoT = true, SpellID = new float[] { 98535, 100206, 100207, 100208, 0 }[i], }; LeapingFlames.SetAffectsRoles_Healers(); LeapingFlames.AffectsRole[PLAYER_ROLES.RangedDPS] = true; Attack LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 1.10f; CatPhase1.Attacks.Add(LeapingFlames_temp); LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 1.30f; CatPhase2.Attacks.Add(LeapingFlames_temp); LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 1.50f; CatPhase3.Attacks.Add(LeapingFlames_temp); LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 1.70f; CatPhase4.Attacks.Add(LeapingFlames_temp); LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 1.90f; CatPhase5.Attacks.Add(LeapingFlames_temp); LeapingFlames_temp = LeapingFlames.Clone(); LeapingFlames_temp.DamagePerTick *= 2.10f; CatPhase6.Attacks.Add(LeapingFlames_temp); #endregion #region Spirit of the Flame // These small burning cats attack enemeis until defeated. // http://ptr.wowhead.com/npc=52593 TargetGroup SpiritOfTheFlame = new TargetGroup { Name = "Spirit of the Flame", LevelOfTargets = 85, Chance = 1f, NearBoss = true, NumTargs = 1f, TargetID = 52593, Duration = SevenStackAverageLength * 1000f, Frequency = SevenStackAverageLength, }; SpiritOfTheFlame.SetAffectsRoles_All(); CatPhase1.Targets.Add(SpiritOfTheFlame); CatPhase2.Targets.Add(SpiritOfTheFlame); CatPhase3.Targets.Add(SpiritOfTheFlame); CatPhase4.Targets.Add(SpiritOfTheFlame); CatPhase5.Targets.Add(SpiritOfTheFlame); CatPhase6.Targets.Add(SpiritOfTheFlame); Attack SpiritOfTheFlameMelee = new Attack { Name = "Spirit Of The Flame Melee", DamagePerHit = BossHandler.StandardMeleePerHit[(int)Content[i]] * .666f, DamageType = ItemDamageType.Physical, IsFromAnAdd = true, MaxNumTargets = 1f, AttackType = ATTACK_TYPES.AT_MELEE, AttackSpeed = 1.8f, Blockable = true, Dodgable = true, Missable = true, Parryable = true, }; SpiritOfTheFlameMelee.AffectsRole[PLAYER_ROLES.MainTank] = true; CatPhase1.Attacks.Add(SpiritOfTheFlameMelee); CatPhase2.Attacks.Add(SpiritOfTheFlameMelee); CatPhase3.Attacks.Add(SpiritOfTheFlameMelee); CatPhase4.Attacks.Add(SpiritOfTheFlameMelee); CatPhase5.Attacks.Add(SpiritOfTheFlameMelee); CatPhase6.Attacks.Add(SpiritOfTheFlameMelee); #endregion #region Adrenaline /* Fandral gains a stack of Adrenaline each time he performs Leaping Flames. Adrenaline * increases his energy regeneration rate by 1% per application. Fandral loses all stacks of * Adrenaline when he switches form.*/ // http://ptr.wowhead.com/spell=97238 #endregion #region Fury /* Fandral gains a stack of Fury each time he transforms into a Cat or Scorpion, * permanently increasing the Physical damage he deals by 10%.*/ // http://ptr.wowhead.com/spell=97235 #endregion #endregion #region Scorpion Form // Fandral transforms into a Scorpion when 7 or more of his enemies are clustered together. #region Flame Scythe // Fandral inflicts 562000 Fire damage to enemies in front of him. Damage is split equally // among targets hit. This attack costs 100 energy. // Damage needs to be split between all players // 10 man - http://ptr.wowhead.com/spell=98474 // 25 man - http://ptr.wowhead.com/spell=100212 // 10 man heroic - http://ptr.wowhead.com/spell=100213 // 25 man heroic - http://ptr.wowhead.com/spell=100214 Attack FlameSythe = new Attack { Name = "Flame Sythe", AttackType = ATTACK_TYPES.AT_MELEE, DamageType = ItemDamageType.Fire, DamagePerHit = new float[] { 562000, 1687000, 765000, 2295000, 0 }[i] / Max_Players[i], AttackSpeed = (i < 2 ? SevenStackAverageLength : FiveStackAverageLength), SpellID = new float[] { 98474, 100212, 100213, 100214, 0 }[i], MaxNumTargets = Max_Players[i], }; FlameSythe.SetAffectsRoles_All(); ScorpionPhase1.Attacks.Add(FlameSythe); Attack FlameSythe_temp = FlameSythe.Clone(); FlameSythe_temp.DamagePerHit *= 1.2f; if (i < 2) ScorpionPhase2.Attacks.Add(FlameSythe_temp); FlameSythe_temp = FlameSythe.Clone(); FlameSythe_temp.DamagePerHit *= 1.4f; if (i < 2) ScorpionPhase3.Attacks.Add(FlameSythe_temp); FlameSythe_temp = FlameSythe.Clone(); FlameSythe_temp.DamagePerHit *= 1.6f; if (i < 2) ScorpionPhase4.Attacks.Add(FlameSythe_temp); FlameSythe_temp = FlameSythe.Clone(); FlameSythe_temp.DamagePerHit *= 1.8f; if (i < 2) ScorpionPhase5.Attacks.Add(FlameSythe_temp); FlameSythe_temp = FlameSythe.Clone(); FlameSythe_temp.DamagePerHit *= 2.0f; if (i < 2) ScorpionPhase6.Attacks.Add(FlameSythe_temp); #endregion #region Adrenaline /* Fandral gains a stack of Adrenaline each time he performs Flame Scythe. Adrenaline * increases his energy regeneration rate by 1% per application. Fandral loses all stacks of * Adrenaline when he switches form.*/ // http://ptr.wowhead.com/spell=97238 #endregion #region Fury /* Fandral gains a stack of Fury each time he transforms into a Cat or Scorpion, * permanently increasing the Physical damage he deals by 10%.*/ // http://ptr.wowhead.com/spell=97235 #endregion #endregion #endregion #region Blaze of Glory! /* Fandral continues to transform into a Cat or Scorpion. * * On every third transform, Fandral pauses in human form to briefly envelop his enemies in a Fiery * Cyclone and cast an additional spell. When he is switching from Cat form to Scorpion form, Fandral * unleashes Searing Seeds. When he is switching from Scorpion form to Cat form, Fandral unleashes * Burning Orbs.*/ #region Fiery Cyclone /* On every third transform, Fandral pauses in human form to briefly envelop his enemies in a * Fiery Cyclone. * * The Fiery Cyclone tosses all enemy targets into the air, preventing all action but making them * invulnerable for 3 sec.*/ Impedance FieryCyclone = new Impedance { Name = "Fiery Cyclone", Frequency = 1f, Duration = 3f * 1000f, Chance = 1f, Breakable = false, }; FieryCyclone.SetAffectsRoles_All(); NEPhase.Stuns.Add(FieryCyclone); #endregion #region Searing Seeds /* When Fandral switches from Cat form to Scorpion form, he unleashes Searing Seeds. * * Searing Seeds implants fiery seeds in Fandral's enemies. Each seed grows at a different rate. * When fully grown, the seeds explode, inflicting 51499 to 51500 Fire damage to targets within * 10 yards.*/ // 10-man - http://ptr.wowhead.com/spell=98620 // 25-man - http://ptr.wowhead.com/spell=100215 // 10-man Heroic - http://ptr.wowhead.com/spell=100216 // 25-man Heroic - http://ptr.wowhead.com/spell=100217 Attack SearingSeed = new Attack { Name = "Searing Seed", DamagePerHit = new float[] { 45000, 45000, 63750, 63750, 0 }[i], AttackSpeed = (SevenStackLength * (i < 2 ? 2f : 1f)) - 1f, DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, MaxNumTargets = 1f, SpellID = new float[] { 98620, 100215, 100216, 100217, 0 }[i], }; SearingSeed.SetAffectsRoles_All(); SearingSeed.AffectsRole[PLAYER_ROLES.MainTank] = false; ShapeshiftingPhase2.Attacks.Add(SearingSeed); ShapeshiftingPhase4.Attacks.Add(SearingSeed); ShapeshiftingPhase6.Attacks.Add(SearingSeed); #endregion #region Burning Orbs /* When Fandral switches from Scorpion form to Cat form, he unleashes Burning Orbs. * * Fandral summons several orbs around the room. Each orb attacks the player nearest to it, * burning them for 7276 to 8174 Fire damage every 2 sec. Stacks.*/ // No more than 4 stacks // Meaning to get the average amount after 4 stacks, you multiply by 2.5 // 10-man - http://ptr.wowhead.com/spell=98584 // 25-man - http://ptr.wowhead.com/spell=100209 // 10-man Heroic - http://ptr.wowhead.com/spell=100210 // 25-man Heroic - http://ptr.wowhead.com/spell=100211 Attack BurningOrbs = new Attack { Name = "Burning Orb", DamagePerHit = new float[] { 3750, 3750, 7650, 7650, 0 }[i] * 10f, DamagePerTick = new float[] { 3750, 3750, 7650, 7650, 0 }[i] * 2.5f, IsDoT = true, Duration = 6f, TickInterval = 2f, AttackSpeed = 14f, MaxNumTargets = new float[] { 2, 5, 2, 5, 0 }[i], AttackType = ATTACK_TYPES.AT_AOE, DamageType = ItemDamageType.Fire, SpellID = new float[] { 98584, 100209, 100210, 100211, 0 }[i], }; BurningOrbs.SetAffectsRoles_All(); ShapeshiftingPhase3.Attacks.Add(BurningOrbs); ShapeshiftingPhase5.Attacks.Add(BurningOrbs); #endregion #endregion #region Apply Phases float phasestart = 0; float ShapshiftingStart = 0; InnerPhase InnerPhaseShapeShifting; // On Normal we are running a 7 stack each phase. That leaves only a 3 stack during the final Cat phase for Berserk if (i < 2) { InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase1, i, 1, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase1.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase1, i, 1, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase1.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase1, i, 1, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 2, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase1, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase2, i, 3, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase2.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase2, i, 3, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase2.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase2, i, 3, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 4, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase2, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase3, i, 5, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase3.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase3, i, 5, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase3.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase3, i, 5, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 6, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase3, i); AddAPhase(NEPhase, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase4, i, 7, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase4.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase4, i, 7, ShapshiftingStart, ThreeStackLength, BerserkTimer[i]); ShapshiftingStart += ThreeStackLength; ShapeshiftingPhase4.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase4, i, 7, phasestart, ShapshiftingStart, BerserkTimer[i]); AddAPhase(ShapeshiftingPhase4, i); } // On Heroic We are running a 5 Stack on the first Scorpion // Then a 7 Stack on Cat and 0 stack [70% before the first stack goes off] on the Scorpion phase else { InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase1, i, 1, ShapshiftingStart, FiveStackLength, BerserkTimer[i]); ShapshiftingStart += FiveStackLength; ShapeshiftingPhase1.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase1, i, 1, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase1.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase1, i, 1, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 2, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase1, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase2, i, 3, ShapshiftingStart, ZeroStackLength, BerserkTimer[i]); ShapshiftingStart += ZeroStackLength; ShapeshiftingPhase2.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase2, i, 3, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase2.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase2, i, 3, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 4, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase2, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase3, i, 5, ShapshiftingStart, ZeroStackLength, BerserkTimer[i]); ShapshiftingStart += ZeroStackLength; ShapeshiftingPhase3.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase3, i, 5, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase3.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase3, i, 5, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 6, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase3, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase4, i, 7, ShapshiftingStart, ZeroStackLength, BerserkTimer[i]); ShapshiftingStart += ZeroStackLength; ShapeshiftingPhase4.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase4, i, 7, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase4.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase4, i, 7, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 8, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase3, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase5, i, 9, ShapshiftingStart, ZeroStackLength, BerserkTimer[i]); ShapshiftingStart += ZeroStackLength; ShapeshiftingPhase5.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase5, i, 9, ShapshiftingStart, SevenStackLength, BerserkTimer[i]); ShapshiftingStart += SevenStackLength; ShapeshiftingPhase5.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase5, i, 9, phasestart, ShapshiftingStart, BerserkTimer[i]); phasestart += ShapshiftingStart; ApplyAPhasesValues(NEPhase, i, 10, phasestart, 3f, BerserkTimer[i]); phasestart += 3f; ShapshiftingStart = 0f; AddAPhase(ShapeshiftingPhase3, i); AddAPhase(NEPhase, i); InnerPhaseShapeShifting = new InnerPhase(ScorpionPhase6, i, 11, ShapshiftingStart, ZeroStackLength, BerserkTimer[i]); ShapshiftingStart += ZeroStackLength; ShapeshiftingPhase6.InnerPhases.Add(InnerPhaseShapeShifting); InnerPhaseShapeShifting = new InnerPhase(CatPhase6, i, 11, ShapshiftingStart, SevenStackLength - 4.45f, BerserkTimer[i]); ShapshiftingStart += (SevenStackLength - 4.45f); ShapeshiftingPhase6.InnerPhases.Add(InnerPhaseShapeShifting); ApplyAPhasesValues(ShapeshiftingPhase6, i, 11, phasestart, ShapshiftingStart, BerserkTimer[i]); AddAPhase(ShapeshiftingPhase3, i); } #endregion } #endregion #endregion #region Defensive Resist_Physical = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Frost = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Fire = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Nature = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Arcane = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Shadow = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Holy = new double[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion #region Impedances for (int i = 0; i < 2; i++) { //Moves; //Stuns; //Fears; //Roots; //Disarms; } TimeBossIsInvuln = new float[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion /* TODO: * all */ }
public Shannox() { /* Shannox can be done with 1 tank on Normal with the main tank tanking Riplimb at the same time as * Shannox. However for consistency between Normal and Heroic, the Boss Handler will assume the use * of the two tank strat.*/ #region Info Name = "Shannox"; Instance = "Firelands"; Content = new BossHandler.TierLevels[] { BossHandler.TierLevels.T12_10, BossHandler.TierLevels.T12_25, BossHandler.TierLevels.T12_10H, BossHandler.TierLevels.T12_25H, BossHandler.TierLevels.T12_LFR }; #endregion #region Basics // Baleroc's health consists of both himself and his dogs Ripgut and Rageface // On heroic mode, you do not kill the dogs. Instead you burn Shannox instead Health = new float[] { (20442296f + (7901028f * 2f)), (61198050f + (25252248f * 2f)), 28619216f, 97100904f, 0 }; MobType = (int)MOB_TYPES.HUMANOID; BerserkTimer = new int[] { 10 * 60, 10 * 60, 10 * 60, 10 * 60, 0 }; SpeedKillTimer = new int[] { 7 * 60, 7 * 60, 7 * 60, 7 * 60, 0 }; InBackPerc_Melee = new double[] { 0.95f, 0.95f, 0.95f, 0.95f, 0 }; InBackPerc_Ranged = new double[] { 0.00f, 0.00f, 0.00f, 0.00f, 0 }; Max_Players = new int[] { 10, 25, 10, 25, 0 }; Min_Tanks = new int[] { 2, 2, 2, 2, 0 }; Min_Healers = new int[] { 3, 5, 3, 5, 0 }; #endregion #region Offensive #region Attacks for (int i = 0; i < 4; i++) { Phase EntireFight = new Phase() { Name = "Entire Fight" }; Phase TwoDogsUp = new Phase() { Name = "Two Dogs Up" }; Phase OneDogUp = new Phase() { Name = "One Dog Up" }; Phase Before30Pct = new Phase() { Name = "Before Shannox reaches 30% Health" }; Phase After30Pct = new Phase() { Name = "After Shannox reaches 30% Health" }; #region Shannox Attack BasicMeleeMT = new Attack { Name = "Melee Shannox", AttackSpeed = 1.4f, AttackType = ATTACK_TYPES.AT_MELEE, DamagePerHit = BossHandler.StandardMeleePerHit[(int)Content[i]] * (i < 2 ? .5f : 1f), Missable = true, Dodgable = true, Parryable = true, Blockable = true, IsTheDefaultMelee=true, }; BasicMeleeMT.AffectsRole[PLAYER_ROLES.MainTank] = true; TwoDogsUp.Attacks.Add(BasicMeleeMT); // With just one dog up, his attack damage goes up by 15% Attack BasicMeleeMT1DU = BasicMeleeMT.Clone(); BasicMeleeMT1DU.DamagePerHit *= 1.15f; OneDogUp.Attacks.Add(BasicMeleeMT1DU); #region Frenzy /* When both of Shannox's hounds are defeated, he goes into a frenzy, increasing physical damage * and attack speed by 30. Shannox no longer uses Hurl Spear after this point and instead drives his * spear directly into the ground to trigger the same cascade of molten eruptions around the impact * point, which deal 61156 to 67594 Fire damage to enemies that are stand in them.*/ // http://ptr.wowhead.com/spell=100522 // If both of his dogs die, his damage goes up by 30% // Does not happen on Heroic Attack BasicMeleeMT0DU = BasicMeleeMT.Clone(); BasicMeleeMT0DU.DamagePerHit *= 1.30f; if (i < 2) After30Pct.Attacks.Add(BasicMeleeMT0DU); else After30Pct.Attacks.Add(BasicMeleeMT); #endregion #region Arcing Slash /* Shannox causes 125% of normal melee damage in a wide arc up to 1 yards in front of him, and * inflicts Jagged Tear on those he strikes.*/ // http://ptr.wowhead.com/spell=99931 Attack ArcingSlash = new Attack { Name = "Arcing Slash", AttackSpeed = 12.5f, AttackType = ATTACK_TYPES.AT_MELEE, DamagePerHit = BasicMeleeMT.DamagePerHit * 1.25f, SpellID = 99931, }; ArcingSlash.AffectsRole[PLAYER_ROLES.MainTank] = true; TwoDogsUp.Attacks.Add(ArcingSlash); Attack ArcingSlash1DU = ArcingSlash.Clone(); ArcingSlash1DU.DamagePerHit = BasicMeleeMT1DU.DamagePerHit * 1.25f; OneDogUp.Attacks.Add(ArcingSlash1DU); Attack ArcingSlash0DU = ArcingSlash.Clone(); ArcingSlash0DU.DamagePerHit = BasicMeleeMT0DU.DamagePerHit * 1.25f; if (i < 2) After30Pct.Attacks.Add(ArcingSlash0DU); else After30Pct.Attacks.Add(ArcingSlash); #region Jagged Tear /* Shannox's Arcing Slash leaves a Jagged Tear that deals 3000 physical damage every 3 sec for 30 * sec. Stacks.*/ // http://ptr.wowhead.com/spell=99937 Attack JaggedTear = new Attack { Name = "Jagged Tear MT", AttackSpeed = 10f, AttackType = ATTACK_TYPES.AT_DOT, IsDoT = true, SpellID = 99937, DamagePerTick = 3000, TickInterval = 3, Duration = 30, }; JaggedTear.AffectsRole[PLAYER_ROLES.MainTank] = true; JaggedTear.AffectsRole[PLAYER_ROLES.OffTank] = false; Before30Pct.Attacks.Add(JaggedTear); After30Pct.Attacks.Add(JaggedTear); #endregion #endregion #region Hurl Spear /* Shannox hurls his spear in the direction of his hound, Riplimb. The spear deals 117000 to * 123000 physical damage to anyone it strikes directly as well as 59546 to 69204 Fire damage to * all enemies within 50 yards. The spear strike also triggers a cascade of molten eruptions around the * impact point which deal 61156 to 67594 Fire damage to enemies that are caught in them. * * Riplimb will then break off from combat, fetch the spear, and return it to Shannox.*/ // http://ptr.wowhead.com/spell=100002 // Should NEVER get hit by this, one should move away from the landing spot /*Attack HurlSpear = new Attack { Name = "Hurl Spear", AttackSpeed = 25f, // Timing is a rough estimate currently. AttackType = ATTACK_TYPES.AT_AOE, DamagePerHit = (99450f + 104550f) / 2f, MaxNumTargets = Max_Players[i], DamageType = ItemDamageType.Physical, SpellID = 100002, };*/ Impedance HurlSpear_Move = new Impedance { Name = "Hurl Spear Move", Breakable = false, Chance = 1f, Frequency = 20f, Duration = 2f * 1000f, }; HurlSpear_Move.AffectsRole[PLAYER_ROLES.RangedDPS] = true; HurlSpear_Move.SetAffectsRoles_Healers(); HurlSpear_Move.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.Moves.Add(HurlSpear_Move); #region Magma Flare // The Initial 40% increase to fire damage, as well as the initial damage should never be aplied, but the residual damage should // 10-man - http://ptr.wowhead.com/spell=99842 // 25-man - http://ptr.wowhead.com/spell=101205 // 10-man Heroic - http://ptr.wowhead.com/spell=101206 // 25-man heroic - http://ptr.wowhead.com/spell=101207 /*Attack MagmaRapture = new Attack { Name = "Magma Rapture", AttackSpeed = 15f, AttackType = ATTACK_TYPES.AT_MELEE, DamagePerHit = new float[] { (64600f + 71400f), (64600f + 71400f), (100937f + 111562f), (100937f + 111562f), 0f }[i], DamageType = ItemDamageType.Fire, MaxNumTargets = 1f, SpellID = new float[] { 99842, 101205, 101206, 101207, 0 }[i], }; */ // http://ptr.wowhead.com/spell=100495 Attack MagmaFlare = new Attack { Name = "Magma Flare", AttackSpeed = 45f, AttackType = ATTACK_TYPES.AT_AOE, DamagePerHit = (39312f + 45687f) / 2f, DamageType = ItemDamageType.Fire, MaxNumTargets = Max_Players[i], SpellID = 100495, }; MagmaFlare.SetUnavoidable(); MagmaFlare.SetAffectsRoles_All(); Before30Pct.Attacks.Add(MagmaFlare); After30Pct.Attacks.Add(MagmaFlare); #endregion #endregion #endregion #region Riplimb /* Shannox has two hounds. Riplimb will attack the target with the most threat. * *Warning* In Heroic Difficulty, Riplimb cannot be permanently slain while his master lives. When * his health reaches zero, he will collapse for up to 30 seconds, and then reanimate at full health to * resume fighting.*/ // http://db.mmo-champion.com/c/53694/ TargetGroup Riplimb = new TargetGroup { Name= "Riplimb", // On normal, Riplimb should be the second dog to die, not the first // Heroic, Riplimb stays alive the entire fight Duration = BerserkTimer[i] * (i < 2 ? 0.7f : 1f) * 1000f, Frequency = 1, LevelOfTargets = 88, NearBoss = false, NumTargs = 1, TargetID = 53694, }; Riplimb.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.Targets.Add(Riplimb); if (i > 1) After30Pct.Targets.Add(Riplimb); #region Melee Attack BasicMeleeOT = new Attack { Name = "Melee Riplimb", AttackSpeed = 1.4f, AttackType = ATTACK_TYPES.AT_MELEE, DamagePerHit = BossHandler.StandardMeleePerHit[(int)Content[i]] * 0.30f, Missable = true, Dodgable = true, Parryable = true, Blockable = true, }; BasicMeleeOT.AffectsRole[PLAYER_ROLES.MainTank] = false; BasicMeleeOT.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.Attacks.Add(BasicMeleeOT); if (i > 1) After30Pct.Attacks.Add(BasicMeleeOT); #endregion #region Limb Rip /* Riplimb bites savagely, dealing 175% of normal melee damage to an enemy and inflicting * Jagged Tear on those he strikes.*/ // http://ptr.wowhead.com/spell=99832 Attack LimbRipOT = new Attack { Name = "Limb Rip", AttackSpeed = 10f, AttackType = ATTACK_TYPES.AT_MELEE, DamagePerHit = BasicMeleeOT.DamagePerHit * 1.75f, // Heroic values are unkonwn at this point. Missable = false, Dodgable = false, Parryable = false, Blockable = false, }; LimbRipOT.AffectsRole[PLAYER_ROLES.MainTank] = false; LimbRipOT.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.Attacks.Add(LimbRipOT); if (i > 1) After30Pct.Attacks.Add(LimbRipOT); #endregion #region Jagged Tear /* Riplimb's Limb Rip leaves a Jagged Tear that deals 3000 physical damage every 3 sec for 30 * sec. Stacks.*/ // http://ptr.wowhead.com/spell=99937 Attack JaggedTearRL = JaggedTear.Clone(); JaggedTearRL.Name = "Jagged Tear OT"; JaggedTearRL.AttackSpeed = LimbRipOT.AttackSpeed; JaggedTearRL.AffectsRole[PLAYER_ROLES.MainTank] = false; JaggedTearRL.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.Attacks.Add(JaggedTearRL); if (i > 1) After30Pct.Attacks.Add(JaggedTearRL); #endregion #region Frenzied Devotion /* Riplimb goes into an unstoppable rage if he is alive to sitness Shannox's health reach 30%. * This effect increases damage dealth by 200% and attack and movement speed by 100%.*/ // http://ptr.wowhead.com/spell=100064 // Only happens on Normal // Never should happen #endregion #region Feeding Frenzy [Heroic Only] /* Riplimb's successful melee attacks grant a stacking 10% bonus to physical damage dealt * for 20sec.*/ // http://ptr.wowhead.com/spell=100656 // Never should last more than 1 minute stacks Stats FeedingFrenzyStats = new Stats(); SpecialEffect FeedingFrenzySpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { PhysicalDamageTakenReductionMultiplier = -0.1f }, 20f, 1.2f, 1, 200); FeedingFrenzyStats.AddSpecialEffect(FeedingFrenzySpecialEffect); FeedingFrenzySpecialEffect = new SpecialEffect(Trigger.Use, FeedingFrenzyStats, 60f, 60f); FeedingFrenzyStats = new Stats(); FeedingFrenzyStats.AddSpecialEffect(FeedingFrenzySpecialEffect); if (i > 1) // Heroic only { BuffState FeedingFrenzyRiplimb = new BuffState { Name = "Feeding Frenzy Riplimb", Breakable = false, Chance = 1, Duration = 20 * 1000, Frequency = BasicMeleeOT.AttackSpeed, Stats = FeedingFrenzyStats, }; FeedingFrenzyRiplimb.AffectsRole[PLAYER_ROLES.OffTank] = true; Before30Pct.BuffStates.Add(FeedingFrenzyRiplimb); After30Pct.BuffStates.Add(FeedingFrenzyRiplimb); } #endregion #endregion #region Rageface /* Shannox has two hounds, Rageface cannot be controlled, and will dart about from enemy to * enemy, changing targets periodically.*/ // http://db.mmo-champion.com/c/53695/ TargetGroup Rageface = new TargetGroup { Name = "Rageface", // One normal, Rageface should be the first dog to die // Heroic Rageface stays alive the entire fight Duration = BerserkTimer[i] * (i < 2 ? .35f : 1f) * 1000f, Frequency = 1, LevelOfTargets = 88, NearBoss = false, NumTargs = 1, TargetID = 53695, }; Rageface.SetAffectsRoles_DPS(); Rageface.SetAffectsRoles_Healers(); if (i < 2) TwoDogsUp.Targets.Add(Rageface); else { Before30Pct.Targets.Add(Rageface); After30Pct.Targets.Add(Rageface); } #region Melee Attack RagefaceMelee = new Attack { Name = "Rageface Melee", AttackSpeed = 1.2f, DamagePerHit = BossHandler.StandardMeleePerHit[(int)Content[i]] * 0.1f, DamageType = ItemDamageType.Physical, MaxNumTargets = 1f, IsFromAnAdd = true, AttackType = ATTACK_TYPES.AT_MELEE, }; RagefaceMelee.SetAffectsRoles_DPS(); RagefaceMelee.SetAffectsRoles_Healers(); if (i < 2) TwoDogsUp.Attacks.Add(RagefaceMelee); else { Before30Pct.Attacks.Add(RagefaceMelee); After30Pct.Attacks.Add(RagefaceMelee); } #endregion #region Face Rage /* Rageface leaps at a random target, stunning and knockign them to the ground, and bgins to * viciously claw at them. This mauling initially deals 8000 physical damage every 0.50 sec, but * the damage dealt increases over time. While so occupied, Rageface is 1000% more susceptible to * critical strikes. * Rageface will continue until his target is dead, or he receives a single attack that deals at least * 40000 damage.*/ // Attack - http://ptr.wowhead.com/spell=99947 // Get off me - http://ptr.wowhead.com/spell=100129 Attack FaceRage = new Attack { Name = "Face Rage", AttackType = ATTACK_TYPES.AT_MELEE, DamageType = ItemDamageType.Physical, AttackSpeed = 15f, DamagePerHit = 30000f, DamagePerTick = 8000f, IsDoT = true, TickInterval = 0.5f, Duration = 30f, Interruptable = true, }; FaceRage.SetAffectsRoles_DPS(); FaceRage.SetAffectsRoles_Healers(); if (i < 2) TwoDogsUp.Attacks.Add(FaceRage); else { Before30Pct.Attacks.Add(FaceRage); After30Pct.Attacks.Add(FaceRage); } BuffState FaceRageBuff = new BuffState { Name = "Face Rage Crit Buff", Frequency = 15f, Duration = 30f * 1000f, Chance = 1f, Breakable = true, Stats = new Stats() { SpellCrit = 10f, PhysicalCrit = 10f }, }; FaceRageBuff.SetAffectsRoles_DPS(); if (i < 2) TwoDogsUp.BuffStates.Add(FaceRageBuff); else { Before30Pct.BuffStates.Add(FaceRageBuff); After30Pct.BuffStates.Add(FaceRageBuff); } #endregion #region Feeding Frenzy [Heroic Only] /* Rageface's successful melee attacks grant a stacking 10% bonus to physical damage dealt * for 20sec.*/ // http://ptr.wowhead.com/spell=100656 if (i > 1) { BuffState FeedingFrenzyRageface = new BuffState { Name = "Feeding Frenzy Rageface", Breakable = false, Chance = 1, Duration = 20 * 1000, Frequency = RagefaceMelee.AttackSpeed, Stats = FeedingFrenzyStats, }; FeedingFrenzyRageface.SetAffectsRoles_DPS(); FeedingFrenzyRageface.SetAffectsRoles_Healers(); Before30Pct.BuffStates.Add(FeedingFrenzyRageface); After30Pct.BuffStates.Add(FeedingFrenzyRageface); } #endregion #region Frenzied Devotion /* Rageface goes into an unstoppable rage if he is alive to sitness Shannox's health reach 30%. * This effect increases damage dealth by 200% and attack and movement speed by 100%.*/ // http://ptr.wowhead.com/spell=100064 // Only happens on normal // Should NEVER happen #endregion #endregion #region Apply Phases float phaseStartTime = 0; float NormalPhaseOneStartTime = 0; float phaseDuration = BerserkTimer[i] * (1 - .3f); NormalPhaseOneStartTime = phaseDuration / 2f; InnerPhase DogsUp; if (i < 2) { DogsUp = new InnerPhase(TwoDogsUp, i, 1, 0, NormalPhaseOneStartTime, BerserkTimer[i]); Before30Pct.InnerPhases.Add(DogsUp); DogsUp = new InnerPhase(OneDogUp, i, 1, NormalPhaseOneStartTime, NormalPhaseOneStartTime, BerserkTimer[i]); Before30Pct.InnerPhases.Add( DogsUp ); } ApplyAPhasesValues( Before30Pct, i, 1, phaseStartTime, phaseDuration, BerserkTimer[i] ); phaseStartTime += phaseDuration; phaseDuration = BerserkTimer[i] - phaseDuration; ApplyAPhasesValues( After30Pct, i, 1, phaseStartTime, phaseDuration, BerserkTimer[i] ); AddAPhase(Before30Pct, i); AddAPhase(After30Pct, i); #endregion } #endregion #endregion #region Defensive Resist_Physical = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Frost = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Fire = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Nature = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Arcane = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Shadow = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Holy = new double[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion #region Impedances for (int i = 0; i < 2; i++) { //Moves; // TODO: OT Always moves for Hurl Spear. // DPS Moves for Hurl Spear /* Immolation Trap * Shannox launches a fiery trap at the feet of a player. The trap takes 2 seconds to arm, and * triggers when stepped on therafter, dealing 64374 to 64375 Fire damage immediately and * 24462 to 27038 Fire damage every 3 sec. and increasing all damage taken by 40%, for 9 sec.*/ // http://ptr.wowhead.com/spell=99838 /* Crystal Prison Trap * Shannox launches a prison trap at the feet of a player. The trap takes 2 seconds to arm, and * triggers when stepped on therafter, encasing the target in a block of magma crystal, preventing all * movement or other actions. Only by destroying the crystal prison can a trapped player be freed.*/ // Spell - http://ptr.wowhead.com/spell=99836 // NPC - http://db.mmo-champion.com/c/53713/ } TimeBossIsInvuln = new float[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion /* TODO: * Moves for Hurl Spear & Traps. */ }
// The tank and healing check of the raid instance // ALMOST a Patchwork fight public Baleroc() { // If not listed here use values from defaults #region Info Name = "Baleroc, the Gatekeeper"; Instance = "Firelands"; Content = new BossHandler.TierLevels[] { BossHandler.TierLevels.T12_10, BossHandler.TierLevels.T12_25, BossHandler.TierLevels.T12_10H, BossHandler.TierLevels.T12_25H, BossHandler.TierLevels.T12_LFR }; #endregion #region Basics Health = new float[] { 31565310f, 99978288f, 59428676f, 166239664f, 0 }; MobType = (int)MOB_TYPES.ELEMENTAL; BerserkTimer = new int[] { 6 * 60, 6 * 60, 6 * 60, 6 * 60, 0 }; SpeedKillTimer = new int[] { 5 * 60, 5 * 60, 5 * 60, 5 * 60, 0 }; InBackPerc_Melee = new double[] { 0.95f, 0.95f, 0.95f, 0.95f, 0 }; InBackPerc_Ranged = new double[] { 0.00f, 0.00f, 0.00f, 0.00f, 0 }; Max_Players = new int[] { 10, 25, 10, 25, 0 }; Min_Tanks = new int[] { 2, 2, 2, 2, 0 }; Min_Healers = new int[] { 3, 5, 3, 5, 0 }; #endregion #region Offensive #region Attacks for (int i = 0; i < 4; i++) { Phase Normal = new Phase() { Name = "Normal Phase" }; Phase DecimationBlade = new Phase() { Name = "Decimation Blade" }; Phase InfernoBlade = new Phase() { Name = "Inferno Blade" }; Phase BothPhases = new Phase() { Name = "Both Phases" }; Attack Melee = GenAStandardMelee(this[i].Content); Melee.IsDualWielding = true; Melee.AffectsRole[PLAYER_ROLES.MainTank] = true; Normal.Attacks.Add(Melee); #region Blaze of Glory /* Baleroc's assault periodically awakens a burning spark within his primary target, increasing the * target's physical damage taken by 20%, but also raising their maximum health by 20%. * * Every time Baleroc applies Blaze of Glory, he gains an application of Incendiary Soul, increasing Fire * damage done by 20%.*/ // http://ptr.wowhead.com/spell=99252 // He averages out to applying this once every 12 seconds Stats BlazeofGloryStats = new Stats(); SpecialEffect BlazeofGlorySpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { BonusHealthMultiplier = 0.2f, DamageTakenReductionMultiplier = -0.20f }, BerserkTimer[i], 12f, 1f, 99); BlazeofGloryStats.AddSpecialEffect(BlazeofGlorySpecialEffect); BuffState BlazeofGlory = new BuffState { Name = "Blaze of Glory", Chance = 1, Frequency = BerserkTimer[i], Stats = BlazeofGloryStats, Breakable = false, Duration = BerserkTimer[i] * 1000f, }; BlazeofGlory.SetAffectsRoles_Tanks(); BothPhases.BuffStates.Add(BlazeofGlory); /* Incendiary Soul * Every time Baleroc applies Blaze of Glory, he gains an application of Incendiary Soul, increasing Fire * damage done by 20%.*/ // http://ptr.wowhead.com/spell=99369 Stats IncendiarySoulStat = new Stats(); SpecialEffect IncendiarySoulSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { FireDamageTakenMultiplier = 0.20f }, BerserkTimer[i], 12f, 1f, 99); IncendiarySoulStat.AddSpecialEffect(IncendiarySoulSpecialEffect); BuffState IncendiarySoul = new BuffState { Name = "Incendiary Soul", Chance = 1, Frequency = BerserkTimer[i], Stats = IncendiarySoulStat, Breakable = false, Duration = BerserkTimer[i] * 1000f, }; IncendiarySoul.SetAffectsRoles_Tanks(); BothPhases.BuffStates.Add(IncendiarySoul); #endregion #region Shards of Torment /* Baleroc summons *warning* two chrystals *end warning* amonst his foes, which continually channel * a shadowy beam on the player that is nearest to them.*/ // Summon - http://ptr.wowhead.com/spell=99260 // NPC - http://db.mmo-champion.com/c/53495/ float ShardofTormentDebuff = new float[] { 40, 60, 40, 60 }[i]; #region Torment // Deals 3500 Shadow damage per application to the nearest player, stacking once per second. // 10 man - http://ptr.wowhead.com/spell=99256 // 25 man - http://ptr.wowhead.com/spell=100230 // 10 man heroic - http://ptr.wowhead.com/spell=100231 // 25 man heroic - http://ptr.wowhead.com/spell=100232 // At most people should be taking 12 stacks of Torment float TormentDamageMultiplier = (1 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11) / 12f; float Affected = ((i == 0) || (i == 2 ) ? 1f : 2f ); Attack Torment = new Attack { Name = "Torment", AttackSpeed = 34f, DamagePerTick = new float[] { 3000, 3000, 4250, 4250, 0 }[i] * TormentDamageMultiplier, IsDoT = true, Duration = 12f, TickInterval = 1f, MaxNumTargets = Affected * 2f, AttackType = ATTACK_TYPES.AT_AOE, DamageType = ItemDamageType.Shadow, SpellID = new float[] { 99256, 100230, 100231, 100232, 0 }[i], }; Torment.SetAffectsRoles_DPS(); BothPhases.Attacks.Add(Torment); #endregion #region Tormented /* When Torment fades from a player, they are afflicted by the Tormented effect, which increases * Shadow damage taken by 250% and reduces healing done by 75%, for 40 sec. * *Warning* Direct melee contact with any other player will apply a fresh copy of the Tormented effect * to that player. [Heroic ONLY]*/ // 10 man - http://ptr.wowhead.com/spell=99257 // 25 man - http://ptr.wowhead.com/spell=99402 // 10 man heroic - http://ptr.wowhead.com/spell=99403 // 25 man heroic - http://ptr.wowhead.com/spell=99404 // This should NEVER get placed on a Healer float TormentedDamageIncrease = new float[] { 2.5f, 2.5f, 5f, 5f, 0f }[i]; BuffState Tormented = new BuffState { Name = "Tormented", Chance = Affected / (Max_Players[i] - Min_Healers[i] - Min_Tanks[i]), Breakable = false, Duration = ShardofTormentDebuff * 1000f, Frequency = 34f, Stats = new Stats() { SpellDamageTakenReductionMultiplier = -TormentedDamageIncrease, BonusHealingDoneMultiplier = -0.50f }, }; Tormented.SetAffectsRoles_DPS(); BothPhases.BuffStates.Add(Tormented); #endregion #region Wave of Torment /* If there are no players within 15 yards of a Shard of Torment, the Shard pulses this effect, dealing * 14250 to 15750 Shadow damage each second to all players.*/ // 10 man - http://ptr.wowhead.com/spell=99261 // 25 man - http://www.wowhead.com/spell=101636 // 10 man heroic - http://www.wowhead.com/spell=101637 // 25 man heroic - http://www.wowhead.com/spell=101638 // This should NEVER happen #endregion #region Vital Spark /* If a player casts a direct heal on someone who is being damaged by Torment, the healer gains an * application of Vital Spark for each (three/five [Normal/Heroic]) stacks of Torment on the target. * Casting a single-target direct heal on a target affected by Blaze of Glory will trigger Vital Flame, * increasing healing done on such targets by 5% per stack of vital Spark, lasting for 15 sec.*/ // http://ptr.wowhead.com/spell=99262 float VitalSparkBaseCD = new float[] { 3, 3, 5, 5, 0 }[i]; float VitalSparkCD = BerserkTimer[i] / ((BerserkTimer[i] * ((Torment.Duration * 2f) / Torment.AttackSpeed)) / VitalSparkBaseCD); Stats VitalSparkStats = new Stats(); // Assume half the healers get the buff at any given time SpecialEffect VitalSparkSpecialEffect = new SpecialEffect(Trigger.HealingSpellHit, new Stats() { BonusHealingDoneMultiplier = 0.05f }, 60f, VitalSparkCD, 0.5f, 999); VitalSparkStats.AddSpecialEffect(VitalSparkSpecialEffect); BuffState VitalSpark = new BuffState { Name = "Vital Spark", Breakable = false, Chance = 1f, Duration = BerserkTimer[i] * 1000f, Frequency = BerserkTimer[i] - 1f, Stats = VitalSparkStats, }; VitalSpark.SetAffectsRoles_Healers(); BothPhases.BuffStates.Add(VitalSpark); #endregion #region Vital Flame /* Increasing healing done to targets affected by Blaze of Glory by 5% per stack of Vital Spark * consumed to create this effect, lasting for 15 sec. When Vital Flame expires, it restores the * Vital Spark stacks that were consumed to create the effect.*/ // http://ptr.wowhead.com/spell=99263 Stats VitalFlameStats = new Stats(); SpecialEffect VitalFlameSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { HealingReceivedMultiplier = 0.05f }, 60f, VitalSparkCD, 1f, 999); VitalFlameStats.AddSpecialEffect(VitalFlameSpecialEffect); BuffState VitalFlame = new BuffState { Name = "Vital Flame", Breakable = false, Chance = 1f, Duration = BerserkTimer[i] * 1000f, Frequency = BerserkTimer[i] - 1f, Stats = VitalFlameStats, }; VitalFlame.SetAffectsRoles_Tanks(); BothPhases.BuffStates.Add(VitalFlame); #endregion #endregion #region Blades of Baleroc /*Baleroc will periodically empower one of his blades with Shadow or Fire energy, and wield it * alone for 15 sec.*/ /* Decimation Blade * Baleroc's melee strikes deal Shadow damage equal to 90% of the target's maximum health, * instead of their normal physical damage. This damage cannot be resisted or mitigated by * normal means.*/ // http://ptr.wowhead.com/spell=99352 // http://ptr.wowhead.com/spell=99353 Attack DecimatingStrike = new Attack { // Decimation Blades' Attack speed was reduced for 5 second per swing to 6.25 on Sep 19, 2011 Name = "Decimating Strike", AttackSpeed = 6.25f, DamagePerHit = .9f, DamageType = ItemDamageType.Shadow, DamageIsPerc = true, AttackType = ATTACK_TYPES.AT_MELEE, SpellID = 99353, Blockable = false, Dodgable = true, Parryable = true, Missable = true, IsDualWielding = false, }; DecimatingStrike.AffectsRole[PLAYER_ROLES.OffTank] = true; DecimationBlade.Attacks.Add(DecimatingStrike); /* Inferno Blade * Baleroc's melee strikes deal 102999 to 103000 Fire damage to the target, instead of their * normal physical damage, while this effect is active.*/ // Initial Cast - http://ptr.wowhead.com/spell=99350 // 10 man - http://ptr.wowhead.com/spell=99351 // 25 man - http://ptr.wowhead.com/spell=101000 // 10 man heroic - http://ptr.wowhead.com/spell=101001 // 25 man heroic - http://ptr.wowhead.com/spell=101002 Attack InfernoStrike = new Attack { Name = "Inferno Strike", AttackSpeed = 4f, DamagePerHit = new float[] { (73125f + 76875f), (124312f + 130687f), (116025f + 121975f), (197242f + 207357f), 0f }[i] / 2f, DamageType = ItemDamageType.Fire, DamageIsPerc = false, AttackType = ATTACK_TYPES.AT_MELEE, SpellID = new float[] { 99351, 10100, 101001, 101002, 0 }[i], Blockable = true, Dodgable = true, Parryable = true, Missable = true, IsDualWielding = false, }; InfernoStrike.AffectsRole[PLAYER_ROLES.MainTank] = true; InfernoBlade.Attacks.Add(InfernoStrike); #endregion #region Countdown [Heroic Only] /* Baleroc links two players to each other for 8 sec. If the chosen players move within 3 yards of each * other, the effect will dissipate harmlessly, but if the effect runs its full course, both players will * explode, dealing 125000 Fire damage to all allies within 45 yards.*/ // http://ptr.wowhead.com/spell=99516 // possible explosion id: http://ptr.wowhead.com/spell=99518 // This should NEVER go off, so one has to move at most 7 of the 8 seconds if (i > 1) { Impedance Countdown_Move = new Impedance { Name = "Countdown Move", Duration = 7f * 1000f, Chance = 2f / (Max_Players[i] - Min_Tanks[i]), Breakable = false, Frequency = 45f, }; Countdown_Move.SetAffectsRoles_DPS(); Countdown_Move.SetAffectsRoles_Healers(); BothPhases.Moves.Add(Countdown_Move); } #endregion #region Apply Phases // Pull then at 30 Sec, Empower Blade w/ 50/50 chance for which blade type. // 15 secs of empowered blade // Return to normal mode. int phasestart = 0; int EBdur = 15; int NormalDur = 30; InnerPhase InnerPhaseNormal, InnerPhaseEmpoweredBlade; InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 30 seconds; OT builds stacks BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(InfernoBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 45 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 1 minute 15 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(DecimationBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 1 minute 30 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 2 minutes 0 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(InfernoBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 2 minutes 15 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 2 minute 45 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(DecimationBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 3 minute 0 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 3 minutes 30 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(InfernoBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 3 minutes 45 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 4 minute 15 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(DecimationBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 4 minute 30 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 5 minutes 0 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(InfernoBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 5 minutes 15 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); InnerPhaseNormal = new InnerPhase(Normal, i, 1, phasestart, NormalDur, BerserkTimer[i]); phasestart += NormalDur; // 5 minute 45 seconds BothPhases.InnerPhases.Add(InnerPhaseNormal); InnerPhaseEmpoweredBlade = new InnerPhase(DecimationBlade, i, 1, phasestart, EBdur, BerserkTimer[i]); phasestart += EBdur; // 6 minute 0 seconds BothPhases.InnerPhases.Add(InnerPhaseEmpoweredBlade); ApplyAPhasesValues(BothPhases, i, 1, 0, BerserkTimer[i], BerserkTimer[i]); AddAPhase(BothPhases, i); #endregion } #endregion #endregion #region Defensive Resist_Physical = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Frost = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Fire = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Nature = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Arcane = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Shadow = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Holy = new double[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion #region Impedances for (int i = 0; i < 2; i++) { //Moves; //Stuns; //Fears; //Roots; //Disarms; } TimeBossIsInvuln = new float[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion /* TODO: * Heroic */ }
public Alysrazor() { // If not listed here use values from defaults #region Info Name = "Alysrazor"; Instance = "Firelands"; Content = new BossHandler.TierLevels[] { BossHandler.TierLevels.T12_10, BossHandler.TierLevels.T12_25, BossHandler.TierLevels.T12_10H, BossHandler.TierLevels.T12_25H, BossHandler.TierLevels.T12_LFR }; Comment = "Not modeled in detail yet."; #endregion #region Basics Health = new float[] { 38651400f, 115954200f, 71892800f, 197122144f, 0 }; // TODO: double check 25-man normal and 10-man heroic health pool MobType = (int)MOB_TYPES.ELEMENTAL; // 3 full phases on Normal; 2 full phases on Heroic; or 15 minute enrage timer. BerserkTimer = new int[] { 15 * 60, 15 * 60, 15 * 60, 15 * 60, 0 }; SpeedKillTimer = new int[] { 8 * 60, 8 * 60, 8 * 60, 8 * 60, 0 }; InBackPerc_Melee = new double[] { 0.95f, 0.95f, 0.95f, 0.95f, 0 }; InBackPerc_Ranged = new double[] { 0.00f, 0.00f, 0.00f, 0.00f, 0 }; Max_Players = new int[] { 10, 25, 10, 25, 0 }; Min_Tanks = new int[] { 2, 2, 2, 2, 0 }; Min_Healers = new int[] { 3, 5, 3, 5, 0 }; #endregion #region Offensive #region Attacks for (int i = 0; i < 4; i++) { Phase InitialPull = new Phase() { Name = "Initial Pull" }; Phase FlightofFlames = new Phase() { Name = "Flight of Flames" }; Phase FlightofFlamesPart2 = new Phase() { Name = "Flight of Flames" }; Phase UltimateFirepower = new Phase() { Name = "Ultimate Firepower" }; Phase Burnout = new Phase() { Name = "Burnout" }; Phase ReIgnition = new Phase() { Name = "Re-Ignition" }; //Mini-Phase variables Phase HatchlingPhase = new Phase() { Name = "Hatchlings" }; Phase FireStormPhase = new Phase() { Name = "Firestorm Phase" }; InnerPhase InnerPhaseHatchling, InnerPhaseFirestorm; float FlightofFlamesPhaseTime = new float[] { 190f, 190f, 250f, 250f, 0f }[i]; float FirestormCD = new float[] { 0, 0, 83f, 83f, 0 }[i]; float MeteorCD = new float[] { 0, 0, 37, 37, 0 }[i]; float FieryTornadoDuration = 35f; float BurnoutDuration = 33f; float ReIgniteDuration = 50f / 3f; #region Initial Pull #region Initial Pull Firestorm /* Firestorm * At the beginning of the battle, Alysrazor ascends into the sky dealing 30000 Fire damage to all * enemies and knocking them back. In addition, Alysrazor will continue to deal 10000 Fire damage * to all enemies every 1 seconds for 10 sec.*/ // Initial damage // 10-man - http://ptr.wowhead.com/spell=99605 // 25-man - http://ptr.wowhead.com/spell=101658 // 10-man Heroic - http://ptr.wowhead.com/spell=101659 // 25-man Heroic - http://ptr.wowhead.com/spell=101660 // Addition damage - http://ptr.wowhead.com/spell=99606 Attack InitialFirestorm = new Attack { Name = "Initial Pull Firestorm", AttackSpeed = BerserkTimer[i] - 1f, AttackType = ATTACK_TYPES.AT_AOE, DamageType = ItemDamageType.Fire, Interruptable = false, MaxNumTargets = Max_Players[i], DamagePerHit = new float[] { 20000f, 20000f, 25000f, 25000f, 0 }[i], DamagePerTick = 8000f, IsDoT = true, Duration = 10f * 1000f, TickInterval = 1f, SpellID = new float[] { 99605, 101658, 101659, 101660, 0 }[i], }; InitialFirestorm.SetAffectsRoles_All(); InitialPull.Attacks.Add(InitialFirestorm); #endregion #region Volcanic Fire /* Volcanic Fire * A massive eruption creates patches of Fire which block escape from Alysrazor's domain. Volcanic * Fire patches deal 92500 to 107500 Fire damage to enemies within 6 yards every 1 seconds.*/ // http://ptr.wowhead.com/spell=98463 // This should never be hit #endregion #endregion #region Flight of Flames /* Alysrazor flies around the area, allowing her minions to corner her foes far below. She will * periodically fly through the center of the arena to claw at floes as well.*/ #region Firestorm [Heroic Only] /* Alysrazor faces the center of the arena and kicks up a powerful, fiery wind. After 5 seconds, * the arena is bathed in flames, dealing 100000 Fire damage every 1 seconds to all enemies within * line of sight for 5 sec.*/ // Initicial cast - http://ptr.wowhead.com/spell=100744 // Actual Damage - http://ptr.wowhead.com/spell=100745 // Personal Note - Stopping a Molten Meteor which is summoned by a Herald of the Burning End allows // people to Line of Sight the Firestorm damage, thus negating the damage (aka interuptable). // This should never be hit, but people should move on the cast part if (i > 1) { /*Attack Firestorm = new Attack { Name = "Firestorm", DamagePerTick = 50000f, IsDoT = true, TickInterval = 1f, Duration = 5f, DamageType = ItemDamageType.Fire, AttackSpeed = FirestormCD, }; Firestorm.SetAffectsRoles_All(); Firestorm.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; */ Impedance Firestorm_move = new Impedance { Name = "Move to Hide from Firestorm", Chance = 1f, Breakable = false, Duration = 5f * 1000f, Frequency = 10f, }; Firestorm_move.SetAffectsRoles_All(); Firestorm_move.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; FireStormPhase.Moves.Add(Firestorm_move); } #endregion #region Molting // Alysrazor begins to mold, creating Molten Feathers nearby. // She channels this for 9 seconds. // 10-man/Heroic - http://ptr.wowhead.com/spell=99464, she drops every second // 25-man/Heroic - http://ptr.wowhead.com/spell=100698, every 400 milliseconds float feathers = 9f / new float[] { 1f, 0.4f, 1f, 0.4f, 0f }[i]; #region Molten Feather [DPS Note] /* Molten Feathers can be picked up by players, up to a maximum of three. While holding a * Molten Feather, all spells can be cast while moving and movement speed is increased by 30% * per feather. Once three feathers have been obtained, the player gains Wings of Flame.*/ // http://ptr.wowhead.com/spell=97128 float AirGroupSize = new float[] { 1f, 3f, 1f, 3f, 0f }[i]; BuffState MoltenFeatherAirGroup = new BuffState { Name = "Molten Feather Air Group", Chance = AirGroupSize / (Max_Players[i] - Min_Tanks[i] - Min_Healers[i]), // Assume that it does not fall off until the end of Burnout Duration = FlightofFlamesPhaseTime * 1000f, Frequency = FlightofFlamesPhaseTime, Breakable = false, Stats = new Stats() { MovementSpeed = (0.30f * 3f) }, }; MoltenFeatherAirGroup.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; // On heroic air group needs to grab 1 feather each after each Firestorm to keep their flying buff up. float remainingfeathers = (feathers - (AirGroupSize * 3f)) + (feathers - ((i > 1) ? AirGroupSize : 0f)) * 2f; BuffState MoltenFeatherGroundGroup = new BuffState { Name = "Molten Feather Ground Group", Chance = (Max_Players[i] - AirGroupSize) / Max_Players[i], Duration = MoltenFeatherAirGroup.Duration, Frequency = MoltenFeatherAirGroup.Frequency, Breakable = false, Stats = new Stats() { MovementSpeed = (0.30f * (3f * (remainingfeathers / (feathers * 3f)))) }, }; MoltenFeatherGroundGroup.SetAffectsRoles_All(); FlightofFlames.BuffStates.Add(MoltenFeatherGroundGroup); FlightofFlamesPart2.BuffStates.Add(MoltenFeatherGroundGroup); // Since people are getting feathers, casters can cast while moving, thus eliminating most movement impedances #endregion #region Wings of Flame // Allows the player to fly for 20 sec.*/ // http://ptr.wowhead.com/spell=98630 MoltenFeatherAirGroup.Stats.MovementSpeed = 2.25f; FlightofFlames.BuffStates.Add(MoltenFeatherAirGroup); FlightofFlamesPart2.BuffStates.Add(MoltenFeatherAirGroup); #endregion #endregion #region Flying // Players in flight using Wings of Flame contend with additional elements of the battle. #region Blazing Power /* While flying, Alysrazor periodically gives off rings of fire, which last for 3 seconds. * Enemies that pass through the ring gain Blazing Power, wich increases haste by 4% and * stacks up to 25 times. In addition, each stack of Blazing Power restores mana, rage, * energy, runic power, and holy power, and refreshes the duration of Wings of Flame.*/ // http://ptr.wowhead.com/spell=99461 // Restores 5% of mana, rage, energy, runic power, and holy power. Stats BlazingPowerStats = new Stats(); SpecialEffect BlazingPowerSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { ManaorEquivRestore = 0.05f, PhysicalHaste = 0.08f, SpellHaste = 0.08f }, 40f, 5f, 1f, 25); BlazingPowerStats.AddSpecialEffect(BlazingPowerSpecialEffect); BuffState BlazingPower = new BuffState { Name = "Blazing Power", Frequency = MoltenFeatherAirGroup.Frequency, Duration = MoltenFeatherAirGroup.Duration, Chance = 1f, Breakable = false, Stats = BlazingPowerStats, }; BlazingPower.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; FlightofFlames.BuffStates.Add(BlazingPower); FlightofFlamesPart2.BuffStates.Add(BlazingPower); #endregion #region Alysra's Razor /* If a player gains 25 stacks of Blazing Power, they gain Alysra's Razor, which increases * critical strike chance by 50% for 30 sec.*/ // http://ptr.wowhead.com/spell=100029 // Normal there is no break in the timing on normal, // Flyer should have 25 stacks during the second Firestorm, so only 10 seconds while not refreshing the stack float AlysrasRazorStartTime = (i < 2 ? 125f : 135f); BuffState AlysrasRazor = new BuffState { Name = "Alysra's Razor", Frequency = MoltenFeatherAirGroup.Frequency, Duration = MoltenFeatherAirGroup.Duration - (AlysrasRazorStartTime * 1000f), Chance = 1f, Breakable = false, Stats = new Stats() { SpellCrit = 0.75f, PhysicalCrit = 0.75f }, }; AlysrasRazor.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; FlightofFlames.BuffStates.Add(AlysrasRazor); FlightofFlamesPart2.BuffStates.Add(AlysrasRazor); #endregion #region Incendiary Cloud /* While flying, Alysrazor periodically gives off between one and three Incendiary Clouds, * which last for 3 seconds. Enemies that pass through the cloud suffer 27750 to 32250 Fire * damage every 1.50 sec. * * *Warning* In Heroic Difficulty, Alysrazor always creates three Incindiary Clouds.*/ // 10 man - http://ptr.wowhead.com/spell=99427 // 25 man - http://ptr.wowhead.com/spell=100729 // 10 man heroic - http://ptr.wowhead.com/spell=100730 // 25 man heroic - http://ptr.wowhead.com/spell=100731 // These should NEVER be hit by the Air group Attack IncendiaryCloud = new Attack { Name = "Incendiary Cloud", DamagePerTick = new float[] { (27750f + 32250f), (27750f + 32250f), (55500f + 64500f), (55500f + 64500f), 0 }[i] / 2f, IsDoT = true, TickInterval = 1.5f, Duration = 3f, AttackType = ATTACK_TYPES.AT_AOE, AttackSpeed = 5f, DamageType = ItemDamageType.Fire, SpellID = new float[] { 99427, 100729, 100730, 100731, 0 }[i], // Normal has 2 clouds, Heroic has 3 clouds MaxNumTargets = new float[] { 2, 2, 3, 3, 0 }[i], // By flying around the clouds, you can "interrupt" the attacks Interruptable = true, }; IncendiaryCloud.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; FlightofFlames.Attacks.Add(IncendiaryCloud); FlightofFlamesPart2.Attacks.Add(IncendiaryCloud); #endregion #endregion #region Blazing Talon Initiate /* Blazing Talon Initiates will periodically fly in from the Firelands to assist Alysrazor * in defeating enemy forces on the ground.*/ // West-side - http://ptr.wowhead.com/npc=53896 // East-side - http://ptr.wowhead.com/npc=53369 // Timer - Both - Normal - 17; Heroic - 17 // Both - Normal - 31; heroic - 22 // East - Normal - 21; Heroic - 53 // West - Normal - 21; Heroic - 21 // East - Normal - 21; Heroic - 21 // West - Normal - 21; Heroic - 40 float WestBlazingTalonInitiateFrequence = (i > 1 ? (17f + 22f + (63f + 21f) + (21f + 40f)) : (17f + 31f + (31f + 21f) + (21f + 21f))) / 4f; float EastBlazingTalonInitiateFrequence = (i > 1 ? (17f + 22f + 63f + (21f + 21f)) : (17f + 31f + 31f + (21f + 21f))) / 4f; TargetGroup BlazingTalonInitiateWest = new TargetGroup { Name = "Blazing Talon Initiate West", Chance = 1f, Frequency = WestBlazingTalonInitiateFrequence, Duration = WestBlazingTalonInitiateFrequence * 1000f, LevelOfTargets = 87, NearBoss = false, NumTargs = 1f, TargetID = 53896, }; BlazingTalonInitiateWest.SetAffectsRoles_DPS(); HatchlingPhase.Targets.Add(BlazingTalonInitiateWest); FlightofFlames.Targets.Add(BlazingTalonInitiateWest); FlightofFlamesPart2.Targets.Add(BlazingTalonInitiateWest); TargetGroup BlazingTalonInitiateEast = new TargetGroup { Name = "Blazing Talon Initiate East", Chance = 1f, Frequency = EastBlazingTalonInitiateFrequence, Duration = EastBlazingTalonInitiateFrequence * 1000f, LevelOfTargets = 87, NearBoss = false, NumTargs = 1f, TargetID = 53369, }; BlazingTalonInitiateEast.SetAffectsRoles_DPS(); HatchlingPhase.Targets.Add(BlazingTalonInitiateEast); FlightofFlames.Targets.Add(BlazingTalonInitiateEast); FlightofFlamesPart2.Targets.Add(BlazingTalonInitiateEast); #region Brushfire /* The Blazing Talon Initiate conjures a fiery ball that moves across the arena, dealing * 27750 to 32250 damage every 1 sec to enemies within 0 yards.*/ // Initiates are now stunnable so these can be "interupted" now // Original cast - http://ptr.wowhead.com/spell=98868 // Summons - http://ptr.wowhead.com/npc=53372 // 10 man - http://ptr.wowhead.com/spell=98885 // 25 man - http://ptr.wowhead.com/spell=100715 // 10 man heroic - http://ptr.wowhead.com/spell=100716 // 25 man heroic - http://ptr.wowhead.com/spell=100717 Attack Brushfire = new Attack { Name = "Brushfire", DamagePerHit = new float[] { (27750f + 32250f), (27750f + 32250f), (55500f + 64500f), (55500f + 64500f), 0f }[i], DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, MaxNumTargets = 1f, Interruptable = true, IsFromAnAdd = true, SpellID = new float[] { 98885, 100715, 100716, 100717, 0 }[i], AttackSpeed = new float[] { 4f, 4f, 8f, 8f, 0f }[i], }; Brushfire.SetAffectsRoles_All(); FlightofFlames.Attacks.Add(Brushfire); FlightofFlamesPart2.Attacks.Add(Brushfire); #endregion #region Fieroblast /* The Blazing Talon Initiate hurls a fiery boulder at an enemy, inflicting 27750 to 32250 Fire * damage and 10000 Fire damage every 3 seconds for 12 sec.*/ // After the September 20, 2011 nerf to Firelands in general, this is only cast on heroic // Cast after every Brushfire (Brushfire/Fieroblast/Burshfire/Fieroblast/etc) // These are interuptable // 10 man Heroic - http://ptr.wowhead.com/spell=101295 // 25 man Heroic - http://ptr.wowhead.com/spell=101296 if (i > 1 ) { Attack Fieroblast = new Attack { Name = "Fieroblast", DamagePerHit = new float[] { 0, 0, (37000f + 43000f), (37000f + 43000f), 0f }[i], DamagePerTick = new float[] { 0, 0, 20000, 20000, 0 }[i], IsDoT = true, TickInterval = 3f, Duration = 12f, AttackSpeed = new float[] { 0, 0, 8f, 8f, 0f }[i], AttackType = ATTACK_TYPES.AT_DOT, DamageType = ItemDamageType.Fire, Interruptable = true, IsFromAnAdd = true, MaxNumTargets = 1f, }; Fieroblast.SetAffectsRoles_All(); Fieroblast.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; FlightofFlames.Attacks.Add(Fieroblast); FlightofFlamesPart2.Attacks.Add(Fieroblast); } #endregion #endregion #region Voracious Hatchling [Tank Note] /* Early in Stage 1, two Blazing Broodmothers drop off two Molten Eggs. After several seconds, * the eggs hatch into Voracious Hatchlings. Voracious Hatchlings are indeed voracious and will * throw a Tantrum if not fed Plump Lava Worms.*/ // East Hatchling - http://ptr.wowhead.com/npc=53898 // West hatchling - http://ptr.wowhead.com/npc=53509 TargetGroup WestVoraciousHatchling = new TargetGroup { Name = "West Voracious Hatchling", Chance = 1f, Frequency = (i > 1 ? FirestormCD : FlightofFlamesPhaseTime) - 1f, Duration = ((i > 1 ? FirestormCD : FlightofFlamesPhaseTime) - 12f) * 1000f, NearBoss = false, NumTargs = 1f, TargetID = 53509, LevelOfTargets = 87, }; WestVoraciousHatchling.AffectsRole[PLAYER_ROLES.MainTank] = true; if (i < 2) { FlightofFlames.Targets.Add(WestVoraciousHatchling); FlightofFlamesPart2.Targets.Add(WestVoraciousHatchling); } else FireStormPhase.Targets.Add(WestVoraciousHatchling); TargetGroup EastVoraciousHatchling = WestVoraciousHatchling.Clone(); EastVoraciousHatchling.Name = "East Voracious Hatchling"; EastVoraciousHatchling.TargetID = 53509; EastVoraciousHatchling.AffectsRole[PLAYER_ROLES.MainTank] = false; EastVoraciousHatchling.AffectsRole[PLAYER_ROLES.OffTank] = true; if (i < 2) { FlightofFlames.Targets.Add(EastVoraciousHatchling); FlightofFlamesPart2.Targets.Add(EastVoraciousHatchling); } else FireStormPhase.Targets.Add(EastVoraciousHatchling); Attack VoraciousHatchlingMelee = new Attack { Name = "Voracious hatchling Melee", DamagePerHit = BossHandler.StandardMeleePerHit[(int)Content[i]], AttackSpeed = 1f, AttackType = ATTACK_TYPES.AT_MELEE, DamageType = ItemDamageType.Physical, IsFromAnAdd = true, MaxNumTargets = 1f, Missable = true, Parryable = true, Dodgable = true, Blockable = true, IsTheDefaultMelee = true, }; VoraciousHatchlingMelee.SetAffectsRoles_Tanks(); if (i < 2) { FlightofFlames.Attacks.Add(VoraciousHatchlingMelee); FlightofFlamesPart2.Attacks.Add(VoraciousHatchlingMelee); } else FireStormPhase.Attacks.Add(VoraciousHatchlingMelee); #region Imprinted /* Upon hatchling, Voracious Hatchlings become imprinted on the nearest enemy. The hatchling * will only attack that target, but the target gains 1000% additional damage against the * hatchling.*/ // http://ptr.wowhead.com/spell=99389; alt - http://ptr.wowhead.com/spell=100359 WestVoraciousHatchling.AffectsRole[PLAYER_ROLES.MainTank] = true; EastVoraciousHatchling.AffectsRole[PLAYER_ROLES.OffTank] = true; BuffState Imprint = new BuffState { Name = "Imprint", Frequency = WestVoraciousHatchling.Frequency, Duration = WestVoraciousHatchling.Duration, Chance = 1f, Breakable = false, Stats = new Stats() { BonusDamageMultiplier = 10f }, }; Imprint.SetAffectsRoles_Tanks(); if (i < 2) { FlightofFlames.BuffStates.Add(Imprint); FlightofFlamesPart2.BuffStates.Add(Imprint); } else FireStormPhase.BuffStates.Add(Imprint); #endregion #region Satiated /* The Voracious Hatchling will not throw a Tantrum when Satiated, which lasts for 15 sec. * Voracious Hatchlings hatch fully Satiated, and can become Satiated again if they are fed * Lava Worms.*/ // 15 seconds // 10-man - http://ptr.wowhead.com/spell=99359 // 25-man - http://ptr.wowhead.com/spell=100850 // 10 seconds // 10-man heroic - http://ptr.wowhead.com/spell=100851 // 25-man heroic - http://ptr.wowhead.com/spell=100852 #endregion #region Hungry /* A Voracious Hatchling that is no longer Satiated becomes Hungry. When Hungry, hatchling * have a 20% chance on hit to throw a Tantrum.*/ // http://ptr.wowhead.com/spell=99361 #endregion #region Tantrum // The Voracious Hatchling throws a Tantrum, increasing damage by 50% and haste by 50%. // http://ptr.wowhead.com/spell=99362 // This should never happen on heroic Stats TantrumStats = new Stats(); SpecialEffect TantrumSpecialEffect = new SpecialEffect(Trigger.DamageTaken, new Stats() { DamageTakenReductionMultiplier = -0.50f }, 10f, (i < 2 ? 35 : 25 ), 0.20f); TantrumStats.AddSpecialEffect(TantrumSpecialEffect); BuffState Tantrum = new BuffState { Name = "Tantrum", Chance = 1f, Breakable = true, Frequency = (i < 2 ? 30 : 20 ), Duration = 10f * 1000f, Stats = TantrumStats, }; Tantrum.SetAffectsRoles_Tanks(); if (i < 2) { FlightofFlames.BuffStates.Add(Tantrum); FlightofFlamesPart2.BuffStates.Add(Tantrum); } else FireStormPhase.BuffStates.Add(Tantrum); #endregion #region Gushing Wound [Healer Note] /* The Voracious Hatchling strikes all targets within a 6-yard cone, causing them to bleed for * 3000 Physical damage every 0.20 seconds or until the target's health falls below 50% of * their maximum health.*/ // 10 man - http://ptr.wowhead.com/spell=100024; alt - http://ptr.wowhead.com/spell=99308 // 25 man - http://ptr.wowhead.com/spell=100721; alt - http://ptr.wowhead.com/spell=100718 // 10 man heroic - http://ptr.wowhead.com/spell=100719; alt - http://ptr.wowhead.com/spell=100722 // 25 man heroic - http://ptr.wowhead.com/spell=100723; alt - http://ptr.wowhead.com/spell=100720 Attack GushingWound = new Attack { Name = "Gushing Wound", DamagePerTick = new float[] { 3000, 4000, 5000, 6000, 0 }[i], TickInterval = 0.20f, DamageType = ItemDamageType.Physical, Duration = 60f, AttackType = ATTACK_TYPES.AT_MELEE, AttackSpeed = 60f, IsDoT = true, IsFromAnAdd = true, MaxNumTargets = 1f, }; GushingWound.SetAffectsRoles_Tanks(); if (i < 2) { FlightofFlames.Attacks.Add(GushingWound); FlightofFlamesPart2.Attacks.Add(GushingWound); } else FireStormPhase.Attacks.Add(GushingWound); #endregion #endregion #region Plump Lava Worm [Tank Note] /* During Stage 1, two sets of four Lava Worms will erupt from the molten ground. Lava Worms * cannot be attacked by players. Voracious Hatchlings that are near a Lava Worm will rush * to devour it, becoming temporarily Satiated.*/ // this means the tank tanking the Hatchlings need to move to position the hatchlings near the worms // when they need to be satiated. // http://ptr.wowhead.com/npc=53520 TargetGroup PlumpLavaWorm = new TargetGroup { Name = "Plump Lava Worm", NumTargs = (i < 2f ? 8f : 4f), // four worms spawn at any given time // two worm will last for the full duration, while the first two will last half that // so an average of 75% of the full duration for all of the worms. Duration = WestVoraciousHatchling.Duration * 0.75f, Frequency = WestVoraciousHatchling.Frequency, Chance = 1f, LevelOfTargets = 85, NearBoss = false, TargetID = 53520, }; PlumpLavaWorm.SetAffectsRoles_Tanks(); if (i < 2) { FlightofFlames.Targets.Add(PlumpLavaWorm); FlightofFlamesPart2.Targets.Add(PlumpLavaWorm); } else FireStormPhase.Targets.Add(PlumpLavaWorm); #region Lava Spew /* Plump Lava Worms spew a molten cone of fire dealing 27750 to 32250 damage every 1 sec * to all enemies within a 14-yard cone.*/ // 10 man - http://ptr.wowhead.com/spell=99336 // 25 man - http://ptr.wowhead.com/spell=100725 // 10 man heroic - http://ptr.wowhead.com/spell=100726 // 25 man heroic - http://ptr.wowhead.com/spell=100727 Attack LavaSpew = new Attack { Name = "Lava Spew", AttackType = ATTACK_TYPES.AT_AOE, DamageType = ItemDamageType.Fire, DamagePerHit = new float[] { (27750f + 32250f), (27750f + 32250f), (55500f + 64500f), (55500f + 64500f), 0f }[i] / 2f, AttackSpeed = 1f, Interruptable = true, IsFromAnAdd = true, MaxNumTargets = Max_Players[i], SpellID = new float[] { 99336, 100725, 100726, 100727, 0 }[i], }; LavaSpew.SetAffectsRoles_All(); if (i < 2) { FlightofFlames.Attacks.Add(LavaSpew); FlightofFlamesPart2.Attacks.Add(LavaSpew); } else FireStormPhase.Attacks.Add(LavaSpew); #endregion #endregion #region Herald of the Burning End [Heroic Only] if (i > 1) { /* During Stage 1, a Herald of the Burning End will periodically appear and begin casting * Cataclysm. The Herald is immune to all damage, but will die once Cataclysm is cast.*/ #region Cataclysm [Heroic Only] /* The Herald of the Burning End summons a powerful Molten Meteor, dealing 462500 to * 537500 Flamestrike damage to enemies within 0 yards.*/ // NPC - http://ptr.wowhead.com/npc=53375 // You cannot target this harm this npc since this npc will deal a 50,000 AOE damage to anyone // near him and is immune to all attacks. He disappears after casting Cataclysm. #region Molten Meteor [Heroic Only] /* After being summoned by the Herald of the Burning End, a Molten Meteor will roll in one * of 8 random directions, dealing 462500 to 537500 Flamestrike damage to enemies within * 0 yards every 1.50 sec. * 10-man heroic - http://ptr.wowhead.com/npc=53489 * 25-man heroic - http://ptr.wowhead.com/npc=54563 * This should NEVER happen*/ TargetGroup MoltenMeteor = new TargetGroup { Name = "Molten Meteor", // meteors lasts at most 9 seconds before they explode, at least one of theses needs to // survive before a firestorm Duration = 9f * 1000f, Chance = 1f, LevelOfTargets = 87, TargetID = new float[] { 0, 0, 53489, 54563, 0 }[i], NumTargs = 1f, NearBoss = false, Frequency = FirestormCD / 2f, }; MoltenMeteor.AffectsRole[PLAYER_ROLES.RangedDPS] = true; FireStormPhase.Targets.Add(MoltenMeteor); /* If the meteor reaches a wall, it will break apart into three Molten Boulders, which * ricochet back to the opposite direction. If it is destroyed before it reaches a wall, * the Molten Meteor becomes temporarily stationary and block line of sight.*/ // Explosion - http://ptr.wowhead.com/spell=99274 // Personal note, this is what is used to negate the damage from the 100,000 damage every second // from Firestorm. // Players should NEVER get hit by this. #endregion #region Molten Boulder [Heroic Only] /* Three Molten Boulders form when a Molten Meteor hits a wall and breaks apart. Molten Boulder * deals 29600 to 34400 Flamestrike damage to enemies within 2 yards every 1.50 sec and knock * them back.*/ // NPC - http://db.mmo-champion.com/c/53496/ // Damage - http://ptr.wowhead.com/spell=99275 Impedance MoltenBoulder_Move = new Impedance { Name = "Molten Boulder", Duration = 2f * 1000f, Chance = 1f, Frequency = MoltenMeteor.Frequency, Breakable = false, }; MoltenBoulder_Move.SetAffectsRoles_All(); FireStormPhase.Moves.Add(MoltenBoulder_Move); #endregion } #endregion #endregion #endregion #region Ultimate Firepower /* Alysrazor flies in a tight circle, removing Wings of Flame from all players after 5 seconds, * and begins her ultimate attack.*/ // This lasts for 35 seconds #region Fiery Vortex /* A Fiery Vortex appears in the middle of the arena, dealing 100000 Fire damage every 0.50 * seconds to enemies within 0 yards.*/ // http://ptr.wowhead.com/spell=99794 // This should NEVER be hit #endregion #region Fiery Tornado /* Fiery Tornadoes erupt from the Fiery Vortex and begin moving rapidly around Alysrazor's arena, * dealing 25000 Fire damage every 1 sec to enemies within 0 yards.*/ // 10 man - http://ptr.wowhead.com/spell=99816 // 25 man - http://ptr.wowhead.com/spell=100733 // 10 man heroic - http://ptr.wowhead.com/spell=100734 // 25 man heroic - http://ptr.wowhead.com/spell=100735 // These should never be hit /*Attack FieryTornado = new Attack { Name = "Fiery Tornado", DamagePerHit = new float[] { 20000, 25000, 60000, 70000, 0 }[i], DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, AttackSpeed = 1f, MaxNumTargets = 1f, Interruptable = true, SpellID = new float[] { 99816, 100733, 100734, 100735, 0 }[i], }; FieryTornado.SetAffectsRoles_All(); FieryTornado.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; */ #endregion #region Blazing Power /* Alysrazor continues to give off rings of fire, which appear on the ground of the arena and * lasts for 3 seconds. Players who pass through the ring gain Blazing Power, which increase haste * by 8% and stacks up to 25 times. In addition, each stack of Blazing Power restores mana, rage, * energy, runic power, and holy power.*/ // http://ptr.wowhead.com/spell=99461 // Restores 5% of mana, rage, energy, runic power, and holy power. BuffState BlazingPowerPhase2 = new BuffState { Name = "Blazing Power Phase 2", Frequency = FieryTornadoDuration, Duration = FieryTornadoDuration * 1000f, Chance = 1f, Breakable = false, Stats = BlazingPowerStats, }; BlazingPowerPhase2.SetAffectsRoles_All(); UltimateFirepower.BuffStates.Add(BlazingPowerPhase2); // Assume the air group has 25 stacks at this point and still refreshing during Tornadoes BuffState BlazingPowerPhase2AirGroup = new BuffState { Name = "Blazing Power Phase 2 Air Group", Frequency = FieryTornadoDuration, Duration = FieryTornadoDuration * 1000f, Chance = 1f, Breakable = false, Stats = new Stats() { SpellHaste = 2f, PhysicalHaste = 2f, CritRating = 0.75f }, }; BlazingPowerPhase2.AffectsRole[PLAYER_ROLES.AlysrazorAirGroup] = true; UltimateFirepower.BuffStates.Add(BlazingPowerPhase2AirGroup); #endregion #endregion #region Burnout [DPS Note] /* Alysrazor crashes to the ground and becomes vulnerable, with 0 Molten Power. This stage lasts * until Alyrazor's energy bar reaches 50 Molten Power.*/ #region Blazing Power BuffState BlazingPowerPhase3 = new BuffState { Name = "Blazing Power Phase 3", Frequency = BurnoutDuration, Duration = BurnoutDuration * 1000f, Chance = 1f, Breakable = false, Stats = new Stats() { SpellHaste = 0.08f * 7f, PhysicalHaste = 0.08f * 7f }, }; BlazingPowerPhase3.SetAffectsRoles_All(); Burnout.BuffStates.Add(BlazingPowerPhase3); BuffState BlazingPowerPhase3AirGroup = BlazingPowerPhase2AirGroup.Clone(); BlazingPowerPhase3AirGroup.Name = "Blazing Power Phase 3 Air Group"; BlazingPowerPhase3AirGroup.Frequency = BurnoutDuration; BlazingPowerPhase3AirGroup.Duration = BurnoutDuration * 1000f; Burnout.BuffStates.Add(BlazingPowerPhase3AirGroup); #endregion #region Burnout /* Alysrazor's fire burns out, causing her to become immobile and increasing damage taken by 100%. * In addition, when struck with a harmful spell, Alysrazor emits Essence of the Green.*/ // http://ptr.wowhead.com/spell=99432 BuffState BurnoutBuffState = new BuffState { Name = "Burnout DeBuff", Breakable = false, Chance = 1f, Duration = BurnoutDuration * 1000f, Frequency = BurnoutDuration, Stats = new Stats() { BonusDamageMultiplier = 1f }, }; BurnoutBuffState.SetAffectsRoles_DPS(); BurnoutBuffState.SetAffectsRoles_Healers(); Burnout.BuffStates.Add(BurnoutBuffState); #endregion #region Essence of the Green [Healer Note] /* During Burnout, if Alysrazor is struck by a harmful spell, she emits Essence of the Green * restoring 10% of maximum mana to players.*/ // http://ptr.wowhead.com/spell=99433 Stats EssenceoftheGreenStats = new Stats(); SpecialEffect EssenceoftheGreenSpecialEffect = new SpecialEffect(Trigger.DamageSpellHit, new Stats() { ManaRestoreFromMaxManaPerSecond = 0.10f }, 0, 0, 1f); EssenceoftheGreenStats.AddSpecialEffect(EssenceoftheGreenSpecialEffect); BuffState EssenceoftheGreen = new BuffState { Name = "Essence of the Green", Breakable = false, Chance = 1f, Duration = BurnoutDuration * 1000f, Frequency = BurnoutDuration, Stats = EssenceoftheGreenStats, }; EssenceoftheGreen.SetAffectsRoles_DPS(); EssenceoftheGreen.SetAffectsRoles_Healers(); Burnout.BuffStates.Add(EssenceoftheGreen); #endregion #region Spark /* A bright spark continues to burn within the heart of Alyrazor, restoring 3 Molten Power * every 2 seconds.*/ // http://ptr.wowhead.com/spell=99921 #endregion #region Blazing Talon Clawshaper /* At the start of stage 2, two Blazing Talon Clawshapers will fly in and begin to re-energize * Alysrazor.*/ // http://ptr.wowhead.com/npc=53734 TargetGroup BlazingTalonClawshaper = new TargetGroup { Name = "Blazing Talon Clawshaper", Chance = 1f, Duration = BurnoutDuration * 1000f, Frequency = BurnoutDuration, // Originally they are not near the boss but they can be pulled/kited to next to the boss, NearBoss = true, NumTargs = 2f, TargetID = 53734, LevelOfTargets = 86, }; BlazingTalonClawshaper.SetAffectsRoles_Tanks(); Burnout.Targets.Add(BlazingTalonClawshaper); /* Ignition * Blazing Talon Clawshapers channel molten energy into Alysrazor, restoring 1 Molten Power * every 1 seconds.*/ // http://ptr.wowhead.com/spell=99919 #endregion // Personal note - Between the Spark and Clawshapers, this stage lasts for 15 seconds if nothing // is done to the Clawshapers, 34 seconds if the Clawshapers are interupted. #endregion #region Re-Ignition /* Alysrazor's fire becomes re-ignited at 50 Molten Power. This stage lasts until Alysrazor * reaches 100 Molten Power.*/ #region Ignited /* Alysrazor's fiery core begins to combust once again, rapidly restoring Molten Power. Restores * 3 Molten Power every 1 seconds.*/ // http://ptr.wowhead.com/spell=99922 // Personal Note - This means that the phase will last 17 seconds #endregion #region Blazing Claw [Tank Note] /* Alysrazor claws her enemies, dealing 92500 to 107500 Physical damage to enemies in a 25-yard cone * every 1.50 seconds. In addition, each swipe increases the Fire and Physical damage taken by the * target by 10% for 15 sec.*/ // 10-man - http://ptr.wowhead.com/spell=99844 // 25-man - http://ptr.wowhead.com/spell=101729 // 10-man Heroic - http://ptr.wowhead.com/spell=101730 // 25-man Heroic - http://ptr.wowhead.com/spell=101731 // Personal Note, this means that there needs to be a tank swap at the 5-6 stack mark Attack BlazingClaw = new Attack { Name = "Blazing Claw", DamagePerHit = new float[] { (69375f + 80625f), (83250f + 96750f), (92500f + 107500f), (115625f + 134375f), 0 }[i] / 2f, AttackSpeed = 1.5f * 2, AttackType = ATTACK_TYPES.AT_MELEE, DamageType = ItemDamageType.Physical, MaxNumTargets = 1f, SpellID = new float[] { 99844, 101729, 101730, 101731, 0 }[i], }; BlazingClaw.SetUnavoidable(); BlazingClaw.SetAffectsRoles_Tanks(); ReIgnition.Attacks.Add(BlazingClaw); Stats BlazingClawStats = new Stats(); SpecialEffect BlazingClawSpecialEffect = new SpecialEffect(Trigger.Use, new Stats() { BossPhysicalDamageDealtReductionMultiplier = -0.10f, FireDamageTakenMultiplier = 0.10f }, 15, 1.5f, 0.5f, 11); BlazingClawStats.AddSpecialEffect(BlazingClawSpecialEffect); BuffState BlazingClawBuffState = new BuffState { Name = "Blazing Claw Debuff", Frequency = ReIgniteDuration, Duration = ReIgniteDuration * 1000f, Chance = 1f, Breakable = false, Stats = BlazingClawStats, }; BlazingClawBuffState.SetAffectsRoles_Tanks(); ReIgnition.BuffStates.Add(BlazingClawBuffState); #endregion #region Blazing Buffet /* Alysrazor's Fiery core emits powerful bursts of flame, dealing 9250 to 10750 Fire damage to all * enemies every 1 seconds for as long as Alysrazor remains ignited.*/ // 10 man - http://ptr.wowhead.com/spell=99757 // 25 man - http://ptr.wowhead.com/spell=100739 // 10 man heroic - http://ptr.wowhead.com/spell=100740 // 25 man heroic - http://ptr.wowhead.com/spell=100741 Attack BlazingBuffet = new Attack { Name = "Blazing Buffet", DamagePerHit = new float[] { (6937f + 8062f), (10406f + 12093f), (11793f + 13706f), (11793f + 13706f), 0 }[i] / 2f, AttackSpeed = 1f, DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, MaxNumTargets = Max_Players[i], SpellID = new float[] { 99757, 100739, 100740, 100741, 0 }[i], }; BlazingBuffet.SetAffectsRoles_All(); ReIgnition.Attacks.Add(BlazingBuffet); #endregion #region Full Power [Healer Note] /* When Alysrazor reaches 100 Molten Power, she is at Full Power, which deals 50000 Fire damage * to all enemies and knocks them back. Once she reaches Full Power, Alysrazor will begin her * Stage 1 activities once again.*/ // 10 man - http://ptr.wowhead.com/spell=99925 // 25 man - http://ptr.wowhead.com/spell=100736 // 10 man heroic - http://ptr.wowhead.com/spell=100737 // 25 man heroic - http://ptr.wowhead.com/spell=100738 Attack FullPower = new Attack { Name = "Full Power", DamagePerHit = new float[] { 37500, 45000, 60000, 70000, 0 }[i], AttackSpeed = ReIgniteDuration - 1, DamageType = ItemDamageType.Fire, AttackType = ATTACK_TYPES.AT_AOE, MaxNumTargets = Max_Players[i], SpellID = new float[] { 99925, 100736, 100737, 100738, 0 }[i], }; FullPower.SetAffectsRoles_All(); ReIgnition.Attacks.Add(FullPower); #endregion #endregion #region Apply Phases // Pull then at 30 Sec, Empower Blade w/ 50/50 chance for which blade type. // 15 secs of empowered blade // Return to normal mode. float phasestart = 0; float HeroicFofStart = 0; float HeroicFoFLength = 0; if (i < 2) { ApplyAPhasesValues(InitialPull, i, 1, 0, 10f, BerserkTimer[i]); phasestart += 10f; ApplyAPhasesValues(FlightofFlames, i, 2, phasestart, FlightofFlamesPhaseTime, BerserkTimer[i]); phasestart += FlightofFlamesPhaseTime; ApplyAPhasesValues(UltimateFirepower, i, 3, phasestart, FieryTornadoDuration, BerserkTimer[i]); phasestart += FieryTornadoDuration; ApplyAPhasesValues(Burnout, i, 4, phasestart, BurnoutDuration, BerserkTimer[i]); phasestart += BurnoutDuration; ApplyAPhasesValues(ReIgnition, i, 5, phasestart, ReIgniteDuration, BerserkTimer[i]); phasestart += ReIgniteDuration; ApplyAPhasesValues(FlightofFlames, i, 6, phasestart, FlightofFlamesPhaseTime, BerserkTimer[i]); ApplyAPhasesValues(UltimateFirepower, i, 7, phasestart, FieryTornadoDuration, BerserkTimer[i]); phasestart += FieryTornadoDuration; ApplyAPhasesValues(Burnout, i, 8, phasestart, BurnoutDuration, BerserkTimer[i]); phasestart += BurnoutDuration; ApplyAPhasesValues(ReIgnition, i, 9, phasestart, ReIgniteDuration, BerserkTimer[i]); phasestart += ReIgniteDuration; ApplyAPhasesValues(FlightofFlames, i, 10, phasestart, FlightofFlamesPhaseTime, BerserkTimer[i]); phasestart += FlightofFlamesPhaseTime; ApplyAPhasesValues(UltimateFirepower, i, 11, phasestart, FieryTornadoDuration, BerserkTimer[i]); phasestart += FieryTornadoDuration; ApplyAPhasesValues(Burnout, i, 12, phasestart, BurnoutDuration, BerserkTimer[i]); phasestart += BurnoutDuration; ApplyAPhasesValues(ReIgnition, i, 13, phasestart, ReIgniteDuration, BerserkTimer[i]); // She will stay in this phase until the raid wipes; } else { ApplyAPhasesValues(InitialPull, i, 1, 0, 10f, BerserkTimer[i]); phasestart += 10f; HeroicFofStart = phasestart; InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 1, phasestart, FirestormCD, BerserkTimer[i]); phasestart += FirestormCD; HeroicFoFLength += FirestormCD; FlightofFlames.InnerPhases.Add(InnerPhaseHatchling); InnerPhaseFirestorm = new InnerPhase(FireStormPhase, i, 1, phasestart, 10f, BerserkTimer[i]); phasestart += 10f; HeroicFoFLength += 10f; FlightofFlames.InnerPhases.Add(InnerPhaseFirestorm); InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 1, phasestart, FirestormCD, BerserkTimer[i]); phasestart += FirestormCD; HeroicFoFLength += FirestormCD; FlightofFlames.InnerPhases.Add(InnerPhaseHatchling); InnerPhaseFirestorm = new InnerPhase(FireStormPhase, i, 1, phasestart, 10f, BerserkTimer[i]); phasestart += 10f; HeroicFoFLength += 10f; FlightofFlames.InnerPhases.Add(InnerPhaseFirestorm); InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 1, phasestart, FlightofFlamesPhaseTime - HeroicFoFLength, BerserkTimer[i]); phasestart += (FlightofFlamesPhaseTime - HeroicFoFLength); HeroicFoFLength = 0; FlightofFlames.InnerPhases.Add(InnerPhaseHatchling); ApplyAPhasesValues(FlightofFlames, i, 2, HeroicFofStart, FlightofFlamesPhaseTime, BerserkTimer[i]); phasestart += FlightofFlamesPhaseTime; ApplyAPhasesValues(UltimateFirepower, i, 3, phasestart, FieryTornadoDuration, BerserkTimer[i]); phasestart += FieryTornadoDuration; ApplyAPhasesValues(Burnout, i, 4, phasestart, BurnoutDuration, BerserkTimer[i]); phasestart += BurnoutDuration; ApplyAPhasesValues(ReIgnition, i, 5, phasestart, ReIgniteDuration, BerserkTimer[i]); phasestart += ReIgniteDuration; HeroicFofStart = phasestart; InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 6, phasestart, FirestormCD, BerserkTimer[i]); phasestart += FirestormCD; HeroicFoFLength += FirestormCD; FlightofFlamesPart2.InnerPhases.Add(InnerPhaseHatchling); InnerPhaseFirestorm = new InnerPhase(FireStormPhase, i, 6, phasestart, 10f, BerserkTimer[i]); phasestart += 10f; HeroicFoFLength += 10f; FlightofFlamesPart2.InnerPhases.Add(InnerPhaseFirestorm); InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 6, phasestart, FirestormCD, BerserkTimer[i]); phasestart += FirestormCD; HeroicFoFLength += FirestormCD; FlightofFlamesPart2.InnerPhases.Add(InnerPhaseHatchling); InnerPhaseFirestorm = new InnerPhase(FireStormPhase, i, 6, phasestart, 10f, BerserkTimer[i]); phasestart += 10f; HeroicFoFLength += 10f; FlightofFlamesPart2.InnerPhases.Add(InnerPhaseFirestorm); InnerPhaseHatchling = new InnerPhase(HatchlingPhase, i, 6, phasestart, FlightofFlamesPhaseTime - HeroicFoFLength, BerserkTimer[i]); phasestart += (FlightofFlamesPhaseTime - HeroicFoFLength); HeroicFoFLength = 0; FlightofFlamesPart2.InnerPhases.Add(InnerPhaseHatchling); ApplyAPhasesValues(FlightofFlamesPart2, i, 6, HeroicFofStart, FlightofFlamesPhaseTime, BerserkTimer[i]); phasestart += FlightofFlamesPhaseTime; ApplyAPhasesValues(UltimateFirepower, i, 7, phasestart, FieryTornadoDuration, BerserkTimer[i]); phasestart += FieryTornadoDuration; ApplyAPhasesValues(Burnout, i, 8, phasestart, BurnoutDuration, BerserkTimer[i]); phasestart += BurnoutDuration; ApplyAPhasesValues(ReIgnition, i, 9, phasestart, BerserkTimer[i] - phasestart, BerserkTimer[i]); // She will stay in this phase until the raid wipes; } AddAPhase(InitialPull, i); AddAPhase(FlightofFlames, i); AddAPhase(UltimateFirepower, i); AddAPhase(Burnout, i); AddAPhase(ReIgnition, i); #endregion } #endregion #endregion #region Defensive Resist_Physical = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Frost = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Fire = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Nature = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Arcane = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Shadow = new double[] { 0.00f, 0.00f, 0, 0, 0 }; Resist_Holy = new double[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion #region Impedances for (int i = 0; i < 2; i++) { //Moves; //Stuns; //Fears; //Roots; //Disarms; } TimeBossIsInvuln = new float[] { 0.00f, 0.00f, 0, 0, 0 }; #endregion /* TODO: * All */ }