mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-02-23 15:38:29 +01:00
Merge branch 'fixmonsterdifficulty' into nut_test_brimhaven
This commit is contained in:
@@ -25,6 +25,8 @@ import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
|
||||
import com.gpl.rpg.AndorsTrail.resource.VisualEffectCollection;
|
||||
import com.gpl.rpg.AndorsTrail.util.Coord;
|
||||
|
||||
import static java.lang.Math.max;
|
||||
|
||||
public final class CombatController implements VisualEffectCompletedCallback {
|
||||
private final ControllerContext controllers;
|
||||
private final WorldContext world;
|
||||
@@ -484,13 +486,28 @@ public final class CombatController implements VisualEffectCompletedCallback {
|
||||
if (target.isImmuneToCriticalHits()) return false;
|
||||
return true;
|
||||
}
|
||||
private static float getAverageDamagePerHit(Actor attacker, Actor target) {
|
||||
float result = (float) (getAttackHitChance(attacker, target)) * attacker.getDamagePotential().average() / 100;
|
||||
if (hasCriticalAttack(attacker, target)) {
|
||||
result += (float) attacker.getEffectiveCriticalChance() * result * attacker.getCriticalMultiplier() / 100;
|
||||
|
||||
// see this post for explenations about the calculation: https://andorstrail.com/viewtopic.php?f=3&t=6661
|
||||
public static float getAverageDamagePerHit(final Actor attacker, final Actor target) {
|
||||
final int numPossibleOutcomes = attacker.getDamagePotential().max - attacker.getDamagePotential().current + 1;
|
||||
float avgNonCriticalDamage = 0;
|
||||
for (int n = 0; n < numPossibleOutcomes; n++) {
|
||||
avgNonCriticalDamage += max(0, (float) n + attacker.getDamagePotential().current - target.getDamageResistance()) / numPossibleOutcomes;
|
||||
}
|
||||
result -= target.getDamageResistance();
|
||||
return result;
|
||||
|
||||
float avgCriticalDamage = 0;
|
||||
float effectiveCriticalChance = 0;
|
||||
if (hasCriticalAttack(attacker, target)) {
|
||||
effectiveCriticalChance = attacker.getEffectiveCriticalChance();
|
||||
}
|
||||
if (effectiveCriticalChance > 0) {
|
||||
for (int n = 0; n < numPossibleOutcomes; n++) {
|
||||
avgCriticalDamage += max(0, Math.floor((n + attacker.getDamagePotential().current) * attacker.getCriticalMultiplier()) - target.getDamageResistance()) / numPossibleOutcomes;
|
||||
}
|
||||
}
|
||||
|
||||
float avgDamagePerSuccessfulStrike = (1 - effectiveCriticalChance / 100) * avgNonCriticalDamage + effectiveCriticalChance * avgCriticalDamage / 100;
|
||||
return (float)getAttackHitChance(attacker, target) * avgDamagePerSuccessfulStrike / 100;
|
||||
}
|
||||
private static float getAverageDamagePerTurn(Actor attacker, Actor target) {
|
||||
return getAverageDamagePerHit(attacker, target) * attacker.getAttacksPerTurn();
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.gpl.rpg.AndorsTrail.controller;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Actor;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by gonk on 02.02.2020.
|
||||
*/
|
||||
public class CombatControllerTest {
|
||||
@Test
|
||||
public void getAverageDamagePerHit() throws Exception {
|
||||
Actor attacker = new Actor(null, false, false);
|
||||
attacker.attackChance = 100;
|
||||
attacker.damagePotential.set(5, 3);
|
||||
|
||||
Actor target = new Actor(null, false, false);
|
||||
target.damageResistance = 3;
|
||||
target.blockChance = 50;
|
||||
|
||||
float averageDamagePerHit = CombatController.getAverageDamagePerHit(attacker, target);
|
||||
assertEquals(0.5, averageDamagePerHit, 0.01);
|
||||
|
||||
attacker.criticalSkill = 30;
|
||||
attacker.criticalMultiplier = 2.5f;
|
||||
|
||||
averageDamagePerHit = CombatController.getAverageDamagePerHit(attacker, target);
|
||||
assertEquals(1.038, averageDamagePerHit, 0.01);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user