From 673582c5c4fc9c725936c85687e8d4d76e5a9e68 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 1 Mar 2019 01:49:37 -0500 Subject: [PATCH] v0.7.2: rebalanced 3 stones: - clairvoyance adjusted, no longer disarms traps, now goes through walls - detect curse is now disarming. Disarms up to 9 traps in an AOE - aggression now forces targeting on whatever it is thrown at. --- .../ShatteredPixelDungeon.java | 5 + .../actors/mobs/Mob.java | 18 ++- .../items/Generator.java | 4 +- .../items/scrolls/Scroll.java | 4 +- .../items/stones/StoneOfAggression.java | 50 ++++++--- .../items/stones/StoneOfClairvoyance.java | 90 +++++---------- .../items/stones/StoneOfDetectCurse.java | 57 ---------- .../items/stones/StoneOfDisarming.java | 104 ++++++++++++++++++ .../sprites/ItemSpriteSheet.java | 2 +- .../shatteredpixeldungeon/windows/WndBag.java | 3 - .../messages/items/items.properties | 13 +-- 11 files changed, 193 insertions(+), 157 deletions(-) delete mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDetectCurse.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDisarming.java diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 480602e62..17b78fedc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -117,6 +117,11 @@ public class ShatteredPixelDungeon extends Game { com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Gloves.class, "com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Knuckles" ); + //v0.7.2 + com.watabou.utils.Bundle.addAlias( + com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDisarming.class, + "com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDetectCurse" ); + } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java index 90a1381d8..4b3f2d413 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Mob.java @@ -195,11 +195,15 @@ public abstract class Mob extends Char { } } - StoneOfAggression.Aggression aggro = buff( StoneOfAggression.Aggression.class ); - if (aggro != null){ - Char source = (Char)Actor.findById( aggro.object ); - if (source != null){ - return source; + //if we are an enemy, and have no target or current target isn't affected by aggression + //then auto-prioritize a target that is affected by aggression, even another enemy + if (alignment == Alignment.ENEMY + && (enemy == null || enemy.buff(StoneOfAggression.Aggression.class) == null)) { + for (Char ch : Actor.chars()) { + if (ch != this && fieldOfView[ch.pos] && + ch.buff(StoneOfAggression.Aggression.class) != null) { + return ch; + } } } @@ -553,6 +557,10 @@ public abstract class Mob extends Char { state = HUNTING; } } + + public boolean isTargeting( Char ch){ + return enemy == ch; + } @Override public void damage( int dmg, Object src ) { 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 4b6122861..7d15379d1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Generator.java @@ -93,7 +93,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlast; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlink; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfClairvoyance; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDeepenedSleep; -import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDetectCurse; +import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDisarming; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfFlock; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfIntuition; @@ -287,7 +287,7 @@ public class Generator { StoneOfBlink.class, StoneOfClairvoyance.class, StoneOfDeepenedSleep.class, - StoneOfDetectCurse.class, + StoneOfDisarming.class, StoneOfFlock.class, StoneOfShock.class }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java index 7ec9a9234..0b2dabb42 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java @@ -40,7 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlast; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfBlink; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfClairvoyance; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDeepenedSleep; -import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDetectCurse; +import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDisarming; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfFlock; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfIntuition; @@ -314,7 +314,7 @@ public abstract class Scroll extends Item { stones.put(ScrollOfRecharging.class, StoneOfShock.class); amnts.put(ScrollOfRecharging.class, 2); - stones.put(ScrollOfRemoveCurse.class, StoneOfDetectCurse.class); + stones.put(ScrollOfRemoveCurse.class, StoneOfDisarming.class); amnts.put(ScrollOfRemoveCurse.class, 2); stones.put(ScrollOfTeleportation.class, StoneOfBlink.class); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java index a96294715..169c592b7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfAggression.java @@ -22,17 +22,19 @@ package com.shatteredpixel.shatteredpixeldungeon.items.stones; 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.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; -import com.watabou.utils.PathFinder; public class StoneOfAggression extends Runestone { @@ -43,27 +45,29 @@ public class StoneOfAggression extends Runestone { @Override protected void activate(int cell) { - CellEmitter.center(cell).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); - Sample.INSTANCE.play( Assets.SND_READ ); + Char ch = Actor.findChar( cell ); - for (int i : PathFinder.NEIGHBOURS9){ - - Char ch = Actor.findChar( cell + i ); - - if (ch != null && ch.alignment == Char.Alignment.ENEMY){ - Buff.prolong(ch, Aggression.class, Aggression.DURATION).object = curUser.id(); + if (ch != null) { + if (ch.alignment == Char.Alignment.ENEMY) { + Buff.prolong(ch, Aggression.class, Aggression.DURATION / 5f); + } else { + Buff.prolong(ch, Aggression.class, Aggression.DURATION); + } + CellEmitter.center(cell).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); + Sample.INSTANCE.play( Assets.SND_READ ); + } else { + //Item.onThrow + Heap heap = Dungeon.level.drop( this, cell ); + if (!heap.isEmpty()) { + heap.sprite.drop( cell ); } } - + } public static class Aggression extends FlavourBuff { - public static final float DURATION = 10f; - - public int object = 0; - - private static final String OBJECT = "object"; + public static final float DURATION = 20f; { type = buffType.NEGATIVE; @@ -73,13 +77,25 @@ public class StoneOfAggression extends Runestone { @Override public void storeInBundle( Bundle bundle ) { super.storeInBundle(bundle); - bundle.put(OBJECT, object); } @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle( bundle ); - object = bundle.getInt( OBJECT ); + } + + @Override + public void detach() { + //if our target is an enemy, reset the aggro of any enemies targeting it + if (target.alignment == Char.Alignment.ENEMY) { + for (Mob m : Dungeon.level.mobs) { + if (m.alignment == Char.Alignment.ENEMY && m.isTargeting(target)) { + m.aggro(null); + } + } + } + super.detach(); + } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfClairvoyance.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfClairvoyance.java index 00cd4510a..f0ed260a4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfClairvoyance.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfClairvoyance.java @@ -23,21 +23,13 @@ package com.shatteredpixel.shatteredpixeldungeon.items.stones; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.CheckedCell; -import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; -import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.mechanics.ShadowCaster; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Point; -import com.watabou.utils.Random; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; public class StoneOfClairvoyance extends Runestone { @@ -49,68 +41,40 @@ public class StoneOfClairvoyance extends Runestone { @Override protected void activate(final int cell) { - boolean[] FOV = new boolean[Dungeon.level.length()]; Point c = Dungeon.level.cellToPoint(cell); - ShadowCaster.castShadow(c.x, c.y, FOV, Dungeon.level.losBlocking, DIST); - int sX = Math.max(0, c.x - DIST); - int eX = Math.min(Dungeon.level.width()-1, c.x + DIST); - - int sY = Math.max(0, c.y - DIST); - int eY = Math.min(Dungeon.level.height()-1, c.y + DIST); - - ArrayList disarmCandidates = new ArrayList<>(); + int[] rounding = ShadowCaster.rounding[DIST]; + int left, right; + int curr; boolean noticed = false; - for (int y = sY; y <= eY; y++){ - int curr = y*Dungeon.level.width() + sX; - for ( int x = sX; x <= eX; x++){ + for (int y = Math.max(0, c.y - DIST); y <= Math.min(Dungeon.level.height()-1, c.y + DIST); y++) { + if (rounding[Math.abs(c.y - y)] < Math.abs(c.y - y)) { + left = c.x - rounding[Math.abs(c.y - y)]; + } else { + left = DIST; + while (rounding[left] < rounding[Math.abs(c.y - y)]){ + left--; + } + left = c.x - left; + } + right = Math.min(Dungeon.level.width()-1, c.x + c.x - left); + left = Math.max(0, left); + for (curr = left + y * Dungeon.level.width(); curr <= right + y * Dungeon.level.width(); curr++){ - if (FOV[curr]){ - curUser.sprite.parent.addToBack( new CheckedCell( curr ) ); - Dungeon.level.mapped[curr] = true; + curUser.sprite.parent.addToBack( new CheckedCell( curr ) ); + Dungeon.level.mapped[curr] = true; + + if (Dungeon.level.secret[curr]) { + Dungeon.level.discover(curr); - if (Dungeon.level.secret[curr]) { - Dungeon.level.discover(curr); - - if (Dungeon.level.heroFOV[curr]) { - GameScene.discoverTile(curr, Dungeon.level.map[curr]); - ScrollOfMagicMapping.discover(curr); - noticed = true; - } + if (Dungeon.level.heroFOV[curr]) { + GameScene.discoverTile(curr, Dungeon.level.map[curr]); + ScrollOfMagicMapping.discover(curr); + noticed = true; } - - Trap t = Dungeon.level.traps.get(curr); - if (t != null && t.active){ - disarmCandidates.add(t); - } - } - curr++; - } - } - - Collections.sort(disarmCandidates, new Comparator() { - @Override - public int compare(Trap o1, Trap o2) { - float diff = Dungeon.level.trueDistance(cell, o1.pos) - Dungeon.level.trueDistance(cell, o2.pos); - if (diff < 0){ - return -1; - } else if (diff == 0){ - return Random.Int(2) == 0 ? -1 : 1; - } else { - return 1; - } - } - }); - - //disarms at most two traps - if (disarmCandidates.size() > 0){ - disarmCandidates.get(0).disarm(); - CellEmitter.get(disarmCandidates.get(0).pos).burst(Speck.factory(Speck.STEAM), 6); - if (disarmCandidates.size() > 1){ - disarmCandidates.get(1).disarm(); - CellEmitter.get(disarmCandidates.get(1).pos).burst(Speck.factory(Speck.STEAM), 6); + } } @@ -120,6 +84,8 @@ public class StoneOfClairvoyance extends Runestone { Sample.INSTANCE.play( Assets.SND_TELEPORT ); GameScene.updateFog(); + + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDetectCurse.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDetectCurse.java deleted file mode 100644 index cd82f1cd2..000000000 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDetectCurse.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Pixel Dungeon - * Copyright (C) 2012-2015 Oleg Dolya - * - * Shattered Pixel Dungeon - * Copyright (C) 2014-2019 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.stones; - -import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem; -import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; -import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; -import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; - -public class StoneOfDetectCurse extends InventoryStone { - - { - mode = WndBag.Mode.CURSE_DETECTABLE; - image = ItemSpriteSheet.STONE_CURSE; - } - - @Override - protected void onItemSelected(Item item) { - - item.cursedKnown = true; - useAnimation(); - - if (item.cursed){ - GLog.w( Messages.get(this, "cursed") ); - } else { - GLog.w( Messages.get(this, "not_cursed") ); - } - } - - public static boolean canDetectCurse(Item item){ - return !item.isIdentified() - && !item.cursedKnown - && (item instanceof EquipableItem || item instanceof Wand); - } -} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDisarming.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDisarming.java new file mode 100644 index 000000000..429afa38c --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/stones/StoneOfDisarming.java @@ -0,0 +1,104 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2019 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.stones; + +import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; +import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.ShadowCaster; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class StoneOfDisarming extends Runestone { + + private static final int DIST = 8; + + { + image = ItemSpriteSheet.STONE_DISARM; + } + + @Override + protected void activate(final int cell) { + boolean[] FOV = new boolean[Dungeon.level.length()]; + Point c = Dungeon.level.cellToPoint(cell); + ShadowCaster.castShadow(c.x, c.y, FOV, Dungeon.level.losBlocking, DIST); + + int sX = Math.max(0, c.x - DIST); + int eX = Math.min(Dungeon.level.width()-1, c.x + DIST); + + int sY = Math.max(0, c.y - DIST); + int eY = Math.min(Dungeon.level.height()-1, c.y + DIST); + + ArrayList disarmCandidates = new ArrayList<>(); + + for (int y = sY; y <= eY; y++){ + int curr = y*Dungeon.level.width() + sX; + for ( int x = sX; x <= eX; x++){ + + if (FOV[curr]){ + + Trap t = Dungeon.level.traps.get(curr); + if (t != null && t.active){ + disarmCandidates.add(t); + } + + } + curr++; + } + } + + Collections.sort(disarmCandidates, new Comparator() { + @Override + public int compare(Trap o1, Trap o2) { + float diff = Dungeon.level.trueDistance(cell, o1.pos) - Dungeon.level.trueDistance(cell, o2.pos); + if (diff < 0){ + return -1; + } else if (diff == 0){ + return Random.Int(2) == 0 ? -1 : 1; + } else { + return 1; + } + } + }); + + //disarms at most nine traps + while (disarmCandidates.size() > 9){ + disarmCandidates.remove(9); + } + + for ( Trap t : disarmCandidates){ + t.reveal(); + t.disarm(); + CellEmitter.get(t.pos).burst(Speck.factory(Speck.STEAM), 6); + } + + Sample.INSTANCE.play( Assets.SND_TELEPORT ); + } +} 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 bb41ba9ec..13c6097d6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -477,7 +477,7 @@ public class ItemSpriteSheet { public static final int STONE_BLINK = STONES+4; public static final int STONE_CLAIRVOYANCE = STONES+5; public static final int STONE_SLEEP = STONES+6; - public static final int STONE_CURSE = STONES+7; + public static final int STONE_DISARM = STONES+7; public static final int STONE_ENCHANT = STONES+8; public static final int STONE_FLOCK = STONES+9; public static final int STONE_INTUITION = STONES+10; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java index ac02fddd5..a8a46c584 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBag.java @@ -42,7 +42,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Recycle; -import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfDetectCurse; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; @@ -87,7 +86,6 @@ public class WndBag extends WndTabbed { POTION, SCROLL, UNIDED_POTION_OR_SCROLL, - CURSE_DETECTABLE, EQUIPMENT, TRANMSUTABLE, ALCHEMY, @@ -401,7 +399,6 @@ public class WndBag extends WndTabbed { mode == Mode.POTION && (item instanceof Potion) || mode == Mode.SCROLL && (item instanceof Scroll) || mode == Mode.UNIDED_POTION_OR_SCROLL && (!item.isIdentified() && (item instanceof Scroll || item instanceof Potion)) || - mode == Mode.CURSE_DETECTABLE && StoneOfDetectCurse.canDetectCurse(item) || mode == Mode.EQUIPMENT && (item instanceof EquipableItem) || mode == Mode.ALCHEMY && Recipe.usableInRecipe(item) || mode == Mode.TRANMSUTABLE && ScrollOfTransmutation.canTransmute(item) || 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 765c2369d..93901e3c0 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 @@ -997,8 +997,8 @@ items.stones.inventorystone.ac_use=USE items.stones.runestone$placeholder.name=runestone items.stones.stoneofaggression.name=stone of aggression -items.stones.stoneofaggression.desc=When this stone is thrown near an enemy, it will afflict them with aggression magic.\n\nAn enemy under the influence of aggression will be forced to attack you instead of any allies, if any allies are nearby. -items.stones.stoneofaggression$aggression.name=Aggression +items.stones.stoneofaggression.desc=When this stone is thrown at an ally or enemy, all nearby enemies will be forced to attack that character for a short time.\n\nWhen used on enemies, the magic will only last for a few moments, but when used on yourself or allies it will last significantly longer. +items.stones.stoneofaggression$aggression.name=Targeted items.stones.stoneofaugmentation.name=stone of augmentation items.stones.stoneofaugmentation.inv_title=Augment an item @@ -1021,16 +1021,13 @@ items.stones.stoneofblink.name=stone of blink items.stones.stoneofblink.desc=This runestone will teleport the user to the location it is thrown to. items.stones.stoneofclairvoyance.name=stone of clairvoyance -items.stones.stoneofclairvoyance.desc=This stone will instantly search all tiles which are visible from the location it is thrown to, and will disarm up to two traps which it finds. +items.stones.stoneofclairvoyance.desc=This stone will instantly reveal all tiles in a wide area around where it is thrown. Its effect will even reach through walls. items.stones.stoneofdeepenedsleep.name=stone of deepened sleep items.stones.stoneofdeepenedsleep.desc=When this stone is thrown near a sleeping enemy, it will magically deepen their sleep. Magically slept enemies will sleep forever until disturbed. -items.stones.stoneofdetectcurse.name=stone of detect curse -items.stones.stoneofdetectcurse.inv_title=Detect an item -items.stones.stoneofdetectcurse.cursed=You sense that the item is cursed! -items.stones.stoneofdetectcurse.not_cursed=There is no evil magic in that item. -items.stones.stoneofdetectcurse.desc=This runestone holds a weaker version of the magic found in scrolls of remove curse. While curses cannot be removed from an item, they will be detected. +items.stones.stoneofdisarming.name=stone of disarming +items.stones.stoneofdisarming.desc=This runestone holds magic that can disable malicious traps hidden throughout the dungeon. It will disarm up to 9 traps around the area it is thrown at. items.stones.stoneofenchantment.name=stone of enchantment items.stones.stoneofenchantment.inv_title=Enchant an item