From 9816333fd79753e1c7049ef678ebf38eefd79539 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 2 Jan 2018 20:59:37 -0500 Subject: [PATCH] v0.6.3: redesigned all ranged weapons and added new ones Still need to adjust generation logic --- core/src/main/assets/items.png | Bin 15087 -> 15572 bytes .../ShatteredPixelDungeon.java | 5 + .../actors/hero/Hero.java | 6 ++ .../actors/hero/HeroClass.java | 11 +- .../items/Generator.java | 34 ++---- .../items/weapon/missiles/Bolas.java | 74 +++++++++++++ .../items/weapon/missiles/CurareDart.java | 28 +---- .../items/weapon/missiles/Dart.java | 30 +----- .../items/weapon/missiles/FishingSpear.java | 60 +++++++++++ .../items/weapon/missiles/IncendiaryDart.java | 28 +---- .../items/weapon/missiles/Javelin.java | 26 +---- .../items/weapon/missiles/Shuriken.java | 25 ++--- .../items/weapon/missiles/ThrowingHammer.java | 64 +++++++++++ .../items/weapon/missiles/ThrowingKnife.java | 101 ++++++++++++++++++ .../items/weapon/missiles/TippedDart.java | 60 +++++++++++ .../missiles/{Tamahawk.java => Tomahawk.java} | 26 ++--- .../items/weapon/missiles/Trident.java | 60 +++++++++++ .../levels/rooms/special/ShopRoom.java | 4 +- .../sprites/ItemSpriteSheet.java | 62 ++++++++--- .../sprites/MissileSprite.java | 50 ++++++--- .../messages/items/items.properties | 29 +++-- 21 files changed, 587 insertions(+), 196 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Bolas.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/FishingSpear.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingHammer.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/TippedDart.java rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/{Tamahawk.java => Tomahawk.java} (87%) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Trident.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index a460e52043538f6f1bb782caa868ad5f6642bbdb..5b83e5cbe07c6335caf474a09b7bf43de3402e7b 100644 GIT binary patch literal 15572 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 JZSHmVzX78wLWckV literal 15087 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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 33f4db642..60ff3bfe3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -60,6 +60,11 @@ public class ShatteredPixelDungeon extends Game { public ShatteredPixelDungeon() { super( WelcomeScene.class ); + //v0.6.3 + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk.class, + "com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tamahawk" ); + //v0.6.0 com.watabou.utils.Bundle.addAlias( com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.MassGraveRoom.Bones.class, 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 b5281d015..053654f0d 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 @@ -450,6 +450,7 @@ public class Hero extends Char { @Override public void spend( float time ) { + justMoved = false; TimekeepersHourglass.timeFreeze buff = buff(TimekeepersHourglass.timeFreeze.class); if (buff != null){ buff.processTime(time); @@ -596,9 +597,14 @@ public class Hero extends Char { next(); } + //FIXME this is a fairly crude way to track this, really it would be nice to have a short + //history of hero actions + public boolean justMoved = false; + private boolean actMove( HeroAction.Move action ) { if (getCloser( action.dst )) { + justMoved = true; return true; } else { 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 95c328f92..a6bffe327 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 @@ -40,6 +40,7 @@ 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.Dart; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.watabou.utils.Bundle; @@ -106,8 +107,8 @@ public enum HeroClass { private static void initWarrior( Hero hero ) { (hero.belongings.weapon = new WornShortsword()).identify(); - Dart darts = new Dart( 8 ); - darts.identify().collect(); + Dart darts = new Dart(); + darts.identify().quantity(3).collect(); if ( Badges.isUnlocked(Badges.Badge.TUTORIAL_WARRIOR) ){ if (!Dungeon.isChallenged(Challenges.NO_ARMOR)) @@ -150,11 +151,11 @@ public enum HeroClass { (hero.belongings.misc1 = cloak).identify(); hero.belongings.misc1.activate( hero ); - Dart darts = new Dart( 8 ); - darts.identify().collect(); + ThrowingKnife knives = new ThrowingKnife(); + knives.quantity(3).collect(); Dungeon.quickslot.setSlot(0, cloak); - Dungeon.quickslot.setSlot(1, darts); + Dungeon.quickslot.setSlot(1, knives); new ScrollOfMagicMapping().identify(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java index f23dc723d..50f50a7a1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -123,13 +123,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sword; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Dart; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.IncendiaryDart; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tamahawk; import com.shatteredpixel.shatteredpixeldungeon.plants.BlandfruitBush; import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil; @@ -253,21 +246,18 @@ public class Generator { WornShortsword.class, Knuckles.class, Dagger.class, - MagesStaff.class, - Boomerang.class, - Dart.class + MagesStaff.class }; - WEP_T1.probs = new float[]{ 1, 1, 1, 0, 0, 1 }; + WEP_T1.probs = new float[]{ 1, 1, 1, 0 }; WEP_T2.classes = new Class[]{ Shortsword.class, HandAxe.class, Spear.class, Quarterstaff.class, - Dirk.class, - IncendiaryDart.class + Dirk.class }; - WEP_T2.probs = new float[]{ 6, 5, 5, 4, 4, 6 }; + WEP_T2.probs = new float[]{ 6, 5, 5, 4, 4 }; WEP_T3.classes = new Class[]{ Sword.class, @@ -275,31 +265,27 @@ public class Generator { Scimitar.class, RoundShield.class, Sai.class, - Whip.class, - Shuriken.class, - CurareDart.class + Whip.class }; - WEP_T3.probs = new float[]{ 6, 5, 5, 4, 4, 4, 6, 6 }; + WEP_T3.probs = new float[]{ 6, 5, 5, 4, 4, 4 }; WEP_T4.classes = new Class[]{ Longsword.class, BattleAxe.class, Flail.class, RunicBlade.class, - AssassinsBlade.class, - Javelin.class + AssassinsBlade.class }; - WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4, 6 }; + WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4 }; WEP_T5.classes = new Class[]{ Greatsword.class, WarHammer.class, Glaive.class, Greataxe.class, - Greatshield.class, - Tamahawk.class + Greatshield.class }; - WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4, 6 }; + WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4 }; //see Generator.randomArmor ARMOR.classes = new Class[]{ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Bolas.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Bolas.java new file mode 100644 index 000000000..acbd7e54b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Bolas.java @@ -0,0 +1,74 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Bolas extends MissileWeapon { + + { + image = ItemSpriteSheet.BOLAS; + + } + + @Override + public int min(int lvl) { + return 4; + } + + @Override + public int max(int lvl) { + return 8; + } + + @Override + public int STRReq(int lvl) { + return 15; + } + + @Override + public int proc( Char attacker, Char defender, int damage ) { + Buff.prolong( defender, Cripple.class, Cripple.DURATION ); + return super.proc( attacker, defender, damage ); + } + + @Override + protected float durabilityPerUse() { + return super.durabilityPerUse()*2f; + } + + @Override + public Item random() { + quantity = Random.Int( 2, 4 ); + return this; + } + + @Override + public int price() { + return 12 * quantity; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/CurareDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/CurareDart.java index 140cf19b1..007fcc845 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/CurareDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/CurareDart.java @@ -24,31 +24,15 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.watabou.utils.Random; -public class CurareDart extends Dart { +public class CurareDart extends TippedDart { public static final float DURATION = 3f; { image = ItemSpriteSheet.CURARE_DART; } - - @Override - public int STRReq(int lvl) { - return 14; - } - - public CurareDart() { - this( 1 ); - } - - public CurareDart( int number ) { - super(); - quantity = number; - } @Override public int proc( Char attacker, Char defender, int damage ) { @@ -56,14 +40,4 @@ public class CurareDart extends Dart { return super.proc( attacker, defender, damage ); } - @Override - public Item random() { - quantity = Random.Int( 2, 5 ); - return this; - } - - @Override - public int price() { - return 8 * quantity; - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Dart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Dart.java index b8bd14e17..de273d752 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Dart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Dart.java @@ -21,10 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Random; @@ -35,7 +31,6 @@ public class Dart extends MissileWeapon { image = ItemSpriteSheet.DART; bones = false; //Finding them in bones would be semi-frequent and disappointing. - } @Override @@ -45,12 +40,12 @@ public class Dart extends MissileWeapon { @Override public int max(int lvl) { - return 4; + return 3; } @Override public int STRReq(int lvl) { - return 10; + return 9; } @Override @@ -58,31 +53,14 @@ public class Dart extends MissileWeapon { return 0; } - @Override - protected void rangedHit(Char enemy) { - if (enemy.isAlive()) - Buff.affect(enemy, PinCushion.class).stick(new Dart()); - else - Dungeon.level.drop( new Dart(), enemy.pos).sprite.drop(); - } - - public Dart() { - this( 1 ); - } - - public Dart( int number ) { - super(); - quantity = number; - } - @Override public Item random() { - quantity = Random.Int( 5, 15 ); + quantity = Random.Int( 5, 10 ); return this; } @Override public int price() { - return quantity * 2; + return quantity * 4; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/FishingSpear.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/FishingSpear.java new file mode 100644 index 000000000..cfd17e677 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/FishingSpear.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class FishingSpear extends MissileWeapon { + + { + image = ItemSpriteSheet.FISHING_SPEAR; + } + + @Override + public int min(int lvl) { + return 6; + } + + @Override + public int max(int lvl) { + return 18; + } + + @Override + public int STRReq(int lvl) { + return 13; + } + + @Override + public Item random() { + quantity = Random.Int( 2, 4 ); + return this; + } + + @Override + public int price() { + return 12 * quantity; + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/IncendiaryDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/IncendiaryDart.java index 0700f9aa7..5b362deaf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/IncendiaryDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/IncendiaryDart.java @@ -28,30 +28,14 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Fire; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.watabou.utils.Random; -public class IncendiaryDart extends Dart { +public class IncendiaryDart extends TippedDart { { image = ItemSpriteSheet.INCENDIARY_DART; } - - @Override - public int STRReq(int lvl) { - return 12; - } - - public IncendiaryDart() { - this( 1 ); - } - - public IncendiaryDart( int number ) { - super(); - quantity = number; - } @Override protected void onThrow( int cell ) { @@ -70,14 +54,4 @@ public class IncendiaryDart extends Dart { return super.proc( attacker, defender, damage ); } - @Override - public Item random() { - quantity = Random.Int( 3, 6 ); - return this; - } - - @Override - public int price() { - return 5 * quantity; - } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Javelin.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Javelin.java index 70eaa921f..4266180c1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Javelin.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Javelin.java @@ -21,9 +21,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles; -import com.shatteredpixel.shatteredpixeldungeon.actors.Char; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Random; @@ -36,42 +33,27 @@ public class Javelin extends MissileWeapon { @Override public int min(int lvl) { - return 2; + return 8; } @Override public int max(int lvl) { - return 15; + return 24; } @Override public int STRReq(int lvl) { return 15; } - - public Javelin() { - this( 1 ); - } - - public Javelin( int number ) { - super(); - quantity = number; - } - - @Override - public int proc( Char attacker, Char defender, int damage ) { - Buff.prolong( defender, Cripple.class, Cripple.DURATION ); - return super.proc( attacker, defender, damage ); - } @Override public Item random() { - quantity = Random.Int( 5, 15 ); + quantity = Random.Int( 2, 4 ); return this; } @Override public int price() { - return 12 * quantity; + return 16 * quantity; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Shuriken.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Shuriken.java index 6776f22c4..59ed0a57b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Shuriken.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Shuriken.java @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Random; @@ -29,42 +31,37 @@ public class Shuriken extends MissileWeapon { { image = ItemSpriteSheet.SHURIKEN; - - DLY = 0.5f; } @Override public int min(int lvl) { - return 2; + return 3; } @Override public int max(int lvl) { - return 6; + return 8; } @Override public int STRReq(int lvl) { - return 13; - } - - public Shuriken() { - this( 1 ); + return 11; } - public Shuriken( int number ) { - super(); - quantity = number; + @Override + public float speedFactor(Char owner) { + if (owner instanceof Hero && ((Hero) owner).justMoved) return 0; + else return super.speedFactor(owner); } @Override public Item random() { - quantity = Random.Int( 5, 15 ); + quantity = Random.NormalIntRange( 2, 4 ); return this; } @Override public int price() { - return 6 * quantity; + return 8 * quantity; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingHammer.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingHammer.java new file mode 100644 index 000000000..080282c36 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingHammer.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class ThrowingHammer extends MissileWeapon { + + { + image = ItemSpriteSheet.THROWING_HAMMER; + } + + @Override + public int min(int lvl) { + return 8; + } + + @Override + public int max(int lvl) { + return 20; + } + + @Override + public int STRReq(int lvl) { + return 17; + } + + @Override + protected float durabilityPerUse() { + return super.durabilityPerUse()/2f; + } + + @Override + public Item random() { + quantity = Random.Int( 2, 4 ); + return this; + } + + @Override + public int price() { + return 20 * quantity; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java new file mode 100644 index 000000000..172045c6c --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingKnife.java @@ -0,0 +1,101 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +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.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfSharpshooting; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class ThrowingKnife extends MissileWeapon { + + { + image = ItemSpriteSheet.THROWING_KNIFE; + + bones = false; + + } + + @Override + public int min(int lvl) { + return 2; + } + + @Override + public int max(int lvl) { + return 6; + } + + @Override + public int STRReq(int lvl) { + return 9; + } + + private Char enemy; + + @Override + protected void onThrow(int cell) { + enemy = Actor.findChar(cell); + super.onThrow(cell); + } + + @Override + public int damageRoll(Char owner) { + if (owner instanceof Hero) { + Hero hero = (Hero)owner; + if (enemy instanceof Mob && ((Mob) enemy).surprisedBy(hero)) { + //deals 75% toward max to max on surprise, instead of min to max. + int diff = max() - min(); + int damage = Random.NormalIntRange( + min() + Math.round(diff*0.75f), + max()); + int exStr = hero.STR() - STRReq(); + if (exStr > 0 && hero.heroClass == HeroClass.HUNTRESS) { + damage += Random.IntRange(0, exStr); + } + return (int)(imbue.damageFactor(damage) * RingOfSharpshooting.damageMultiplier( hero )); + } + } + return super.damageRoll(owner); + } + + @Override + protected float durabilityPerUse() { + return super.durabilityPerUse()*2f; + } + + @Override + public Item random() { + quantity = Random.NormalIntRange( 2, 4 ); + return this; + } + + @Override + public int price() { + return 4 * quantity; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/TippedDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/TippedDart.java new file mode 100644 index 000000000..92a6c47e3 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/TippedDart.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.watabou.utils.Random; + +public abstract class TippedDart extends Dart { + + { + bones = true; + } + + @Override + public int STRReq(int lvl) { + return 11; + } + + @Override + protected void rangedHit(Char enemy) { + if (enemy.isAlive()) + Buff.affect(enemy, PinCushion.class).stick(new Dart()); + else + Dungeon.level.drop( new Dart(), enemy.pos).sprite.drop(); + } + + @Override + public Item random() { + quantity = Random.Int( 3, 5 ); + return this; + } + + @Override + public int price() { + return quantity * 8; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tamahawk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tomahawk.java similarity index 87% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tamahawk.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tomahawk.java index 322880a38..cc726130a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tamahawk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Tomahawk.java @@ -28,7 +28,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.utils.Random; -public class Tamahawk extends MissileWeapon { +public class Tomahawk extends MissileWeapon { { image = ItemSpriteSheet.TOMAHAWK; @@ -37,26 +37,17 @@ public class Tamahawk extends MissileWeapon { @Override public int min(int lvl) { - return 4; + return 8; } @Override public int max(int lvl) { - return 20; + return 16; } @Override public int STRReq(int lvl) { - return 17; - } - - public Tamahawk() { - this( 1 ); - } - - public Tamahawk( int number ) { - super(); - quantity = number; + return 15; } @Override @@ -65,14 +56,19 @@ public class Tamahawk extends MissileWeapon { return super.proc( attacker, defender, damage ); } + @Override + protected float durabilityPerUse() { + return super.durabilityPerUse()*2f; + } + @Override public Item random() { - quantity = Random.Int( 5, 12 ); + quantity = Random.Int( 2, 4 ); return this; } @Override public int price() { - return 15 * quantity; + return 16 * quantity; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Trident.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Trident.java new file mode 100644 index 000000000..0de93788b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Trident.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2017 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.missiles; + +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Trident extends MissileWeapon { + + { + image = ItemSpriteSheet.TRIDENT; + } + + @Override + public int min(int lvl) { + return 10; + } + + @Override + public int max(int lvl) { + return 30; + } + + @Override + public int STRReq(int lvl) { + return 17; + } + + @Override + public Item random() { + quantity = Random.Int( 2, 4 ); + return this; + } + + @Override + public int price() { + return 20 * quantity; + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java index 54e345043..1bdb46172 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/ShopRoom.java @@ -65,7 +65,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.IncendiaryDart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tamahawk; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; @@ -190,7 +190,7 @@ public class ShopRoom extends SpecialRoom { itemsToSpawn.add( Random.Int( 2 ) == 0 ? new Greatsword().identify() : new WarHammer().identify() ); itemsToSpawn.add( Random.Int(2) == 0 ? new Javelin().quantity(Random.NormalIntRange(4, 7)) : - new Tamahawk().quantity(Random.NormalIntRange(4, 7))); + new Tomahawk().quantity(Random.NormalIntRange(4, 7))); itemsToSpawn.add( new PlateArmor().identify() ); itemsToSpawn.add( new Torch() ); itemsToSpawn.add( new Torch() ); 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 d3913a2d2..fbaa1ef6f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -206,25 +206,59 @@ public class ItemSpriteSheet { //8 free slots - private static final int MISSILE_WEP = xy(1, 10); //16 slots - public static final int DART = MISSILE_WEP+0; - public static final int BOOMERANG = MISSILE_WEP+1; - public static final int INCENDIARY_DART = MISSILE_WEP+2; - public static final int SHURIKEN = MISSILE_WEP+3; - public static final int CURARE_DART = MISSILE_WEP+4; - public static final int JAVELIN = MISSILE_WEP+5; - public static final int TOMAHAWK = MISSILE_WEP+6; + 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 DART = MISSILE_WEP+1; + public static final int THROWING_KNIFE = MISSILE_WEP+2; + + public static final int SHURIKEN = MISSILE_WEP+4; + + public static final int FISHING_SPEAR = MISSILE_WEP+7; + public static final int BOLAS = MISSILE_WEP+8; + + public static final int JAVELIN = MISSILE_WEP+10; + public static final int TOMAHAWK = MISSILE_WEP+11; + + public static final int TRIDENT = MISSILE_WEP+13; + public static final int THROWING_HAMMER = MISSILE_WEP+14; + static{ - assignItemRect(DART, 15, 15); assignItemRect(BOOMERANG, 14, 14); - assignItemRect(INCENDIARY_DART, 15, 15); + + assignItemRect(DART, 15, 15); + assignItemRect(THROWING_KNIFE, 12, 13); + assignItemRect(SHURIKEN, 12, 12); - assignItemRect(CURARE_DART, 15, 15); + + assignItemRect(FISHING_SPEAR, 13, 13); + assignItemRect(BOLAS, 15, 14); + assignItemRect(JAVELIN, 16, 16); assignItemRect(TOMAHAWK, 13, 13); + + assignItemRect(TRIDENT, 16, 16); + assignItemRect(THROWING_HAMMER, 12, 12); } - - private static final int ARMOR = xy(1, 11); //16 slots + + public static final int TIPPED_DARTS = xy(1, 11); //16 slots + public static final int ADRENALINE_DART = TIPPED_DARTS+0; + public static final int INCENDIARY_DART = TIPPED_DARTS+1; + public static final int HOLY_DART = TIPPED_DARTS+2; + public static final int BLINDING_DART = TIPPED_DARTS+3; + public static final int HEALING_DART = TIPPED_DARTS+4; + public static final int FREEZING_DART = TIPPED_DARTS+5; + public static final int VERTIGO_DART = TIPPED_DARTS+6; + public static final int POISON_DART = TIPPED_DARTS+7; + public static final int SLEEP_DART = TIPPED_DARTS+8; + public static final int CURARE_DART = TIPPED_DARTS+9; + public static final int WARPING_DART = TIPPED_DARTS+10; + static { + for (int i = TIPPED_DARTS; i < TIPPED_DARTS+16; i++) + assignItemRect(i, 15, 15); + } + + private static final int ARMOR = xy(1, 12); //16 slots public static final int ARMOR_CLOTH = ARMOR+0; public static final int ARMOR_LEATHER = ARMOR+1; public static final int ARMOR_MAIL = ARMOR+2; @@ -246,7 +280,7 @@ public class ItemSpriteSheet { assignItemRect(ARMOR_HUNTRESS, 13, 15); } - //32 free slots + //16 free slots private static final int WANDS = xy(1, 14); //16 slots public static final int WAND_MAGIC_MISSILE = WANDS+0; 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 f882182ed..fb4a0b29a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java @@ -29,6 +29,8 @@ import com.watabou.noosa.tweeners.Tweener; import com.watabou.utils.Callback; import com.watabou.utils.PointF; +import java.util.HashMap; + public class MissileSprite extends ItemSprite implements Tweener.Listener { private static final float SPEED = 240f; @@ -63,7 +65,30 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { image, listener ); } + + private static final int DEFAULT_ANGULAR_SPEED = 720; + + private static final HashMap ANGULAR_SPEEDS = new HashMap<>(); + static { + ANGULAR_SPEEDS.put(ItemSpriteSheet.DART, 0); + ANGULAR_SPEEDS.put(ItemSpriteSheet.THROWING_KNIFE, 0); + ANGULAR_SPEEDS.put(ItemSpriteSheet.FISHING_SPEAR, 0); + ANGULAR_SPEEDS.put(ItemSpriteSheet.JAVELIN, 0); + ANGULAR_SPEEDS.put(ItemSpriteSheet.TRIDENT, 0); + + for( int i = ItemSpriteSheet.TIPPED_DARTS; i < ItemSpriteSheet.TIPPED_DARTS+16; i++){ + ANGULAR_SPEEDS.put(i, 0); + } + + //720 is default + + ANGULAR_SPEEDS.put(ItemSpriteSheet.BOOMERANG, 1440); + ANGULAR_SPEEDS.put(ItemSpriteSheet.BOLAS, 1440); + + ANGULAR_SPEEDS.put(ItemSpriteSheet.SHURIKEN, 2160); + } + //TODO it might be nice to have a source and destination angle, to improve thrown weapon visuals private void setup( PointF from, PointF to, int image, Callback listener ){ originToCenter(); @@ -75,21 +100,20 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { PointF d = PointF.diff( to, from ); speed.set( d ).normalize().scale( SPEED ); - if (image == ItemSpriteSheet.DART || image == ItemSpriteSheet.INCENDIARY_DART - || image == ItemSpriteSheet.CURARE_DART || image == ItemSpriteSheet.JAVELIN) { - - angularSpeed = 0; - angle = 135 - (float)(Math.atan2( d.x, d.y ) / 3.1415926 * 180); - - } else if (image == ItemSpriteSheet.SHURIKEN - || image == ItemSpriteSheet.BOOMERANG - || image == ItemSpriteSheet.TOMAHAWK) { - - angularSpeed = 1440; + if ( ANGULAR_SPEEDS.containsKey(image)) angularSpeed = ANGULAR_SPEEDS.get(image); + else angularSpeed = DEFAULT_ANGULAR_SPEED; + + angle = 135 - (float)(Math.atan2( d.x, d.y ) / 3.1415926 * 180); + + if (d.x >= 0){ + flipHorizontal = false; + updateFrame(); } else { - - angularSpeed = 720; + angularSpeed = -angularSpeed; + angle += 90; + flipHorizontal = true; + updateFrame(); } PosTweener tweener = new PosTweener( this, to, d.length() / SPEED ); 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 4db49b2f0..516b88803 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 @@ -926,22 +926,28 @@ items.weapon.melee.wornshortsword.desc=A quite short sword, worn down through he ###missile weapons +items.weapon.missiles.bolas.name=bolas +items.weapon.missiles.bolas.desc=These unusual ranged weapons aren't very damaging, but they do an excellent job of slowing their targets. + items.weapon.missiles.boomerang.name=boomerang items.weapon.missiles.boomerang.desc=Thrown to the enemy this flat curved wooden missile will return to the hands of its thrower. items.weapon.missiles.boomerang.durability=Due it its solid construction, this boomerang will not break from use. items.weapon.missiles.curaredart.name=curare dart -items.weapon.missiles.curaredart.desc=These little evil darts don't do much damage but they can paralyze the target leaving it helpless and motionless for some time. +items.weapon.missiles.curaredart.desc=These darts are tipped with an earthroot-based compound which will paralyze their target for a short time. items.weapon.missiles.dart.name=dart -items.weapon.missiles.dart.desc=These simple metal spikes are weighted to fly true and sting their prey with a flick of the wrist. +items.weapon.missiles.dart.desc=These simple shafts of spike-tipped wood are weighted to fly true and sting their prey with a flick of the wrist. items.weapon.missiles.dart.durability=Due to their size and simple construction, darts will never break from use. However specially tipped darts will lose their effect after one use. +items.weapon.missiles.fishingspear.name=fishing spear +items.weapon.missiles.fishingspear.desc=Lightweight throwing spears designed for fishing. They work well as an improvised weapon too. + items.weapon.missiles.incendiarydart.name=incendiary dart -items.weapon.missiles.incendiarydart.desc=The spike on each of these darts is designed to pin it to its target while the unstable compounds strapped to its length burst into brilliant flames. +items.weapon.missiles.incendiarydart.desc=These darts are tipped with a firebloom-based compound which will burst into brilliant flames on impact. items.weapon.missiles.javelin.name=javelin -items.weapon.missiles.javelin.desc=This length of metal is weighted to keep the spike at its tip foremost as it sails through the air. +items.weapon.missiles.javelin.desc=These larger throwing spears are weighted to keep the spike at their tip foremost as they sail through the air. items.weapon.missiles.missileweapon.stats=This missile weapon deals _%1$d-%2$d damage_ and requires _%3$d strength_ to use properly. items.weapon.missiles.missileweapon.distance=This weapon is designed to be used at a distance, it is much less accurate at melee range. @@ -949,10 +955,19 @@ items.weapon.missiles.missileweapon.durability=Missile weapons will wear out and items.weapon.missiles.missileweapon.uses_left=This stack of weapons has _%d/%d_ uses left before one breaks. items.weapon.missiles.shuriken.name=shuriken -items.weapon.missiles.shuriken.desc=Star-shaped pieces of metal with razor-sharp blades do significant damage when they hit a target. They can be thrown at very high rate. +items.weapon.missiles.shuriken.desc=Star-shaped pieces of metal with razor-sharp blades. They are lightweight and easy to use on the move. A single shuriken can be thrown instantly after moving. -items.weapon.missiles.tamahawk.name=tomahawk -items.weapon.missiles.tamahawk.desc=This throwing axe is not that heavy, but it still requires significant strength to be used effectively. +items.weapon.missiles.throwinghammer.name=throwing hammer +items.weapon.missiles.throwinghammer.desc=These hefty hammers are designed to be thrown at an enemy. While they are a bit lacking in damage, their all-metal construction makes them quite durable. + +items.weapon.missiles.throwingknife.name=throwing knife +items.weapon.missiles.throwingknife.desc=These lightweight knives are balanced to arc through the air right into their target. They are most effective against unaware enemies. + +items.weapon.missiles.tomahawk.name=tomahawk +items.weapon.missiles.tomahawk.desc=These throwing axes have a serrated edge that makes using them tricky to use. However, a solid blow with this weapon will cause an enemy to bleed. + +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.weapon.identify=You are now familiar enough with your weapon to identify it.