52 public static Hit nextMeleeHit(
Mob attacker,
Mob defender) {
53 int max = getMaxHit(attacker, defender,
CombatType.MELEE);
57 public static Hit nextMeleeHit(
Mob attacker,
Mob defender,
int max) {
61 public static Hit nextMeleeHit(
Mob attacker,
Mob defender,
int max,
boolean multipleHitsAllowed) {
65 public static Hit nextRangedHit(
Mob attacker,
Mob defender,
int max) {
69 public static Hit nextMagicHit(
Mob attacker,
Mob defender,
int max) {
74 final CombatStrategy<? super Mob> strategy = attacker.
getStrategy();
75 final int totalHits = defender.
isNpc() && defender.getNpc().definition.
getSize() > 1 ? 3 : 1;
77 if (strategy.toString().contains(
"ScytheOfVitur") && totalHits > 1) {
78 final Hit[] hits =
new Hit[totalHits];
80 for (
int index = 0; index < hits.length; index++) {
81 final Hit hit = hits[index] =
new Hit(max < 0 ? -1 : 0, hitsplat, icon,
82 isAccurate(attacker, defender, type, strategy));
85 max = type.getFormula().modifyDamage(attacker, defender, max);
86 int verdict = RandomUtils.inclusive(0, max);
97 if (verdict > defender.getCurrentHealth()) {
98 verdict = defender.getCurrentHealth();
101 hit.setDamage(verdict);
105 return new Hit(hits);
108 final Hit hit =
new Hit(max < 0 ? -1 : 0, hitsplat, icon,
109 isAccurate(attacker, defender, type, strategy));
111 max = type.getFormula().modifyDamage(attacker, defender, max);
112 int verdict = RandomUtils.inclusive(0, max);
114 if (verdict > defender.getCurrentHealth()) {
115 verdict = defender.getCurrentHealth();
118 hit.setDamage(verdict);
124 private static boolean isAccurate(
Mob attacker,
Mob defender,
CombatType type, CombatStrategy<? super Mob> strategy) {
125 if (strategy !=
null && strategy.isAlwaysAccurate()) {
129 double attackRoll = rollOffensive(attacker, defender, type.getFormula());
130 double defenceRoll = rollDefensive(attacker, defender, type.getFormula());
131 boolean isNpc = attacker.
isNpc();
143 return RandomUtils.success(attackRoll / (attackRoll + defenceRoll));
148 public static int rollOffensive(
Mob attacker,
Mob defender, FormulaModifier<Mob> formula) {
149 int roll = formula.modifyAccuracy(attacker, defender, 0);
150 int bonus = formula.modifyOffensiveBonus(attacker, defender, 0);
151 return attacker.
getCombat().modifyAccuracy(defender, roll * (bonus + 64));
154 public static int rollDefensive(
Mob attacker,
Mob defender, FormulaModifier<Mob> formula) {
155 int roll = formula.modifyDefensive(attacker, defender, 0);
156 int bonus = formula.modifyDefensiveBonus(attacker, defender, 0);
157 return attacker.
getCombat().modifyDefensive(defender, roll * (bonus + 64));
161 FormulaModifier<Mob> formula = type.getFormula();
162 int level = formula.modifyAggressive(attacker, defender, 0);
163 int bonus = formula.modifyAggressiveBonus(attacker, defender, 0);
167 return maxHit(level, bonus);
170 public static int getModifiedMaxHit(
Mob attacker,
Mob defender,
CombatType type) {
171 FormulaModifier<Mob> formula = type.getFormula();
172 int level = formula.modifyAggressive(attacker, defender, 0);
173 int bonus = formula.modifyAggressiveBonus(attacker, defender, 0);
178 return (
int) Math.floor(
RangeMaxHit.maxHit(attacker));
180 return formula.modifyDamage(attacker, defender, maxHit(level, bonus));
183 private static int maxHit(
int level,
int bonus) {
184 return (320 + level * (bonus + 64)) / 640;