v3.0.1: code changes to waterskin so it smartly handles blood vial fx

This commit is contained in:
Evan Debenham
2025-03-09 20:34:10 -04:00
parent 0d045f8620
commit 9235770d12
2 changed files with 38 additions and 18 deletions
@@ -81,27 +81,37 @@ public class Dewdrop extends Item {
public static boolean consumeDew(int quantity, Hero hero, boolean force){ public static boolean consumeDew(int quantity, Hero hero, boolean force){
//20 drops for a full heal //20 drops for a full heal
int heal = Math.round( hero.HT * 0.05f * quantity ); int effect = Math.round( hero.HT * 0.05f * quantity );
int heal = Math.min( hero.HT - hero.HP, effect );
int effect = Math.min( hero.HT - hero.HP, heal );
int shield = 0; int shield = 0;
if (hero.hasTalent(Talent.SHIELDING_DEW)){ if (hero.hasTalent(Talent.SHIELDING_DEW)){
shield = heal - effect;
//When vial is present, this allocates exactly as much of the effect as is needed
// to get to 100% HP, and the rest is then given as shielding (without the vial boost)
if (quantity > 1 && heal < effect && VialOfBlood.delayBurstHealing()){
heal = Math.round(heal/VialOfBlood.totalHealMultiplier());
}
shield = effect - heal;
int maxShield = Math.round(hero.HT *0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW)); int maxShield = Math.round(hero.HT *0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW));
int curShield = 0; int curShield = 0;
if (hero.buff(Barrier.class) != null) curShield = hero.buff(Barrier.class).shielding(); if (hero.buff(Barrier.class) != null) curShield = hero.buff(Barrier.class).shielding();
shield = Math.min(shield, maxShield-curShield); shield = Math.min(shield, maxShield-curShield);
} }
if (effect > 0 || shield > 0) {
if (effect > 0 && quantity > 1 && VialOfBlood.delayBurstHealing()){ if (heal > 0 || shield > 0) {
if (heal > 0 && quantity > 1 && VialOfBlood.delayBurstHealing()){
Healing healing = Buff.affect(hero, Healing.class); Healing healing = Buff.affect(hero, Healing.class);
healing.setHeal(effect, 0, VialOfBlood.maxHealPerTurn()); healing.setHeal(heal, 0, VialOfBlood.maxHealPerTurn());
healing.applyVialEffect(); healing.applyVialEffect();
} else { } else {
hero.HP += effect; hero.HP += heal;
if (effect > 0){ if (heal > 0){
hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(effect), FloatingText.HEALING); hero.sprite.showStatusWithIcon( CharSprite.POSITIVE, Integer.toString(heal), FloatingText.HEALING);
} }
} }
@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.trinkets.VialOfBlood;
import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog; import com.shatteredpixel.shatteredpixeldungeon.journal.Catalog;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
@@ -53,7 +54,7 @@ public class Waterskin extends Item {
unique = true; unique = true;
} }
private int volume = 0; private int volume = 20;
private static final String VOLUME = "volume"; private static final String VOLUME = "volume";
@@ -89,6 +90,15 @@ public class Waterskin extends Item {
float missingHealthPercent = 1f - (hero.HP / (float)hero.HT); float missingHealthPercent = 1f - (hero.HP / (float)hero.HT);
//each drop is worth 5% of total health
float dropsNeeded = missingHealthPercent / 0.05f;
//we are getting extra heal value, scale back drops needed accordingly
if (dropsNeeded > 1.01f && VialOfBlood.delayBurstHealing()){
dropsNeeded /= VialOfBlood.totalHealMultiplier();
}
//add extra drops if we can gain shielding
int curShield = 0; int curShield = 0;
if (hero.buff(Barrier.class) != null) curShield = hero.buff(Barrier.class).shielding(); if (hero.buff(Barrier.class) != null) curShield = hero.buff(Barrier.class).shielding();
int maxShield = Math.round(hero.HT *0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW)); int maxShield = Math.round(hero.HT *0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW));
@@ -96,17 +106,17 @@ public class Waterskin extends Item {
float missingShieldPercent = 1f - (curShield / (float)maxShield); float missingShieldPercent = 1f - (curShield / (float)maxShield);
missingShieldPercent *= 0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW); missingShieldPercent *= 0.2f*hero.pointsInTalent(Talent.SHIELDING_DEW);
if (missingShieldPercent > 0){ if (missingShieldPercent > 0){
missingHealthPercent += missingShieldPercent; dropsNeeded += missingShieldPercent / 0.05f;
} }
} }
//trimming off 0.01 drops helps with floating point errors
int dropsNeeded = (int)Math.ceil((missingHealthPercent / 0.05f) - 0.01f);
dropsNeeded = (int)GameMath.gate(1, dropsNeeded, volume);
if (Dewdrop.consumeDew(dropsNeeded, hero, true)){ //trimming off 0.01 drops helps with floating point errors
volume -= dropsNeeded; int dropsToConsume = (int)Math.ceil(dropsNeeded - 0.01f);
Catalog.countUses(Dewdrop.class, dropsNeeded); dropsToConsume = (int)GameMath.gate(1, dropsToConsume, volume);
if (Dewdrop.consumeDew(dropsToConsume, hero, true)){
volume -= dropsToConsume;
Catalog.countUses(Dewdrop.class, dropsToConsume);
hero.spend(TIME_TO_DRINK); hero.spend(TIME_TO_DRINK);
hero.busy(); hero.busy();