diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java index d4b3a7821..3a1bf11c8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRecharging.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.scrolls; import com.shatteredpixel.shatteredpixeldungeon.Assets; +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging; @@ -62,8 +63,8 @@ public class ScrollOfRecharging extends Scroll { Buff.append(curUser, Recharging.class, BUFF_DURATION/3f); } - public static void charge( Hero hero ) { - hero.sprite.centerEmitter().burst( EnergyParticle.FACTORY, 15 ); + public static void charge( Char user ) { + user.sprite.centerEmitter().burst( EnergyParticle.FACTORY, 15 ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java index 7bfa23bb8..dc95c5f25 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java @@ -107,7 +107,11 @@ public class ScrollOfTeleportation extends Scroll { } - public static void teleportHero( Hero hero ) { + public static void teleportHero( Hero hero ) { + teleportChar( hero ); + } + + public static void teleportChar( Char ch ) { if (Dungeon.bossLevel()){ GLog.w( Messages.get(ScrollOfTeleportation.class, "no_tele") ); @@ -129,12 +133,15 @@ public class ScrollOfTeleportation extends Scroll { } else { - GLog.i( Messages.get(ScrollOfTeleportation.class, "tele") ); + appear( ch, pos ); + Dungeon.level.occupyCell( ch ); - appear( hero, pos ); - Dungeon.level.occupyCell(hero ); - Dungeon.observe(); - GameScene.updateFog(); + if (ch == Dungeon.hero) { + GLog.i( Messages.get(ScrollOfTeleportation.class, "tele") ); + + Dungeon.observe(); + GameScene.updateFog(); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java index 6fbb491fc..23bcd8ec3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/CursedWand.java @@ -82,7 +82,7 @@ public class CursedWand { private static float RARE_CHANCE = 0.09f; private static float VERY_RARE_CHANCE = 0.01f; - public static void cursedZap(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ + public static void cursedZap(final Item origin, final Char user, final Ballistica bolt, final Callback afterZap){ switch (Random.chances(new float[]{COMMON_CHANCE, UNCOMMON_CHANCE, RARE_CHANCE, VERY_RARE_CHANCE})){ case 0: default: @@ -100,7 +100,7 @@ public class CursedWand { } } - private static void commonEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ + private static void commonEffect(final Item origin, final Char user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //anti-entropy @@ -139,32 +139,15 @@ public class CursedWand { case 2: switch(Random.Int(2)){ case 0: - ScrollOfTeleportation.teleportHero(user); + ScrollOfTeleportation.teleportChar(user); afterZap.call(); break; case 1: cursedFX(user, bolt, new Callback() { public void call() { Char ch = Actor.findChar( bolt.collisionPos ); - if (ch == user){ - ScrollOfTeleportation.teleportHero(user); - } else if (ch != null && !ch.properties().contains(Char.Property.IMMOVABLE)) { - int count = 10; - int pos; - do { - pos = Dungeon.level.randomRespawnCell(); - if (count-- <= 0) { - break; - } - } while (pos == -1); - if (pos == -1 || Dungeon.bossLevel()) { - GLog.w( Messages.get(ScrollOfTeleportation.class, "no_tele") ); - } else { - ch.pos = pos; - if (((Mob) ch).state == ((Mob) ch).HUNTING)((Mob) ch).state = ((Mob) ch).WANDERING; - ch.sprite.place(ch.pos); - ch.sprite.visible = Dungeon.level.heroFOV[pos]; - } + if (ch != null && !ch.properties().contains(Char.Property.IMMOVABLE)) { + ScrollOfTeleportation.teleportChar(user); } afterZap.call(); } @@ -196,7 +179,7 @@ public class CursedWand { } - private static void uncommonEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ + private static void uncommonEffect(final Item origin, final Char user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //Random plant @@ -228,26 +211,37 @@ public class CursedWand { if (target != null) { cursedFX(user, bolt, new Callback() { public void call() { - int damage = user.lvl * 2; + int damage = Dungeon.depth * 2; + Char toHeal, toDamage; + switch (Random.Int(2)) { - case 0: - user.HP = Math.min(user.HT, user.HP + damage); - user.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); - target.damage(damage, origin); - target.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); + case 0: default: + toHeal = user; + toDamage = target; break; case 1: - user.damage( damage, this ); - user.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); - target.HP = Math.min(target.HT, target.HP + damage); - target.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); - Sample.INSTANCE.play(Assets.SND_CURSED); - if (!user.isAlive() && origin != null) { - Dungeon.fail( origin.getClass() ); - GLog.n(Messages.get(CursedWand.class, "ondeath", origin.name())); - } + toHeal = target; + toDamage = user; break; } + toHeal.HP = Math.min(toHeal.HT, toHeal.HP + damage); + toHeal.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); + toDamage.damage(damage, origin == null ? toHeal : origin); + toDamage.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); + + if (toDamage == Dungeon.hero){ + Sample.INSTANCE.play(Assets.SND_CURSED); + if (!toDamage.isAlive()) { + if (origin != null) { + Dungeon.fail( origin.getClass() ); + GLog.n( Messages.get( CursedWand.class, "ondeath", origin.name() ) ); + } else { + Dungeon.fail( toHeal.getClass() ); + } + } + } else { + Sample.INSTANCE.play(Assets.SND_BURNING); + } afterZap.call(); } }); @@ -279,11 +273,16 @@ public class CursedWand { } - private static void rareEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ + private static void rareEffect(final Item origin, final Char user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //sheep transformation case 0: + if (user != Dungeon.hero){ + cursedZap(origin, user, bolt, afterZap); + return; + } + cursedFX(user, bolt, new Callback() { public void call() { Char ch = Actor.findChar( bolt.collisionPos ); @@ -310,13 +309,13 @@ public class CursedWand { //curses! case 1: - CursingTrap.curse(user); + if (user instanceof Hero) CursingTrap.curse( (Hero) user ); afterZap.call(); break; //inter-level teleportation case 2: - if (Dungeon.depth > 1 && !Dungeon.bossLevel()) { + if (Dungeon.depth > 1 && !Dungeon.bossLevel() && user == Dungeon.hero) { //each depth has 1 more weight than the previous depth. float[] depths = new float[Dungeon.depth-1]; @@ -335,7 +334,7 @@ public class CursedWand { Game.switchScene(InterlevelScene.class); } else { - ScrollOfTeleportation.teleportHero(user); + ScrollOfTeleportation.teleportChar(user); } afterZap.call(); @@ -349,7 +348,7 @@ public class CursedWand { } } - private static void veryRareEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ + private static void veryRareEffect(final Item origin, final Char user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //great forest fire! @@ -394,6 +393,12 @@ public class CursedWand { //crashes the game, yes, really. case 2: + + if (user != Dungeon.hero){ + cursedZap(origin, user, bolt, afterZap); + return; + } + try { Dungeon.saveAll(); if(Messages.lang() != Languages.ENGLISH){ @@ -427,11 +432,11 @@ public class CursedWand { //random transmogrification case 3: //skips this effect if there is no item to transmogrify - if (origin == null || !Dungeon.hero.belongings.contains(origin)){ + if (origin == null || user != Dungeon.hero || !Dungeon.hero.belongings.contains(origin)){ cursedZap(origin, user, bolt, afterZap); return; } - origin.detach(user.belongings.backpack); + origin.detach(Dungeon.hero.belongings.backpack); Item result; do { result = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR, @@ -450,7 +455,7 @@ public class CursedWand { } } - private static void cursedFX(final Hero user, final Ballistica bolt, final Callback callback){ + private static void cursedFX(final Char user, final Ballistica bolt, final Callback callback){ MagicMissile.boltFromChar( user.sprite.parent, MagicMissile.RAINBOW, user.sprite, diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Shocking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Shocking.java index 664bda754..a8bf60abf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Shocking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Shocking.java @@ -50,9 +50,9 @@ public class Shocking extends Weapon.Enchantment { if (Random.Int( level + 3 ) >= 2) { affected.clear(); - arcs.clear(); - arc(attacker, defender, 2); + + arc(attacker, defender, 2, affected, arcs); affected.remove(defender); //defender isn't hurt by lightning for (Char ch : affected) { @@ -77,7 +77,7 @@ public class Shocking extends Weapon.Enchantment { private ArrayList arcs = new ArrayList<>(); - private void arc( Char attacker, Char defender, int dist ) { + public static void arc( Char attacker, Char defender, int dist, ArrayList affected, ArrayList arcs ) { affected.add(defender); @@ -90,7 +90,7 @@ public class Shocking extends Weapon.Enchantment { Char n = Actor.findChar(i); if (n != null && n != attacker && !affected.contains(n)) { arcs.add(new Lightning.Arc(defender.sprite.center(), n.sprite.center())); - arc(attacker, n, (Dungeon.level.water[n.pos] && !n.flying) ? 2 : 1); + arc(attacker, n, (Dungeon.level.water[n.pos] && !n.flying) ? 2 : 1, affected, arcs); } } }