From 6e63c6db2160778509cfbb1352b62c9f0c1d30c2 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sun, 18 Mar 2018 18:51:22 -0400 Subject: [PATCH] v0.6.4: new ranged weapon, 2 new melee weapons (gauntlet sprite WIP) --- core/src/main/assets/items.png | Bin 15516 -> 15669 bytes .../items/Generator.java | 24 +++---- .../items/weapon/melee/Crossbow.java | 41 ++++++++++++ .../items/weapon/melee/Gauntlets.java | 47 +++++++++++++ .../items/weapon/missiles/FishingSpear.java | 18 +++-- .../items/weapon/missiles/ThrowingSpear.java | 52 +++++++++++++++ .../items/weapon/missiles/darts/Dart.java | 53 ++++++++++++--- .../weapon/missiles/darts/HealingDart.java | 4 ++ .../items/weapon/missiles/darts/HolyDart.java | 4 ++ .../levels/rooms/special/ShopRoom.java | 8 +-- .../sprites/ItemSpriteSheet.java | 12 +++- .../sprites/MissileSprite.java | 62 +++++++++++------- .../messages/items/items.properties | 13 +++- 13 files changed, 283 insertions(+), 55 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlets.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingSpear.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index 4878a551b3b0c07fb40a98201002177a13e337b1..a6d0dcd396bb7671c57d75f38d11ef68959f86ec 100644 GIT binary patch literal 15669 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 gxk~Z10Gc$H6p@lYvRA{kPD9a3! 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 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 d387973b8..bcf26ba48 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -99,9 +99,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTransfusion; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.AssassinsBlade; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dirk; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Flail; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gauntlets; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Glaive; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Greataxe; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Greatshield; @@ -130,11 +132,10 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWea import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingHammer; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingSpear; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Trident; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.IncendiaryDart; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.ParalyticDart; import com.shatteredpixel.shatteredpixeldungeon.plants.BlandfruitBush; import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed; import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil; @@ -299,18 +300,20 @@ public class Generator { BattleAxe.class, Flail.class, RunicBlade.class, - AssassinsBlade.class + AssassinsBlade.class, + Crossbow.class }; - WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4 }; + WEP_T4.probs = new float[]{ 6, 5, 5, 4, 4, 4 }; WEP_T5.classes = new Class[]{ Greatsword.class, WarHammer.class, Glaive.class, Greataxe.class, - Greatshield.class + Greatshield.class, + Gauntlets.class }; - WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4 }; + WEP_T5.probs = new float[]{ 6, 5, 5, 4, 4, 4 }; //see Generator.randomArmor ARMOR.classes = new Class[]{ @@ -332,14 +335,13 @@ public class Generator { MIS_T1.probs = new float[]{ 1, 1 }; MIS_T2.classes = new Class[]{ - Shuriken.class, - IncendiaryDart.class, - ParalyticDart.class, + FishingSpear.class, + Shuriken.class }; - MIS_T2.probs = new float[]{ 8, 3, 3 }; + MIS_T2.probs = new float[]{ 4, 3 }; MIS_T3.classes = new Class[]{ - FishingSpear.class, + ThrowingSpear.class, Bolas.class }; MIS_T3.probs = new float[]{ 4, 3 }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java new file mode 100644 index 000000000..a2d286714 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Crossbow.java @@ -0,0 +1,41 @@ +/* + * 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.melee; + +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class Crossbow extends MeleeWeapon { + + { + image = ItemSpriteSheet.CROSSBOW; + + //check Dart.class for additional properties + + tier = 4; + } + + @Override + public int max(int lvl) { + return 4*(tier+1) + //20 base, down from 25 + lvl*(tier); //+4 per level, down from +5 + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlets.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlets.java new file mode 100644 index 000000000..3a6b9e43d --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/Gauntlets.java @@ -0,0 +1,47 @@ +/* + * 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.melee; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +//TODO rename +public class Gauntlets extends MeleeWeapon { + + { + image = ItemSpriteSheet.GAUNTLETS; + + tier = 5; + DLY = 0.5f; //2x speed + } + + @Override + public int max(int lvl) { + return Math.round(2.5f*(tier+1)) + //15 base, down from 30 + lvl*Math.round(0.5f*(tier+1)); //+3 per level, down from +6 + } + + @Override + public int defenseFactor( Char owner ) { + return 5; //5 extra defence + } +} 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 index 91834e840..710ace9cb 100644 --- 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 @@ -21,6 +21,8 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Piranha; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class FishingSpear extends MissileWeapon { @@ -31,22 +33,30 @@ public class FishingSpear extends MissileWeapon { @Override public int min(int lvl) { - return 6; + return 4; } @Override public int max(int lvl) { - return 15; + return 10; } @Override public int STRReq(int lvl) { - return 13; + return 11; + } + + @Override + public int proc(Char attacker, Char defender, int damage) { + if (defender instanceof Piranha){ + damage = Math.max(damage, defender.HP/2); + } + return super.proc(attacker, defender, damage); } @Override public int price() { - return 18 * quantity; + return 12 * quantity; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingSpear.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingSpear.java new file mode 100644 index 000000000..43c241287 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/ThrowingSpear.java @@ -0,0 +1,52 @@ +/* + * 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.sprites.ItemSpriteSheet; + +public class ThrowingSpear extends MissileWeapon { + + { + image = ItemSpriteSheet.THROWING_SPEAR; + } + + @Override + public int min(int lvl) { + return 6; + } + + @Override + public int max(int lvl) { + return 15; + } + + @Override + public int STRReq(int lvl) { + return 13; + } + + @Override + public int price() { + return 18 * quantity; + } + +} 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 4fe122c06..3db051939 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 @@ -21,7 +21,11 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +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; @@ -29,18 +33,16 @@ public class Dart extends MissileWeapon { { image = ItemSpriteSheet.DART; - - bones = false; //Finding them in bones would be semi-frequent and disappointing. } @Override public int min(int lvl) { - return 1; + return bow != null ? 4 + bow.level() : 1; } @Override public int max(int lvl) { - return 2; + return bow != null ? 12 + 3*bow.level() : 2; } @Override @@ -53,11 +55,44 @@ public class Dart extends MissileWeapon { return 0; } + private static Crossbow bow; + + private void updateCrossbow(){ + if (Dungeon.hero.belongings.weapon instanceof Crossbow){ + bow = (Crossbow) Dungeon.hero.belongings.weapon; + } else { + bow = null; + } + } + @Override - public Item random() { - super.random(); - quantity += 3; - return this; + public int throwPos(Hero user, int dst) { + if (bow != null && bow.hasEnchant(Projecting.class) + && !Dungeon.level.solid[dst] && Dungeon.level.distance(user.pos, dst) <= 4){ + return dst; + } else { + return super.throwPos(user, dst); + } + } + + @Override + public int proc(Char attacker, Char defender, int damage) { + if (bow != null && bow.enchantment != null){ + damage = bow.enchantment.proc(bow, attacker, defender, damage); + } + return super.proc(attacker, defender, damage); + } + + @Override + protected void onThrow(int cell) { + updateCrossbow(); + super.onThrow(cell); + } + + @Override + public String info() { + updateCrossbow(); + return super.info(); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HealingDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HealingDart.java index f20f85c35..37c775894 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HealingDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HealingDart.java @@ -40,6 +40,10 @@ public class HealingDart extends TippedDart { Buff.affect( defender, Healing.class ).setHeal((int)(0.5f*defender.HT + 30), 0.333f, 0); PotionOfHealing.cure( defender ); + if (attacker.alignment == defender.alignment){ + return 0; + } + return super.proc(attacker, defender, damage); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HolyDart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HolyDart.java index 81aff56d1..5f84a122a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HolyDart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/darts/HolyDart.java @@ -37,6 +37,10 @@ public class HolyDart extends TippedDart { Buff.affect(defender, Bless.class, 20f); + if (attacker.alignment == defender.alignment){ + return 0; + } + return super.proc(attacker, defender, damage); } } 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 3c61dbf67..bd634d57d 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 @@ -68,9 +68,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingHammer; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingSpear; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Trident; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.IncendiaryDart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; @@ -171,15 +171,15 @@ public class ShopRoom extends SpecialRoom { case 6: itemsToSpawn.add( (Random.Int( 2 ) == 0 ? new Shortsword().identify() : new HandAxe()).identify() ); itemsToSpawn.add( Random.Int( 2 ) == 0 ? - new Shuriken().quantity(2) : - new IncendiaryDart().quantity(5)); + new FishingSpear().quantity(2) : + new Shuriken().quantity(2)); itemsToSpawn.add( new LeatherArmor().identify() ); break; case 11: itemsToSpawn.add( (Random.Int( 2 ) == 0 ? new Sword().identify() : new Mace()).identify() ); itemsToSpawn.add( Random.Int( 2 ) == 0 ? - new FishingSpear().quantity(2) : + new ThrowingSpear().quantity(2) : new Bolas().quantity(2)); itemsToSpawn.add( new MailArmor().identify() ); break; 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 8d6ff1b81..6ed830fe3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -182,12 +182,14 @@ public class ItemSpriteSheet { public static final int FLAIL = WEP_TIER4+2; public static final int RUNIC_BLADE = WEP_TIER4+3; public static final int ASSASSINS_BLADE = WEP_TIER4+4; + public static final int CROSSBOW = WEP_TIER4+5; static{ assignItemRect(LONGSWORD, 15, 15); assignItemRect(BATTLE_AXE, 16, 16); assignItemRect(FLAIL, 14, 14); assignItemRect(RUNIC_BLADE, 14, 14); assignItemRect(ASSASSINS_BLADE, 14, 15); + assignItemRect(CROSSBOW, 15, 15); } private static final int WEP_TIER5 = xy(1, 9); //8 slots @@ -196,12 +198,14 @@ public class ItemSpriteSheet { public static final int GLAIVE = WEP_TIER5+2; public static final int GREATAXE = WEP_TIER5+3; public static final int GREATSHIELD = WEP_TIER5+4; + public static final int GAUNTLETS = WEP_TIER5+5; static{ assignItemRect(GREATSWORD, 16, 16); assignItemRect(WAR_HAMMER, 16, 16); assignItemRect(GLAIVE, 16, 16); assignItemRect(GREATAXE, 12, 16); assignItemRect(GREATSHIELD, 12, 16); + assignItemRect(GAUNTLETS, 13, 15); } //8 free slots @@ -213,9 +217,10 @@ public class ItemSpriteSheet { public static final int THROWING_KNIFE = MISSILE_WEP+2; public static final int THROWING_STONE = MISSILE_WEP+3; - public static final int SHURIKEN = MISSILE_WEP+4; + public static final int FISHING_SPEAR = MISSILE_WEP+4; + public static final int SHURIKEN = MISSILE_WEP+5; - public static final int FISHING_SPEAR = MISSILE_WEP+7; + public static final int THROWING_SPEAR = MISSILE_WEP+7; public static final int BOLAS = MISSILE_WEP+8; public static final int JAVELIN = MISSILE_WEP+10; @@ -231,9 +236,10 @@ public class ItemSpriteSheet { assignItemRect(THROWING_KNIFE, 12, 13); assignItemRect(THROWING_STONE, 9, 9); + assignItemRect(FISHING_SPEAR, 11, 11); assignItemRect(SHURIKEN, 12, 12); - assignItemRect(FISHING_SPEAR, 13, 13); + assignItemRect(THROWING_SPEAR, 13, 13); assignItemRect(BOLAS, 15, 14); assignItemRect(JAVELIN, 16, 16); 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 fb4a0b29a..5d6b9f04d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/MissileSprite.java @@ -21,7 +21,18 @@ package com.shatteredpixel.shatteredpixeldungeon.sprites; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Crossbow; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingSpear; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Trident; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.watabou.noosa.Visual; import com.watabou.noosa.tweeners.PosTweener; @@ -55,41 +66,37 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { public void reset( PointF from, PointF to, Item item, Callback listener) { revive(); - int image; - if (item == null) view(image = 0, null); - else view(image = item.image(), item.glowing()); + if (item == null) view(0, null); + else view(item.image(), item.glowing()); setup( from, to, - image, + item, listener ); } private static final int DEFAULT_ANGULAR_SPEED = 720; - private static final HashMap ANGULAR_SPEEDS = new HashMap<>(); + private static final HashMap, Integer> 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); - } + ANGULAR_SPEEDS.put(Dart.class, 0); + ANGULAR_SPEEDS.put(ThrowingKnife.class, 0); + ANGULAR_SPEEDS.put(FishingSpear.class, 0); + ANGULAR_SPEEDS.put(ThrowingSpear.class, 0); + ANGULAR_SPEEDS.put(Javelin.class, 0); + ANGULAR_SPEEDS.put(Trident.class, 0); //720 is default - ANGULAR_SPEEDS.put(ItemSpriteSheet.BOOMERANG, 1440); - ANGULAR_SPEEDS.put(ItemSpriteSheet.BOLAS, 1440); + ANGULAR_SPEEDS.put(Boomerang.class, 1440); + ANGULAR_SPEEDS.put(Bolas.class, 1440); - ANGULAR_SPEEDS.put(ItemSpriteSheet.SHURIKEN, 2160); + ANGULAR_SPEEDS.put(Shuriken.class, 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 ){ + private void setup( PointF from, PointF to, Item item, Callback listener ){ originToCenter(); @@ -98,10 +105,15 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { point( from ); PointF d = PointF.diff( to, from ); - speed.set( d ).normalize().scale( SPEED ); - - if ( ANGULAR_SPEEDS.containsKey(image)) angularSpeed = ANGULAR_SPEEDS.get(image); - else angularSpeed = DEFAULT_ANGULAR_SPEED; + speed.set(d).normalize().scale(SPEED); + + angularSpeed = DEFAULT_ANGULAR_SPEED; + for (Class cls : ANGULAR_SPEEDS.keySet()){ + if (cls.isAssignableFrom(item.getClass())){ + angularSpeed = ANGULAR_SPEEDS.get(cls); + break; + } + } angle = 135 - (float)(Math.atan2( d.x, d.y ) / 3.1415926 * 180); @@ -116,7 +128,11 @@ public class MissileSprite extends ItemSprite implements Tweener.Listener { updateFrame(); } - PosTweener tweener = new PosTweener( this, to, d.length() / SPEED ); + float speed = SPEED; + if (item instanceof Dart && Dungeon.hero.belongings.weapon instanceof Crossbow){ + speed *= 3f; + } + PosTweener tweener = new PosTweener( this, to, d.length() / speed ); tweener.listener = this; parent.add( tweener ); } 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 096080b38..66a1c96f3 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 @@ -822,6 +822,10 @@ items.weapon.melee.battleaxe.name=battle axe items.weapon.melee.battleaxe.stats_desc=This is a rather accurate weapon. items.weapon.melee.battleaxe.desc=The enormous steel head of this battle axe puts considerable heft behind each wide stroke. +items.weapon.melee.crossbow.name=crossbow +items.weapon.melee.crossbow.stats_desc=This weapon enhances the damage of thrown darts when equipped, and will even grant its enchantment to them. +items.weapon.melee.crossbow.desc=A fairly intricate weapon which shoots bolts at exceptional speeds. While it isn't designed for it, this crossbow's heft and sturdy construction make it a decent melee weapon as well. + items.weapon.melee.dagger.name=dagger items.weapon.melee.dagger.stats_desc=This weapon is stronger against unaware enemies. items.weapon.melee.dagger.desc=A simple iron dagger with a worn wooden handle. @@ -834,6 +838,10 @@ 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.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.gauntlets.name=stone gauntlets +items.weapon.melee.gauntlets.stats_desc=This is a very fast weapon.\nThis weapon blocks some damage. +items.weapon.melee.gauntlets.desc=These large gauntlets are made of crimson fabric with heavy magical stone layered ontop. They tighten around your arms and add tremendous force to your blows. + items.weapon.melee.glaive.name=glaive items.weapon.melee.glaive.stats_desc=This is a rather slow weapon.\nThis weapon has extra reach. items.weapon.melee.glaive.desc=A massive polearm consisting of a sword blade on the end of a pole. @@ -977,7 +985,7 @@ items.weapon.missiles.curaredart.name=curare dart 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.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.fishingspear.desc=Tiny throwing spears designed for fishing. They work well as an improvised weapon too. items.weapon.missiles.javelin.name=javelin 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. @@ -996,6 +1004,9 @@ items.weapon.missiles.throwinghammer.desc=These hefty hammers are designed to be 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.throwingspear.name=throwing spear +items.weapon.missiles.throwingspear.desc=These lightweight spears have thin frames which are clearly designed to be thrown, and not thrusted. + items.weapon.missiles.throwingstone.name=throwing stone items.weapon.missiles.throwingstone.desc=These stones are sanded down to make them able to be thrown with more power than a regular stone. Despite the craftsmanship, they still aren't a very reliable weapon.