/// <summary> /// Calculates the creature damage for a physical monster attack /// </summary> /// <param name="bodyPart">The creature body part the monster is targeting</param> /// <param name="criticalHit">Is TRUE if monster rolls a critical hit</param> public float?CalculateDamage(ref DamageType damageType, CombatManeuver maneuver, BodyPart bodyPart, ref bool criticalHit, ref float shieldMod) { // check lifestone protection var player = AttackTarget as Player; if (player != null && player.UnderLifestoneProtection) { player.HandleLifestoneProtection(); return(null); } // evasion chance var evadeChance = GetEvadeChance(); if (ThreadSafeRandom.Next(0.0f, 1.0f) < evadeChance) { return(null); } // get base damage var attackPart = GetAttackPart(maneuver); if (attackPart == null) { return(0.0f); } damageType = GetDamageType(attackPart); var damageRange = GetBaseDamage(attackPart); var baseDamage = ThreadSafeRandom.Next(damageRange.Min, damageRange.Max); var damageRatingMod = GetRatingMod(EnchantmentManager.GetDamageRating()); var recklessnessMod = player != null?player.GetRecklessnessMod() : 1.0f; var target = AttackTarget as Creature; var targetPet = AttackTarget as CombatPet; // handle pet damage type var pet = this as CombatPet; if (pet != null) { damageType = pet.DamageType; } // monster weapon / attributes var weapon = GetEquippedWeapon(); // critical hit var critical = 0.1f; if (ThreadSafeRandom.Next(0.0f, 1.0f) < critical) { criticalHit = true; } // attribute damage modifier (verify) var attributeMod = GetAttributeMod(CombatType.Melee); // get armor piece var armor = GetArmor(bodyPart); // get armor modifiers var armorMod = GetArmorMod(armor, weapon, damageType); // get resistance modifiers (protect/vuln) var resistanceMod = AttackTarget.EnchantmentManager.GetResistanceMod(damageType); var damageResistRatingMod = GetNegativeRatingMod(AttackTarget.EnchantmentManager.GetDamageResistRating()); // get shield modifier var attackTarget = AttackTarget as Creature; shieldMod = attackTarget.GetShieldMod(this, damageType); // scale damage by modifiers var damage = baseDamage * damageRatingMod * attributeMod * armorMod * shieldMod * resistanceMod * damageResistRatingMod; if (!criticalHit) { damage *= recklessnessMod; } else { damage *= 2; // fixme: target recklessness mod still in effect? } return(damage); }
/// <summary> /// Calculates the player damage for a physical monster attack /// </summary> /// <param name="bodyPart">The player body part the monster is targeting</param> /// <param name="criticalHit">Is TRUE if monster rolls a critical hit</param> public float CalculateDamage(ref DamageType damageType, CombatManeuver maneuver, BodyPart bodyPart, ref bool criticalHit, ref float shieldMod) { // evasion chance var evadeChance = GetEvadeChance(); if (Physics.Common.Random.RollDice(0.0f, 1.0f) < evadeChance) { return(0.0f); } // get base damage var attackPart = GetAttackPart(maneuver); damageType = GetDamageType(attackPart); var damageRange = GetBaseDamage(attackPart); var baseDamage = Physics.Common.Random.RollDice(damageRange.Min, damageRange.Max); var damageRatingMod = GetRatingMod(EnchantmentManager.GetDamageRating()); var player = AttackTarget as Player; var recklessnessMod = player != null?player.GetRecklessnessMod() : 1.0f; // monster weapon / attributes var weapon = GetEquippedWeapon(); // critical hit var critical = 0.1f; if (Physics.Common.Random.RollDice(0.0f, 1.0f) < critical) { criticalHit = true; } // attribute damage modifier (verify) var attributeMod = GetAttributeMod(AttackType.Melee); // get armor piece var armor = GetArmor(bodyPart); // get armor modifiers var armorMod = GetArmorMod(armor, damageType); // get resistance modifiers (protect/vuln) var resistanceMod = AttackTarget.EnchantmentManager.GetResistanceMod(damageType); var damageResistRatingMod = GetNegativeRatingMod(AttackTarget.EnchantmentManager.GetDamageResistRating()); // get shield modifier var attackTarget = AttackTarget as Creature; shieldMod = attackTarget.GetShieldMod(this, damageType); // scale damage by modifiers var damage = baseDamage * damageRatingMod * attributeMod * armorMod * shieldMod * resistanceMod * damageResistRatingMod; if (!criticalHit) { damage *= recklessnessMod; } else { damage *= 2; // fixme: target recklessness mod still in effect? } return(damage); }
public float CalculateDamage(WorldObject target, WorldObject damageSource, ref bool criticalHit, ref bool sneakAttack) { var creature = target as Creature; // evasion chance var evadeChance = GetEvadeChance(target); if (Physics.Common.Random.RollDice(0.0f, 1.0f) < evadeChance) { return(0.0f); } // get weapon base damage var baseDamageRange = GetBaseDamage(); var baseDamage = Physics.Common.Random.RollDice(baseDamageRange.Min, baseDamageRange.Max); // get damage mods var attackType = GetAttackType(); var attributeMod = GetAttributeMod(attackType); var powerAccuracyMod = GetPowerAccuracyMod(); var recklessnessMod = GetRecklessnessMod(this, creature); var sneakAttackMod = GetSneakAttackMod(target); sneakAttack = sneakAttackMod > 1.0f; var damageRatingMod = AdditiveCombine(recklessnessMod, sneakAttackMod, GetRatingMod(EnchantmentManager.GetDamageRating())); //Console.WriteLine("Damage rating: " + ModToRating(damageRatingMod)); var damage = baseDamage * attributeMod * powerAccuracyMod * damageRatingMod; // critical hit var critical = GetWeaponPhysicalCritFrequencyModifier(this); if (Physics.Common.Random.RollDice(0.0f, 1.0f) < critical) { damage = baseDamageRange.Max * attributeMod * powerAccuracyMod * sneakAttackMod * (2.0f + GetWeaponCritMultiplierModifier(this)); criticalHit = true; } // get random body part @ attack height var bodyPart = BodyParts.GetBodyPart(target, AttackHeight.Value); if (bodyPart == null) { return(0.0f); } var creaturePart = new Creature_BodyPart(creature, bodyPart); // get target armor var armor = creaturePart.BaseArmorMod; // get target resistance DamageType damageType; if (damageSource?.ItemType == ItemType.MissileWeapon) { damageType = (DamageType)damageSource.GetProperty(PropertyInt.DamageType); } else { damageType = GetDamageType(); } creaturePart.WeaponResistanceMod = GetWeaponResistanceModifier(this, damageType); var resistance = GetResistance(creaturePart, damageType); // ratings var damageResistRatingMod = GetNegativeRatingMod(creature.EnchantmentManager.GetDamageResistRating()); //Console.WriteLine("Damage resistance rating: " + NegativeModToRating(damageResistRatingMod)); // scale damage for armor and shield var armorMod = SkillFormula.CalcArmorMod(resistance); var shieldMod = creature.GetShieldMod(this, damageType); var slayerMod = GetWeaponCreatureSlayerModifier(this, target as Creature); var elementalDamageMod = GetMissileElementalDamageModifier(this, target as Creature, damageType); return((damage + elementalDamageMod) * armorMod * shieldMod * slayerMod * damageResistRatingMod); }
/// <summary> /// Calculates the creature damage for a physical monster attack /// </summary> public float?CalculateDamagePVP(WorldObject target, WorldObject damageSource, DamageType damageType, ref bool criticalHit, ref bool sneakAttack, ref BodyPart bodyPart) { // verify target player killer var targetPlayer = target as Player; if (targetPlayer == null) { return(null); } // check lifestone protection if (targetPlayer.UnderLifestoneProtection) { targetPlayer.HandleLifestoneProtection(); return(null); } // evasion chance var evadeChance = GetEvadeChance(target); if (ThreadSafeRandom.Next(0.0f, 1.0f) < evadeChance) { return(null); } // get base damage var baseDamageRange = GetBaseDamage(); var baseDamage = ThreadSafeRandom.Next(baseDamageRange.Min, baseDamageRange.Max); // get damage mods var attackType = GetAttackType(); var attributeMod = GetAttributeMod(attackType); var powerAccuracyMod = GetPowerAccuracyMod(); var recklessnessMod = GetRecklessnessMod(this, targetPlayer); var sneakAttackMod = GetSneakAttackMod(target); sneakAttack = sneakAttackMod > 1.0f; var damageRatingMod = AdditiveCombine(recklessnessMod, sneakAttackMod, GetRatingMod(EnchantmentManager.GetDamageRating())); //Console.WriteLine("Damage rating: " + ModToRating(damageRatingMod)); var damage = baseDamage * attributeMod * powerAccuracyMod * damageRatingMod; // critical hit var attackSkill = GetCreatureSkill(GetCurrentWeaponSkill()); var critical = GetWeaponPhysicalCritFrequencyModifier(this, attackSkill); if (ThreadSafeRandom.Next(0.0f, 1.0f) < critical) { damage = baseDamageRange.Max * attributeMod * powerAccuracyMod * sneakAttackMod * (1.0f + GetWeaponCritMultiplierModifier(this, attackSkill)); criticalHit = true; } // select random body part @ current attack height bodyPart = BodyParts.GetBodyPart(AttackHeight.Value); // get armor piece var armor = GetArmor(bodyPart); // get armor modifiers var armorMod = GetArmorMod(armor, damageSource, damageType, attackSkill); // get resistance modifiers (protect/vuln) var resistanceMod = damageSource != null && damageSource.IgnoreMagicResist ? 1.0f : AttackTarget.EnchantmentManager.GetResistanceMod(damageType); // weapon resistance mod? var damageResistRatingMod = GetNegativeRatingMod(AttackTarget.EnchantmentManager.GetDamageResistRating()); // get shield modifier var attackTarget = AttackTarget as Creature; var shieldMod = attackTarget.GetShieldMod(this, damageType); var slayerMod = GetWeaponCreatureSlayerModifier(this, target as Creature); var elementalDamageMod = GetMissileElementalDamageModifier(this, target as Creature, damageType); // scale damage by modifiers var outDamage = (damage + elementalDamageMod) * armorMod * shieldMod * slayerMod * resistanceMod * damageResistRatingMod; return(outDamage); }
public float?CalculateDamage(WorldObject target, WorldObject damageSource, ref bool criticalHit, ref bool sneakAttack) { var creature = target as Creature; // evasion chance var evadeChance = GetEvadeChance(target); if (ThreadSafeRandom.Next(0.0f, 1.0f) < evadeChance) { return(null); } // get weapon base damage var weapon = GetEquippedWeapon(); var baseDamageRange = GetBaseDamage(); var baseDamage = ThreadSafeRandom.Next(baseDamageRange.Min, baseDamageRange.Max); // get damage mods var attackType = GetCombatType(); var attributeMod = GetAttributeMod(weapon); var powerAccuracyMod = GetPowerMod(weapon); var recklessnessMod = GetRecklessnessMod(this, creature); var sneakAttackMod = GetSneakAttackMod(target); sneakAttack = sneakAttackMod > 1.0f; // heritage damge mod var heritageMod = GetHeritageBonus(weapon) ? 1.05f : 1.0f; var damageRatingMod = AdditiveCombine(recklessnessMod, sneakAttackMod, heritageMod, GetRatingMod(EnchantmentManager.GetDamageRating())); //Console.WriteLine("Damage rating: " + ModToRating(damageRatingMod)); var damage = baseDamage * attributeMod * powerAccuracyMod * damageRatingMod; // critical hit var attackSkill = GetCreatureSkill(GetCurrentWeaponSkill()); var critical = GetWeaponCritChanceModifier(this, attackSkill); if (ThreadSafeRandom.Next(0.0f, 1.0f) < critical) { var criticalDamageMod = 1.0f + GetWeaponCritDamageMod(this, attackSkill); damage = baseDamageRange.Max * attributeMod * powerAccuracyMod * sneakAttackMod * criticalDamageMod; criticalHit = true; } // get random body part @ attack height var bodyPart = BodyParts.GetBodyPart(target, AttackHeight.Value); if (bodyPart == null) { return(null); } var creaturePart = new Creature_BodyPart(creature, bodyPart, damageSource != null ? damageSource.IgnoreMagicArmor : false, damageSource != null ? damageSource.IgnoreMagicResist : false); if (weapon != null && weapon.HasImbuedEffect(ImbuedEffectType.ArmorRending)) { creaturePart.WeaponArmorMod = GetArmorRendingMod(attackSkill); } // get target armor var armor = creaturePart.BaseArmorMod; // get target resistance DamageType damageType; if (damageSource?.ItemType == ItemType.MissileWeapon) { damageType = (DamageType)damageSource.GetProperty(PropertyInt.DamageType); } else { damageType = GetDamageType(); } creaturePart.WeaponResistanceMod = GetWeaponResistanceModifier(this, attackSkill, damageType); var resistance = GetResistance(creaturePart, damageType); // ratings var damageResistRatingMod = GetNegativeRatingMod(creature.EnchantmentManager.GetDamageResistRating()); //Console.WriteLine("Damage resistance rating: " + NegativeModToRating(damageResistRatingMod)); // scale damage for armor and shield var armorMod = SkillFormula.CalcArmorMod(resistance); var shieldMod = creature.GetShieldMod(this, damageType); var slayerMod = GetWeaponCreatureSlayerModifier(this, target as Creature); var elementalDamageMod = GetMissileElementalDamageModifier(this, target as Creature, damageType); return((damage + elementalDamageMod) * armorMod * shieldMod * slayerMod * damageResistRatingMod); }
/// <summary> /// Calculates the creature damage for a physical monster attack /// </summary> public float?CalculateDamagePVP(WorldObject target, WorldObject damageSource, DamageType damageType, ref bool criticalHit, ref bool sneakAttack, ref BodyPart bodyPart) { // verify target player killer var targetPlayer = target as Player; if (targetPlayer == null) { return(null); } // check lifestone protection if (targetPlayer.UnderLifestoneProtection) { targetPlayer.HandleLifestoneProtection(); return(null); } // evasion chance var evadeChance = GetEvadeChance(target); if (ThreadSafeRandom.Next(0.0f, 1.0f) < evadeChance) { return(null); } // get base damage var weapon = GetEquippedWeapon(); var baseDamageRange = GetBaseDamage(); var baseDamage = ThreadSafeRandom.Next(baseDamageRange.Min, baseDamageRange.Max); // get damage mods var attackType = GetCombatType(); var attributeMod = GetAttributeMod(weapon); var powerMod = GetPowerMod(weapon); var recklessnessMod = GetRecklessnessMod(this, targetPlayer); var sneakAttackMod = GetSneakAttackMod(target); sneakAttack = sneakAttackMod > 1.0f; // heritage damge mod var heritageMod = GetHeritageBonus(weapon) ? 1.05f : 1.0f; var damageRatingMod = AdditiveCombine(heritageMod, recklessnessMod, sneakAttackMod, GetRatingMod(EnchantmentManager.GetDamageRating()), GetNegativeRatingMod(target.EnchantmentManager.GetDamageResistRating())); //Console.WriteLine("Damage rating: " + ModToRating(damageRatingMod)); var damage = baseDamage * attributeMod * powerMod * damageRatingMod; // critical hit var attackSkill = GetCreatureSkill(GetCurrentWeaponSkill()); var critical = GetWeaponCritChanceModifier(this, attackSkill); if (ThreadSafeRandom.Next(0.0f, 1.0f) < critical) { if (targetPlayer != null && targetPlayer.AugmentationCriticalDefense > 0) { var protChance = targetPlayer.AugmentationCriticalDefense * 0.05f; if (ThreadSafeRandom.Next(0.0f, 1.0f) > protChance) { criticalHit = true; } } else { criticalHit = true; } } if (criticalHit) { // not effective for criticals: recklessness damageRatingMod = AdditiveCombine(heritageMod, sneakAttackMod, GetRatingMod(EnchantmentManager.GetDamageRating()), GetNegativeRatingMod(target.EnchantmentManager.GetDamageResistRating())); damage = baseDamageRange.Max * attributeMod * powerMod * damageRatingMod * (1.0f + GetWeaponCritDamageMod(this, attackSkill)); } // get armor rending mod here? var armorRendingMod = 1.0f; if (weapon != null && weapon.HasImbuedEffect(ImbuedEffectType.ArmorRending)) { armorRendingMod = GetArmorRendingMod(attackSkill); } // select random body part @ current attack height bodyPart = BodyParts.GetBodyPart(AttackHeight.Value); // get armor piece var armor = GetArmorLayers(bodyPart); // get armor modifiers var armorMod = GetArmorMod(damageType, armor, damageSource, armorRendingMod); // get resistance modifiers (protect/vuln) var resistanceMod = damageSource != null && damageSource.IgnoreMagicResist ? 1.0f : AttackTarget.EnchantmentManager.GetResistanceMod(damageType); // weapon resistance mod? var damageResistRatingMod = GetNegativeRatingMod(AttackTarget.EnchantmentManager.GetDamageResistRating()); // get shield modifier var attackTarget = AttackTarget as Creature; var shieldMod = attackTarget.GetShieldMod(this, damageType); var slayerMod = GetWeaponCreatureSlayerModifier(this, target as Creature); var elementalDamageMod = GetMissileElementalDamageModifier(this, target as Creature, damageType); // scale damage by modifiers var outDamage = (damage + elementalDamageMod) * armorMod * shieldMod * slayerMod * resistanceMod * damageResistRatingMod; return(outDamage); }