diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java index e09c5abd7..d705e23e4 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java @@ -21,6 +21,7 @@ import java.util.HashSet; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CapeOfThorns; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon; import com.watabou.noosa.Camera; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; @@ -133,6 +134,12 @@ public class DM300 extends Mob { Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); Badges.validateBossSlain(); + + LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); + if (beacon != null) { + beacon.upgrade(); + GLog.p("Your beacon grows stronger!"); + } yell( "Mission failed. Shutting down." ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java index 584dfceff..66bc13452 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java @@ -54,7 +54,7 @@ public class Goo extends Mob { defenseSkill = 12; spriteClass = GooSprite.class; - loot = new LloydsBeacon(); + loot = new LloydsBeacon().identify(); lootChance = 0.333f; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java index 09d158f7e..098f0e8f3 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/King.java @@ -20,6 +20,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import java.util.HashSet; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; @@ -143,6 +145,12 @@ public class King extends Mob { super.die( cause ); Badges.validateBossSlain(); + + LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); + if (beacon != null) { + beacon.upgrade(); + GLog.p("Your beacon grows stronger!"); + } yell( "You cannot kill me, " + Dungeon.hero.givenName() + "... I am... immortal..." ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java index b82e69e53..4f1ea176e 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java @@ -19,6 +19,8 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import java.util.HashSet; +import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.LloydsBeacon; +import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; @@ -99,6 +101,12 @@ public class Tengu extends Mob { super.die( cause ); Badges.validateBossSlain(); + + LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); + if (beacon != null) { + beacon.upgrade(); + GLog.p("Your beacon grows stronger!"); + } yell( "Free at last..." ); } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java index d82de0c74..4fe57c35d 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/Artifact.java @@ -274,7 +274,7 @@ public class Artifact extends KindofMisc { @Override public void restoreFromBundle( Bundle bundle ) { super.restoreFromBundle(bundle); - image = bundle.getInt( IMAGE ); + if (bundle.contains( IMAGE )) image = bundle.getInt( IMAGE ); exp = bundle.getInt( EXP ); charge = bundle.getInt( CHARGE ); partialCharge = bundle.getFloat( PARTIALCHARGE ); diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java index 80e946e11..111255f0e 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java @@ -21,12 +21,19 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts; 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.Invisibility; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlink; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite.Glowing; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -35,10 +42,11 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.Utils; import com.watabou.noosa.Game; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; import java.util.ArrayList; -public class LloydsBeacon extends Item { +public class LloydsBeacon extends Artifact { private static final String TXT_PREVENTING = "Strong magic aura of this place prevents you from using the lloyd's beacon!"; @@ -50,13 +58,17 @@ public class LloydsBeacon extends Item { "The lloyd's beacon is successfully set at your current location, now you can return here anytime."; private static final String TXT_INFO = - "Lloyd's beacon is an intricate magic device, that allows you to return to a place you have already been."; + "Lloyd's beacon is an intricate magic device, which grants the user control of teleportation magics.\n" + + "\n" + + "The beacon can be used to return to a set location, but can also expel bursts of random teleportation " + + "magic once it has charged from being equipped. This magic can be directed at a target or at the user themselves."; private static final String TXT_SET = "\n\nThis beacon was set somewhere on the level %d of Pixel Dungeon."; public static final float TIME_TO_USE = 1; - + + public static final String AC_ZAP = "ZAP"; public static final String AC_SET = "SET"; public static final String AC_RETURN = "RETURN"; @@ -66,8 +78,14 @@ public class LloydsBeacon extends Item { { name = "lloyd's beacon"; image = ItemSpriteSheet.ARTIFACT_BEACON; - - unique = true; + + level = 0; + levelCap = 3; + + charge = 0; + chargeCap = 3+level; + + defaultAction = AC_ZAP; } private static final String DEPTH = "depth"; @@ -92,6 +110,7 @@ public class LloydsBeacon extends Item { @Override public ArrayList actions( Hero hero ) { ArrayList actions = super.actions( hero ); + actions.add( AC_ZAP ); actions.add( AC_SET ); if (returnDepth != -1) { actions.add( AC_RETURN ); @@ -101,7 +120,7 @@ public class LloydsBeacon extends Item { @Override public void execute( Hero hero, String action ) { - + if (action == AC_SET || action == AC_RETURN) { if (Dungeon.bossLevel()) { @@ -117,8 +136,19 @@ public class LloydsBeacon extends Item { } } } - - if (action == AC_SET) { + + if (action == AC_ZAP ){ + + curUser = hero; + int chargesToUse = Dungeon.depth > 20 ? 2 : 1; + + if (!isEquipped( hero )) GLog.i("You need to equip the beacon to do that."); + else if (charge < chargesToUse) GLog.i("Your beacon does not have enough energy right now."); + else { + GameScene.selectCell(zapper); + } + + } else if (action == AC_SET) { returnDepth = Dungeon.depth; returnPos = hero.pos; @@ -158,30 +188,122 @@ public class LloydsBeacon extends Item { } } - + + protected CellSelector.Listener zapper = new CellSelector.Listener() { + + @Override + public void onSelect(Integer target) { + + if (target == null) return; + + Invisibility.dispel(); + charge -= Dungeon.depth > 20 ? 2 : 1; + updateQuickslot(); + + if (Actor.findChar(target) == curUser){ + ScrollOfTeleportation.teleportHero(curUser); + curUser.spendAndNext(1f); + } else { + final Ballistica bolt = new Ballistica( curUser.pos, target, Ballistica.MAGIC_BOLT ); + final Char ch = Actor.findChar(bolt.collisionPos); + + if (ch == curUser){ + ScrollOfTeleportation.teleportHero(curUser); + curUser.spendAndNext( 1f ); + } else { + curUser.sprite.zap(bolt.collisionPos); + curUser.busy(); + + MagicMissile.force(curUser.sprite.parent, bolt.sourcePos, bolt.collisionPos, new Callback() { + @Override + public void call() { + if (ch != null) { + + int count = 10; + int pos; + do { + pos = Dungeon.level.randomRespawnCell(); + if (count-- <= 0) { + break; + } + } while (pos == -1); + + if (pos == -1) { + + GLog.w(ScrollOfTeleportation.TXT_NO_TELEPORT); + + } else { + + ch.pos = pos; + ch.sprite.place(ch.pos); + ch.sprite.visible = Dungeon.visible[pos]; + + } + } + curUser.spendAndNext(1f); + } + }); + + } + + + } + + } + + @Override + public String prompt() { + return "Choose a location to zap."; + } + }; + + @Override + protected ArtifactBuff passiveBuff() { + return new beaconRecharge(); + } + + @Override + public Item upgrade() { + chargeCap ++; + + return super.upgrade(); + } + + @Override + public String desc() { + return TXT_INFO + (returnDepth == -1 ? "" : Utils.format( TXT_SET, returnDepth ) ); + } + public void reset() { returnDepth = -1; } - @Override - public boolean isUpgradable() { - return false; - } - - @Override - public boolean isIdentified() { - return true; - } - private static final Glowing WHITE = new Glowing( 0xFFFFFF ); @Override public Glowing glowing() { return returnDepth != -1 ? WHITE : null; } - - @Override - public String info() { - return TXT_INFO + (returnDepth == -1 ? "" : Utils.format( TXT_SET, returnDepth ) ); + + public class beaconRecharge extends ArtifactBuff{ + @Override + public boolean act() { + if (charge < chargeCap && !cursed) { + partialCharge += 1 / (100f - (chargeCap - charge)*10f); + + if (partialCharge >= 1) { + partialCharge --; + charge ++; + + if (charge == chargeCap){ + partialCharge = 0; + } + } + } + + updateQuickslot(); + spend( TICK ); + return true; + } } } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index c4df4546c..a594457b0 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -353,7 +353,7 @@ public abstract class Wand extends Item { @Override public String prompt() { - return "Choose direction to zap"; + return "Choose a location to zap"; } };