From d81141bd8bad459c0b3d867907d0ad38f48ec7c2 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 24 Nov 2021 14:33:05 -0500 Subject: [PATCH] v1.1.0: implemented the telekinetic grab spell --- .../assets/messages/items/items.properties | 5 + core/src/main/assets/sprites/items.png | Bin 20057 -> 20133 bytes .../actors/buffs/PinCushion.java | 8 ++ .../actors/mobs/Tengu.java | 4 +- .../shatteredpixeldungeon/items/Amulet.java | 4 +- .../shatteredpixeldungeon/items/Dewdrop.java | 7 +- .../items/EnergyCrystal.java | 4 +- .../items/EquipableItem.java | 4 +- .../shatteredpixeldungeon/items/Gold.java | 5 +- .../shatteredpixeldungeon/items/Honeypot.java | 4 +- .../shatteredpixeldungeon/items/Item.java | 12 ++- .../items/LostBackpack.java | 6 +- .../shatteredpixeldungeon/items/Recipe.java | 8 +- .../items/TengusMask.java | 4 +- .../items/artifacts/DriedRose.java | 4 +- .../items/artifacts/TimekeepersHourglass.java | 3 +- .../items/bombs/Bomb.java | 8 +- .../items/journal/DocumentPage.java | 4 +- .../items/journal/Guidebook.java | 4 +- .../shatteredpixeldungeon/items/keys/Key.java | 4 +- .../items/keys/SkeletonKey.java | 4 +- .../items/quest/CorpseDust.java | 4 +- .../items/spells/SummonElemental.java | 32 ++++++ .../items/spells/TelekineticGrab.java | 101 ++++++++++++++++++ .../items/weapon/missiles/MissileWeapon.java | 5 +- .../scenes/AlchemyScene.java | 12 ++- .../sprites/ItemSpriteSheet.java | 22 ++-- .../shatteredpixeldungeon/ui/QuickRecipe.java | 6 +- 28 files changed, 224 insertions(+), 64 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/SummonElemental.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TelekineticGrab.java diff --git a/core/src/main/assets/messages/items/items.properties b/core/src/main/assets/messages/items/items.properties index 69ec856ca..50dfaa6cd 100644 --- a/core/src/main/assets/messages/items/items.properties +++ b/core/src/main/assets/messages/items/items.properties @@ -1092,6 +1092,11 @@ items.spells.recycle.desc=This spell contains a lesser form of transmutation mag items.spells.targetedspell.prompt=Choose a target items.spells.targetedspell.inv_title=Infuse an item +items.spells.telekineticgrab.name=telekinetic grab +items.spells.telekineticgrab.cant_grab=You can't grab that. +items.spells.telekineticgrab.no_target=There's nothing to grab there. +items.spells.telekineticgrab.desc=This spell allows the caster to remotely grab any item from the ground, or any thrown weapon that's stuck to an enemy!\n\nIt can't be used to grab items that someone else owns, or to grab containers like chests. + items.spells.wildenergy.name=wild energy items.spells.wildenergy.desc=This spell contains some of the cursed energy which powered DM-300. When cast, it will recharge your wands and worn artifacts, while also triggering a random cursed wand effect. You are able to choose a direction for this cursed magic to shoot in, however. diff --git a/core/src/main/assets/sprites/items.png b/core/src/main/assets/sprites/items.png index 248dce3ab5b90177da0d9f6c44584ac8eef884d3..129da29f032ce360a8caf2b284a410a433c693e7 100644 GIT binary patch literal 20133 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
Ha?lUsU~*@#TfvJAbEbm7e(DRkt_Hf63jJ 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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java index 0adb11b59..3b15748f7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/PinCushion.java @@ -45,6 +45,14 @@ public class PinCushion extends Buff { items.add(projectile); } + public Item grabOne(){ + Item item = items.remove(0); + if (items.isEmpty()){ + detach(); + } + return item; + } + public ArrayList getStuckItems(){ return new ArrayList<>(items); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java index fb8957d12..9996fb8d9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java @@ -683,7 +683,7 @@ public class Tengu extends Mob { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { GLog.w( Messages.get(this, "cant_pickup") ); return false; } @@ -1058,7 +1058,7 @@ public class Tengu extends Mob { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { GLog.w( Messages.get(this, "cant_pickup") ); return false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java index 7852bf974..4c9aa2098 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Amulet.java @@ -63,8 +63,8 @@ public class Amulet extends Item { } @Override - public boolean doPickUp( Hero hero ) { - if (super.doPickUp( hero )) { + public boolean doPickUp(Hero hero, int pos) { + if (super.doPickUp( hero, pos )) { if (!Statistics.amuletObtained) { Statistics.amuletObtained = true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java index 52858ded1..d9e249ec4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Dewdrop.java @@ -25,7 +25,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; @@ -47,18 +46,18 @@ public class Dewdrop extends Item { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { Waterskin flask = hero.belongings.getItem( Waterskin.class ); if (flask != null && !flask.isFull()){ flask.collectDew( this ); - GameScene.pickUp( this, hero.pos ); + GameScene.pickUp( this, pos ); } else { - int terr = Dungeon.level.map[hero.pos]; + int terr = Dungeon.level.map[pos]; if (!consumeDew(1, hero, terr == Terrain.ENTRANCE|| terr == Terrain.EXIT || terr == Terrain.UNLOCKED_EXIT)){ return false; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java index 907ad3039..dd2db8bd0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EnergyCrystal.java @@ -33,13 +33,13 @@ public class EnergyCrystal extends Item { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { Dungeon.energy += quantity; //TODO Statistics.goldCollected += quantity; //Badges.validateGoldCollected(); - GameScene.pickUp( this, hero.pos ); + GameScene.pickUp( this, pos ); hero.sprite.showStatus( 0x44CCFF, TXT_VALUE, quantity ); hero.spendAndNext( TIME_TO_PICK_UP ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java index a6daa6826..0bab2d3cb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/EquipableItem.java @@ -53,8 +53,8 @@ public abstract class EquipableItem extends Item { } @Override - public boolean doPickUp(Hero hero) { - if (super.doPickUp(hero)){ + public boolean doPickUp(Hero hero, int pos) { + if (super.doPickUp(hero, pos)){ if (!isIdentified() && !Document.ADVENTURERS_GUIDE.isPageRead(Document.GUIDE_IDING)){ GLog.p(Messages.get(Guidebook.class, "hint")); GameScene.flashForDocument(Document.GUIDE_IDING); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java index ef48d80f5..80a149427 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Gold.java @@ -31,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; -import com.watabou.utils.Bundle; import com.watabou.utils.Random; import java.util.ArrayList; @@ -59,7 +58,7 @@ public class Gold extends Item { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { Dungeon.gold += quantity; Statistics.goldCollected += quantity; @@ -69,7 +68,7 @@ public class Gold extends Item { if (thievery != null) thievery.collect(quantity); - GameScene.pickUp( this, hero.pos ); + GameScene.pickUp( this, pos ); hero.sprite.showStatus( CharSprite.NEUTRAL, TXT_VALUE, quantity ); hero.spendAndNext( TIME_TO_PICK_UP ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java index aa51c8acd..dca94fbe0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java @@ -156,8 +156,8 @@ public class Honeypot extends Item { } @Override - public boolean doPickUp(Hero hero) { - if ( super.doPickUp(hero) ){ + public boolean doPickUp(Hero hero, int pos) { + if ( super.doPickUp(hero, pos) ){ pickupPot( hero ); return true; } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index a32937471..2d7be14d4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; @@ -43,7 +42,6 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.MissileSprite; import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton; -import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.Bundlable; @@ -111,11 +109,15 @@ public class Item implements Bundlable { public String actionName(String action, Hero hero){ return Messages.get(this, "ac_" + action); } - - public boolean doPickUp( Hero hero ) { + + public final boolean doPickUp( Hero hero ) { + return doPickUp( hero, hero.pos ); + } + + public boolean doPickUp(Hero hero, int pos) { if (collect( hero.belongings.backpack )) { - GameScene.pickUp( this, hero.pos ); + GameScene.pickUp( this, pos ); Sample.INSTANCE.play( Assets.Sounds.ITEM ); hero.spendAndNext( TIME_TO_PICK_UP ); return true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java index aaa089317..f765a78b8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/LostBackpack.java @@ -1,8 +1,6 @@ package com.shatteredpixel.shatteredpixeldungeon.items; import com.shatteredpixel.shatteredpixeldungeon.Assets; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LostInventory; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; @@ -24,7 +22,7 @@ public class LostBackpack extends Item { } @Override - public boolean doPickUp(Hero hero) { + public boolean doPickUp(Hero hero, int pos) { if (hero.buff(LostInventory.class) != null){ hero.buff(LostInventory.class).detach(); } @@ -53,7 +51,7 @@ public class LostBackpack extends Item { Item.updateQuickslot(); Sample.INSTANCE.play( Assets.Sounds.DEWDROP ); hero.spendAndNext(TIME_TO_PICK_UP); - GameScene.pickUp( this, hero.pos ); + GameScene.pickUp( this, pos ); ((HeroSprite)hero.sprite).updateArmor(); return true; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java index a62903345..54beb1020 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -54,6 +54,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalPorter; import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Recycle; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.SummonElemental; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.TelekineticGrab; import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; @@ -174,6 +176,7 @@ public abstract class Recipe { new ExoticPotion.PotionToExotic(), new ExoticScroll.ScrollToExotic(), new ArcaneResin.Recipe(), + new Alchemize.Recipe(), new StewedMeat.oneMeat() }; @@ -193,7 +196,6 @@ public abstract class Recipe { new InfernalBrew.Recipe(), new ShockingBrew.Recipe(), new CausticBrew.Recipe(), - new Alchemize.Recipe(), new AquaBlast.Recipe(), new BeaconOfReturning.Recipe(), new CurseInfusion.Recipe(), @@ -204,13 +206,13 @@ public abstract class Recipe { new ReclaimTrap.Recipe(), new Recycle.Recipe(), new WildEnergy.Recipe(), + new TelekineticGrab.Recipe(), + new SummonElemental.Recipe(), new StewedMeat.twoMeat() }; private static Recipe[] threeIngredientRecipes = new Recipe[]{ new Potion.SeedToPotion(), - //new ExoticPotion.PotionToExotic(), - //new ExoticScroll.ScrollToExotic(), new StewedMeat.threeMeat(), new MeatPie.Recipe() }; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/TengusMask.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/TengusMask.java index 5085de85d..49a81c6c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/TengusMask.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/TengusMask.java @@ -73,9 +73,9 @@ public class TengusMask extends Item { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { Badges.validateMastery(); - return super.doPickUp( hero ); + return super.doPickUp( hero, pos ); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java index e2944f19e..df6723ca9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/DriedRose.java @@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -457,7 +456,7 @@ public class DriedRose extends Artifact { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { DriedRose rose = hero.belongings.getItem( DriedRose.class ); if (rose == null){ @@ -476,6 +475,7 @@ public class DriedRose extends Artifact { GLog.i( Messages.get(this, "levelup") ); Sample.INSTANCE.play( Assets.Sounds.DEWDROP ); + GameScene.pickUp(this, pos); hero.spendAndNext(TIME_TO_PICK_UP); return true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java index c498a2d9d..c6b0303d8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/TimekeepersHourglass.java @@ -414,7 +414,7 @@ public class TimekeepersHourglass extends Artifact { } @Override - public boolean doPickUp( Hero hero ) { + public boolean doPickUp(Hero hero, int pos) { TimekeepersHourglass hourglass = hero.belongings.getItem( TimekeepersHourglass.class ); if (hourglass != null && !hourglass.cursed) { hourglass.upgrade(); @@ -423,6 +423,7 @@ public class TimekeepersHourglass extends Artifact { GLog.p( Messages.get(this, "maxlevel") ); else GLog.i( Messages.get(this, "levelup") ); + GameScene.pickUp(this, pos); hero.spendAndNext(TIME_TO_PICK_UP); return true; } else { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index d4de2e4d9..6b4b046d4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -123,12 +123,12 @@ public class Bomb extends Item { } @Override - public boolean doPickUp(Hero hero) { + public boolean doPickUp(Hero hero, int pos) { if (fuse != null) { GLog.w( Messages.get(this, "snuff_fuse") ); fuse = null; } - return super.doPickUp(hero); + return super.doPickUp(hero, pos); } public void explode(int cell){ @@ -317,10 +317,10 @@ public class Bomb extends Item { } @Override - public boolean doPickUp(Hero hero) { + public boolean doPickUp(Hero hero, int pos) { Bomb bomb = new Bomb(); bomb.quantity(2); - if (bomb.doPickUp(hero)) { + if (bomb.doPickUp(hero, pos)) { //isaaaaac.... (don't bother doing this when not in english) if (SPDSettings.language() == Languages.ENGLISH) hero.sprite.showStatus(CharSprite.NEUTRAL, "1+1 free!"); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/DocumentPage.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/DocumentPage.java index fffbe42b5..3e217e05a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/DocumentPage.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/DocumentPage.java @@ -50,8 +50,8 @@ public abstract class DocumentPage extends Item { } @Override - public final boolean doPickUp(Hero hero) { - GameScene.pickUpJournal(this, hero.pos); + public final boolean doPickUp(Hero hero, int pos) { + GameScene.pickUpJournal(this, pos); GameScene.flashForDocument(page()); if (document() == Document.ALCHEMY_GUIDE){ WndJournal.last_index = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/Guidebook.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/Guidebook.java index ff25ba9b2..3a1fbb3c4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/Guidebook.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/Guidebook.java @@ -19,8 +19,8 @@ public class Guidebook extends Item { } @Override - public final boolean doPickUp(Hero hero) { - GameScene.pickUpJournal(this, hero.pos); + public final boolean doPickUp(Hero hero, int pos) { + GameScene.pickUpJournal(this, pos); String page = Document.GUIDE_INTRO; Game.runOnRenderThread(new Callback() { @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java index 3d4d83b6e..136350835 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/Key.java @@ -47,8 +47,8 @@ public abstract class Key extends Item { } @Override - public boolean doPickUp(Hero hero) { - GameScene.pickUpJournal(this, hero.pos); + public boolean doPickUp(Hero hero, int pos) { + GameScene.pickUpJournal(this, pos); WndJournal.last_index = 2; Notes.add(this); Sample.INSTANCE.play( Assets.Sounds.ITEM ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/SkeletonKey.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/SkeletonKey.java index fcfcdc44c..fa563c481 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/SkeletonKey.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/keys/SkeletonKey.java @@ -48,7 +48,7 @@ public class SkeletonKey extends Key { } @Override - public boolean doPickUp(Hero hero) { + public boolean doPickUp(Hero hero, int pos) { if(!SPDSettings.supportNagged()){ try { Dungeon.saveAll(); @@ -64,7 +64,7 @@ public class SkeletonKey extends Key { } - return super.doPickUp(hero); + return super.doPickUp(hero, pos); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/CorpseDust.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/CorpseDust.java index eaf0ae380..f4eeb9170 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/CorpseDust.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/quest/CorpseDust.java @@ -65,8 +65,8 @@ public class CorpseDust extends Item { } @Override - public boolean doPickUp(Hero hero) { - if (super.doPickUp(hero)){ + public boolean doPickUp(Hero hero, int pos) { + if (super.doPickUp(hero, pos)){ GLog.n( Messages.get( this, "chill") ); Buff.affect(hero, DustGhostSpawner.class); return true; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/SummonElemental.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/SummonElemental.java new file mode 100644 index 000000000..55357fb08 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/SummonElemental.java @@ -0,0 +1,32 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.spells; + +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.Embers; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class SummonElemental extends Spell { + + { + image = ItemSpriteSheet.SUMMON_ELE; + } + + @Override + protected void onCast(Hero hero) { + + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { + + { + inputs = new Class[]{Embers.class, ArcaneCatalyst.class}; + inQuantity = new int[]{1, 1}; + + cost = 8; + + output = SummonElemental.class; + outQuantity = 3; + } + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TelekineticGrab.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TelekineticGrab.java new file mode 100644 index 000000000..7eacbe4c8 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/TelekineticGrab.java @@ -0,0 +1,101 @@ +package com.shatteredpixel.shatteredpixeldungeon.items.spells; + +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.PinCushion; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; +import com.shatteredpixel.shatteredpixeldungeon.items.Heap; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.noosa.audio.Sample; +import com.watabou.utils.Callback; + +public class TelekineticGrab extends TargetedSpell { + + { + image = ItemSpriteSheet.TELE_GRAB; + } + + @Override + protected void fx(Ballistica bolt, Callback callback) { + MagicMissile.boltFromChar( curUser.sprite.parent, + MagicMissile.BEACON, + curUser.sprite, + bolt.collisionPos, + callback); + Sample.INSTANCE.play( Assets.Sounds.ZAP ); + } + + @Override + protected void affectTarget(Ballistica bolt, Hero hero) { + Char ch = Actor.findChar(bolt.collisionPos); + + if (ch != null && ch.buff(PinCushion.class) != null){ + + Item item = ch.buff(PinCushion.class).grabOne(); + + if (item.doPickUp(hero, ch.pos)){ + hero.spend(-Item.TIME_TO_PICK_UP); //casting the spell already takes a turn + + } else { + GLog.w(Messages.get(this, "cant_grab")); + Dungeon.level.drop(item, ch.pos).sprite.drop(); + return; + } + + } else if (Dungeon.level.heaps.get(bolt.collisionPos) != null){ + + Heap h = Dungeon.level.heaps.get(bolt.collisionPos); + + if (h.type != Heap.Type.HEAP){ + GLog.w(Messages.get(this, "cant_grab")); + h.sprite.drop(); + return; + } + + Item item = h.peek(); + + if (item.doPickUp(hero, h.pos)){ + h.pickUp(); + hero.spend(-Item.TIME_TO_PICK_UP); //casting the spell already takes a turn + + } else { + GLog.w(Messages.get(this, "cant_grab")); + h.sprite.drop(); + return; + } + + } else { + GLog.w(Messages.get(this, "no_target")); + } + + } + + @Override + public int value() { + //prices of ingredients, divided by output quantity (rounded up slightly) + return Math.round(quantity * ((48) / 6f)); + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { + + { + inputs = new Class[]{LiquidMetal.class, ArcaneCatalyst.class}; + inQuantity = new int[]{15, 1}; + + cost = 4; + + output = TelekineticGrab.class; + outQuantity = 6; + } + + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java index 54d5aab60..17f646dd4 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -25,7 +25,6 @@ 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.Corruption; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.MagicImmune; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Momentum; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.PinCushion; @@ -369,9 +368,9 @@ abstract public class MissileWeapon extends Weapon { } @Override - public boolean doPickUp(Hero hero) { + public boolean doPickUp(Hero hero, int pos) { parent = null; - return super.doPickUp(hero); + return super.doPickUp(hero, pos); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java index 3083aa088..bb137a470 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/AlchemyScene.java @@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Belongings; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SparkParticle; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.LiquidMetal; import com.shatteredpixel.shatteredpixeldungeon.items.Recipe; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.AlchemistsToolkit; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; @@ -308,7 +309,11 @@ public class AlchemyScene extends PixelScene { if (item != null && inputs[0] != null) { for (int i = 0; i < inputs.length; i++) { if (inputs[i].item() == null) { - inputs[i].item(item.detach(Dungeon.hero.belongings.backpack)); + if (item instanceof LiquidMetal){ + inputs[i].item(item.detachAll(Dungeon.hero.belongings.backpack)); + } else { + inputs[i].item(item.detach(Dungeon.hero.belongings.backpack)); + } break; } } @@ -424,6 +429,7 @@ public class AlchemyScene extends PixelScene { smokeEmitter.burst(Speck.factory( Speck.WOOL ), 10 ); Sample.INSTANCE.play( Assets.Sounds.PUFF ); + int resultQuantity = result.quantity(); if (!result.collect()){ Dungeon.level.drop(result, Dungeon.hero.pos); } @@ -451,6 +457,8 @@ public class AlchemyScene extends PixelScene { } updateState(); + //we reset the quantity in case the result was merged into another stack in the backpack + result.quantity(resultQuantity); outputs[0].item(result); } @@ -465,7 +473,7 @@ public class AlchemyScene extends PixelScene { ArrayList found = inventory.getAllSimilar(finding); while (!found.isEmpty() && needed > 0){ Item detached; - if (finding instanceof Dart) { + if (finding instanceof LiquidMetal) { detached = found.get(0).detachAll(inventory.backpack); } else { detached = found.get(0).detach(inventory.backpack); 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 4fe5c243e..177b340ce 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -596,22 +596,26 @@ public class ItemSpriteSheet { private static final int SPELLS = xy(1, 27); //16 slots public static final int MAGIC_PORTER = SPELLS+0; public static final int PHASE_SHIFT = SPELLS+1; - public static final int WILD_ENERGY = SPELLS+2; - public static final int RETURN_BEACON = SPELLS+3; + public static final int TELE_GRAB = SPELLS+2; + public static final int WILD_ENERGY = SPELLS+3; + public static final int RETURN_BEACON = SPELLS+4; + public static final int SUMMON_ELE = SPELLS+5; - public static final int AQUA_BLAST = SPELLS+5; - public static final int FEATHER_FALL = SPELLS+6; - public static final int RECLAIM_TRAP = SPELLS+7; + public static final int AQUA_BLAST = SPELLS+7; + public static final int FEATHER_FALL = SPELLS+8; + public static final int RECLAIM_TRAP = SPELLS+9; - public static final int CURSE_INFUSE = SPELLS+9; - public static final int MAGIC_INFUSE = SPELLS+10; - public static final int ALCHEMIZE = SPELLS+11; - public static final int RECYCLE = SPELLS+12; + public static final int CURSE_INFUSE = SPELLS+11; + public static final int MAGIC_INFUSE = SPELLS+12; + public static final int ALCHEMIZE = SPELLS+13; + public static final int RECYCLE = SPELLS+14; static{ assignItemRect(MAGIC_PORTER, 12, 11); assignItemRect(PHASE_SHIFT, 12, 11); + assignItemRect(TELE_GRAB, 12, 11); assignItemRect(WILD_ENERGY, 8, 16); assignItemRect(RETURN_BEACON, 8, 16); + assignItemRect(SUMMON_ELE, 8, 16); assignItemRect(AQUA_BLAST, 11, 11); assignItemRect(FEATHER_FALL, 11, 11); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java index d77eca1bc..4abbcfc80 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java @@ -62,6 +62,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.spells.MagicalPorter; import com.shatteredpixel.shatteredpixeldungeon.items.spells.PhaseShift; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Recycle; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.SummonElemental; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.TelekineticGrab; import com.shatteredpixel.shatteredpixeldungeon.items.spells.WildEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; @@ -372,16 +374,16 @@ public class QuickRecipe extends Component { result.add(new QuickRecipe(new ElixirOfArcaneArmor.Recipe())); return result; case 9: + result.add(new QuickRecipe(new TelekineticGrab.Recipe())); result.add(new QuickRecipe(new PhaseShift.Recipe())); result.add(new QuickRecipe(new WildEnergy.Recipe())); result.add(new QuickRecipe(new BeaconOfReturning.Recipe())); - result.add(null); + result.add(new QuickRecipe(new SummonElemental.Recipe())); result.add(null); result.add(new QuickRecipe(new AquaBlast.Recipe())); result.add(new QuickRecipe(new ReclaimTrap.Recipe())); result.add(new QuickRecipe(new FeatherFall.Recipe())); result.add(null); - result.add(null); result.add(new QuickRecipe(new Alchemize.Recipe())); result.add(new QuickRecipe(new MagicalInfusion.Recipe())); result.add(new QuickRecipe(new CurseInfusion.Recipe()));