B
Baker
Guest
Hey all.
I'm releasing this because after finding it in the decompiled Odin zone, I incorporated it into my emulator. I figured it would be helpful for fellow emulator developers and even those just working on the server files who want to get a better understanding of how the calculations work.
Anyway, here they are:
Bashing (Auto-Attack):
Skills:
Please note: These snippets are directly from my emulator so they aren't exactly what the zone contains (zone does a lot of separate calculations to obtain values like minDMG, attackPower, etc.)
Hope this is helpful.
Best,
Baker
I'm releasing this because after finding it in the decompiled Odin zone, I incorporated it into my emulator. I figured it would be helpful for fellow emulator developers and even those just working on the server files who want to get a better understanding of how the calculations work.
Anyway, here they are:
Bashing (Auto-Attack):
Code:
internal static int CalculateBashDamage(GameObject attacker, GameObject target, bool isCrit = false)
{
var damage = 0.0D;
var minWC = (double) attacker.Stats.CurrentMinDmg + (isCrit ? attacker.Stats.CriticalMinDmg : 0);
var maxWC = (double) attacker.Stats.CurrentMaxDmg + (isCrit ? attacker.Stats.CriticalMaxDmg : 0);
var minAtkPower = minWC;
var maxAtkPower = maxWC;
var attackPower = Mathd.Rnd.Next((int) (maxAtkPower - minAtkPower)) + minAtkPower;
var defensePower = target.Stats.CurrentDef + (double) target.Stats.CurrentEND;
if (defensePower < 1.0D)
defensePower = 1.0D;
damage = (attacker.Level + 1) / defensePower * attackPower;
return (int) damage;
}
Skills:
Code:
internal static int CalculateSkillDamage(GameObject caster, GameObject target, ActiveSkillInstance skill, HitType hitType, bool isCrit = false)
{
var damage = 0.0D;
if (hitType == HitType.HT_PY)
{
var minWC = caster.Stats.CurrentMinDmg + (double) skill.Stats.CurrentMinDmg + (isCrit ? caster.Stats.CriticalMinDmg : 0);
var maxWC = caster.Stats.CurrentMaxDmg + (double) skill.Stats.CurrentMaxDmg + (isCrit ? caster.Stats.CriticalMaxDmg : 0);
var minEmpBonus = 0.0D;
var maxEmpBonus = 0.0D;
var minAtkPower = minWC + minEmpBonus;
var maxAtkPower = maxWC + maxEmpBonus;
var attackPower = Mathd.Rnd.Next((int) (maxAtkPower - minAtkPower)) + minAtkPower;
var defensePower = target.Stats.CurrentDef + (double) target.Stats.CurrentEND;
if (defensePower < 1.0D)
defensePower = 1.0D;
damage = (caster.Level + 1) / defensePower * attackPower;
return (int) damage;
}
if (hitType == HitType.HT_MA)
{
var minMA = caster.Stats.CurrentMinMDmg + (double) skill.Stats.CurrentMinMDmg + (isCrit ? caster.Stats.CriticalMinMDmg : 0);
var maxMA = caster.Stats.CurrentMaxMDmg + (double) skill.Stats.CurrentMaxMDmg + (isCrit ? caster.Stats.CriticalMaxMDmg : 0);
var minEmpBonus = 0.0D;
var maxEmpBonus = 0.0D;
var minAtkPower = minMA + minEmpBonus;
var maxAtkPower = maxMA + maxEmpBonus;
var attackPower = Mathd.Rnd.Next((int) (maxAtkPower - minAtkPower)) + minAtkPower;
var defensePower = target.Stats.CurrentMDef + (double) target.Stats.CurrentSPR;
if (defensePower < 1.0D)
defensePower = 1.0D;
damage = (caster.Level + 1) / defensePower * attackPower;
return (int) damage;
}
return (int) damage;
}
Please note: These snippets are directly from my emulator so they aren't exactly what the zone contains (zone does a lot of separate calculations to obtain values like minDMG, attackPower, etc.)
Hope this is helpful.
Best,
Baker