v1.3.0: fixed various bugs with damage boosting effects

This commit is contained in:
Evan Debenham
2022-06-13 12:08:30 -04:00
parent 27bec7f377
commit 921a2d3b8f
5 changed files with 28 additions and 20 deletions
@@ -315,7 +315,7 @@ public abstract class Char extends Actor {
} else if (hit( this, enemy, accMulti )) { } else if (hit( this, enemy, accMulti )) {
int dr = Math.round(enemy.drRoll() * AscensionChallenge.statModifier(this)); int dr = Math.round(enemy.drRoll() * AscensionChallenge.statModifier(enemy));
Barkskin bark = enemy.buff(Barkskin.class); Barkskin bark = enemy.buff(Barkskin.class);
if (bark != null) dr += Random.NormalIntRange( 0 , bark.level() ); if (bark != null) dr += Random.NormalIntRange( 0 , bark.level() );
@@ -332,7 +332,9 @@ public abstract class Char extends Actor {
} }
} }
int dmg; //we use a float here briefly so that we don't have to constantly round while
// potentially applying various multiplier effects
float dmg;
Preparation prep = buff(Preparation.class); Preparation prep = buff(Preparation.class);
if (prep != null){ if (prep != null){
dmg = prep.damageRoll(this); dmg = prep.damageRoll(this);
@@ -352,6 +354,13 @@ public abstract class Char extends Actor {
dmg *= 1.5f; dmg *= 1.5f;
} }
for (ChampionEnemy buff : buffs(ChampionEnemy.class)){
dmg *= buff.meleeDamageFactor();
}
dmg *= AscensionChallenge.statModifier(this);
//flat damage bonus is applied after positive multipliers, but before negative ones
dmg += dmgBonus; dmg += dmgBonus;
//friendly endure //friendly endure
@@ -368,9 +377,14 @@ public abstract class Char extends Actor {
dmg *= 0.67f; dmg *= 0.67f;
} }
int effectiveDamage = enemy.defenseProc( this, dmg ); if ( buff(Weakness.class) != null ){
dmg *= 0.67f;
}
int effectiveDamage = enemy.defenseProc( this, Math.round(dmg) );
effectiveDamage = Math.max( effectiveDamage - dr, 0 ); effectiveDamage = Math.max( effectiveDamage - dr, 0 );
//vulnerable specifically applies after armor reductions
if ( enemy.buff( Vulnerable.class ) != null){ if ( enemy.buff( Vulnerable.class ) != null){
effectiveDamage *= 1.33f; effectiveDamage *= 1.33f;
} }
@@ -505,14 +519,9 @@ public abstract class Char extends Actor {
// atm attack is always post-armor and defence is already pre-armor // atm attack is always post-armor and defence is already pre-armor
public int attackProc( Char enemy, int damage ) { public int attackProc( Char enemy, int damage ) {
if ( buff(Weakness.class) != null ){
damage *= 0.67f;
}
for (ChampionEnemy buff : buffs(ChampionEnemy.class)){ for (ChampionEnemy buff : buffs(ChampionEnemy.class)){
damage *= buff.meleeDamageFactor();
buff.onAttackProc( enemy ); buff.onAttackProc( enemy );
} }
damage = Math.round( damage * AscensionChallenge.statModifier(this));
return damage; return damage;
} }
@@ -81,7 +81,7 @@ public class AscensionChallenge extends Buff {
} }
for (Class<?extends Mob> cls : modifiers.keySet()){ for (Class<?extends Mob> cls : modifiers.keySet()){
if (ch.getClass().isAssignableFrom(cls)){ if (cls.isAssignableFrom(ch.getClass())){
return modifiers.get(cls); return modifiers.get(cls);
} }
} }
@@ -132,7 +132,7 @@ public class AscensionChallenge extends Buff {
//only enemies that are boosted count //only enemies that are boosted count
boolean found = false; boolean found = false;
for (Class<?extends Mob> cls : modifiers.keySet()){ for (Class<?extends Mob> cls : modifiers.keySet()){
if (enemy.getClass().isAssignableFrom(cls)){ if (cls.isAssignableFrom(enemy.getClass())){
found = true; found = true;
break; break;
} }
@@ -168,7 +168,7 @@ public class AscensionChallenge extends Buff {
return 7; //half of 13, rounded up return 7; //half of 13, rounded up
} else { } else {
for (Class<?extends Mob> cls : modifiers.keySet()){ for (Class<?extends Mob> cls : modifiers.keySet()){
if (m.getClass().isAssignableFrom(cls)){ if (cls.isAssignableFrom(m.getClass())){
return Math.max(13, m.EXP); //same exp as an eye return Math.max(13, m.EXP); //same exp as an eye
} }
} }
@@ -122,9 +122,8 @@ public class Berserk extends Buff {
return Math.min(1f, power); return Math.min(1f, power);
} }
public int damageFactor(int dmg){ public float damageFactor(float dmg){
float bonus = Math.min(1.5f, 1f + (power / 2f)); return dmg * Math.min(1.5f, 1f + (power / 2f));
return Math.round(dmg * bonus);
} }
public boolean berserking(){ public boolean berserking(){
@@ -221,7 +220,7 @@ public class Berserk extends Buff {
@Override @Override
public String desc() { public String desc() {
float dispDamage = (damageFactor(10000) / 100f) - 100f; float dispDamage = ((int)damageFactor(10000) / 100f) - 100f;
switch (state){ switch (state){
case NORMAL: default: case NORMAL: default:
return Messages.get(this, "angered_desc", Math.floor(power * 100f), dispDamage); return Messages.get(this, "angered_desc", Math.floor(power * 100f), dispDamage);
@@ -1223,7 +1223,7 @@ public class Hero extends Char {
if (!(src instanceof Char)){ if (!(src instanceof Char)){
//reduce damage here if it isn't coming from a character (if it is we already reduced it) //reduce damage here if it isn't coming from a character (if it is we already reduced it)
if (endure != null){ if (endure != null){
dmg = endure.adjustDamageTaken(dmg); dmg = Math.round(endure.adjustDamageTaken(dmg));
} }
//the same also applies to challenge scroll damage reduction //the same also applies to challenge scroll damage reduction
if (buff(ScrollOfChallenge.ChallengeArena.class) != null){ if (buff(ScrollOfChallenge.ChallengeArena.class) != null){
@@ -109,10 +109,10 @@ public class Endure extends ArmorAbility {
hitsLeft = 0; hitsLeft = 0;
} }
public int adjustDamageTaken(int damage){ public float adjustDamageTaken(float damage){
if (enduring) { if (enduring) {
damageBonus += damage/2; damageBonus += damage/2;
return damage/2; return damage/2f;
} }
return damage; return damage;
} }
@@ -155,7 +155,7 @@ public class Endure extends ArmorAbility {
} }
} }
public int damageFactor(int damage){ public float damageFactor(float damage){
if (enduring){ if (enduring){
return damage; return damage;
} else { } else {