Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Odin Damage Calculation

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):

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
 
Back
Top