From 2ff3e26bbc5884a4bb686696967bbd9ced4f0701 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 8 Jun 2023 16:56:58 -0400 Subject: [PATCH] v2.1.1: improved how barkskin handles being applied by multiple sources --- .../assets/messages/actors/actors.properties | 2 +- .../shatteredpixeldungeon/actors/Char.java | 3 +-- .../actors/buffs/Barkskin.java | 26 +++++++++++++++++-- .../actors/hero/Hero.java | 2 +- .../items/food/FrozenCarpaccio.java | 2 +- .../items/food/PhantomMeat.java | 2 +- .../potions/exotic/PotionOfEarthenArmor.java | 3 +-- .../plants/Earthroot.java | 2 +- .../shatteredpixeldungeon/plants/Plant.java | 3 +-- 9 files changed, 32 insertions(+), 13 deletions(-) diff --git a/core/src/main/assets/messages/actors/actors.properties b/core/src/main/assets/messages/actors/actors.properties index bee1b3fe5..a76af1fa7 100644 --- a/core/src/main/assets/messages/actors/actors.properties +++ b/core/src/main/assets/messages/actors/actors.properties @@ -85,7 +85,7 @@ actors.buffs.ascensionchallenge.almost=You feel Yog's grip on the amulet begin t actors.buffs.ascensionchallenge.on_kill=The dark energy consumes you... actors.buffs.barkskin.name=barkskin -actors.buffs.barkskin.desc=Your skin is hardened, it feels rough and solid like bark.\n\nThe hardened skin increases your effective armor, allowing you to better defend against physical attack.\n\nYour armor is currently increased by: 0-%d.\nTurns until barkskin weakens: %s. +actors.buffs.barkskin.desc=Your skin is hardened, it feels rough and solid like bark.\n\nThe hardened skin increases your effective armor, allowing you to better defend against physical attack.\n\nYour armor is currently increased by: 0-%d.\nTurns until barkskin weakens: %s.\n\nIf you receive barkskin from multiple sources, only the strongest one will apply. actors.buffs.barrier.name=barrier actors.buffs.barrier.desc=A durable bubble of force which blocks all damage.\n\nThe barrier will take damage for whatever it is protecting so long as there is shielding left. The shielding will also slowly decay over time.\n\nShielding remaining: %d. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 0e8b36174..dcf2f6855 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -576,8 +576,7 @@ public abstract class Char extends Actor { public int drRoll() { int dr = 0; - Barkskin bark = buff(Barkskin.class); - if (bark != null) dr += Random.NormalIntRange( 0 , bark.level() ); + dr += Random.NormalIntRange( 0 , Barkskin.currentLevel(this) ); return dr; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java index ffa8c7eeb..cd133e289 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Barkskin.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -59,8 +60,7 @@ public class Barkskin extends Buff { } public void set( int value, int time ) { - //decide whether to override, preferring high value + low interval - if (Math.sqrt(interval)*level <= Math.sqrt(time)*value) { + if (level <= value) { level = value; interval = time; spend(time - cooldown() - 1); @@ -108,4 +108,26 @@ public class Barkskin extends Buff { interval = bundle.getInt( INTERVAL ); level = bundle.getInt( LEVEL ); } + + //These two methods allow for multiple instances of barkskin to stack in terms of duration + // but only the stronger bonus is applied + + public static int currentLevel(Char ch ){ + int level = 0; + for (Barkskin b : ch.buffs(Barkskin.class)){ + level = Math.max(level, b.level); + } + return level; + } + + //reset if a matching buff exists, otherwise append + public static void conditionallyAppend(Char ch, int level, int interval){ + for (Barkskin b : ch.buffs(Barkskin.class)){ + if (b.interval == interval){ + b.set(level, interval); + return; + } + } + Buff.append(ch, Barkskin.class).set(level, interval); + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 2a794041c..841f5366f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -819,7 +819,7 @@ public class Hero extends Char { } if(hasTalent(Talent.BARKSKIN) && Dungeon.level.map[pos] == Terrain.FURROWED_GRASS){ - Buff.affect(this, Barkskin.class).set( (lvl*pointsInTalent(Talent.BARKSKIN))/2, 1 ); + Barkskin.conditionallyAppend(this, (lvl*pointsInTalent(Talent.BARKSKIN))/2, 1 ); } return actResult; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/FrozenCarpaccio.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/FrozenCarpaccio.java index 5baacad0a..e987e2e5a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/FrozenCarpaccio.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/FrozenCarpaccio.java @@ -58,7 +58,7 @@ public class FrozenCarpaccio extends Food { break; case 1: GLog.i( Messages.get(FrozenCarpaccio.class, "hard") ); - Buff.affect( hero, Barkskin.class ).set( hero.HT / 4, 1 ); + Barkskin.conditionallyAppend( hero, hero.HT / 4, 1 ); break; case 2: GLog.i( Messages.get(FrozenCarpaccio.class, "refresh") ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/PhantomMeat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/PhantomMeat.java index 82fb669e0..a4d164f66 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/PhantomMeat.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/PhantomMeat.java @@ -49,7 +49,7 @@ public class PhantomMeat extends Food { public static void effect(Hero hero){ - Buff.affect( hero, Barkskin.class ).set( hero.HT / 4, 1 ); + Barkskin.conditionallyAppend( hero, hero.HT / 4, 1 ); Buff.affect( hero, Invisibility.class, Invisibility.DURATION ); if (hero.HP < hero.HT) { hero.HP = Math.min( hero.HP + hero.HT / 4, hero.HT ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfEarthenArmor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfEarthenArmor.java index d544973a3..2673b8350 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfEarthenArmor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/exotic/PotionOfEarthenArmor.java @@ -22,7 +22,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -36,7 +35,7 @@ public class PotionOfEarthenArmor extends ExoticPotion { public void apply( Hero hero ) { identify(); - Buff.affect(hero, Barkskin.class).set( 2 + hero.lvl/3, 50 ); + Barkskin.conditionallyAppend( hero, 2 + hero.lvl/3, 50 ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Earthroot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Earthroot.java index 5d00b6a94..287150003 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Earthroot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Earthroot.java @@ -47,7 +47,7 @@ public class Earthroot extends Plant { if (ch != null){ if (ch instanceof Hero && ((Hero) ch).subClass == HeroSubClass.WARDEN) { - Buff.affect(ch, Barkskin.class).set(Dungeon.hero.lvl + 5, 5); + Barkskin.conditionallyAppend(Dungeon.hero, Dungeon.hero.lvl + 5, 5); } else { Buff.affect(ch, Armor.class).level(ch.HT); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java index 3b8a3dcce..a3150a0d3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/plants/Plant.java @@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barkskin; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -66,7 +65,7 @@ public abstract class Plant implements Bundlable { if (Dungeon.level.heroFOV[pos] && Dungeon.hero.hasTalent(Talent.NATURES_AID)){ // 3/5 turns based on talent points spent - Buff.affect(Dungeon.hero, Barkskin.class).set(2, 1 + 2*(Dungeon.hero.pointsInTalent(Talent.NATURES_AID))); + Barkskin.conditionallyAppend(Dungeon.hero, 2, 1 + 2*(Dungeon.hero.pointsInTalent(Talent.NATURES_AID))); } wither();