Skip to content

Instantly share code, notes, and snippets.

@Ddemon26
Created April 1, 2025 03:19
Show Gist options
  • Save Ddemon26/4cf34af8f5602a402745430334bf47ae to your computer and use it in GitHub Desktop.
Save Ddemon26/4cf34af8f5602a402745430334bf47ae to your computer and use it in GitHub Desktop.
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