From bd3b87c9afb0b969d8dacdcebe1d37a60e633867 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 22 Nov 2018 01:29:53 -0500 Subject: [PATCH] v0.7.1: reworked huntress's signature weapon --- core/src/main/assets/items.png | Bin 19362 -> 19392 bytes .../shatteredpixeldungeon/QuickSlot.java | 15 +- .../actors/hero/Hero.java | 2 + .../actors/hero/HeroClass.java | 8 +- .../shatteredpixeldungeon/items/Item.java | 2 +- .../items/armor/Armor.java | 2 +- .../items/weapon/SpiritBow.java | 221 ++++++++++++++++++ .../items/weapon/Weapon.java | 1 + .../items/weapon/missiles/darts/Dart.java | 11 +- .../sprites/ItemSpriteSheet.java | 13 +- .../sprites/MissileSprite.java | 5 + .../shatteredpixeldungeon/windows/WndBag.java | 3 +- .../windows/WndStartGame.java | 4 +- .../messages/actors/actors.properties | 6 +- .../messages/items/items.properties | 6 + 15 files changed, 270 insertions(+), 29 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/SpiritBow.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index a78acb238f8131deb69cc7e5521a973ac2d8ea42..339594248c874ed631f8fe0eac215d9f437fc7bc 100644 GIT binary patch literal 19392 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∓wNvB{`- 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 NeWU|>tG}gX{1a&V{>K0S literal 19362 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%0DnUOW8umBrz`Gdx4&W{EA)WxtnCdLHAR^|BTPsp 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 B&20bx diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java index c36c2399b..3446173e6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/QuickSlot.java @@ -92,12 +92,15 @@ public class QuickSlot { } public void convertToPlaceholder(Item item){ - Item placeholder = item.virtual(); - - if (placeholder != null && contains(item)) - for (int i = 0; i < SIZE; i++) - if (getItem(i) == item) - setSlot( i , placeholder ); + + if (contains(item)) { + Item placeholder = item.virtual(); + if (placeholder == null) return; + + for (int i = 0; i < SIZE; i++) { + if (getItem(i) == item) setSlot(i, placeholder); + } + } } public Item randomNonePlaceholder(){ 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 b5a989aac..8233418a5 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 @@ -1248,6 +1248,8 @@ public class Hero extends Char { sprite.showStatus( CharSprite.POSITIVE, Messages.get(Hero.class, "level_up") ); Sample.INSTANCE.play( Assets.SND_LEVELUP ); + Item.updateQuickslot(); + Badges.validateLevelReached(); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index 0b7bf3775..4c50dd844 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -39,11 +39,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Knuckles; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingStone; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -168,10 +168,10 @@ public enum HeroClass { private static void initHuntress( Hero hero ) { (hero.belongings.weapon = new Knuckles()).identify(); - Boomerang boomerang = new Boomerang(); - boomerang.identify().collect(); + SpiritBow bow = new SpiritBow(); + bow.identify().collect(); - Dungeon.quickslot.setSlot(0, boomerang); + Dungeon.quickslot.setSlot(0, bow); new VelvetPouch().collect(); Dungeon.LimitedDrops.VELVET_POUCH.drop(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index ab0e731ea..46919ef17 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -447,7 +447,7 @@ public class Item implements Bundlable { return quantity != 1 ? Integer.toString( quantity ) : null; } - public void updateQuickslot() { + public static void updateQuickslot() { QuickSlotButton.refresh(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java index 58dfc7097..e4deb4c2c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java @@ -491,7 +491,7 @@ public class Armor extends EquipableItem { public Armor inscribe( Glyph glyph ) { this.glyph = glyph; - + updateQuickslot(); return this; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/SpiritBow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/SpiritBow.java new file mode 100644 index 000000000..04ce4675b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/SpiritBow.java @@ -0,0 +1,221 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2018 Evan Debenham + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.items.weapon; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass; +import com.shatteredpixel.shatteredpixeldungeon.effects.Splash; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +import java.util.ArrayList; + +public class SpiritBow extends Weapon { + + public static final String AC_SHOOT = "SHOOT"; + + { + image = ItemSpriteSheet.SPIRIT_BOW; + + defaultAction = AC_SHOOT; + usesTargeting = true; + + unique = true; + bones = false; + } + + @Override + public ArrayList actions(Hero hero) { + ArrayList actions = super.actions(hero); + actions.remove(AC_EQUIP); + actions.add(AC_SHOOT); + return actions; + } + + @Override + public void execute(Hero hero, String action) { + super.execute(hero, action); + if (action.equals(AC_SHOOT)) { + GameScene.selectCell( shooter ); + } + } + + @Override + public String info() { + String info = desc(); + + info += "\n\n" + Messages.get( SpiritBow.class, "stats", + Math.round(augment.damageFactor(min())), + Math.round(augment.damageFactor(max())), + STRReq()); + + if (STRReq() > Dungeon.hero.STR()) { + info += " " + Messages.get(Weapon.class, "too_heavy"); + } else if (Dungeon.hero.heroClass == HeroClass.HUNTRESS && Dungeon.hero.STR() > STRReq()){ + info += " " + Messages.get(Weapon.class, "excess_str", Dungeon.hero.STR() - STRReq()); + } + + switch (augment) { + case SPEED: + info += "\n\n" + Messages.get(Weapon.class, "faster"); + break; + case DAMAGE: + info += "\n\n" + Messages.get(Weapon.class, "stronger"); + break; + case NONE: + } + + if (enchantment != null && (cursedKnown || !enchantment.curse())){ + info += "\n\n" + Messages.get(Weapon.class, "enchanted", enchantment.name()); + info += " " + Messages.get(enchantment, "desc"); + } + + if (cursed && isEquipped( Dungeon.hero )) { + info += "\n\n" + Messages.get(Weapon.class, "cursed_worn"); + } else if (cursedKnown && cursed) { + info += "\n\n" + Messages.get(Weapon.class, "cursed"); + } else if (!isIdentified() && cursedKnown){ + info += "\n\n" + Messages.get(Weapon.class, "not_cursed"); + } + + info += "\n\n" + Messages.get(MissileWeapon.class, "distance"); + + return info; + } + + @Override + public int STRReq(int lvl) { + lvl = Math.max(0, lvl); + //strength req decreases at +1,+3,+6,+10,etc. + return 10 - (int)(Math.sqrt(8 * lvl + 1) - 1)/2; + } + + @Override + public int min(int lvl) { + return 1 + Dungeon.hero.lvl/6; + } + + @Override + public int max(int lvl) { + return 6 + Dungeon.hero.lvl/3; + } + + @Override + public int damageRoll(Char owner) { + int damage = augment.damageFactor(super.damageRoll( owner )); + + if (owner instanceof Hero) { + int exStr = ((Hero)owner).STR() - STRReq(); + if (exStr > 0) { + damage += Random.IntRange( 0, exStr ); + } + } + + return damage; + } + + @Override + public int level() { + return Dungeon.hero.lvl/5; + } + + @Override + public int visiblyUpgraded() { + return level(); + } + + //for fetching upgrades from a boomerang from pre-0.7.0 + //TODO implement on this + public int spentUpgrades() { + return super.level(); + } + + @Override + public boolean isUpgradable() { + return false; + } + + public class SpiritArrow extends MissileWeapon { + + { + image = ItemSpriteSheet.SPIRIT_ARROW; + } + + @Override + public int damageRoll(Char owner) { + return SpiritBow.this.damageRoll(owner); + } + + @Override + public boolean hasEnchant(Class type, Char owner) { + return SpiritBow.this.hasEnchant(type, owner); + } + + @Override + public int proc(Char attacker, Char defender, int damage) { + return SpiritBow.this.proc(attacker, defender, damage); + } + + @Override + public float castDelay(Char user, int dst) { + return SpiritBow.this.speedFactor(user); + } + + @Override + public int STRReq(int lvl) { + return SpiritBow.this.STRReq(lvl); + } + + @Override + protected void onThrow( int cell ) { + Char enemy = Actor.findChar( cell ); + if (enemy == null || enemy == curUser) { + parent = null; + Splash.at( cell, 0xCC99FFFF, 1 ); + } else { + if (!curUser.shoot( enemy, this )) { + Splash.at(cell, 0xCC99FFFF, 1); + } + } + } + } + + private CellSelector.Listener shooter = new CellSelector.Listener() { + @Override + public void onSelect( Integer target ) { + if (target != null) { + new SpiritArrow().cast(curUser, target); + } + } + @Override + public String prompt() { + return Messages.get(SpiritBow.class, "prompt"); + } + }; +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java index cc963f0ae..580808afb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java @@ -239,6 +239,7 @@ abstract public class Weapon extends KindOfWeapon { public Weapon enchant( Enchantment ench ) { enchantment = ench; + updateQuickslot(); return this; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java index 1ad9677bf..cb5be2104 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/Dart.java @@ -24,8 +24,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; -import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Projecting; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -76,12 +74,11 @@ public class Dart extends MissileWeapon { } @Override - public int throwPos(Hero user, int dst) { - if (bow != null && bow.hasEnchant(Projecting.class, user) - && !Dungeon.level.solid[dst] && Dungeon.level.distance(user.pos, dst) <= 4){ - return dst; + public boolean hasEnchant(Class type, Char owner) { + if (bow != null && bow.hasEnchant(type, owner)){ + return true; } else { - return super.throwPos(user, dst); + return super.hasEnchant(type, owner); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 8caa841fe..b07ce86b2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -77,14 +77,17 @@ public class ItemSpriteSheet { public static final int DEWDROP = UNCOLLECTIBLE+1; public static final int PETAL = UNCOLLECTIBLE+2; public static final int SANDBAG = UNCOLLECTIBLE+3; + public static final int SPIRIT_ARROW = UNCOLLECTIBLE+4; - public static final int GUIDE_PAGE = UNCOLLECTIBLE+5; - public static final int ALCH_PAGE = UNCOLLECTIBLE+6; + public static final int GUIDE_PAGE = UNCOLLECTIBLE+6; + public static final int ALCH_PAGE = UNCOLLECTIBLE+7; static{ assignItemRect(GOLD, 15, 13); assignItemRect(DEWDROP, 10, 10); assignItemRect(PETAL, 8, 8); assignItemRect(SANDBAG, 10, 10); + assignItemRect(SPIRIT_ARROW,11, 11); + assignItemRect(GUIDE_PAGE, 10, 11); assignItemRect(ALCH_PAGE, 10, 11); } @@ -256,7 +259,7 @@ public class ItemSpriteSheet { //8 free slots private static final int MISSILE_WEP = xy(1, 10); //16 slots. 3 per tier + boomerang - public static final int BOOMERANG = MISSILE_WEP+0; + public static final int SPIRIT_BOW = MISSILE_WEP+0; public static final int DART = MISSILE_WEP+1; public static final int THROWING_KNIFE = MISSILE_WEP+2; @@ -267,6 +270,7 @@ public class ItemSpriteSheet { public static final int THROWING_SPEAR = MISSILE_WEP+7; public static final int BOLAS = MISSILE_WEP+8; + public static final int BOOMERANG = MISSILE_WEP+9; public static final int JAVELIN = MISSILE_WEP+10; public static final int TOMAHAWK = MISSILE_WEP+11; @@ -275,7 +279,7 @@ public class ItemSpriteSheet { public static final int THROWING_HAMMER = MISSILE_WEP+14; static{ - assignItemRect(BOOMERANG, 14, 14); + assignItemRect(SPIRIT_BOW, 16, 16); assignItemRect(DART, 15, 15); assignItemRect(THROWING_KNIFE, 12, 13); @@ -286,6 +290,7 @@ public class ItemSpriteSheet { assignItemRect(THROWING_SPEAR, 13, 13); assignItemRect(BOLAS, 15, 14); + assignItemRect(BOOMERANG, 14, 14); assignItemRect(JAVELIN, 16, 16); assignItemRect(TOMAHAWK, 13, 13); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java index 509d51e9d..b1752a2f4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang; @@ -80,6 +81,7 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { private static final HashMap, Integer> ANGULAR_SPEEDS = new HashMap<>(); static { + ANGULAR_SPEEDS.put(SpiritBow.SpiritArrow.class, 0); ANGULAR_SPEEDS.put(Dart.class, 0); ANGULAR_SPEEDS.put(ThrowingKnife.class, 0); ANGULAR_SPEEDS.put(FishingSpear.class, 0); @@ -132,6 +134,9 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { if (item instanceof Dart && Dungeon.hero.belongings.weapon instanceof Crossbow){ speed *= 3f; } + if (item instanceof SpiritBow.SpiritArrow){ + speed *= 1.5f; + } PosTweener tweener = new PosTweener( this, to, d.length() / speed ); tweener.listener = this; parent.add( tweener ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java index 041a03499..61e971456 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -44,6 +44,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutat import com.shatteredpixel.shatteredpixeldungeon.items.spells.Recycle; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDetectCurse; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; @@ -393,7 +394,7 @@ public class WndBag extends WndTabbed { mode == Mode.QUICKSLOT && (item.defaultAction != null) || mode == Mode.WEAPON && (item instanceof MeleeWeapon || item instanceof Boomerang) || mode == Mode.ARMOR && (item instanceof Armor) || - mode == Mode.ENCHANTABLE && (item instanceof MeleeWeapon || item instanceof Boomerang || item instanceof Armor) || + mode == Mode.ENCHANTABLE && (item instanceof MeleeWeapon || item instanceof SpiritBow || item instanceof Armor) || mode == Mode.WAND && (item instanceof Wand) || mode == Mode.SEED && (item instanceof Seed) || mode == Mode.FOOD && (item instanceof Food) || diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java index f17b3216a..772a9d7a1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndStartGame.java @@ -333,9 +333,9 @@ public class WndStartGame extends Window { heroMisc.icon(Icons.get(Icons.DEPTH)); break; case HUNTRESS: - heroItem.icon(new ItemSprite(ItemSpriteSheet.BOOMERANG, null)); + heroItem.icon(new ItemSprite(ItemSpriteSheet.SPIRIT_BOW, null)); heroLoadout.icon(new ItemSprite(ItemSpriteSheet.KNUCKLEDUSTER, null)); - heroMisc.icon(new ItemSprite(ItemSpriteSheet.DART, null)); + heroMisc.icon(new Image(Assets.TILES_SEWERS, 112, 96, 16, 16 )); break; } diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties index 45c9b9f27..422a6b1bd 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties @@ -312,9 +312,9 @@ actors.hero.heroclass.rogue_desc_misc=The Rogue detects secrets and traps from a actors.hero.heroclass.rogue_desc_subclasses=A subclass can be chosen after defeating the second boss. The Rogue has two subclasses: actors.hero.heroclass.huntress=huntress -actors.hero.heroclass.huntress_desc_item=The Huntress starts with a _unique boomerang,_ which can be thrown an infinite number of times.\n\nThe boomerang is upgradeable and can be imbued and enchanted, just like a melee weapon. -actors.hero.heroclass.huntress_desc_loadout=The Huntress starts with _knuckledusters,_ which attack much faster than other starter weapons.\n\nThe Huntress starts with her boomerang as a ranged option.\n\nThe Huntress starts with a _velvet pouch,_ which can store small items like seeds and runestones. -actors.hero.heroclass.huntress_desc_misc=The Huntress gains bonus damage from excess strength on thrown weapons.\n\nThe Huntress can use thrown weapons for longer before they break.\n\nThe Huntress senses nearby enemies even if they are hidden behind obstacles.\n\nThe Huntress automatically identifies potions of mind vision. +actors.hero.heroclass.huntress_desc_item=The Huntress starts with a _unique spirit bow,_ which can fire an infinite number of conjured arrows.\n\nThe bow steadily grows stronger as the huntress levels up, and can be augmented and enchanted. +actors.hero.heroclass.huntress_desc_loadout=The Huntress starts with _knuckledusters,_ which attack much faster than other starter weapons.\n\nThe Huntress starts with her bow as a ranged option.\n\nThe Huntress starts with a _velvet pouch,_ which can store small items like seeds and runestones. +actors.hero.heroclass.huntress_desc_misc=The Huntress can travel through tall grass without trampling it.\n\nThe Huntress gains bonus damage from excess strength on thrown weapons.\n\nThe Huntress can use thrown weapons for longer before they break.\n\nThe Huntress senses nearby enemies even if they are hidden behind obstacles.\n\nThe Huntress automatically identifies potions of mind vision. actors.hero.heroclass.huntress_desc_subclasses=A subclass can be chosen after defeating the second boss. The Huntress has two subclasses: actors.hero.herosubclass.gladiator=gladiator diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties index 1cf009a16..644d2a80c 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties @@ -1410,6 +1410,12 @@ items.weapon.missiles.trident.name=trident items.weapon.missiles.trident.desc=Massive throwing spears with three deadly prongs on the end. They are powerful, but quite heavy. +items.weapon.spiritbow.name=Spirit Bow +items.weapon.spiritbow.ac_shoot=SHOOT +items.weapon.spiritbow.prompt=Choose a target +items.weapon.spiritbow.stats=The bow cannot be directly upgraded, but will instead steadily grow stronger as you level up. At your current level, arrows shot from the bow will deal _%1$d-%2$d damage_ and require _%3$d strength_ to use properly. +items.weapon.spiritbow.desc=A bow made of out ancient magical wood. The bow's string and etchings glow with a pale blue light. When the string is pulled this bow will conjure a magical arrow which can be fired at an enemy. + items.weapon.weapon.identify=You are now familiar enough with your weapon to identify it. items.weapon.weapon.too_heavy=Because of your inadequate strength this weapon will hinder your attack speed, accuracy, and ability to surprise attack. items.weapon.weapon.excess_str=Because of your excess strength, you will deal up to _%d bonus damage_ with this weapon.