示例#1
0
        private float CalculateThisDamage(ItemDamageType type, float baseDamage)
        {
            float dmg = 0;

            try {
                AttackTable MHAtkTable = AttackTables[type];
                dmg  = baseDamage;                   // Base Damage
                dmg *= 1f + DamageMultipliers[type]; // Global Damage Bonuses
                dmg *= 1f - DamageResistances[type]; // Global Damage Penalties

                // Work the Attack Table, note: some of these points will always be zero
                float dmgDrop = (1f
                                 - MHAtkTable.Miss                                            // no damage when being missed
                                 - MHAtkTable.Dodge                                           // no damage when being dodged
                                 - MHAtkTable.Parry                                           // no damage when being parried
                                 - MHAtkTable.Glance                                          // glancing handled below
                                 - MHAtkTable.Block                                           // blocked  handled below
                                 - MHAtkTable.Crit);                                          // crits    handled below

                float dmgGlance = dmg * MHAtkTable.Glance * 0.70f;                            // Partial Damage when glancing
                float dmgBlock  = dmg * MHAtkTable.Block * 0.70f;                             // Partial damage when blocked
                float dmgCrit   = dmg * MHAtkTable.Crit * (1f + DamageCritMultipliers[type]); // Bonus Damage when critting

                dmg *= dmgDrop;

                dmg += dmgGlance + dmgBlock + dmgCrit;
            } catch (Exception ex) {
                Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS",
                                                               ex.Message, "CalculateThisDamage(...)", "", ex.StackTrace);
            }

            return(dmg);
        }
示例#2
0
        /// <summary>
        /// Performs the meat and potatoes intention of this class.
        /// All the DPS, etc variables will be populated.
        /// Do not run Calculate multiple times for the same ItemDamageType without resetting.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public float Calculate(ItemDamageType type)
        {
            float retVal = 0f;

            try{
                foreach (SpecialEffect effect in EffectsList)
                {
                    if (effect == null ||
                        effect.Stats == null ||
                        !TriggerChances.ContainsKey(effect.Trigger) ||
                        !TriggerIntervals.ContainsKey(effect.Trigger))
                    {
                    }
                    else if (effect.Stats.PhysicalDamage > 0 && type == ItemDamageType.Physical)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.PhysicalDamage, type);
                    }
                    else if (effect.Stats.ArcaneDamage > 0 && type == ItemDamageType.Arcane)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.ArcaneDamage, type);
                    }
                    else if (effect.Stats.HolyDamage > 0 && type == ItemDamageType.Holy)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.HolyDamage, type);
                    }
                    else if (effect.Stats.NatureDamage > 0 && type == ItemDamageType.Nature)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.NatureDamage, type);
                    }
                    else if (effect.Stats.ShadowDamage > 0 && type == ItemDamageType.Shadow)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.ShadowDamage, type);
                    }
                    else if (effect.Stats.FireDamage > 0 && type == ItemDamageType.Fire)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.FireDamage, type);
                    }
                    else if (effect.Stats.FrostDamage > 0 && type == ItemDamageType.Frost)
                    {
                        retVal = CalculateTotalDamagePerSecond(effect, effect.Stats.FrostDamage, type);
                    }
                }
            }catch (Exception ex) {
                Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS",
                                                               ex.Message, "Calculate(...)", "", ex.StackTrace);
            }
            return(retVal);
        }
示例#3
0
        private float CalculateTotalDamagePerSecond(SpecialEffect effect, float baseDamage, ItemDamageType type)
        {
            float totalDamage         = 0f;
            float totalDamagePerSec   = 0f;
            float totalNumProcs       = 0f;
            float totalNumProcsPerSec = 0f;

            try {
                float triggerInterval = TriggerIntervals[effect.Trigger];
                float triggerChance   = TriggerChances[effect.Trigger];
                if (TriggerChances.ContainsKey(Trigger.MainHandHit) && MainHandEffects.Contains(effect) && (!OffHandEffects.Contains(effect) || !dualWieldProcs))
                {
                    triggerInterval = TriggerIntervals[Trigger.MainHandHit];
                    triggerChance   = TriggerChances[Trigger.MainHandHit];
                    if (OffHandEffects.Contains(effect))
                    {
                        dualWieldProcs = true;
                    }
                }
                else if (TriggerChances.ContainsKey(Trigger.OffHandHit) && OffHandEffects.Contains(effect))
                {
                    triggerInterval = TriggerIntervals[Trigger.OffHandHit];
                    triggerChance   = TriggerChances[Trigger.OffHandHit];
                }
                // Process the Effects
                totalNumProcsPerSec = effect.GetAverageProcsPerSecond(triggerInterval, triggerChance, Char.MainHand.Speed, FightDuration);
                totalNumProcs       = totalNumProcsPerSec * FightDuration;
                totalDamage         = totalNumProcs * CalculateThisDamage(type, baseDamage);
                totalDamagePerSec   = totalDamage / FightDuration;

                // Set our Results into the Dictionaries
                TotalDamage[type]         += totalDamage;
                TotalDamagePerSec[type]   += totalDamagePerSec;
                TotalNumProcs[type]       += totalNumProcs;
                TotalNumProcsPerSec[type] += totalNumProcsPerSec;
            } catch (Exception ex) {
                Rawr.Base.ErrorBox eb = new Rawr.Base.ErrorBox("Error calculating special proc DPS",
                                                               ex.Message, "CalculateTotalDamagePerSecond(...)", "", ex.StackTrace);
            }

            return(totalDamagePerSec);
        }