private Cycle GetNewCycle(CycleId cycleId) { Cycle c = null; switch (cycleId) { case CycleId.ABSpam234AM: c = ABSpam234AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam34AM: c = ABSpam34AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam4AM: c = ABSpam4AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam0234AMABar: c = ABSpam0234AMABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam0234AMABABar: c = ABSpam0234AMABABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar2AMABar0AMABABar: c = AB2ABar2AMABar0AMABABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3ABar023AM: c = AB3ABar023AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB23ABar023AM: c = AB23ABar023AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar02AMABABar: c = AB2ABar02AMABABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar1AM: c = ABABar1AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar12AMABABar: c = AB2ABar12AMABABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.Frostbolt: c = GetSpell(SpellId.Frostbolt); break; case CycleId.Fireball: c = GetSpell(SpellId.Fireball); break; case CycleId.FBPyro: c = FBPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FBLBPyro: c = FBLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this, 1); break; case CycleId.FFBLBPyro: c = FFBLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this, 1); break; case CycleId.FBLB3Pyro: c = FBLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this, Math.Min(3, CalculationOptions.AoeTargets)); break; case CycleId.FFBLB3Pyro: c = FFBLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this, Math.Min(3, CalculationOptions.AoeTargets)); break; case CycleId.FBScPyro: c = FBScPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FFBPyro: c = FFBPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FFBScPyro: c = FFBScPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FFBScLBPyro: c = FFBScLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrostfireBolt: c = GetSpell(SpellId.FrostfireBolt); break; case CycleId.ArcaneBlastSpam: c = GetSpell(SpellId.ArcaneBlast4); break; case CycleId.ABSpam04MBAM: c = ABSpam04MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam024MBAM: c = ABSpam024MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam034MBAM: c = ABSpam034MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam0234MBAM: c = ABSpam0234MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam4MBAM: c = ABSpam4MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam24MBAM: c = ABSpam24MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam234MBAM: c = ABSpam234MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB4AM234MBAM: c = AB4AM234MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3AM23MBAM: c = AB3AM23MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB4AM0234MBAM: c = AB4AM0234MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3AM023MBAM: c = AB3AM023MBAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABarAM: c = new ABarAM(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.ABP: c = new ABP(this); break;*/ case CycleId.ABAM: c = ABAM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpamMBAM: c = new ABSpamMBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam3C: c = new ABSpam3C(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam03C: c = new ABSpam03C(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar3C: c = new AB2ABar3C(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar2C: c = new ABABar2C(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar2MBAM: c = new ABABar2MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar1MBAM: c = new ABABar1MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar3C: c = new ABABar3C(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3ABar3MBAM: c = new AB3ABar3MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3AM: c = AB3AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2AM: c = AB2AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3AM2MBAM: c = new AB3AM2MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar2MBAM: c = new AB2ABar2MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar0MBAM: c = new ABABar0MBAM(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.ABABar: c = new ABABar(this); break;*/ case CycleId.ABSpam3MBAM: c = new ABSpam3MBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABSpam03MBAM: c = new ABSpam03MBAM(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.ABAMABar: c = new ABAMABar(Calculations.NeedsDisplayCalculations, this); break; case CycleId.AB2AMABar: c = new AB2AMABar(Calculations.NeedsDisplayCalculations, this); break;*/ case CycleId.AB3AMABar: c = AB3AMABar.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3ABar123AM: c = AB3ABar123AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB4ABar1234AM: c = AB4ABar1234AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB4ABar34AM: c = AB4ABar34AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB4ABar4AM: c = AB4ABar4AM.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB3AMABar2C: c = new AB3AMABar2C(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.AB32AMABar: c = new AB32AMABar(Calculations.NeedsDisplayCalculations, this); break;*/ case CycleId.AB3ABar3C: c = new AB3ABar3C(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar0C: c = new ABABar0C(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABar1C: c = new ABABar1C(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.ABABarY: c = new ABABarY(Calculations.NeedsDisplayCalculations, this); break; case CycleId.AB2ABar: c = new AB2ABar(Calculations.NeedsDisplayCalculations, this); break;*/ case CycleId.AB2ABar2C: c = new AB2ABar2C(Solver.NeedsDisplayCalculations, this); break; case CycleId.AB2ABarMBAM: c = new AB2ABarMBAM(Solver.NeedsDisplayCalculations, this); break; case CycleId.ArcaneManaNeutral: c = ArcaneManaNeutral.GetCycle(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.AB3ABar: c = new AB3ABar(Calculations.NeedsDisplayCalculations, this); break; case CycleId.AB3ABarX: c = new AB3ABarX(Calculations.NeedsDisplayCalculations, this); break; case CycleId.AB3ABarY: c = new AB3ABarY(Calculations.NeedsDisplayCalculations, this); break; case CycleId.FBABar: c = new FBABar(Calculations.NeedsDisplayCalculations, this); break; case CycleId.FrBABar: c = new FrBABar(Calculations.NeedsDisplayCalculations, this); break; case CycleId.FFBABar: c = new FFBABar(Calculations.NeedsDisplayCalculations, this); break;*/ /*case CycleId.ABAMP: c = new ABAMP(this); break; case CycleId.AB3AMSc: c = new AB3AMSc(this); break; case CycleId.ABAM3Sc: c = new ABAM3Sc(this); break; case CycleId.ABAM3Sc2: c = new ABAM3Sc2(this); break; case CycleId.ABAM3FrB: c = new ABAM3FrB(this); break; case CycleId.ABAM3FrB2: c = new ABAM3FrB2(this); break; case CycleId.ABFrB: c = new ABFrB(this); break; case CycleId.AB3FrB: c = new AB3FrB(this); break; case CycleId.ABFrB3FrB: c = new ABFrB3FrB(this); break; case CycleId.ABFrB3FrB2: c = new ABFrB3FrB2(this); break; case CycleId.ABFrB3FrBSc: c = new ABFrB3FrBSc(this); break; case CycleId.ABFB3FBSc: c = new ABFB3FBSc(this); break; case CycleId.AB3Sc: c = new AB3Sc(this); break;*/ /*case CycleId.FBSc: c = new FBSc(this); break; case CycleId.FBFBlast: c = new FBFBlast(this); break;*/ case CycleId.FrBFBIL: c = FrBFBIL.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBDFFBIL: c = FrBDFFBIL.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBDFFFBIL: c = FrBDFFFBIL.GetSolvedCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBDFFFB: c = FrBDFFFB.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBILFB: c = FrBILFB.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBIL: c = FrBIL.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FrBFB: c = FrBFB.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FBScLBPyro: c = FBScLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.FB2ABar: c = new FB2ABar(Calculations.NeedsDisplayCalculations, this); break; case CycleId.FrB2ABar: c = new FrB2ABar(Calculations.NeedsDisplayCalculations, this); break;*/ case CycleId.ScLBPyro: c = ScLBPyro.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.ABABarSlow: c = new ABABarSlow(Solver.NeedsDisplayCalculations, this); break; /*case CycleId.FBABarSlow: c = new FBABarSlow(Calculations.NeedsDisplayCalculations, this); break; case CycleId.FrBABarSlow: c = new FrBABarSlow(Calculations.NeedsDisplayCalculations, this); break;*/ case CycleId.CustomSpellMix: c = new SpellCustomMix(Solver.NeedsDisplayCalculations, this); break; case CycleId.ArcaneMissiles: c = GetSpell(SpellId.ArcaneMissiles); break; case CycleId.Scorch: c = GetSpell(SpellId.Scorch); break; case CycleId.ArcaneExplosion: c = GetSpell(SpellId.ArcaneExplosion0); break; case CycleId.AE4AB: c = AE4AB.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.AERampAB: c = AERampAB.GetCycle(Solver.NeedsDisplayCalculations, this); break; case CycleId.FlamestrikeSpammed: c = GetSpell(SpellId.FlamestrikeSpammed); break; case CycleId.FlamestrikeSingle: c = GetSpell(SpellId.FlamestrikeSingle); break; case CycleId.Blizzard: c = GetSpell(SpellId.Blizzard); break; case CycleId.BlastWave: c = GetSpell(SpellId.BlastWave); break; case CycleId.DragonsBreath: c = GetSpell(SpellId.DragonsBreath); break; case CycleId.ConeOfCold: c = GetSpell(SpellId.ConeOfCold); break; } return c; }
public Cycle GetCycle(CycleId cycleId) { //Cycle c = Cycles[(int)cycleId]; //if (c != null) return c; Cycle c = null; //if (Cycles.TryGetValue((int)cycleId, out c)) return c; for (int i = 0; i < CyclesCount; i++) { Cycle cycle = Cycles[i]; if (cycle.CycleId == cycleId) return cycle; } if (CalculationOptions.AdvancedHasteProcs) { c = GetAveragedHasteCycle(cycleId); } if (c == null) { c = GetNewCycle(cycleId); } if (c != null) { if (cycleId != CycleId.ArcaneManaNeutral) // if cycle is based on other cycles make sure we don't double count mixins { if (UseMageWard) { c = MageWardCycle.GetCycle(Solver.NeedsDisplayCalculations, this, c); } if (CalculationOptions.MirrorImage == 1) { c = MirrorImageCycle.GetCycle(Solver.NeedsDisplayCalculations, this, c); } if (FlameOrb) { // add flame orb mix-in c = FlameOrbCycle.GetCycle(Solver.NeedsDisplayCalculations, this, c, false); } if (CalculationOptions.PlayerLevel >= 81 && CalculationOptions.FlameOrb == 1) { c = FlameOrbCycle.GetCycle(Solver.NeedsDisplayCalculations, this, c, true); } if (Combustion) { // add combustion mix-in c = CombustionCycle.GetCycle(Solver.NeedsDisplayCalculations, this, c); } } c.CycleId = cycleId; //Cycles[(int)cycleId] = c; //Cycles.Add(c); if (CyclesCount >= Cycles.Length) { int length = 2 * Cycles.Length; Cycle[] destinationArray = new Cycle[length]; Array.Copy(Cycles, 0, destinationArray, 0, CyclesCount); Cycles = destinationArray; } Cycles[CyclesCount++] = c; } return c; }
private Cycle GetAveragedHasteCycle(CycleId cycleId) { float baseProcHaste = 0; // construct possible proc combinations Cycle baseCycle = GetNewCycle(cycleId); // on use stacking items for (int i = 0; i < Solver.StackingHasteEffectCooldownsCount; i++) { EffectCooldown effectCooldown = Solver.StackingHasteEffectCooldowns[i]; if (EffectsActive(effectCooldown.Mask)) { Stats specialStats = effectCooldown.SpecialEffect.Stats; for (int j = 0; j < specialStats._rawSpecialEffectDataSize; j++) { SpecialEffect effect = specialStats._rawSpecialEffectData[j]; if (effect.Stats.HasteRating > 0) { float trigInterval; float trigChance; if (baseCycle.GetTriggerData(effect, out trigInterval, out trigChance)) { baseProcHaste += effect.GetAverageStackSize(trigInterval, trigChance, 3.0f, effectCooldown.SpecialEffect.Duration) * effect.Stats.HasteRating; } } } } } int N = Solver.HasteRatingEffectsCount; SpecialEffect[] hasteRatingEffects = new SpecialEffect[N]; Array.Copy(Solver.HasteRatingEffects, 0, hasteRatingEffects, 0, N); if (baseProcHaste == 0 && N == 0) return baseCycle; float[] triggerInterval = new float[N]; float[] triggerChance = new float[N]; float[] offset = new float[N]; for (int i = 0; i < N; i++) { baseCycle.GetTriggerData(hasteRatingEffects[i], out triggerInterval[i], out triggerChance[i]); } WeightedStat[] result = SpecialEffect.GetAverageCombinedUptimeCombinations(hasteRatingEffects, triggerInterval, triggerChance, offset, 3.0f, CalculationOptions.FightDuration, AdditiveStat.HasteRating); if (HasteProcs == null) { HasteProcs = new CastingState[result.Length]; for (int i = 0; i < result.Length; i++) { CastingState subState = CastingState.New(Solver, Effects, Frozen, baseProcHaste + result[i].Value); subState.ReferenceCastingState = this; HasteProcs[i] = subState; } } Cycle c = Cycle.New(Solver.NeedsDisplayCalculations, this); c.Name = baseCycle.Name; for (int i = 0; i < result.Length; i++) { Cycle subCycle = null; if (HasteProcs[i].ProcHasteRating == 0) { subCycle = baseCycle; } else { subCycle = HasteProcs[i].GetNewCycle(cycleId); } c.AddCycle(Solver.NeedsDisplayCalculations, subCycle, result[i].Chance / subCycle.CastTime); } // if base proc is not zero then the substates are different for each cycle if (baseProcHaste > 0) { HasteProcs = null; } return c; }
public void Initialize(CastingState castingState) { Note = null; DpmConversion = 0; Mix1 = CycleId.None; Mix2 = CycleId.None; CastingState = castingState; calculated = false; damagePerSecond = 0; effectDamagePerSecondSpell = 0; effectDamagePerSecondProc = 0; effectSpellPower = 0; effectIntellect = 0; effectMasteryRating = 0; effectMastery = 0; effectCrit = 0; effectManaAdeptMultiplier = 1; threatPerSecond = 0; effectThreatPerSecond = 0; costPerSecond = 0; manaRegenPerSecond = 0; DpsPerSpellPower = 0; DpsPerMastery = 0; DpsPerCrit = 0; Absorbed = 0; ProvidesSnare = false; ProvidesScorch = false; AreaEffect = false; //AoeSpell = null; HitProcs = 0; Ticks = 0; CastProcs = 0; CastProcs2 = 0; NukeProcs = 0; NukeProcs2 = 0; CritProcs = 0; IgniteProcs = 0; DotProcs = 0; CastTime = 0; TargetProcs = 0; DamageProcs = 0; OO5SR = 0; }