From 84044fa6586609db40f00ccdb0f49569c5b77ce6 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 24 Nov 2022 17:14:43 -0500 Subject: [PATCH] v2.0.0: adjusted pickaxe code and gave it a duelist ability --- .../assets/messages/items/items.properties | 4 +- .../actors/mobs/npcs/Blacksmith.java | 1 + .../items/quest/Pickaxe.java | 100 +++++++++++++----- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index fee878dc7..4a512f70e 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -842,7 +842,9 @@ items.quest.metalshard.desc=A shard of rusted cursed metal, which broke off DM-3 items.quest.pickaxe.name=pickaxe items.quest.pickaxe.ac_mine=MINE items.quest.pickaxe.no_vein=There is no dark gold vein near you to mine. -items.quest.pickaxe.desc=This is a large and sturdy tool for breaking rocks. Probably it can be used as a weapon. +items.quest.pickaxe.ability_name=smash +items.quest.pickaxe.ability_desc=The duelist can _smash_ an enemy with a pickaxe. This is guaranteed to hit, applies vulnerable for 3 turns, and deals double damage to enemies with rigid skin. +items.quest.pickaxe.desc=This is a sturdy and heavy tool for breaking rocks. It can probably be used as a weapon in a pinch. items.quest.ratskull.name=giant rat skull items.quest.ratskull.desc=A surprisingly large rat skull. It would make a great hunting trophy, if you had a wall to mount it on. diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java index 0937fec47..490d16474 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java @@ -99,6 +99,7 @@ public class Blacksmith extends NPC { Notes.add( Notes.Landmark.TROLL ); Pickaxe pick = new Pickaxe(); + pick.identify(); if (pick.doPickUp( Dungeon.hero )) { GLog.i( Messages.capitalize(Messages.get(Dungeon.hero, "you_now_have", pick.name()) )); } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/Pickaxe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/Pickaxe.java index 265e3b3d7..72190f6b7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/Pickaxe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/Pickaxe.java @@ -25,11 +25,21 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vulnerable; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Bat; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Crab; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Scorpio; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Spinner; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Swarm; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RunicBlade; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -44,7 +54,7 @@ import com.watabou.utils.PathFinder; import java.util.ArrayList; -public class Pickaxe extends Weapon { +public class Pickaxe extends MeleeWeapon { public static final String AC_MINE = "MINE"; @@ -59,26 +69,15 @@ public class Pickaxe extends Weapon { unique = true; bones = false; - - defaultAction = AC_MINE; + tier = 2; } public boolean bloodStained = false; - @Override - public int min(int lvl) { - return 2; //tier 2 - } - - @Override - public int max(int lvl) { - return 15; //tier 2 - } - @Override public int STRReq(int lvl) { - return STRReq(3, lvl); //tier 3 + return super.STRReq(lvl) + 2; //tier 3 strength requirement with tier 2 damage stats } @Override @@ -139,16 +138,6 @@ public class Pickaxe extends Weapon { } } - @Override - public boolean isUpgradable() { - return false; - } - - @Override - public boolean isIdentified() { - return true; - } - @Override public int proc( Char attacker, Char defender, int damage ) { if (!bloodStained && defender instanceof Bat) { @@ -170,9 +159,62 @@ public class Pickaxe extends Weapon { } }); } - return damage; + return super.proc( attacker, defender, damage ); } - + + @Override + public String defaultAction() { + if (Dungeon.hero.heroClass == HeroClass.DUELIST && isEquipped(Dungeon.hero)){ + return AC_ABILITY; + } else { + return AC_MINE; + } + } + + @Override + public String targetingPrompt() { + return Messages.get(this, "prompt"); + } + + @Override + protected void duelistAbility(Hero hero, Integer target) { + if (target == null) { + return; + } + + Char enemy = Actor.findChar(target); + if (enemy == null || enemy == hero || hero.isCharmedBy(enemy) || !Dungeon.level.heroFOV[target]) { + GLog.w(Messages.get(this, "ability_no_target")); + return; + } + + if (!hero.canAttack(enemy)){ + GLog.w(Messages.get(this, "ability_bad_position")); + return; + } + + hero.sprite.attack(enemy.pos, new Callback() { + @Override + public void call() { + float damageMulti = 1f; + if (Char.hasProp(enemy, Char.Property.INORGANIC) + || enemy instanceof Swarm + || enemy instanceof Crab + || enemy instanceof Spinner + || enemy instanceof Scorpio) { + damageMulti = 2f; + } + hero.attack(enemy, damageMulti, 0, Char.INFINITE_ACCURACY); + if (enemy.isAlive()){ + Buff.affect(enemy, Vulnerable.class, 3f); + } + onAbilityUsed(hero); + Sample.INSTANCE.play(Assets.Sounds.HIT_STRONG); + hero.spendAndNext(hero.attackDelay()); + } + }); + } + private static final String BLOODSTAINED = "bloodStained"; @Override @@ -191,7 +233,11 @@ public class Pickaxe extends Weapon { @Override public Glowing glowing() { - return bloodStained ? BLOODY : null; + if (super.glowing() == null) { + return bloodStained ? BLOODY : null; + } else { + return super.glowing(); + } } }