RuneHive-Game
Loading...
Searching...
No Matches
MeleeAccuracy.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.accuracy;
2
3import com.runehive.game.world.entity.combat.FormulaUtils;
4import com.runehive.game.world.entity.mob.Mob;
5import com.runehive.game.world.entity.mob.player.Player;
6import com.runehive.game.world.entity.mob.prayer.Prayer;
7import com.runehive.game.world.entity.skill.Skill;
8
9import java.security.SecureRandom;
10
11/**
12 * @Author Origin
13 * 2/22/2023
14 */
15public class MeleeAccuracy {
16
17 public static final SecureRandom srand = new SecureRandom();
18
19 public static boolean successful(Mob attacker, Mob defender) {
20 double attackRoll = getAttackRoll(attacker);
21 double defenceRoll = getDefenceRoll(defender);
22
23 double chance;
24 if (attackRoll > defenceRoll)
25 chance = 1D - (defenceRoll + 2D) / (2D * (attackRoll + 1D));
26 else
27 chance = attackRoll / (2D * (defenceRoll + 1D));
28
29 double roll = srand.nextDouble();
30
31
32 return chance > roll;
33 }
34
35 public static double getDefenceRoll(Mob defender) {
36 double defenceLevel = defender.skills.getLevel(Skill.DEFENCE);
37 double defenceBonus = getDefenceBonus(defender);
38
39 if (defender instanceof Player) {
40 defenceLevel *= getPrayerDefenseBonus(defender);
41
42 switch (defender.getCombat().getFightType().getStyle()) {
43 case DEFENSIVE -> defenceLevel += 3;
44 case CONTROLLED -> defenceLevel += 1;
45 }
46 } else {
47 defenceLevel += 9;
48 }
49
50 return defenceLevel * (defenceBonus + 64);
51 }
52
53 public static double getAttackRoll(Mob attacker) {
54 double effectiveLevel = getEffectiveLevel(attacker);
55 double attackBonus = getAttackBonus(attacker);
56
57 double roll = effectiveLevel * (attackBonus + 64);
58
59 if (attacker instanceof Player player) {
60 // TODO equipment bonuses
61 }
62
63 return Math.floor(roll);
64 }
65
66 public static double getEffectiveLevel(Mob attacker) {
67 double effectiveLevel = attacker.skills.getLevel(Skill.ATTACK);
68 if (attacker instanceof Player) {
69 effectiveLevel *= getPrayerAttackBonus(attacker);
70 effectiveLevel = Math.floor(effectiveLevel);
71
72 switch (attacker.getCombat().getFightType().getStyle()) {
73 case ACCURATE -> effectiveLevel += 3;
74 case CONTROLLED -> effectiveLevel += 1;
75 }
76 }
77 effectiveLevel += 8;
78
79 if (attacker instanceof Player player) {
80 if (FormulaUtils.voidMelee(player)) {
81 effectiveLevel *= 1.10;
82 }
83 }
84
85 return Math.floor(effectiveLevel);
86 }
87
88 private static double getPrayerDefenseBonus(Mob defender) {
89 double prayerBonus = 1;
90 if (defender.prayer.isActive(Prayer.THICK_SKIN))
91 prayerBonus += 1.05D; // 5% def level boost
92 else if (defender.prayer.isActive(Prayer.ROCK_SKIN))
93 prayerBonus += 1.10D; // 10% def level boost
94 else if (defender.prayer.isActive(Prayer.STEEL_SKIN))
95 prayerBonus += 1.15D; // 15% def level boost
96 else if (defender.prayer.isActive(Prayer.CHIVALRY))
97 prayerBonus += 1.20D; // 20% def level boost
98 else if (defender.prayer.isActive(Prayer.PIETY))
99 prayerBonus += 1.25D; // 25% def level boost
100 return prayerBonus;
101 }
102
103 private static int getDefenceBonus(Mob defender) {
104 return defender.getBonus(defender.getCombat().getFightType().getCorrespondingBonus());
105 }
106
107 private static int getAttackBonus(Mob attacker) {
108 return attacker.getBonus(attacker.getCombat().getFightType().getBonus());
109 }
110
111 private static double getPrayerAttackBonus(Mob attacker) {
112 double prayerBonus = 1;
113 if (attacker.prayer.isActive(Prayer.THICK_SKIN))
114 prayerBonus += 1.05D; // 5% def level boost
115 else if (attacker.prayer.isActive(Prayer.ROCK_SKIN))
116 prayerBonus += 1.10D; // 10% def level boost
117 else if (attacker.prayer.isActive(Prayer.STEEL_SKIN))
118 prayerBonus += 1.15D; // 15% def level boost
119 else if (attacker.prayer.isActive(Prayer.CHIVALRY))
120 prayerBonus += 1.20D; // 20% def level boost
121 else if (attacker.prayer.isActive(Prayer.PIETY))
122 prayerBonus += 1.25D; // 25% def level boost
123 return prayerBonus;
124 }
125
126}
static boolean successful(Mob attacker, Mob defender)
Handles the mob class.
Definition Mob.java:66
abstract Combat<? extends Mob > getCombat()
The combat of the mob.
This class represents a character controlled by a player.
Definition Player.java:125
boolean isActive(Prayer... prayers)
Checks if all given prayers are active.
Represents a trainable and usable skill.
Definition Skill.java:18
static final int DEFENCE
The defence skill id.
Definition Skill.java:24
static final int ATTACK
The attack skill id.
Definition Skill.java:21
int getLevel(int id)
Gets the level of a skill.