Created
April 1, 2025 03:19
-
-
Save Ddemon26/4cf34af8f5602a402745430334bf47ae to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public static class OSRSCombatCalculator { | |
// Calculates Melee Damage | |
public static int CalculateMeleeDamage( | |
int atkLvl, int atkBonus, int strLvl, int strBonus, | |
int defLvl, int defBonus, | |
float atkPrayer = 1f, float strPrayer = 1f, | |
float defPrayer = 1f, float damageMultiplier = 1f, | |
int atkStance = 0, int strStance = 0 | |
) | |
=> HitSuccess(AttackRoll(atkLvl, atkBonus, atkPrayer, atkStance), DefenceRoll(defLvl, defBonus, defPrayer)) | |
? Mathf.FloorToInt(Random.Range(0, MaxHit(strLvl, strBonus, strPrayer, strStance) + 1) * damageMultiplier) | |
: 0; | |
// Calculates Ranged Damage | |
public static int CalculateRangedDamage( | |
int rngLvl, int rngBonus, int rngStrBonus, | |
int defLvl, int defRngBonus, | |
float rngPrayer = 1f, float defPrayer = 1f, | |
float damageMultiplier = 1f, int rngStance = 0 | |
) | |
=> HitSuccess(AttackRoll(rngLvl, rngBonus, rngPrayer, rngStance), DefenceRoll(defLvl, defRngBonus, defPrayer)) | |
? Mathf.FloorToInt(Random.Range(0, MaxHit(rngLvl, rngStrBonus, rngPrayer, rngStance) + 1) * damageMultiplier) | |
: 0; | |
// Calculates Magic Damage | |
public static int CalculateMagicDamage( | |
int mageLvl, int mageBonus, int spellMaxHit, | |
int defLvl, int defMageBonus, int defMageLvl = 1, | |
float magePrayer = 1f, float defPrayer = 1f, | |
float damageMultiplier = 1f, float gearMultiplier = 1f | |
) | |
=> HitSuccess(MagicAttackRoll(mageLvl, mageBonus, magePrayer), MagicDefenceRoll(defLvl, defMageLvl, defMageBonus, defPrayer)) | |
? Mathf.FloorToInt(Random.Range(0, Mathf.FloorToInt(spellMaxHit * gearMultiplier * damageMultiplier) + 1)) | |
: 0; | |
// Helper Methods (Accurate OSRS Formulas) | |
private static int AttackRoll(int lvl, int bonus, float prayer, int stance) | |
=> (Mathf.FloorToInt(lvl * prayer) + stance + 8) * (bonus + 64); | |
private static int DefenceRoll(int lvl, int bonus, float prayer, int stance = 0) | |
=> (Mathf.FloorToInt(lvl * prayer) + stance + 8) * (bonus + 64); | |
private static int MagicAttackRoll(int mageLvl, int mageBonus, float prayer) | |
=> (Mathf.FloorToInt(mageLvl * prayer) + 8) * (mageBonus + 64); | |
private static int MagicDefenceRoll(int defLvl, int mageLvl, int defBonus, float defPrayer) | |
=> (Mathf.FloorToInt(defLvl * 0.3f + mageLvl * 0.7f) + 8) * (defBonus + 64); | |
private static int MaxHit(int lvl, int bonus, float prayer, int stance) | |
=> Mathf.FloorToInt(((Mathf.FloorToInt(lvl * prayer) + stance + 8) * (bonus + 64)) / 640f); | |
private static bool HitSuccess(int atkRoll, int defRoll) | |
=> Random.Range(0, atkRoll + defRoll) < atkRoll; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment