private MoonkinState GetState(int eclipseEnergy, int eclipseDirection, int wrathCount, double starsurgeCooldown, bool shootingStarsActive) { // Trim state space by clipping values at their maximums/minimums: Eclipse energy -100 <= x <= 100, SS CD >= 0 if (eclipseEnergy < -100) { eclipseEnergy = -100; } if (eclipseEnergy > 100) { eclipseEnergy = 100; } if (starsurgeCooldown < 0) { starsurgeCooldown = 0; } string name = String.Format("E{0}D{1}W{2}C{3}S{4}", eclipseEnergy, eclipseDirection, wrathCount, starsurgeCooldown, shootingStarsActive ? 1 : 0); MoonkinState state; if (!_stateSpace.TryGetValue(name, out state)) { state = new MoonkinState { Name = name, EclipseDirection = eclipseDirection, EclipseEnergy = eclipseEnergy, WrathCount = wrathCount, StarsurgeCooldown = starsurgeCooldown, IsShootingStarsActive = shootingStarsActive }; _stateSpace.Add(name, state); } return(state); }
public double GetRotationLength() { List <int> solarIndices = new List <int>(); List <int> lunarIndices = new List <int>(); double toSolarTotalWeight = 0; double toLunarTotalWeight = 0; for (int i = 0; i < _process.StateSpace.Count; ++i) { MoonkinState st = (MoonkinState)_process.StateSpace[i]; if (st.EclipseEnergy == -100) { lunarIndices.Add(i); toSolarTotalWeight += _process.StateWeight[i]; } else if (st.EclipseEnergy == 100) { solarIndices.Add(i); toLunarTotalWeight += _process.StateWeight[i]; } } double[] toSolarDurations = _process.GetAverageTimeToEnd(st => ((MoonkinState)st).EclipseEnergy == 100); double[] toLunarDurations = _process.GetAverageTimeToEnd(st => ((MoonkinState)st).EclipseEnergy == -100); double lunarToSolarDuration = 0; double solarToLunarDuration = 0; foreach (int idx in lunarIndices) { lunarToSolarDuration += toSolarDurations[idx] * (_process.StateWeight[idx] / toSolarTotalWeight); } foreach (int idx in solarIndices) { solarToLunarDuration += toLunarDurations[idx] * (_process.StateWeight[idx] / toLunarTotalWeight); } return(lunarToSolarDuration + solarToLunarDuration); }
protected override List <StateTransition <MoonkinCycleAbility> > GetStateTransitions(State <MoonkinCycleAbility> state) { MoonkinState theState = state as MoonkinState; List <StateTransition <MoonkinCycleAbility> > retval = new List <StateTransition <MoonkinCycleAbility> >(); bool inEclipse = (theState.EclipseDirection > 0 && theState.EclipseEnergy < 0) || (theState.EclipseDirection < 0 && theState.EclipseEnergy > 0); if (theState.StarsurgeCooldown == 0) { MoonkinCycleAbility usedAbility = (inEclipse ? (theState.IsShootingStarsActive ? ShootingStarsEclipse : StarsurgeEclipse) : (theState.IsShootingStarsActive ? ShootingStars : Starsurge)); double transitionDuration = (theState.IsShootingStarsActive ? globalCooldown : starsurgeCastTime); double shootingStarsProbability = (theState.IsShootingStarsActive ? 0 : shootingStarsStarsurgeTransitionProbability); double normalProbability = 1 - shootingStarsProbability; // Solar Eclipse if (theState.EclipseEnergy == 100) { retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = StarsurgeEclipse, TargetState = GetState(100 - StarsurgeEnergy, -1, theState.WrathCount, 15 - starsurgeCastTime, false), TransitionDuration = transitionDuration, TransitionProbability = normalProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = ShootingStarsEclipse, TargetState = GetState(100 - StarsurgeEnergy, -1, theState.WrathCount, 0, true), TransitionDuration = transitionDuration, TransitionProbability = shootingStarsProbability }); } // Lunar Eclipse else if (theState.EclipseEnergy == -100) { retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = StarsurgeEclipse, TargetState = GetState(-100 + StarsurgeEnergy, 1, theState.WrathCount, 15 - starsurgeCastTime, false), TransitionDuration = transitionDuration, TransitionProbability = normalProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = ShootingStarsEclipse, TargetState = GetState(-100 + StarsurgeEnergy, 1, theState.WrathCount, 0, true), TransitionDuration = transitionDuration, TransitionProbability = shootingStarsProbability }); } // Baseline // TODO: If we're 1 cast away from an Eclipse, skip the Starsurge and go into Eclipse instead else { retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = usedAbility, TargetState = GetState(theState.EclipseEnergy + theState.EclipseDirection * StarsurgeEnergy, theState.EclipseDirection, theState.WrathCount, 15 - starsurgeCastTime, false), TransitionDuration = transitionDuration, TransitionProbability = normalProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = usedAbility, TargetState = GetState(theState.EclipseEnergy + theState.EclipseDirection * StarsurgeEnergy, theState.EclipseDirection, theState.WrathCount, 0, true), TransitionDuration = transitionDuration, TransitionProbability = shootingStarsProbability }); } } // Solar Eclipse - start casting Wrath else if (theState.EclipseEnergy == 100) { double transitionTime = wrathCastTime; double shootingStarsProbability = shootingStarsWrathTransitionProbability; // Wrath energy generation follows a 13/13/14 pattern. // Euphoria does not apply since we are not between 0 and -35 energy. // If we have 4T12, we are losing the bonus and need to play monkey games with the Wrath counter if (Has4T12) { switch (theState.WrathCount) { // 17/16 -> 14 (counter at 0) case 0: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyHigh, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyHigh, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; // 16/17 -> 13 (counter at 2) case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; // 17/17 -> 13 (counter at 1) case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; } } else { switch (theState.WrathCount) { case 0: case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, theState.WrathCount + 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyLow, -1, theState.WrathCount + 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyHigh, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = WrathEclipse, TargetState = GetState(100 - WrathEnergyHigh, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; } } } // Lunar Eclipse - cast Starfire else if (theState.EclipseEnergy == -100) { double transitionTime = starfireCastTime; double shootingStarsProbability = shootingStarsStarfireTransitionProbability; // No need for Euphoria since we are inside an Eclipse state // No 4T12 since we gained Eclipse retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = StarfireEclipse, TargetState = GetState(-100 + StarfireEnergy, 1, theState.WrathCount, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = StarfireEclipse, TargetState = GetState(-100 + StarfireEnergy, 1, theState.WrathCount, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); } // Moving toward Lunar Eclipse, cast Wrath else if (theState.EclipseDirection == -1) { double transitionTime = wrathCastTime; // Euphoria only procs when we're out of eclipse (past 0 on the bar) and there's less than 35 energy in the direction of the eclipse if (theState.EclipseEnergy <= 0 && theState.EclipseEnergy >= -35) { double baseProbability = wrathNoEuphoriaNoSSTransitionProbability; double baseEuphoriaProbability = wrathEuphoriaNoSSTransitionProbability; double shootingStarsProbability = wrathNoEuphoriaWithSSTransitionProbability; double shootingStarsEuphoriaProbability = wrathEuphoriaWithSSTransitionProbability; if (Has4T12) { // 4T12 has just come active if the 14 Wrath results in 0 to -13 energy, or a 13 Wrath results in 0 to -12 energy bool bActivated4T12 = (theState.WrathCount == 0 ? theState.EclipseEnergy >= -13 : theState.EclipseEnergy >= -12); // Change the Wrath counter if we drop out of Eclipse (activating the set bonus) if (bActivated4T12) { switch (theState.WrathCount) { // 13/14 -> 16 (counter at 0) case 0: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12 - WrathEnergyHigh4T12, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12 - WrathEnergyHigh4T12, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; // 14/13 -> 17 (counter at 2) case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; // 13/13 -> 17 (counter at 1) case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; } } else { switch (theState.WrathCount) { case 0: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyHigh4T12, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyHigh4T12, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12 - WrathEnergyLow4T12, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12 - WrathEnergyHigh4T12, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12 - WrathEnergyHigh4T12, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; } } } else { switch (theState.WrathCount) { case 0: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - 2 * WrathEnergyLow, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - 2 * WrathEnergyLow, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, 2, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow - WrathEnergyHigh, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, 2, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow - WrathEnergyHigh, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh - WrathEnergyLow, -1, 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh - WrathEnergyLow, -1, 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsEuphoriaProbability }); break; } } } else { double shootingStarsProbability = shootingStarsWrathTransitionProbability; // Between -35 and -100 energy, 4T12 is active but not Euphoria if (Has4T12 && theState.EclipseEnergy <= 0) { switch (theState.WrathCount) { case 0: case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, theState.WrathCount + 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh4T12, -1, theState.WrathCount + 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Wrath, TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow4T12, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; } } // No special Eclipse modifiers active, revert to plain 13/13/14 else { switch (theState.WrathCount) { case 0: case 1: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? WrathEclipse : Wrath), TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, theState.WrathCount + 1, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? WrathEclipse : Wrath), TargetState = GetState(theState.EclipseEnergy - WrathEnergyLow, -1, theState.WrathCount + 1, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; case 2: retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? WrathEclipse : Wrath), TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh, -1, 0, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = transitionTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? WrathEclipse : Wrath), TargetState = GetState(theState.EclipseEnergy - WrathEnergyHigh, -1, 0, 0, true), TransitionDuration = transitionTime, TransitionProbability = shootingStarsProbability }); break; } } } } // Moving toward Solar Eclipse, cast Starfire else if (theState.EclipseDirection == 1) { double transitionTime = starfireCastTime; // Euphoria only procs when we're out of eclipse (past 0 on the bar) and there's less than 35 energy in the direction of the eclipse if (theState.EclipseEnergy >= 0 && theState.EclipseEnergy <= 35) { double baseProbability = starfireNoEuphoriaNoSSTransitionProbability; double baseEuphoriaProbability = starfireEuphoriaNoSSTransitionProbability; double shootingStarsProbability = starfireNoEuphoriaWithSSTransitionProbability; double shootingStarsEuphoriaProbability = starfireEuphoriaWithSSTransitionProbability; retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + (Has4T12 ? StarfireEnergy4T12 : StarfireEnergy), 1, theState.WrathCount, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = starfireCastTime, TransitionProbability = baseProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + (Has4T12 ? StarfireEnergy4T12 : StarfireEnergy) + 20, 1, theState.WrathCount, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = starfireCastTime, TransitionProbability = baseEuphoriaProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + (Has4T12 ? StarfireEnergy4T12 : StarfireEnergy), 1, theState.WrathCount, 0, true), TransitionDuration = starfireCastTime, TransitionProbability = shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + (Has4T12 ? StarfireEnergy4T12 : StarfireEnergy) + 20, 1, theState.WrathCount, 0, true), TransitionDuration = starfireCastTime, TransitionProbability = shootingStarsEuphoriaProbability }); } else { double shootingStarsProbability = shootingStarsStarfireTransitionProbability; // If not in Eclipse and 4T12 is equipped, use 4T12 Starfire if (Has4T12 && theState.EclipseEnergy >= 0) { retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + StarfireEnergy4T12, 1, theState.WrathCount, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = starfireCastTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = Starfire, TargetState = GetState(theState.EclipseEnergy + StarfireEnergy4T12, 1, theState.WrathCount, 0, true), TransitionDuration = starfireCastTime, TransitionProbability = shootingStarsProbability }); } else { retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? StarfireEclipse : Starfire), TargetState = GetState(theState.EclipseEnergy + StarfireEnergy, 1, theState.WrathCount, theState.StarsurgeCooldown - transitionTime, false), TransitionDuration = starfireCastTime, TransitionProbability = 1 - shootingStarsProbability }); retval.Add(new StateTransition <MoonkinCycleAbility> { Ability = (inEclipse ? StarfireEclipse : Starfire), TargetState = GetState(theState.EclipseEnergy + StarfireEnergy, 1, theState.WrathCount, 0, true), TransitionDuration = starfireCastTime, TransitionProbability = shootingStarsProbability }); } } } return(retval); }