Пример #1
0
        /// <summary>
        /// This a basic IT, PS, HSx4 (or BBx4), DSx3, RSx? rotation.
        /// </summary>
        public void PRE_Frost()
        {
            m_szRotationName = "Frost Rotation";

            ResetRotation();
            // Setup an instance of each ability.
            // No runes:
            //            AbilityDK_Outbreak OutB = new AbilityDK_Outbreak(m_CT.m_CState);
            // Single Runes:
            AbilityDK_IcyTouch IT = new AbilityDK_IcyTouch(m_CT.m_CState);
            AbilityDK_FrostFever FF = new AbilityDK_FrostFever(m_CT.m_CState);
            AbilityDK_PlagueStrike PS = new AbilityDK_PlagueStrike(m_CT.m_CState);
            AbilityDK_BloodPlague BP = new AbilityDK_BloodPlague(m_CT.m_CState);
            AbilityDK_BloodStrike BS = new AbilityDK_BloodStrike(m_CT.m_CState);
            // AbilityDK_HeartStrike HS = new AbilityDK_HeartStrike(m_CT.m_CState);
            //            AbilityDK_NecroticStrike NS = new AbilityDK_NecroticStrike(m_CT.m_CState);
            //            AbilityDK_Pestilence Pest = new AbilityDK_Pestilence(m_CT.m_CState);
            // AbilityDK_BloodBoil BB = new AbilityDK_BloodBoil(m_CT.m_CState);
            AbilityDK_HowlingBlast HB = new AbilityDK_HowlingBlast(m_CT.m_CState);
            // AbilityDK_ScourgeStrike SS = new AbilityDK_ScourgeStrike(m_CT.m_CState);
            // AbilityDK_DeathNDecay DnD = new AbilityDK_DeathNDecay(m_CT.m_CState);
            // Multi Runes:
            // AbilityDK_DeathStrike DS = new AbilityDK_DeathStrike(m_CT.m_CState);
            // AbilityDK_FesteringStrike Fest = new AbilityDK_FesteringStrike(m_CT.m_CState);
            AbilityDK_Obliterate OB = new AbilityDK_Obliterate(m_CT.m_CState);
            // RP:  Unlikely to start w/ RP abilities to open.
            // AbilityDK_RuneStrike RS = new AbilityDK_RuneStrike(m_CT.m_CState);
            // each RS gives a 45% chance to renew a fully depleted runes.
            // thus 20 RSs gets us 9 extra runes.
            // Same is true for DC & FS
            // AbilityDK_DeathCoil DC = new AbilityDK_DeathCoil(m_CT.m_CState);
            AbilityDK_FrostStrike FS = new AbilityDK_FrostStrike(m_CT.m_CState);

            // Simple ITx1, PSx1, BSx2, OBx1  RS w/ RP (x3ish).
            // if Glyph of HB, then HB can be used to apply FF.
            if (m_CT.m_CState.m_Talents.GlyphofHowlingBlast
                && HB.DPS > IT.DPS)
            {
                ml_Rot.Add(HB);
            }
            else 
            {
                ml_Rot.Add(IT);
            }
            ml_Rot.Add(FF);
            ml_Rot.Add(PS);
            ml_Rot.Add(BP);

            // TODO: 4.1 Blood Runes are ALWAYS Death Runes.
            // These will create DeathRunes that can allow flexibility in the rotation later on.
            // ml_Rot.Add(BS);
            // ml_Rot.Add(BS);

            ml_Rot.Add(OB);
            ml_Rot.Add(OB);

            ml_Rot.Add(OB);
            ml_Rot.Add(OB);
            ml_Rot.Add(OB);

            #region RunicPower Pass 1.
            // How much RP do we have at this point?
            foreach (AbilityDK_Base ab in ml_Rot)
                m_RunicPower += ab.RunicPower;
            if (m_CT.m_CState.m_Stats.RPp5 > 0)
                m_RunicPower -= (int)((CurRotationDuration / 5) * m_CT.m_CState.m_Stats.RPp5);

            float RSCount = 0;
            // Burn what we can.
            for (RSCount = Math.Abs((float)m_RunicPower / (float)FS.RunicPower); RSCount > 0; RSCount--)
            {
                if (RSCount >= 1)
                {
                    ml_Rot.Add(FS);
                    m_RunicPower += FS.RunicPower;
                }
                // Partials at the end.

            }
            #endregion

            #region Talent: Rime
            if (m_CT.m_CState.m_Talents.Rime > 0)
            {
                AbilityDK_Base ability;
                // we want 1 full use, and then any sub values.
                if (HB.DPS > IT.DPS)
                {
                    ability = new AbilityDK_HowlingBlast(m_CT.m_CState);
                    ability.szName = "HB";
                }
                else
                {
                    ability = new AbilityDK_IcyTouch(m_CT.m_CState);
                    ability.szName = "IT";
                }
                ability.szName += " (Rime)";
                // These are free ITs/HBs.
                ability.AbilityCost[(int)DKCostTypes.Blood] = 0;
                ability.AbilityCost[(int)DKCostTypes.Frost] = 0;
                ability.AbilityCost[(int)DKCostTypes.UnHoly] = 0;
                ability.AbilityCost[(int)DKCostTypes.Death] = 0;
                ability.AbilityCost[(int)DKCostTypes.RunicPower] = 0;

                float fRimeMod = this.Count(DKability.Obliterate) * .15f * m_CT.m_CState.m_Talents.Rime;
                // 60% chance to proc 2 Rimes rather than 1.
                if (m_CT.m_CState.m_Stats.b2T13_DPS)
                    fRimeMod *= 1.6f;
                if (fRimeMod >= 1f)
                {
                    for (; fRimeMod >= 1; fRimeMod--)
                    {
                        ml_Rot.Add(ability);
                    }
                }
                if (fRimeMod > 0f && fRimeMod < 1f)
                {
                    if (HB.DPS > IT.DPS)
                    {
                        ability = new AbilityDK_HowlingBlast(m_CT.m_CState);
                        ability.szName = "HB";
                    }
                    else
                    {
                        ability = new AbilityDK_IcyTouch(m_CT.m_CState);
                        ability.szName = "IT";
                    }
                    ability.szName += " (Rime_partial)";
                    // These are free ITs/HBs.
                    ability.AbilityCost[(int)DKCostTypes.Blood] = 0;
                    ability.AbilityCost[(int)DKCostTypes.Frost] = 0;
                    ability.AbilityCost[(int)DKCostTypes.UnHoly] = 0;
                    ability.AbilityCost[(int)DKCostTypes.Death] = 0;
                    ability.AbilityCost[(int)DKCostTypes.RunicPower] = 0;
                    ability.bPartial = true;
                    ability.fPartialValue = fRimeMod;
                    ml_Rot.Add(ability);
                }
            }
            #endregion
            BuildCosts();
            #region Talent: Killing Machine
            float fRotInMins = CurRotationDuration / 60;
            float fKMPPM = 5 * (m_CT.m_CState.m_Talents.KillingMachine / 3);
            float KMProcCount = fKMPPM * fRotInMins;
            float fOBFSCount = Count(DKability.FrostStrike) + Count(DKability.Obliterate);
            float fPctOBFSCrit = KMProcCount / fOBFSCount;
            OB.SetKMCritChance(fPctOBFSCrit);
            FS.SetKMCritChance(fPctOBFSCrit);
            #endregion
            BuildCosts();
            #region RunicPower Pass 2.
            // How much RP do we have at this point?
            if (m_CT.m_CState.m_Stats.RPp5 > 0)
                m_RunicPower -= (int)((CurRotationDuration / 5) * m_CT.m_CState.m_Stats.RPp5);

            // Burn what we can.
            for (RSCount = Math.Abs((float)m_RunicPower / (float)FS.RunicPower); RSCount > 0; RSCount--)
            {
                if (RSCount >= 1)
                {
                    ml_Rot.Add(FS);
                    m_RunicPower += FS.RunicPower;
                }
                else
                {
                    AbilityDK_FrostStrike FSPartial = new AbilityDK_FrostStrike(m_CT.m_CState);
                    FSPartial.fPartialValue = RSCount;
                    FSPartial.bPartial = true;
                    FSPartial.szName = "FS (partial)";
                    FSPartial.RunicPower = (int)((float)FS.AbilityCost[(int)DKCostTypes.RunicPower] * RSCount);
                    m_RunicPower += FSPartial.RunicPower;
                    ml_Rot.Add(FSPartial);
                }
            }
            #endregion
            BuildCosts();

        }
Пример #2
0
        /// <summary>
        /// This a basic IT, PS, HSx4 (or BBx4), DSx3, RSx? rotation.
        /// </summary>
        public void PRE_BloodDiseased()
        {
            m_szRotationName = "Blood Diseased Rotation";

            ResetRotation();
            // This will only happen while tanking...
            //m_CT.m_Opts.presence = Presence.Blood;
            // Setup an instance of each ability.
            // No runes:
            AbilityDK_Outbreak OutB = new AbilityDK_Outbreak(m_CT.m_CState);
            // Single Runes:
            AbilityDK_IcyTouch IT = new AbilityDK_IcyTouch(m_CT.m_CState);
            AbilityDK_FrostFever FF = new AbilityDK_FrostFever(m_CT.m_CState);
            AbilityDK_PlagueStrike PS = new AbilityDK_PlagueStrike(m_CT.m_CState);
            AbilityDK_BloodPlague BP = new AbilityDK_BloodPlague(m_CT.m_CState);
            //            AbilityDK_BloodStrike BS = new AbilityDK_BloodStrike(m_CT.m_CState);
            AbilityDK_HeartStrike HS = new AbilityDK_HeartStrike(m_CT.m_CState);
            //            AbilityDK_NecroticStrike NS = new AbilityDK_NecroticStrike(m_CT.m_CState);
            //            AbilityDK_Pestilence Pest = new AbilityDK_Pestilence(m_CT.m_CState);
            AbilityDK_BloodBoil BB = new AbilityDK_BloodBoil(m_CT.m_CState);
            //            AbilityDK_HowlingBlast HB = new AbilityDK_HowlingBlast(m_CT.m_CState);
            //            AbilityDK_ScourgeStrike SS = new AbilityDK_ScourgeStrike(m_CT.m_CState);
            //            AbilityDK_DeathNDecay DnD = new AbilityDK_DeathNDecay(m_CT.m_CState);
            // Multi Runes:
            AbilityDK_DeathStrike DS = new AbilityDK_DeathStrike(m_CT.m_CState);
            //            AbilityDK_FesteringStrike Fest = new AbilityDK_FesteringStrike(m_CT.m_CState);
            //            AbilityDK_Obliterate OB = new AbilityDK_Obliterate(m_CT.m_CState);
            // RP:  Unlikely to start w/ RP abilities to open.
            AbilityDK_RuneStrike RS = new AbilityDK_RuneStrike(m_CT.m_CState);
            // each RS gives a 45% chance to renew a fully depleted runes.
            // thus 20 RSs gets us 9 extra runes.
            // Same is true for DC & FS
            //            AbilityDK_DeathCoil DC = new AbilityDK_DeathCoil(m_CT.m_CState);
            //            AbilityDK_FrostStrike FS = new AbilityDK_FrostStrike(m_CT.m_CState);
            AbilityDK_DancingRuneWeapon DRW = new AbilityDK_DancingRuneWeapon(m_CT.m_CState);

            // Fire DRW every chance we get.
            ml_Rot.Add(DRW);

            // Fill the 1.5 min CD w/ the sub rotation.
            
            uint subrotDuration = (9 * MIN_GCD_MS);
            for (int count = (int)(DRW.Cooldown / subrotDuration); count > 0; count--)
            {
                // Simple ITx1, PSx1, DSx1, HSx2 or BBx2, RS w/ RP (x3ish).
                if (Rawr.Properties.GeneralSettings.Default.PTRMode)
                {
                    ml_Rot.Add(OutB);
                    ml_Rot.Add(DS);
                }
                else
                {
                    ml_Rot.Add(IT);
                    ml_Rot.Add(PS);
                }
                ml_Rot.Add(FF);
                ml_Rot.Add(BP); // Scarlet Fever is tied to this for 4.0.6

                if (HS.TotalThreat > BB.TotalThreat)
                {
                    // Just HSx4
                    ml_Rot.Add(HS);
                    ml_Rot.Add(HS);
                    ml_Rot.Add(HS);
                    ml_Rot.Add(HS);
                }
                else
                {
                    // if BB does more, then BB.
                    ml_Rot.Add(BB);
                    ml_Rot.Add(BB);
                    ml_Rot.Add(BB);
                    ml_Rot.Add(BB);
                }

                // These will create DeathRunes that can allow flexibility in the rotation later on.
                ml_Rot.Add(DS);
                ml_Rot.Add(DS);
                ml_Rot.Add(DS);
            }


            #region Runic Power Pass 1.
            // How much RP do we have at this point?
            foreach (AbilityDK_Base ab in ml_Rot)
                m_RunicPower += ab.RunicPower;
            m_RunicPower = (int)((float)m_RunicPower);
            if (m_CT.m_CState.m_Stats.RPp5 > 0)
                m_RunicPower -= (int)((CurRotationDuration / 5) * m_CT.m_CState.m_Stats.RPp5);

            // Burn what we can.
            float RSCount = 0;
            for (RSCount = Math.Abs(m_RunicPower / RS.RunicPower); RSCount > 0; RSCount--)
            {
                ml_Rot.Add(RS);
                m_RunicPower += RS.RunicPower;
            }
            #endregion
            BuildCosts();
            #region RunicPower Pass 2.
            // How much RP do we have at this point?
            if (m_CT.m_CState.m_Stats.RPp5 > 0)
                m_RunicPower -= (int)((CurRotationDuration / 5) * m_CT.m_CState.m_Stats.RPp5);

            // Burn what we can.
            for (RSCount = Math.Abs((float)m_RunicPower / (float)RS.RunicPower); RSCount > 0; RSCount--)
            {
                if (RSCount >= 1)
                {
                    ml_Rot.Add(RS);
                    m_RunicPower += RS.RunicPower;
                }
                else
                {
                    AbilityDK_RuneStrike RSPartial = new AbilityDK_RuneStrike(m_CT.m_CState);
                    RSPartial.fPartialValue = RSCount;
                    RSPartial.bPartial = true;
                    RSPartial.szName = "RS (partial)";
                    RSPartial.RunicPower = (int)((float)RS.AbilityCost[(int)DKCostTypes.RunicPower] * RSCount);
                    m_RunicPower += RSPartial.RunicPower;
                    ml_Rot.Add(RSPartial);
                }
            }
            #endregion
            BuildCosts();
        }
Пример #3
0
        /// <summary>
        /// Generate a rotation based on available resources.
        /// </summary>
        public void PostAbilitiesSingleUse(bool bThreat)
        {
            // Setup an instance of each ability.
            // No runes:
            AbilityDK_Outbreak OutB = new AbilityDK_Outbreak(m_CState);
            // Single Runes:
            AbilityDK_IcyTouch IT = new AbilityDK_IcyTouch(m_CState);

            PostData(IT);
            AbilityDK_FrostFever FF = new AbilityDK_FrostFever(m_CState);

            PostData(FF);
            AbilityDK_PlagueStrike PS = new AbilityDK_PlagueStrike(m_CState);

            PostData(PS);
            AbilityDK_BloodPlague BP = new AbilityDK_BloodPlague(m_CState);

            PostData(BP);
            AbilityDK_BloodStrike BS = new AbilityDK_BloodStrike(m_CState);

            PostData(BS);
            AbilityDK_HeartStrike HS = new AbilityDK_HeartStrike(m_CState);

            PostData(HS);
            AbilityDK_NecroticStrike NS = new AbilityDK_NecroticStrike(m_CState);

            PostData(NS);
//            AbilityDK_Pestilence Pest = new AbilityDK_Pestilence(m_CState);
            AbilityDK_BloodBoil BB = new AbilityDK_BloodBoil(m_CState);

            PostData(BB);
            AbilityDK_HowlingBlast HB = new AbilityDK_HowlingBlast(m_CState);

            PostData(HB);
            AbilityDK_ScourgeStrike SS = new AbilityDK_ScourgeStrike(m_CState);

            PostData(SS);
            AbilityDK_DeathNDecay DnD = new AbilityDK_DeathNDecay(m_CState);

            PostData(DnD);
            // Multi Runes:
            AbilityDK_DeathStrike DS = new AbilityDK_DeathStrike(m_CState);

            PostData(DS);
            AbilityDK_FesteringStrike Fest = new AbilityDK_FesteringStrike(m_CState);

            PostData(Fest);
            AbilityDK_Obliterate OB = new AbilityDK_Obliterate(m_CState);

            PostData(OB);
            // RP:
            AbilityDK_RuneStrike RS = new AbilityDK_RuneStrike(m_CState);

            PostData(RS);
            AbilityDK_DeathCoil DC = new AbilityDK_DeathCoil(m_CState);

            PostData(DC);
            AbilityDK_FrostStrike FS = new AbilityDK_FrostStrike(m_CState);

            PostData(FS);
        }
Пример #4
0
        /// <summary>
        /// This is my fire 1 of everything rotation.
        /// </summary>
        public void PRE_OneEachRot()
        {
            m_szRotationName = "One Each Rotation";
            ResetRotation();
            // Setup an instance of each ability.
            // No runes:
            AbilityDK_Outbreak OutB = new AbilityDK_Outbreak(m_CT.m_CState);
            // Single Runes:
            AbilityDK_IcyTouch IT = new AbilityDK_IcyTouch(m_CT.m_CState);
            AbilityDK_FrostFever FF = new AbilityDK_FrostFever(m_CT.m_CState);
            AbilityDK_PlagueStrike PS = new AbilityDK_PlagueStrike(m_CT.m_CState);
            AbilityDK_BloodPlague BP = new AbilityDK_BloodPlague(m_CT.m_CState);
            AbilityDK_BloodStrike BS = new AbilityDK_BloodStrike(m_CT.m_CState);
            AbilityDK_HeartStrike HS = new AbilityDK_HeartStrike(m_CT.m_CState);
            AbilityDK_NecroticStrike NS = new AbilityDK_NecroticStrike(m_CT.m_CState);
            AbilityDK_Pestilence Pest = new AbilityDK_Pestilence(m_CT.m_CState);
            AbilityDK_BloodBoil BB = new AbilityDK_BloodBoil(m_CT.m_CState);
            AbilityDK_HowlingBlast HB = new AbilityDK_HowlingBlast(m_CT.m_CState);
            AbilityDK_ScourgeStrike SS = new AbilityDK_ScourgeStrike(m_CT.m_CState);
            AbilityDK_DeathNDecay DnD = new AbilityDK_DeathNDecay(m_CT.m_CState);
            // Multi Runes:
            AbilityDK_DeathStrike DS = new AbilityDK_DeathStrike(m_CT.m_CState);
            AbilityDK_FesteringStrike Fest = new AbilityDK_FesteringStrike(m_CT.m_CState);
            AbilityDK_Obliterate OB = new AbilityDK_Obliterate(m_CT.m_CState);
            // RP:  Unlikely to start w/ RP abilities to open.
            AbilityDK_RuneStrike RS = new AbilityDK_RuneStrike(m_CT.m_CState);
            AbilityDK_DeathCoil DC = new AbilityDK_DeathCoil(m_CT.m_CState);
            AbilityDK_FrostStrike FS = new AbilityDK_FrostStrike(m_CT.m_CState);

            // For now, let's just blow everything in here one each.
            ml_Rot.Add(IT);
            ml_Rot.Add(FF);
            ml_Rot.Add(PS);
            ml_Rot.Add(BP);
            ml_Rot.Add(BS);
            ml_Rot.Add(HS);
            ml_Rot.Add(BB);
            ml_Rot.Add(NS);
            ml_Rot.Add(HB);
            ml_Rot.Add(SS);
            ml_Rot.Add(DnD);

            ml_Rot.Add(DS);
            ml_Rot.Add(OB);
            ml_Rot.Add(Fest);

            ml_Rot.Add(RS);
            ml_Rot.Add(DC);
            ml_Rot.Add(FS);

            BuildCosts();
        }
Пример #5
0
        /// <summary>
        /// Generate a rotation based on available resources.
        /// </summary>
        public void PostAbilitiesSingleUse(bool bThreat)
        {
            // Setup an instance of each ability.
            // No runes:
            AbilityDK_Outbreak OutB = new AbilityDK_Outbreak(m_CState);
            // Single Runes:
            AbilityDK_IcyTouch IT = new AbilityDK_IcyTouch(m_CState);
            PostData(IT);
            AbilityDK_FrostFever FF = new AbilityDK_FrostFever(m_CState);
            PostData(FF);
            AbilityDK_PlagueStrike PS = new AbilityDK_PlagueStrike(m_CState);
            PostData(PS);
            AbilityDK_BloodPlague BP = new AbilityDK_BloodPlague(m_CState);
            PostData(BP);
            AbilityDK_BloodStrike BS = new AbilityDK_BloodStrike(m_CState);
            PostData(BS);
            AbilityDK_HeartStrike HS = new AbilityDK_HeartStrike(m_CState);
            PostData(HS);
            AbilityDK_NecroticStrike NS = new AbilityDK_NecroticStrike(m_CState);
            PostData(NS);
//            AbilityDK_Pestilence Pest = new AbilityDK_Pestilence(m_CState);
            AbilityDK_BloodBoil BB = new AbilityDK_BloodBoil(m_CState);
            PostData(BB);
            AbilityDK_HowlingBlast HB = new AbilityDK_HowlingBlast(m_CState);
            PostData(HB);
            AbilityDK_ScourgeStrike SS = new AbilityDK_ScourgeStrike(m_CState);
            PostData(SS);
            AbilityDK_DeathNDecay DnD = new AbilityDK_DeathNDecay(m_CState);
            PostData(DnD);
            // Multi Runes:
            AbilityDK_DeathStrike DS = new AbilityDK_DeathStrike(m_CState);
            PostData(DS);
            AbilityDK_FesteringStrike Fest = new AbilityDK_FesteringStrike(m_CState);
            PostData(Fest);
            AbilityDK_Obliterate OB = new AbilityDK_Obliterate(m_CState);
            PostData(OB);
            // RP:
            AbilityDK_RuneStrike RS = new AbilityDK_RuneStrike(m_CState);
            PostData(RS);
            AbilityDK_DeathCoil DC = new AbilityDK_DeathCoil(m_CState);
            PostData(DC);
            AbilityDK_FrostStrike FS = new AbilityDK_FrostStrike(m_CState);
            PostData(FS);
        }