From d06603b95bc8983601ce0749e3d08c9fb6b1c754 Mon Sep 17 00:00:00 2001
From: Evan Debenham <Evan.SHPX@gmail.com>
Date: Fri, 7 Sep 2018 00:33:58 -0400
Subject: [PATCH] v0.7.0: added 3 early spells, still very wip

---
 core/src/main/assets/items.png                | Bin 17539 -> 17734 bytes
 .../ShatteredPixelDungeon.java                |   3 +
 .../items/spells/AquaBlast.java               |  71 ++++++++++++
 .../items/spells/InventorySpell.java          |  71 ++++++++++++
 .../MagicalInfusion.java}                     |  20 +---
 .../items/spells/PhaseShift.java              |  80 +++++++++++++
 .../items/spells/Spell.java                   |  73 ++++++++++++
 .../items/spells/TargetedSpell.java           | 106 ++++++++++++++++++
 .../sprites/ItemSpriteSheet.java              |  13 ++-
 .../messages/items/items.properties           |  23 +++-
 10 files changed, 437 insertions(+), 23 deletions(-)
 create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java
 create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/InventorySpell.java
 rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/{scrolls/ScrollOfMagicalInfusion.java => spells/MagicalInfusion.java} (82%)
 create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java
 create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Spell.java
 create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TargetedSpell.java

diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png
index 2c9534b83f29f442959f2ceee6157b5221ebaf20..38c36a6cd4bad16a22e00d1bd98f40d410a6f285 100644
GIT binary patch
literal 17734
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

literal 17539
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
D?a*5R

diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
index a78aef2f3..0ce6ae705 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
@@ -142,6 +142,9 @@ public class ShatteredPixelDungeon extends Game {
 		com.watabou.utils.Bundle.addAlias(
 				com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight.class,
 				"com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight" );
+		com.watabou.utils.Bundle.addAlias(
+				com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalInfusion.class,
+				"com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicalInfusion" );
 	}
 	
 	@Override
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java
new file mode 100644
index 000000000..32cf22d12
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java
@@ -0,0 +1,71 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
+
+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.Paralysis;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.effects.Splash;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
+import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
+import com.watabou.utils.PathFinder;
+import com.watabou.utils.Random;
+
+public class AquaBlast extends TargetedSpell {
+	
+	{
+		image = ItemSpriteSheet.AQUA_BLAST;
+	}
+	
+	@Override
+	protected void affectTarget(Ballistica bolt, Hero hero) {
+		int cell = bolt.collisionPos;
+		
+		//TODO perhaps different color based on depth?
+		Splash.at(cell, 0x00AAFF, 10);
+		
+		for (int i : PathFinder.NEIGHBOURS9){
+			if (i == 0 || Random.Int(2) == 0){
+				int terr = Dungeon.level.map[cell + i];
+				if (terr == Terrain.EMPTY || terr == Terrain.GRASS ||
+						terr == Terrain.EMBERS || terr == Terrain.EMPTY_SP ||
+						terr == Terrain.HIGH_GRASS || terr == Terrain.EMPTY_DECO) {
+					Level.set(cell + i, Terrain.WATER);
+					GameScene.updateMap(cell + i);
+				}
+			}
+		}
+		
+		Char target = Actor.findChar(cell);
+		
+		if (target != null && target != hero){
+			//just enough to skip their current turn
+			Buff.affect(target, Paralysis.class, 0f);
+		}
+	}
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/InventorySpell.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/InventorySpell.java
new file mode 100644
index 000000000..26676fd95
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/InventorySpell.java
@@ -0,0 +1,71 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
+
+import com.shatteredpixel.shatteredpixeldungeon.Assets;
+import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.items.Item;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
+import com.watabou.noosa.audio.Sample;
+
+public abstract class InventorySpell extends Spell {
+	
+	protected String inventoryTitle = Messages.get(this, "inv_title");
+	protected WndBag.Mode mode = WndBag.Mode.ALL;
+	
+	@Override
+	protected void onCast(Hero hero) {
+		curItem = detach( hero.belongings.backpack );
+		GameScene.selectItem( itemSelector, mode, inventoryTitle );
+	}
+	
+	protected abstract void onItemSelected( Item item );
+	
+	protected static WndBag.Listener itemSelector = new WndBag.Listener() {
+		@Override
+		public void onSelect( Item item ) {
+			
+			//FIXME this safety check shouldn't be necessary
+			//it would be better to eliminate the curItem static variable.
+			if (!(curItem instanceof InventorySpell)){
+				return;
+			}
+			
+			if (item != null) {
+				
+				((InventorySpell)curItem).onItemSelected( item );
+				curUser.spend( 1f );
+				curUser.busy();
+				(curUser.sprite).operate( curUser.pos );
+				
+				Sample.INSTANCE.play( Assets.SND_READ );
+				Invisibility.dispel();
+				
+			} else {
+				curItem.collect( curUser.belongings.backpack );
+			}
+		}
+	};
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfMagicalInfusion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java
similarity index 82%
rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfMagicalInfusion.java
rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java
index 0436aff1f..f9db87045 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfMagicalInfusion.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java
@@ -19,7 +19,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package com.shatteredpixel.shatteredpixeldungeon.items.scrolls;
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
 
 import com.shatteredpixel.shatteredpixeldungeon.Badges;
 import com.shatteredpixel.shatteredpixeldungeon.effects.Enchanting;
@@ -32,13 +32,11 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
 import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
 import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
 
-public class ScrollOfMagicalInfusion extends InventoryScroll {
-	
-	//TODO transition to a spell
+public class MagicalInfusion extends InventorySpell {
 	
 	{
 		mode = WndBag.Mode.ENCHANTABLE;
-		image = ItemSpriteSheet.SCROLL_ISAZ;
+		image = ItemSpriteSheet.MAGIC_INFUSE;
 	}
 	
 	@Override
@@ -57,18 +55,8 @@ public class ScrollOfMagicalInfusion extends InventoryScroll {
 		Enchanting.show(curUser, item);
 	}
 	
-	@Override
-	public void empoweredRead() {
-		//does nothing for now, this should never happen.
-	}
-	
-	@Override
-	public boolean isKnown() {
-		return true;
-	}
-	
 	@Override
 	public int price() {
-		return isKnown() ? 100 * quantity : super.price();
+		return 100 * quantity;
 	}
 }
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java
new file mode 100644
index 000000000..5b4d5bf80
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java
@@ -0,0 +1,80 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
+
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
+import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
+import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon;
+import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
+import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
+import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
+
+public class PhaseShift extends TargetedSpell {
+	
+	{
+		image = ItemSpriteSheet.PHASE_SHIFT;
+	}
+	
+	@Override
+	protected void affectTarget(Ballistica bolt, Hero hero) {
+		final Char ch = Actor.findChar(bolt.collisionPos);
+		
+		if (ch == hero){
+			ScrollOfTeleportation.teleportHero(curUser);
+		} else if (ch != null) {
+			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 if (ch.properties().contains(Char.Property.IMMOVABLE)) {
+				
+				//TODO move text
+				GLog.w( Messages.get(LloydsBeacon.class, "tele_fail") );
+				
+			} else  {
+				
+				ch.pos = pos;
+				if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).HUNTING){
+					((Mob) ch).state = ((Mob) ch).WANDERING;
+				}
+				ch.sprite.place(ch.pos);
+				ch.sprite.visible = Dungeon.level.heroFOV[pos];
+				
+			}
+		}
+	}
+	
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Spell.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Spell.java
new file mode 100644
index 000000000..62b9d4ac6
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Spell.java
@@ -0,0 +1,73 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
+
+
+import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.items.Item;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
+
+import java.util.ArrayList;
+
+public abstract class Spell extends Item {
+	
+	public static final String AC_CAST = "CAST";
+	
+	{
+		stackable = true;
+		defaultAction = AC_CAST;
+	}
+	
+	@Override
+	public ArrayList<String> actions(Hero hero ) {
+		ArrayList<String> actions = super.actions( hero );
+		actions.add( AC_CAST );
+		return actions;
+	}
+	
+	@Override
+	public void execute( final Hero hero, String action ) {
+		
+		super.execute( hero, action );
+		
+		if (action.equals( AC_CAST )) {
+			
+			if (curUser.buff(MagicImmune.class) != null){
+				GLog.w( Messages.get(this, "no_magic") );
+				return;
+			}
+			
+			onCast( hero );
+			
+		}
+	}
+	
+	@Override
+	public boolean isIdentified() {
+		return true;
+	}
+	
+	protected abstract void onCast(Hero hero );
+	
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TargetedSpell.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TargetedSpell.java
new file mode 100644
index 000000000..a5360423b
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TargetedSpell.java
@@ -0,0 +1,106 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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 <http://www.gnu.org/licenses/>
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.items.spells;
+
+import com.shatteredpixel.shatteredpixeldungeon.Assets;
+import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
+import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
+import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
+import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
+import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
+import com.watabou.noosa.audio.Sample;
+import com.watabou.utils.Callback;
+
+public abstract class TargetedSpell extends Spell {
+	
+	protected int collisionProperties = Ballistica.PROJECTILE;
+	
+	@Override
+	protected void onCast(Hero hero) {
+		GameScene.selectCell(targeter);
+	}
+	
+	protected abstract void affectTarget( Ballistica bolt, Hero hero );
+	
+	protected void fx( Ballistica bolt, Callback callback ) {
+		MagicMissile.boltFromChar( curUser.sprite.parent,
+				MagicMissile.MAGIC_MISSILE,
+				curUser.sprite,
+				bolt.collisionPos,
+				callback);
+		Sample.INSTANCE.play( Assets.SND_ZAP );
+	}
+	
+	private  static CellSelector.Listener targeter = new  CellSelector.Listener(){
+		
+		@Override
+		public void onSelect( Integer target ) {
+			
+			if (target != null) {
+				
+				//FIXME this safety check shouldn't be necessary
+				//it would be better to eliminate the curItem static variable.
+				final TargetedSpell curSpell;
+				if (curItem instanceof TargetedSpell) {
+					curSpell = (TargetedSpell)curItem;
+				} else {
+					return;
+				}
+				
+				final Ballistica shot = new Ballistica( curUser.pos, target, curSpell.collisionProperties);
+				int cell = shot.collisionPos;
+				
+				curUser.sprite.zap(cell);
+				
+				//attempts to target the cell aimed at if something is there, otherwise targets the collision pos.
+				if (Actor.findChar(target) != null)
+					QuickSlotButton.target(Actor.findChar(target));
+				else
+					QuickSlotButton.target(Actor.findChar(cell));
+				
+				curUser.busy();
+				Invisibility.dispel();
+				
+				curSpell.fx(shot, new Callback() {
+					public void call() {
+						curSpell.affectTarget(shot, curUser);
+						curSpell.detach( curUser.belongings.backpack );
+						curSpell.updateQuickslot();
+						curUser.spendAndNext( 1f );
+					}
+				});
+				
+			}
+				
+		}
+		
+		@Override
+		public String prompt() {
+			return Messages.get(TargetedSpell.class, "prompt");
+		}
+	};
+	
+}
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 0f6716950..1e0693889 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java
@@ -553,12 +553,21 @@ public class ItemSpriteSheet {
 		assignItemRect(BREW_FRIGID,     10, 14);
 		assignItemRect(BREW_FROSTFIRE,  10, 14);
 		
-		assignItemRect(BREW_CAUSTIC,   10, 14);
+		assignItemRect(BREW_CAUSTIC,    10, 14);
 		assignItemRect(BREW_INFERNAL,   10, 14);
 		assignItemRect(BREW_BLIZZARD,   10, 14);
 		assignItemRect(BREW_SHOCKING,   10, 14);
 	}
-	                                                                                    //16 free slots
+	
+	private static final int SPELLS         =                               xy(1, 27);  //16 slots
+	public static final int PHASE_SHIFT     = SPELLS+0;
+	public static final int AQUA_BLAST      = SPELLS+1;
+	public static final int MAGIC_INFUSE    = SPELLS+2;
+	static{
+		assignItemRect(PHASE_SHIFT,     12, 11);
+		assignItemRect(AQUA_BLAST,      11, 11);
+		assignItemRect(MAGIC_INFUSE,    10, 15);
+	}
 	
 	private static final int FOOD       =                                   xy(1, 28);  //16 slots
 	public static final int MEAT        = FOOD+0;
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 4a5a6f1ea..e6c7b0ab0 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
@@ -792,11 +792,6 @@ items.scrolls.scrolloflullaby.name=scroll of lullaby
 items.scrolls.scrolloflullaby.sooth=The scroll utters a soothing melody. You feel very sleepy.
 items.scrolls.scrolloflullaby.desc=Reading this scroll emits a soothing melody will lull all who hear it into a deep magical sleep.
 
-items.scrolls.scrollofmagicalinfusion.name=scroll of magical infusion
-items.scrolls.scrollofmagicalinfusion.inv_title=Infuse an item
-items.scrolls.scrollofmagicalinfusion.infuse=Your %s is infused with arcane energy!
-items.scrolls.scrollofmagicalinfusion.desc=This scroll will infuse a weapon or armor with powerful magical energy.\n\nIn addition to being upgraded, A weapon will gain a magical enchantment, or armor will be imbued with a magical glyph.\n\nIf the item already has an enchantment or glyph, it will never be erased by this scroll.
-
 items.scrolls.scrollofmagicmapping.name=scroll of magic mapping
 items.scrolls.scrollofmagicmapping.layout=You are now aware of the level layout.
 items.scrolls.scrollofmagicmapping.desc=When this scroll is read, an image of crystal clarity will be etched into your memory, alerting you to the precise layout of the level and revealing all hidden secrets. The locations of items and creatures will remain unknown.
@@ -909,6 +904,24 @@ items.scrolls.exotic.scrollofpsionicblast.desc=This scroll contains incredible d
 
 
 
+###spells
+items.spells.aquablast.name=aqua blast
+items.spells.aquablast.desc=WIP
+
+items.spells.spell.ac_cast=CAST
+
+items.spells.magicalinfusion.name=magical infusion
+items.spells.magicalinfusion.inv_title=Infuse an item
+items.spells.magicalinfusion.infuse=Your %s is infused with arcane energy!
+items.spells.magicalinfusion.desc=This spell will infuse a weapon or armor with powerful magical energy.\n\nIn addition to being upgraded, A weapon will gain a magical enchantment, or armor will be imbued with a magical glyph.\n\nIf the item already has an enchantment or glyph, it will not be erased by the upgrade.
+
+items.spells.phaseshift.name=phase shift
+items.spells.phaseshift.desc=WIP
+
+items.spells.targetedspell.prompt=Choose a target
+items.spells.targetedspell.inv_title=Infuse an item
+
+
 ###runestones
 items.stones.inventorystone.ac_use=USE