diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png
index 4878a551b..a6d0dcd39 100644
Binary files a/core/src/main/assets/items.png and b/core/src/main/assets/items.png differ
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.