diff --git a/assets/buffs.png b/assets/buffs.png index f2f365c74..575cfe8c4 100644 Binary files a/assets/buffs.png and b/assets/buffs.png differ diff --git a/assets/large_buffs.png b/assets/large_buffs.png index 2803b6c64..624f5f7c4 100644 Binary files a/assets/large_buffs.png and b/assets/large_buffs.png differ diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 099ddd966..550b4dab1 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -86,6 +86,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicalInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; @@ -102,7 +103,6 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; -import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.shatteredpixel.shatteredpixeldungeon.windows.WndResurrect; @@ -872,18 +872,10 @@ public class Hero extends Char { } break; case BATTLEMAGE: - if (wep instanceof Wand) { - Wand wand = (Wand)wep; - if (wand.curCharges < wand.maxCharges && damage > 0) { - - wand.curCharges++; - if (Dungeon.quickslot.contains(wand)) { - QuickSlotButton.refresh(); - } - - ScrollOfRecharging.charge( this ); - } - damage += wand.curCharges; + if (wep instanceof Wand || wep instanceof MagesStaff) { + //gives wands 50% charge + Buff.affect( this, ScrollOfRecharging.Recharging.class, 2f); + ScrollOfRecharging.charge( this ); } break; case SNIPER: diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java index 77afedb4d..570e6216b 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java @@ -17,6 +17,9 @@ */ package com.shatteredpixel.shatteredpixeldungeon.items.scrolls; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; @@ -27,6 +30,8 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; public class ScrollOfRecharging extends Scroll { + public static final float BUFF_DURATION = 30f; + { name = "Scroll of Recharging"; initials = "Re"; @@ -34,19 +39,15 @@ public class ScrollOfRecharging extends Scroll { @Override protected void doRead() { - - int count = curUser.belongings.charge( true ); - charge( curUser ); + + Buff.affect(curUser, Recharging.class, BUFF_DURATION); + charge(curUser); Sample.INSTANCE.play( Assets.SND_READ ); Invisibility.dispel(); - - if (count > 0) { - GLog.i( "a surge of energy courses through your pack, recharging your wand" + (count > 1 ? "s" : "") ); - SpellSprite.show( curUser, SpellSprite.CHARGE ); - } else { - GLog.i( "a surge of energy courses through your pack, but nothing happens" ); - } + + GLog.i( "a surge of energy courses through your body, invigorating your wands."); + SpellSprite.show( curUser, SpellSprite.CHARGE ); setKnown(); curUser.spendAndNext( TIME_TO_READ ); @@ -56,7 +57,7 @@ public class ScrollOfRecharging extends Scroll { public String desc() { return "The raw magical power bound up in this parchment will, when released, " + - "recharge all of the reader's wands to full power."; + "charge up all the users wands over time."; } public static void charge( Hero hero ) { @@ -67,4 +68,28 @@ public class ScrollOfRecharging extends Scroll { public int price() { return isKnown() ? 40 * quantity : super.price(); } + + + public static class Recharging extends FlavourBuff { + + @Override + public int icon() { + return BuffIndicator.CHARGE; + } + + @Override + public String toString() { + return "Recharging"; + } + + //want to process partial turns for this buff, and not count it when it's expiring. + //firstly, if this buff has half a turn left, should give out half the benefit. + //secondly, recall that buffs execute in random order, so this can cause a problem where we can't simply check + //if this buff is still attached, must instead directly check its remaining time, and act accordingly. + //otherwise this causes inconsistent behaviour where this may detach before, or after, a wand charger acts. + public float remainder() { + return Math.min( 1f, this.cooldown()); + } + + } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index 46de4cb82..60ed89387 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -19,6 +19,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.wands; import java.util.ArrayList; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; @@ -61,7 +62,7 @@ public abstract class Wand extends KindOfWeapon { public int maxCharges = initialCharges(); public int curCharges = maxCharges; - private float partialCharge = 0f; + protected float partialCharge = 0f; protected Charger charger; @@ -123,7 +124,7 @@ public abstract class Wand extends KindOfWeapon { } protected abstract void onZap( Ballistica attack ); - + @Override public boolean collect( Bag container ) { if (super.collect( container )) { @@ -395,6 +396,8 @@ public abstract class Wand extends KindOfWeapon { private static final float SCALING_CHARGE_ADDITION = 40f; private static final float NORMAL_SCALE_FACTOR = 0.85f; + private static final float CHARGE_BUFF_BONUS = 0.25f; + float scalingFactor = NORMAL_SCALE_FACTOR; @Override @@ -427,6 +430,11 @@ public abstract class Wand extends KindOfWeapon { + (SCALING_CHARGE_ADDITION * Math.pow(scalingFactor, missingCharges))); partialCharge += 1f/turnsToCharge; + + ScrollOfRecharging.Recharging bonus = target.buff(ScrollOfRecharging.Recharging.class); + if (bonus != null && bonus.remainder() > 0f){ + partialCharge += CHARGE_BUFF_BONUS * bonus.remainder(); + } } private void setScaleFactor(float value){ diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/src/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index dcc947e08..9ecce0be9 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -67,6 +67,7 @@ public class BuffIndicator extends Component { public static final int THORNS = 31; public static final int FORESIGHT = 32; public static final int VERTIGO = 33; + public static final int CHARGE = 34; public static final int SIZE = 7;