diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java
index 506814858..9900133b6 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
import com.watabou.noosa.Game;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
-import com.shatteredpixel.shatteredpixeldungeon.ResultDescriptions;
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.scenes.AmuletScene;
@@ -66,7 +65,6 @@ public class Amulet extends Item {
if (!Statistics.amuletObtained) {
Statistics.amuletObtained = true;
- Dungeon.win( ResultDescriptions.WIN );
Badges.validateVictory();
showAmuletScene( true );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java
index 22a5e5344..dc585dda0 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java
@@ -17,6 +17,8 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items;
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
@@ -24,45 +26,73 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle
public abstract class EquipableItem extends Item {
- public static final String AC_EQUIP = "EQUIP";
- public static final String AC_UNEQUIP = "UNEQUIP";
-
- @Override
- public void execute( Hero hero, String action ) {
- if (action.equals( AC_EQUIP )) {
- doEquip( hero );
- } else if (action.equals( AC_UNEQUIP )) {
- doUnequip( hero, true );
- } else {
- super.execute( hero, action );
- }
- }
-
- @Override
- public void doDrop( Hero hero ) {
- if (!isEquipped( hero ) || doUnequip( hero, false )) {
- super.doDrop( hero );
- }
- }
-
- @Override
- public void cast( final Hero user, int dst ) {
-
- if (isEquipped( user )) {
-
- if (quantity == 1 && !this.doUnequip( user, false )) {
- return;
- }
- }
-
- super.cast( user, dst );
- }
-
- protected static void equipCursed( Hero hero ) {
- hero.sprite.emitter().burst( ShadowParticle.CURSE, 6 );
- Sample.INSTANCE.play( Assets.SND_CURSED );
- }
-
- public abstract boolean doEquip( Hero hero );
- public abstract boolean doUnequip( Hero hero, boolean collect );
+ private static final String TXT_UNEQUIP_CURSED = "You can't remove cursed %s!";
+
+ public static final String AC_EQUIP = "EQUIP";
+ public static final String AC_UNEQUIP = "UNEQUIP";
+
+ @Override
+ public void execute( Hero hero, String action ) {
+ if (action.equals( AC_EQUIP )) {
+ doEquip( hero );
+ } else if (action.equals( AC_UNEQUIP )) {
+ doUnequip( hero, true );
+ } else {
+ super.execute( hero, action );
+ }
+ }
+
+ @Override
+ public void doDrop( Hero hero ) {
+ if (!isEquipped( hero ) || doUnequip( hero, false, false )) {
+ super.doDrop( hero );
+ }
+ }
+
+ @Override
+ public void cast( final Hero user, int dst ) {
+
+ if (isEquipped( user )) {
+ if (quantity == 1 && !this.doUnequip( user, false, false )) {
+ return;
+ }
+ }
+
+ super.cast( user, dst );
+ }
+
+ protected static void equipCursed( Hero hero ) {
+ hero.sprite.emitter().burst( ShadowParticle.CURSE, 6 );
+ Sample.INSTANCE.play( Assets.SND_CURSED );
+ }
+
+ protected float time2equip( Hero hero ) {
+ return 1;
+ }
+
+ public abstract boolean doEquip( Hero hero );
+
+ public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
+
+ if (cursed) {
+ GLog.w(TXT_UNEQUIP_CURSED, name());
+ return false;
+ }
+
+ if (single) {
+ hero.spendAndNext( time2equip( hero ) );
+ } else {
+ hero.spend( time2equip( hero ) );
+ }
+
+ if (collect && !collect( hero.belongings.backpack )) {
+ Dungeon.level.drop( this, hero.pos );
+ }
+
+ return true;
+ }
+
+ public boolean doUnequip( Hero hero, boolean collect ) {
+ return doUnequip( hero, collect, true );
+ }
}
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java
index 5131ef601..70998aa97 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java
@@ -187,7 +187,7 @@ public class Item implements Bundlable {
return collect( Dungeon.hero.belongings.backpack );
}
- public Item detach( Bag container ) {
+ public final Item detach( Bag container ) {
if (quantity <= 0) {
@@ -203,28 +203,30 @@ public class Item implements Bundlable {
quantity--;
updateQuickslot();
- try {
- return getClass().newInstance();
+ try {
+ Item detached = getClass().newInstance();
+ detached.onDetach( );
+ return detached;
} catch (Exception e) {
return null;
}
}
}
- public Item detachAll( Bag container ) {
- for (Item item : container.items) {
- if (item == this) {
- container.items.remove( this );
- QuickSlot.refresh();
- return this;
- } else if (item instanceof Bag) {
- Bag bag = (Bag)item;
- if (bag.contains( this )) {
- detachAll( bag );
- return this;
- }
- }
- }
+ public final Item detachAll( Bag container ) {
+ for (Item item : container.items) {
+ if (item == this) {
+ container.items.remove( this );
+ item.onDetach( );
+ QuickSlot.refresh();
+ return this;
+ } else if (item instanceof Bag) {
+ Bag bag = (Bag)item;
+ if (bag.contains( this )) {
+ return detachAll( bag );
+ }
+ }
+ }
return this;
}
@@ -232,6 +234,8 @@ public class Item implements Bundlable {
public boolean isSimilar( Item item ) {
return getClass() == item.getClass();
}
+
+ protected void onDetach(){}
public Item upgrade() {
@@ -428,7 +432,7 @@ public class Item implements Bundlable {
float delay = TIME_TO_THROW;
if (this instanceof MissileWeapon) {
- // Refactoring needed!
+ // FIXME
delay *= ((MissileWeapon)this).speedFactor( user );
if (enemy != null && enemy.buff( SnipersMark.class ) != null) {
delay *= 0.5f;
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/KindOfWeapon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/KindOfWeapon.java
index 6d0701440..8230be7f5 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/KindOfWeapon.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/KindOfWeapon.java
@@ -19,7 +19,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items;
import java.util.ArrayList;
-import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
@@ -29,7 +28,6 @@ import com.watabou.utils.Random;
public class KindOfWeapon extends EquipableItem {
private static final String TXT_EQUIP_CURSED = "you wince as your grip involuntarily tightens around your %s";
- private static final String TXT_UNEQUIP_CURSED = "you can't remove cursed %s!";
protected static final float TIME_TO_EQUIP = 1f;
@@ -75,24 +73,20 @@ public class KindOfWeapon extends EquipableItem {
return false;
}
}
-
- @Override
- public boolean doUnequip( Hero hero, boolean collect ) {
-
- if (cursed) {
- GLog.w( TXT_UNEQUIP_CURSED, name() );
- return false;
- }
-
- hero.belongings.weapon = null;
- hero.spendAndNext( TIME_TO_EQUIP );
-
- if (collect && !collect( hero.belongings.backpack )) {
- Dungeon.level.drop( this, hero.pos );
- }
-
- return true;
- }
+
+ @Override
+ public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
+ if (super.doUnequip( hero, collect, single )) {
+
+ hero.belongings.weapon = null;
+ return true;
+
+ } else {
+
+ return false;
+
+ }
+ }
public void activate( Hero hero ) {
}
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java
new file mode 100644
index 000000000..48ff91a30
--- /dev/null
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Weightstone.java
@@ -0,0 +1,195 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2014 Oleg Dolya
+ *
+ * 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;
+
+import java.util.ArrayList;
+
+import com.watabou.noosa.BitmapTextMultiline;
+import com.watabou.noosa.audio.Sample;
+import com.shatteredpixel.shatteredpixeldungeon.Assets;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
+import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
+import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
+import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
+import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
+import com.shatteredpixel.shatteredpixeldungeon.windows.IconTitle;
+import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
+
+public class Weightstone extends Item {
+
+ private static final String TXT_SELECT_WEAPON = "Select a weapon to balance";
+ private static final String TXT_FAST = "you balanced your %s to make it faster";
+ private static final String TXT_ACCURATE = "you balanced your %s to make it more accurate";
+
+ private static final float TIME_TO_APPLY = 2;
+
+ private static final String AC_APPLY = "APPLY";
+
+ {
+ name = "weightstone";
+ image = ItemSpriteSheet.WEIGHT;
+
+ stackable = true;
+ }
+
+ @Override
+ public ArrayList actions( Hero hero ) {
+ ArrayList actions = super.actions( hero );
+ actions.add( AC_APPLY );
+ return actions;
+ }
+
+ @Override
+ public void execute( Hero hero, String action ) {
+ if (action == AC_APPLY) {
+
+ curUser = hero;
+ GameScene.selectItem( itemSelector, WndBag.Mode.WEAPON, TXT_SELECT_WEAPON );
+
+ } else {
+
+ super.execute( hero, action );
+
+ }
+ }
+
+ @Override
+ public boolean isUpgradable() {
+ return false;
+ }
+
+ @Override
+ public boolean isIdentified() {
+ return true;
+ }
+
+ private void apply( Weapon weapon, boolean forSpeed ) {
+
+ detach( curUser.belongings.backpack );
+
+ if (forSpeed) {
+ weapon.imbue = Weapon.Imbue.SPEED;
+ GLog.p( TXT_FAST, weapon.name() );
+ } else {
+ weapon.imbue = Weapon.Imbue.ACCURACY;
+ GLog.p( TXT_ACCURATE, weapon.name() );
+ }
+
+ curUser.sprite.operate( curUser.pos );
+ Sample.INSTANCE.play( Assets.SND_MISS );
+
+ curUser.spend( TIME_TO_APPLY );
+ curUser.busy();
+ }
+
+ @Override
+ public int price() {
+ return 40 * quantity;
+ }
+
+ @Override
+ public String info() {
+ return
+ "Using a weightstone, you can balance your melee weapon to increase its speed or accuracy.";
+ }
+
+ private final WndBag.Listener itemSelector = new WndBag.Listener() {
+ @Override
+ public void onSelect( Item item ) {
+ if (item != null) {
+ GameScene.show( new WndBalance( (Weapon)item ) );
+ }
+ }
+ };
+
+ public class WndBalance extends Window {
+
+ private static final String TXT_CHOICE = "How would you like to balance your %s?";
+
+ private static final String TXT_SPEED = "For speed";
+ private static final String TXT_ACCURACY = "For accuracy";
+ private static final String TXT_CANCEL = "Never mind";
+
+ private static final int WIDTH = 120;
+ private static final int MARGIN = 2;
+ private static final int BUTTON_WIDTH = WIDTH - MARGIN * 2;
+ private static final int BUTTON_HEIGHT = 20;
+
+ public WndBalance( final Weapon weapon ) {
+ super();
+
+ IconTitle titlebar = new IconTitle( weapon );
+ titlebar.setRect( 0, 0, WIDTH, 0 );
+ add( titlebar );
+
+ BitmapTextMultiline tfMesage = PixelScene.createMultiline( Utils.format( TXT_CHOICE, weapon.name() ), 8 );
+ tfMesage.maxWidth = WIDTH - MARGIN * 2;
+ tfMesage.measure();
+ tfMesage.x = MARGIN;
+ tfMesage.y = titlebar.bottom() + MARGIN;
+ add( tfMesage );
+
+ float pos = tfMesage.y + tfMesage.height();
+
+ if (weapon.imbue != Weapon.Imbue.SPEED) {
+ RedButton btnSpeed = new RedButton( TXT_SPEED ) {
+ @Override
+ protected void onClick() {
+ hide();
+ Weightstone.this.apply( weapon, true );
+ }
+ };
+ btnSpeed.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT );
+ add( btnSpeed );
+
+ pos = btnSpeed.bottom();
+ }
+
+ if (weapon.imbue != Weapon.Imbue.ACCURACY) {
+ RedButton btnAccuracy = new RedButton( TXT_ACCURACY ) {
+ @Override
+ protected void onClick() {
+ hide();
+ Weightstone.this.apply( weapon, false );
+ }
+ };
+ btnAccuracy.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT );
+ add( btnAccuracy );
+
+ pos = btnAccuracy.bottom();
+ }
+
+ RedButton btnCancel = new RedButton( TXT_CANCEL ) {
+ @Override
+ protected void onClick() {
+ hide();
+ }
+ };
+ btnCancel.setRect( MARGIN, pos + MARGIN, BUTTON_WIDTH, BUTTON_HEIGHT );
+ add( btnCancel );
+
+ resize( WIDTH, (int)btnCancel.bottom() + MARGIN );
+ }
+
+ protected void onSelect( int index ) {};
+ }
+}
\ No newline at end of file
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java
index 510ab24b5..eed619794 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/Armor.java
@@ -37,7 +37,6 @@ import com.watabou.utils.Random;
public class Armor extends EquipableItem {
private static final String TXT_EQUIP_CURSED = "your %s constricts around you painfully";
- private static final String TXT_UNEQUIP_CURSED = "You can't remove cursed %s!";
private static final String TXT_IDENTIFY = "you are now familiar enough with your %s to identify it. It is %s.";
@@ -89,7 +88,7 @@ public class Armor extends EquipableItem {
detach( hero.belongings.backpack );
- if (hero.belongings.armor == null || hero.belongings.armor.doUnequip( hero, true )) {
+ if (hero.belongings.armor == null || hero.belongings.armor.doUnequip( hero, true, false )) {
hero.belongings.armor = this;
@@ -100,8 +99,8 @@ public class Armor extends EquipableItem {
}
((HeroSprite)hero.sprite).updateArmor();
-
- hero.spendAndNext( 2 * hero.speed() );
+
+ hero.spendAndNext( 2 * time2equip( hero ) );
return true;
} else {
@@ -111,29 +110,27 @@ public class Armor extends EquipableItem {
}
}
-
- @Override
- public boolean doUnequip( Hero hero, boolean collect ) {
- if (cursed) {
-
- GLog.w( TXT_UNEQUIP_CURSED, name() );
- return false;
-
- } else {
-
- hero.belongings.armor = null;
- hero.spendAndNext( hero.speed() );
-
- ((HeroSprite)hero.sprite).updateArmor();
-
- if (collect && !collect( hero.belongings.backpack )) {
- Dungeon.level.drop( this, hero.pos );
- }
-
- return true;
-
- }
- }
+
+ @Override
+ protected float time2equip( Hero hero ) {
+ return hero.speed();
+ }
+
+ @Override
+ public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
+ if (super.doUnequip( hero, collect, single )) {
+
+ hero.belongings.armor = null;
+ ((HeroSprite)hero.sprite).updateArmor();
+
+ return true;
+
+ } else {
+
+ return false;
+
+ }
+ }
@Override
public boolean isEquipped( Hero hero ) {
@@ -305,11 +302,19 @@ public class Armor extends EquipableItem {
}
return price;
}
-
- public Armor inscribe( Glyph glyph ) {
- this.glyph = glyph;
- return this;
- }
+
+ public Armor inscribe( Glyph glyph ) {
+
+ if (glyph != null && this.glyph == null) {
+ DR += tier;
+ } else if (glyph == null && this.glyph != null) {
+ DR -= tier;
+ }
+
+ this.glyph = glyph;
+
+ return this;
+ }
public boolean isInscribed() {
return glyph != null;
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java
index ce1f49f39..5dff86402 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/ClassArmor.java
@@ -85,7 +85,7 @@ abstract public class ClassArmor extends Armor {
@Override
public ArrayList actions( Hero hero ) {
ArrayList actions = super.actions( hero );
- if (hero.HP >= 2 && isEquipped( hero )) {
+ if (hero.HP >= 3 && isEquipped( hero )) {
actions.add( special() );
}
return actions;
@@ -95,7 +95,7 @@ abstract public class ClassArmor extends Armor {
public void execute( Hero hero, String action ) {
if (action == special()) {
- if (hero.HP < 2) {
+ if (hero.HP < 3) {
GLog.w( TXT_LOW_HEALTH );
} else if (!isEquipped( hero )) {
GLog.w( TXT_NOT_EQUIPPED );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/HuntressArmor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/HuntressArmor.java
index 3ad88ec7f..ef2c78f10 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/HuntressArmor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/HuntressArmor.java
@@ -81,7 +81,7 @@ public class HuntressArmor extends ClassArmor {
return;
}
- curUser.HP /= 2;
+ curUser.HP -= (curUser.HP / 3);
curUser.sprite.zap( curUser.pos );
curUser.busy();
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/MageArmor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/MageArmor.java
index 55c9a425d..ee70412dd 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/MageArmor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/MageArmor.java
@@ -64,8 +64,8 @@ public class MageArmor extends ClassArmor {
Buff.prolong( mob, Roots.class, 3 );
}
}
-
- curUser.HP /= 2;
+
+ curUser.HP -= (curUser.HP / 3);
curUser.spend( Actor.TICK );
curUser.sprite.operate( curUser.pos );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/RogueArmor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/RogueArmor.java
index 05a682f0a..eecb856b8 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/RogueArmor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/RogueArmor.java
@@ -26,7 +26,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
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.actors.mobs.Mob.State;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlink;
@@ -88,13 +87,13 @@ public class RogueArmor extends ClassArmor {
GLog.w( TXT_FOV );
return;
}
-
- curUser.HP /= 2;
+
+ curUser.HP -= (curUser.HP / 3);
for (Mob mob : Dungeon.level.mobs) {
if (Level.fieldOfView[mob.pos]) {
Buff.prolong( mob, Blindness.class, 2 );
- mob.state = State.WANDERING;
+ mob.state = mob.WANDERING;
mob.sprite.emitter().burst( Speck.factory( Speck.LIGHT ), 4 );
}
}
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/WarriorArmor.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/WarriorArmor.java
index 96be36571..53ad17f04 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/WarriorArmor.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/WarriorArmor.java
@@ -17,8 +17,8 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items.armor;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
import com.watabou.noosa.Camera;
-import com.watabou.noosa.tweeners.PosTweener;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@@ -37,8 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
-import com.watabou.utils.PointF;
-
+import com.watabou.utils.Callback;
public class WarriorArmor extends ClassArmor {
private static int LEAP_TIME = 1;
@@ -90,34 +89,36 @@ public class WarriorArmor extends ClassArmor {
if (Actor.findChar( cell ) != null && cell != curUser.pos) {
cell = Ballistica.trace[Ballistica.distance - 2];
}
-
- curUser.HP /= 2;
+
+ curUser.HP -= (curUser.HP / 3);
if (curUser.subClass == HeroSubClass.BERSERKER && curUser.HP <= curUser.HT * Fury.LEVEL) {
Buff.affect( curUser, Fury.class );
}
Invisibility.dispel();
-
- curUser.move( cell );
- curUser.sprite.place( cell );
- Dungeon.level.press( target, curUser );
- Dungeon.observe();
-
- for (int i=0; i < Level.NEIGHBOURS8.length; i++) {
- Char mob = Actor.findChar( curUser.pos + Level.NEIGHBOURS8[i] );
- if (mob != null && mob != curUser) {
- Buff.prolong( mob, Paralysis.class, SHOCK_TIME );
- }
- }
-
- PointF pos = curUser.sprite.point();
- Camera.main.target = null;
- curUser.sprite.y -= 16;
- curUser.sprite.parent.add( new PosTweener( curUser.sprite, pos, 0.1f ) );
-
- CellEmitter.center( cell ).burst( Speck.factory( Speck.DUST ), 10 );
-
- curUser.spendAndNext( LEAP_TIME );
+
+ final int dest = cell;
+ curUser.busy();
+ ((HeroSprite)curUser.sprite).jump(curUser.pos, cell, new Callback() {
+ @Override
+ public void call() {
+ curUser.move(dest);
+ Dungeon.level.press(dest, curUser);
+ Dungeon.observe();
+
+ for (int i = 0; i < Level.NEIGHBOURS8.length; i++) {
+ Char mob = Actor.findChar(curUser.pos + Level.NEIGHBOURS8[i]);
+ if (mob != null && mob != curUser) {
+ Buff.prolong(mob, Paralysis.class, SHOCK_TIME);
+ }
+ }
+
+ CellEmitter.center(dest).burst(Speck.factory(Speck.DUST), 10);
+ Camera.main.shake(2, 0.5f);
+
+ curUser.spendAndNext(LEAP_TIME);
+ }
+ });
}
}
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Bounce.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Bounce.java
index d0f884ada..c390d9a1a 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Bounce.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Bounce.java
@@ -47,7 +47,7 @@ public class Bounce extends Glyph {
Actor.addDelayed( new Pushing( attacker, attacker.pos, newPos ), -1 );
attacker.pos = newPos;
- // ��� ��� ��� ����� :(
+ // FIXME
if (attacker instanceof Mob) {
Dungeon.level.mobPress( (Mob)attacker );
} else {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java
index 9a0bb556b..514b4af8d 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java
@@ -125,7 +125,7 @@ public class Viscosity extends Glyph {
target.damage( 1, this );
if (target == Dungeon.hero && !target.isAlive()) {
- // Refactoring needed!
+ // FIXME
Glyph glyph = new Viscosity();
Dungeon.fail( Utils.format( ResultDescriptions.GLYPH, glyph.name(), Dungeon.depth ) );
GLog.n( "%s killed you...", glyph.name() );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java
index 0e73cb2aa..859bd6bcc 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java
@@ -97,7 +97,8 @@ public class Artifact extends KindofMisc {
}
@Override
- public boolean doUnequip( Hero hero, boolean collect ) {
+ public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
+ if (super.doUnequip( hero, collect, single )) {
if (hero.belongings.misc1 == this) {
hero.belongings.misc1 = null;
@@ -108,13 +109,13 @@ public class Artifact extends KindofMisc {
passiveBuff.detach();
passiveBuff = null;
- hero.spendAndNext( TIME_TO_EQUIP );
-
- if (collect && !collect( hero.belongings.backpack )) {
- Dungeon.level.drop( this, hero.pos );
- }
-
return true;
+
+ } else {
+
+ return false;
+
+ }
}
@Override
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java
index 36979f843..02aabd8cf 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/Bag.java
@@ -84,12 +84,11 @@ public class Bag extends Item implements Iterable- {
return false;
}
}
-
- @Override
- public Item detach( Bag container ) {
- owner = null;
- return super.detach( container );
- }
+
+ @Override
+ public void onDetach( ) {
+ this.owner = null;
+ }
@Override
public boolean isUpgradable() {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/WandHolster.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/WandHolster.java
index 0766a103b..eef19657f 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/WandHolster.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/bags/WandHolster.java
@@ -48,16 +48,13 @@ public class WandHolster extends Bag {
return false;
}
}
-
+
@Override
- public Item detach( Bag container ) {
-
- for (Item item : items) {
- ((Wand)item).stopCharging();
- }
-
- return super.detach( container );
- }
+ public void onDetach( ) {
+ for (Item item : items) {
+ ((Wand)item).stopCharging();
+ }
+ }
@Override
public int price() {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/food/MysteryMeat.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/food/MysteryMeat.java
index 301d6dc7e..5197179a5 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/food/MysteryMeat.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/food/MysteryMeat.java
@@ -57,7 +57,7 @@ public class MysteryMeat extends Food {
break;
case 2:
GLog.w( "You are not feeling well." );
- Buff.affect( hero, Poison.class ).set( Poison.durationFactor( hero ) * hero.HT / 2 / Poison.DOT );
+ Buff.affect( hero, Poison.class ).set( Poison.durationFactor( hero ) * hero.HT / 5 );
break;
case 3:
GLog.w( "You are stuffed." );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/IronKey.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/IronKey.java
index 15bafd949..c8e96ef97 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/IronKey.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/IronKey.java
@@ -27,7 +27,7 @@ public class IronKey extends Key {
private static final String TXT_FROM_DEPTH = "iron key from depth %d";
- public static int curDepthQunatity = 0;
+ public static int curDepthQuantity = 0;
{
name = "iron key";
@@ -51,15 +51,13 @@ public class IronKey extends Key {
}
return result;
}
-
- @Override
- public Item detach( Bag bag ) {
- Item result = super.detach( bag );
- if (result != null && depth == Dungeon.depth) {
- Dungeon.hero.belongings.countIronKeys();
- }
- return result;
- }
+
+ @Override
+ public void onDetach( ) {
+ if (depth == Dungeon.depth) {
+ Dungeon.hero.belongings.countIronKeys();
+ }
+ }
@Override
public String toString() {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java
index 8799e118d..57d41fbe0 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java
@@ -36,13 +36,6 @@ public class Key extends Item {
return item.getClass() == getClass() && ((Key)item).depth == depth;
}
- @Override
- public Item detach( Bag container ) {
- Key key = (Key)super.detach( container );
- key.depth = depth;
- return key;
- }
-
private static final String DEPTH = "depth";
@Override
@@ -66,4 +59,10 @@ public class Key extends Item {
public boolean isIdentified() {
return true;
}
+
+ @Override
+ public String status() {
+ return depth + "*";
+ }
+
}
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java
index dda1c0ae9..29e7cffdb 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/rings/Ring.java
@@ -145,32 +145,28 @@ public class Ring extends KindofMisc {
buff = buff();
buff.attachTo( ch );
}
-
- @Override
- public boolean doUnequip( Hero hero, boolean collect ) {
-
- if (cursed) {
- GLog.w( "You can't remove cursed " + name() + "!" );
- return false;
- }
-
- if (hero.belongings.misc1 == this) {
- hero.belongings.misc1 = null;
- } else {
- hero.belongings.misc2 = null;
- }
-
- buff.detach();
- buff = null;
-
- hero.spendAndNext( TIME_TO_EQUIP );
-
- if (collect && !collect( hero.belongings.backpack )) {
- Dungeon.level.drop( this, hero.pos );
- }
-
- return true;
- }
+
+ @Override
+ public boolean doUnequip( Hero hero, boolean collect, boolean single ) {
+ if (super.doUnequip( hero, collect, single )) {
+
+ if (hero.belongings.misc1 == this) {
+ hero.belongings.misc1 = null;
+ } else {
+ hero.belongings.misc2 = null;
+ }
+
+ hero.remove( buff );
+ buff = null;
+
+ return true;
+
+ } else {
+
+ return false;
+
+ }
+ }
@Override
public boolean isEquipped( Hero hero ) {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java
index 45a864354..b2d43b2fa 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java
@@ -147,8 +147,8 @@ public abstract class Wand extends KindOfWeapon {
@Override
public boolean doUnequip( Hero hero, boolean collect ) {
- charger.detach();
- return super.doUnequip(hero, collect);
+ onDetach();
+ return super.doUnequip( hero, collect );
}
@Override
@@ -188,17 +188,10 @@ public abstract class Wand extends KindOfWeapon {
public void charge( Char owner ) {
(charger = new Charger()).attachTo( owner );
}
-
- @Override
- public Item detach( Bag container ) {
- stopCharging();
- return super.detach( container );
- }
@Override
- public Item detachAll( Bag container) {
+ public void onDetach( ) {
stopCharging();
- return super.detachAll( container );
}
public void stopCharging() {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfAmok.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfAmok.java
index 254558d43..b84421c44 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfAmok.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfAmok.java
@@ -17,6 +17,8 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
@@ -37,8 +39,12 @@ public class WandOfAmok extends Wand {
protected void onZap( int cell ) {
Char ch = Actor.findChar( cell );
if (ch != null) {
-
- Buff.affect( ch, Amok.class, 3f + level() );
+
+ if (ch == Dungeon.hero) {
+ Buff.affect( ch, Vertigo.class, Vertigo.duration(ch) );
+ } else {
+ Buff.affect( ch, Amok.class, 3f + level() );
+ }
} else {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfFlock.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfFlock.java
index dcc8bd740..500a08237 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfFlock.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfFlock.java
@@ -17,12 +17,12 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
+import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
-import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
@@ -104,7 +104,7 @@ public class WandOfFlock extends Wand {
"A flick of this wand summons a flock of magic sheep, creating temporary impenetrable obstacle.";
}
- public static class Sheep extends Mob.NPC {
+ public static class Sheep extends NPC {
private static final String[] QUOTES = {"Baa!", "Baa?", "Baa.", "Baa..."};
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLightning.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLightning.java
index 3bd3d7a79..8e9edbc6a 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLightning.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfLightning.java
@@ -48,7 +48,6 @@ public class WandOfLightning extends Wand {
@Override
protected void onZap( int cell ) {
- // The actual effect is processed in "fx" method
if (!curUser.isAlive()) {
Dungeon.fail( Utils.format( ResultDescriptions.ITEM, name, Dungeon.depth ) );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPoison.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPoison.java
index 05385b3d6..6806017f2 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPoison.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfPoison.java
@@ -38,7 +38,7 @@ public class WandOfPoison extends Wand {
Char ch = Actor.findChar( cell );
if (ch != null) {
- Buff.affect( ch, Poison.class ).set( Poison.durationFactor( ch ) * (1 + 2 * (float)Math.pow( 1.5, level() )) );
+ Buff.affect( ch, Poison.class ).set( Poison.durationFactor( ch ) * (5 + level()) );
} else {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTelekinesis.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTelekinesis.java
index 816bdc51f..bbc95f9e3 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTelekinesis.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTelekinesis.java
@@ -80,7 +80,7 @@ public class WandOfTelekinesis extends Wand {
ch.pos = next;
Actor.freeCell( next );
- // Refactoring needed!
+ // FIXME
if (ch instanceof Mob) {
Dungeon.level.mobPress( (Mob)ch );
} else {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTeleportation.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTeleportation.java
index 89b280457..8810f408a 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTeleportation.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfTeleportation.java
@@ -17,7 +17,7 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items.wands;
-import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
+import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.NPC;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@@ -44,7 +44,7 @@ public class WandOfTeleportation extends Wand {
setKnown();
ScrollOfTeleportation.teleportHero( curUser );
- } else if (ch != null && !(ch instanceof Mob.NPC)) {
+ } else if (ch != null && !(ch instanceof NPC)) {
int count = 10;
int pos;
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java
index 3bdc33807..30394c49b 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/Weapon.java
@@ -46,7 +46,12 @@ public class Weapon extends KindOfWeapon {
public int STR = 10;
public float ACU = 1; // Accuracy modifier
public float DLY = 1f; // Speed modifier
-
+
+ public enum Imbue {
+ NONE, SPEED, ACCURACY
+ }
+ public Imbue imbue = Imbue.NONE;
+
private int hitsToKnow = 20;
protected Enchantment enchantment;
@@ -68,17 +73,20 @@ public class Weapon extends KindOfWeapon {
}
private static final String ENCHANTMENT = "enchantment";
+ private static final String IMBUE = "imbue";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
bundle.put( ENCHANTMENT, enchantment );
+ bundle.put( IMBUE, imbue );
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
enchantment = (Enchantment)bundle.get( ENCHANTMENT );
+ imbue = bundle.getEnum( IMBUE, Imbue.class );
}
@Override
@@ -104,8 +112,10 @@ public class Weapon extends KindOfWeapon {
}
ACU *= (float)(Math.pow(1.1, bonus));
}
-
- return encumbrance > 0 ? (float)((ACU) / Math.pow( 1.5, encumbrance )) : ACU;
+
+ return
+ (encumbrance > 0 ? (float)(ACU / Math.pow( 1.5, encumbrance )) : ACU) *
+ (imbue == Imbue.ACCURACY ? 1.5f : 1.0f);
}
@Override
@@ -122,8 +132,10 @@ public class Weapon extends KindOfWeapon {
}
float DLY = (float)(0.25 + (this.DLY - 0.25)*Math.pow(0.8, bonus));
-
- return encumrance > 0 ? (float)(DLY * Math.pow( 1.2, encumrance )) : DLY;
+
+ return
+ (encumrance > 0 ? (float)(DLY * Math.pow( 1.2, encumrance )) : DLY) *
+ (imbue == Imbue.SPEED ? 0.6f : 1.0f);
}
@Override
@@ -131,7 +143,7 @@ public class Weapon extends KindOfWeapon {
int damage = super.damageRoll( hero );
- if (hero.usingRanged == (hero.heroClass == HeroClass.HUNTRESS)) {
+ if ((hero.rangedWeapon != null) == (hero.heroClass == HeroClass.HUNTRESS)) {
int exStr = hero.STR() - STR;
if (exStr > 0) {
damage += Random.IntRange( 0, exStr );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Horror.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Horror.java
index 4011693a5..4e781ae86 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Horror.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Horror.java
@@ -17,9 +17,11 @@
*/
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments;
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
+import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite.Glowing;
@@ -39,9 +41,12 @@ public class Horror extends Weapon.Enchantment {
int level = Math.max( 0, weapon.level );
if (Random.Int( level + 5 ) >= 4) {
-
- Terror terror = Buff.affect( defender, Terror.class, Terror.DURATION );
- terror.source = attacker;
+
+ if (defender == Dungeon.hero) {
+ Buff.affect( defender, Vertigo.class, Vertigo.duration(defender) );
+ } else {
+ Buff.affect( defender, Terror.class, Terror.DURATION ).source = attacker;
+ }
return true;
} else {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java
index 2fb4085e3..135af2d6f 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MeleeWeapon.java
@@ -114,7 +114,16 @@ public class MeleeWeapon extends Weapon {
info.append( " weapon. ");
} else if (ACU != 1f) {
info.append( "This is a rather " + (ACU > 1f ? "accurate" : "inaccurate") + " weapon. " );
- }
+ }
+ switch (imbue) {
+ case SPEED:
+ info.append( "It was balanced to make it faster. " );
+ break;
+ case ACCURACY:
+ info.append( "It was balanced to make it more accurate. " );
+ break;
+ case NONE:
+ }
if (enchantment != null) {
info.append( "It is enchanted." );
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java
index 498b08dcd..a7192c759 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/Boomerang.java
@@ -76,27 +76,41 @@ public class Boomerang extends MissileWeapon {
return super.enchant( ench );
}
-
- @Override
- public void proc( Char attacker, Char defender, int damage ) {
- super.proc( attacker, defender, damage );
- if (attacker instanceof Hero && ((Hero)attacker).usingRanged) {
- circleBack( defender.pos, (Hero)attacker );
- }
- }
-
- @Override
- protected void miss( int cell ) {
- circleBack( cell, curUser );
- }
-
- private void circleBack( int from, Hero owner ) {
- if (!collect( curUser.belongings.backpack )) {
- Dungeon.level.drop( this, owner.pos ).sprite.drop();
- }
- ((MissileSprite)curUser.sprite.parent.recycle( MissileSprite.class )).
- reset( from, curUser.pos, curItem, null );
- }
+
+ @Override
+ public void proc( Char attacker, Char defender, int damage ) {
+ super.proc( attacker, defender, damage );
+ if (attacker instanceof Hero && ((Hero)attacker).rangedWeapon == this) {
+ circleBack( defender.pos, (Hero)attacker );
+ }
+ }
+
+ @Override
+ protected void miss( int cell ) {
+ circleBack( cell, curUser );
+ }
+
+ private void circleBack( int from, Hero owner ) {
+
+ ((MissileSprite)curUser.sprite.parent.recycle( MissileSprite.class )).
+ reset( from, curUser.pos, curItem, null );
+
+ if (throwEquiped) {
+ owner.belongings.weapon = this;
+ owner.spend( -TIME_TO_EQUIP );
+ } else
+ if (!collect( curUser.belongings.backpack )) {
+ Dungeon.level.drop( this, owner.pos ).sprite.drop();
+ }
+ }
+
+ private boolean throwEquiped;
+
+ @Override
+ public void cast( Hero user, int dst ) {
+ throwEquiped = isEquipped( user );
+ super.cast( user, dst );
+ }
@Override
public String desc() {
diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java
index 21c2c8f8d..b83e05420 100644
--- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java
+++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java
@@ -94,9 +94,9 @@ public class MissileWeapon extends Weapon {
super.proc( attacker, defender, damage );
Hero hero = (Hero)attacker;
- if (!hero.usingRanged && stackable) {
- if (quantity == 1) {
- doUnequip( hero, false );
+ if (hero.rangedWeapon == null && stackable) {
+ if (quantity == 1) {
+ doUnequip( hero, false, false );
} else {
detach( null );
}