v3.1.0: shield buffs now have a priority order in which they are used
This commit is contained in:
@@ -901,13 +901,7 @@ public abstract class Char extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int shielded = dmg;
|
int shielded = dmg;
|
||||||
//FIXME: when I add proper damage properties, should add an IGNORES_SHIELDS property to use here.
|
dmg = ShieldBuff.processDamage(this, dmg, src);
|
||||||
if (!(src instanceof Hunger)){
|
|
||||||
for (ShieldBuff s : buffs(ShieldBuff.class)){
|
|
||||||
dmg = s.absorbDamage(dmg);
|
|
||||||
if (dmg == 0) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
shielded -= dmg;
|
shielded -= dmg;
|
||||||
HP -= dmg;
|
HP -= dmg;
|
||||||
|
|
||||||
|
|||||||
+34
@@ -24,10 +24,20 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
public abstract class ShieldBuff extends Buff {
|
public abstract class ShieldBuff extends Buff {
|
||||||
|
|
||||||
private int shielding;
|
private int shielding;
|
||||||
|
|
||||||
|
//higher priority shielding buffs are consumed first if multiple exist
|
||||||
|
//currently we have the following:
|
||||||
|
// 2: relatively weak and short term shields like blocking buff
|
||||||
|
// 1: larger but still short-term shields from Cleric's ascended form
|
||||||
|
// 0: everything else, mostly the various sources of generic barrier
|
||||||
|
protected int shieldUsePriority = 0;
|
||||||
protected boolean detachesAtZero = true;
|
protected boolean detachesAtZero = true;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -94,6 +104,30 @@ public abstract class ShieldBuff extends Buff {
|
|||||||
return dmg;
|
return dmg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int processDamage( Char target, int damage, Object src ){
|
||||||
|
//hunger damage is not affected by shielding
|
||||||
|
if (src instanceof Hunger){
|
||||||
|
return damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<ShieldBuff> buffs = new ArrayList<>(target.buffs(ShieldBuff.class));
|
||||||
|
if (!buffs.isEmpty()){
|
||||||
|
//sort in descending order based on shield use priority
|
||||||
|
Collections.sort(buffs, new Comparator<ShieldBuff>() {
|
||||||
|
@Override
|
||||||
|
public int compare(ShieldBuff a, ShieldBuff b) {
|
||||||
|
return b.shieldUsePriority - a.shieldUsePriority;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (ShieldBuff buff : buffs){
|
||||||
|
damage = buff.absorbDamage(damage);
|
||||||
|
if (damage == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return damage;
|
||||||
|
}
|
||||||
|
|
||||||
private static final String SHIELDING = "shielding";
|
private static final String SHIELDING = "shielding";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
@@ -77,6 +77,7 @@ public class AscendedForm extends ArmorAbility {
|
|||||||
type = buffType.POSITIVE;
|
type = buffType.POSITIVE;
|
||||||
|
|
||||||
detachesAtZero = false;
|
detachesAtZero = false;
|
||||||
|
shieldUsePriority = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float DURATION = 10f;
|
public static float DURATION = 10f;
|
||||||
|
|||||||
+4
@@ -93,6 +93,10 @@ public class DivineIntervention extends ClericSpell {
|
|||||||
|
|
||||||
public static class DivineShield extends ShieldBuff{
|
public static class DivineShield extends ShieldBuff{
|
||||||
|
|
||||||
|
{
|
||||||
|
shieldUsePriority = 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean act() {
|
public boolean act() {
|
||||||
|
|
||||||
|
|||||||
+2
@@ -70,6 +70,8 @@ public class Blocking extends Weapon.Enchantment {
|
|||||||
|
|
||||||
{
|
{
|
||||||
type = buffType.POSITIVE;
|
type = buffType.POSITIVE;
|
||||||
|
|
||||||
|
shieldUsePriority = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user