51 public static final SecureRandom srand =
new SecureRandom();
53 public static boolean successful(
Mob attacker,
Mob defender) {
54 double attackRoll = getAttackRoll(attacker);
55 if (attacker instanceof
Player player) {
61 double defenceRoll = getDefenceRoll(defender);
64 if (attackRoll > defenceRoll)
65 chance = 1D - (defenceRoll + 2D) / (2D * (attackRoll + 1D));
67 chance = attackRoll / (2D * (defenceRoll + 1D));
69 double roll = srand.nextDouble();
73 public static int getAttackBonus(
Mob attacker) {
74 return attacker.getBonus(
Equipment.MAGIC_OFFENSE);
77 public static int getDefenceBonus(
Mob defender) {
78 return defender.getBonus(
Equipment.MAGIC_DEFENSE);
81 public static double getDefenceRoll(
Mob defender) {
82 double magicLevel = getMagicLevel(defender);
83 double defenceBonus = getDefenceBonus(defender);
85 double effectiveLevel;
86 if (defender instanceof
Player) {
87 magicLevel *= getPrayerBonusDefender(defender);
90 switch (defender.
getCombat().getFightType().getStyle()) {
91 case DEFENSIVE -> defenceLevel += 3;
92 case CONTROLLED -> defenceLevel += 1;
95 effectiveLevel = magicLevel * 0.7 + defenceLevel * 0.3 + 8;
97 effectiveLevel = magicLevel + 9;
100 return effectiveLevel * (defenceBonus + 64);
103 public static int getMagicLevel(
Mob mob) {
105 if (mob instanceof
Npc npc) {
106 int[] skills = npc.definition.getSkills();
107 if (skills !=
null) {
111 magicLevel = mob.skills.getLevel(
Skill.
MAGIC);
116 public static double getPrayerBonus(
Mob attacker) {
117 double prayerBonus = 1;
119 prayerBonus *= 1.05D;
121 prayerBonus *= 1.10D;
123 prayerBonus *= 1.15D;
125 prayerBonus *= 1.25D;
129 public static double getPrayerBonusDefender(
Mob defender) {
130 double prayerBonus = 1;
132 prayerBonus *= 1.25D;
136 public static double getAttackRoll(
Mob attacker) {
137 double magicLevel = getMagicLevel(attacker);
138 double attackBonus = getAttackBonus(attacker);
140 double effectiveLevel;
141 if (attacker instanceof
Player) {
142 effectiveLevel = magicLevel * getPrayerBonus(attacker) + 8;
144 effectiveLevel = magicLevel + 9;
147 return effectiveLevel * (attackBonus + 64);