From 69be76c7cfa2b3d05dc4baeb7ada2474006575b7 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 7 Dec 2022 16:26:28 -0500 Subject: [PATCH] v2.0.0: added a weapon ability for the flail --- core/src/main/assets/interfaces/buffs.png | Bin 1498 -> 1515 bytes .../main/assets/interfaces/large_buffs.png | Bin 3202 -> 3255 bytes .../assets/messages/items/items.properties | 3 + .../items/weapon/melee/Flail.java | 110 ++++++++++++++++++ .../ui/BuffIndicator.java | 1 + 5 files changed, 114 insertions(+) diff --git a/core/src/main/assets/interfaces/buffs.png b/core/src/main/assets/interfaces/buffs.png index 27b5b5414a9c91a1d21c515dacdaa9128afe227f..1457fd801acb77f282ec1427a83d69288e1e93b5 100644 GIT binary patch delta 985 zcmV;~119|13+oH8VF3YklVSnIf3>pER^$kS@HwF){~m}tM3}SJjk)M7Zr9!A{of;1 zUC@&Z@#Slp^{tQUzZnYHXI{Vz4HOYy3`ej6ffXLX&)CQZ5cu`&uRMZs85Q93e~SH? z`IR<6fzM_Ft8C!wziGf>GvDy0c#|&*0BRr=`1RMfXd&A`b_O^BX#-yye-!?H28^JA zl9dd6jRk=fEDErK{2KDtAW#5*IRn{SkjrrfI8*=O7RZ1CSP&2z!hgC2Cf3D<*c4l0 zTja%#*cE2Bhg}h|*cVmtk#N9j&O|CuDv}by>lA2^jm>6jv(SRFxvJlul zL<2!U4KN=DdwVsky_vuyj`>nP1p0j#Am3o%P=VEg01R{l{QTJSe+Fp48DM^BfS;cN zgfs94TLNhVm;g2qk7G8#dmD*ciM9$iw>LL40l&6J82Hgvu2|$Ne<~jx!C>Bi(ZFvwtbI?` zT${Mh3@a5lJ-s_Uwb`%Q)hhC<=5+U1qiV3Qb8{yvz=3m!c7y`%U`YZ`XQQkD(y@`B&%fr)Vbv^l2Q&x*a5`9y zz?qH!`E!BU*eM?Zu2wsM00M)6j&wN!AT&UOQfOcUOZgC}VNrk;=nP^Vfm@2e*-QY7 zLx}t^0~@az!UNtTB*zCaaefGw-N0`fs9Zpy{-N)HQ3n73eSd+HR`~*a00000NkvXX Hu0mjfUURr< delta 968 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 PK5=M`Z-7s^wKEFQ=(+v4m1XUYUZ$k#r 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 Ar~m)} diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 9df265f03..eb490f19c 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1510,6 +1510,9 @@ items.weapon.melee.dirk.desc=A longer thrusting dagger, gives a bit more steel t items.weapon.melee.flail.name=flail items.weapon.melee.flail.stats_desc=This is a rather inaccurate weapon.\nThis weapon cannot surprise attack. +items.weapon.melee.flail.ability_name=spin +items.weapon.melee.flail.spin_warn=You can't spin the flail any more. +items.weapon.melee.flail.ability_desc=The Duelist can _spin_ a flail to build up power for a short time. Each turn the flail is spun it will deal +20% damage, to a max of 3 times. At 3 spins the flail is also guaranteed to hit. Starting to spin the flail costs 2 charges. items.weapon.melee.flail.desc=A spiked ball attached to a handle by a length of chain. Very unwieldy, but devastating if it lands a solid hit. items.weapon.melee.gauntlet.name=stone gauntlet diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java index 272d2fadf..315289538 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Flail.java @@ -22,7 +22,18 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Bundle; public class Flail extends MeleeWeapon { @@ -41,4 +52,103 @@ public class Flail extends MeleeWeapon { return Math.round(7*(tier+1)) + //35 base, up from 25 lvl*Math.round(1.6f*(tier+1)); //+8 per level, up from +5 } + + @Override + public int damageRoll(Char owner) { + int dmg = super.damageRoll(owner); + + SpinAbilityTracker spin = owner.buff(SpinAbilityTracker.class); + if (spin != null){ + dmg = Math.round(dmg * (1f + 0.2f*spin.spins)); + if (spin.spins == 3) Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG); + spin.detach(); + } + + return dmg; + } + + @Override + public float accuracyFactor(Char owner, Char target) { + SpinAbilityTracker spin = owner.buff(SpinAbilityTracker.class); + if (spin != null && spin.spins >= 3f) { + return Float.POSITIVE_INFINITY; + } else { + return super.accuracyFactor(owner, target); + } + } + + @Override + public int abilityChargeUse() { + return (Dungeon.hero.buff(SpinAbilityTracker.class) == null) ? 2 : 0; + } + + @Override + protected void duelistAbility(Hero hero, Integer target) { + + onAbilityUsed(hero); + SpinAbilityTracker spin = hero.buff(SpinAbilityTracker.class); + + if (spin == null){ + spin = Buff.affect(hero, SpinAbilityTracker.class, 3f); + } + + if (spin.spins < 3){ + spin.spins++; + Buff.prolong(hero, SpinAbilityTracker.class, 3f); + Sample.INSTANCE.play(Assets.Sounds.CHAINS, 1, 1, 0.9f + 0.1f*spin.spins); + hero.sprite.operate(hero.pos); + hero.spendAndNext(hero.attackDelay()); + BuffIndicator.refreshHero(); + } else { + GLog.w(Messages.get(this, "spin_warn")); + } + } + + public static class SpinAbilityTracker extends FlavourBuff { + + { + type = buffType.POSITIVE; + } + + public int spins = 0; + + @Override + public int icon() { + return BuffIndicator.DUEL_SPIN; + } + + @Override + public void tintIcon(Image icon) { + switch (spins){ + case 1: default: + icon.hardlight(0, 1, 0); + break; + case 2: + icon.hardlight(1, 1, 0); + break; + case 3: + icon.hardlight(1, 0, 0); + break; + } + } + + @Override + public float iconFadePercent() { + return Math.max(0, (3 - visualcooldown()) / 3); + } + + public static String SPINS = "spins"; + + @Override + public void storeInBundle(Bundle bundle) { + super.storeInBundle(bundle); + bundle.put(SPINS, spins); + } + + @Override + public void restoreFromBundle(Bundle bundle) { + super.restoreFromBundle(bundle); + spins = bundle.getInt(SPINS); + } + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java index 94024b449..8295f4f84 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BuffIndicator.java @@ -113,6 +113,7 @@ public class BuffIndicator extends Component { public static final int AMULET = 59; public static final int DUEL_CLEAVE = 60; public static final int DUEL_GUARD = 61; + public static final int DUEL_SPIN = 62; public static final int SIZE_SMALL = 7; public static final int SIZE_LARGE = 16;