コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }