diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index b95ec6139..1024abe5b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bleeding; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; @@ -57,6 +58,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Brimstone; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; @@ -355,6 +357,12 @@ public abstract class Char extends Actor { dmg = Math.round( dmg * resist( srcClass )); } + //TODO improve this when I have proper damage source logic + if (AntiMagic.RESISTS.contains(src.getClass()) && buff(ArcaneArmor.class) != null){ + dmg -= Random.NormalIntRange(0, buff(ArcaneArmor.class).level()); + if (dmg < 0) dmg = 0; + } + if (buff( Paralysis.class ) != null) { buff( Paralysis.class ).processDamage(dmg); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java new file mode 100644 index 000000000..ee99bdbea --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArcaneArmor.java @@ -0,0 +1,106 @@ +/* + * 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.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.watabou.noosa.Image; +import com.watabou.utils.Bundle; + +//A magical version of barkskin, essentially +public class ArcaneArmor extends Buff { + + { + type = buffType.POSITIVE; + } + + private int level = 0; + private int interval = 1; + + @Override + public boolean act() { + if (target.isAlive()) { + + spend( interval ); + if (--level <= 0) { + detach(); + } + + } else { + + detach(); + + } + + return true; + } + + public int level() { + return level; + } + + public void set( int value, int time ) { + //decide whether to override, preferring high value + low interval + if (Math.sqrt(interval)*level < Math.sqrt(time)*value) { + level = value; + interval = time; + spend(time - cooldown() - 1); + } + } + + @Override + public int icon() { + return BuffIndicator.ARMOR; + } + + @Override + public void tintIcon(Image icon) { + icon.tint(0.5f, 0, 1, 0.5f); + } + + @Override + public String toString() { + return Messages.get(this, "name"); + } + + @Override + public String desc() { + return Messages.get(this, "desc", level, dispTurns(cooldown()+1)); + } + + private static final String LEVEL = "level"; + private static final String INTERVAL = "interval"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( INTERVAL, interval ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + interval = bundle.getInt( INTERVAL ); + level = bundle.getInt( LEVEL ); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java index 85334eb66..897957b28 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ArtifactRecharge.java @@ -66,6 +66,10 @@ public class ArtifactRecharge extends Buff { left = amount; } + public void prolong( int amount ){ + left += amount; + } + @Override public int icon() { return BuffIndicator.RECHARGING; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfArcaneArmor.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfArcaneArmor.java new file mode 100644 index 000000000..a1ed0e560 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfArcaneArmor.java @@ -0,0 +1,61 @@ +/* + * 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.potions.elixirs; + +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArcaneArmor; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfEarthenArmor; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.GooBlob; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; + +public class ElixirOfArcaneArmor extends Elixir { + + { + image = ItemSpriteSheet.ELIXIR_ARCANE; + } + + @Override + public void apply(Hero hero) { + Buff.affect(hero, ArcaneArmor.class).set(5 + hero.lvl/2, 80); + } + + @Override + public int price() { + //prices of ingredients + return quantity * (50 + 40); + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { + + { + inputs = new Class[]{PotionOfEarthenArmor.class, GooBlob.class}; + inQuantity = new int[]{1, 1}; + + cost = 8; + + output = ElixirOfArcaneArmor.class; + outQuantity = 1; + } + + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java new file mode 100644 index 000000000..70067da32 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/WildEnergy.java @@ -0,0 +1,84 @@ +/* + * 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.spells; + +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ArtifactRecharge; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMysticalEnergy; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.CursedWand; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Callback; + +public class WildEnergy extends TargetedSpell { + + { + image = ItemSpriteSheet.WILD_ENERGY; + } + + //we rely on cursedWand to do fx instead + @Override + protected void fx(Ballistica bolt, Callback callback) { + affectTarget(bolt, curUser); + } + + @Override + protected void affectTarget(Ballistica bolt, final Hero hero) { + CursedWand.cursedZap(null, hero, bolt, new Callback() { + @Override + public void call() { + ScrollOfRecharging.charge(hero); + + Buff.affect(hero, Recharging.class, 10f); + Buff.affect(hero, ArtifactRecharge.class).prolong( 10 ); + + detach( curUser.belongings.backpack ); + updateQuickslot(); + curUser.spendAndNext( 1f ); + } + }); + } + + @Override + public int price() { + //prices of ingredients, divided by output quantity + return Math.round(quantity * ((50 + 100) / 5f)); + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { + + { + inputs = new Class[]{ScrollOfMysticalEnergy.class, MetalShard.class}; + inQuantity = new int[]{1, 1}; + + cost = 8; + + output = WildEnergy.class; + outQuantity = 5; + } + + } +} 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 c2b75828d..5656a7877 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,25 +82,25 @@ public class CursedWand { private static float RARE_CHANCE = 0.09f; private static float VERY_RARE_CHANCE = 0.01f; - public static void cursedZap(final Wand wand, final Hero user, final Ballistica bolt){ + public static void cursedZap(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ switch (Random.chances(new float[]{COMMON_CHANCE, UNCOMMON_CHANCE, RARE_CHANCE, VERY_RARE_CHANCE})){ case 0: default: - commonEffect(wand, user, bolt); + commonEffect(origin, user, bolt, afterZap); break; case 1: - uncommonEffect(wand, user, bolt); + uncommonEffect(origin, user, bolt, afterZap); break; case 2: - rareEffect(wand, user, bolt); + rareEffect(origin, user, bolt, afterZap); break; case 3: - veryRareEffect(wand, user, bolt); + veryRareEffect(origin, user, bolt, afterZap); break; } } - private static void commonEffect(final Wand wand, final Hero user, final Ballistica bolt){ + private static void commonEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //anti-entropy @@ -120,7 +120,7 @@ public class CursedWand { Buff.affect(target, Frost.class, Frost.duration(target) * Random.Float(3f, 5f)); break; } - wand.wandUsed(); + afterZap.call(); } }); break; @@ -130,7 +130,7 @@ public class CursedWand { cursedFX(user, bolt, new Callback() { public void call() { GameScene.add( Blob.seed(bolt.collisionPos, 30, Regrowth.class)); - wand.wandUsed(); + afterZap.call(); } }); break; @@ -140,7 +140,7 @@ public class CursedWand { switch(Random.Int(2)){ case 0: ScrollOfTeleportation.teleportHero(user); - wand.wandUsed(); + afterZap.call(); break; case 1: cursedFX(user, bolt, new Callback() { @@ -148,7 +148,6 @@ public class CursedWand { Char ch = Actor.findChar( bolt.collisionPos ); if (ch == user){ ScrollOfTeleportation.teleportHero(user); - wand.wandUsed(); } else if (ch != null && !ch.properties().contains(Char.Property.IMMOVABLE)) { int count = 10; int pos; @@ -167,7 +166,7 @@ public class CursedWand { ch.sprite.visible = Dungeon.level.heroFOV[pos]; } } - wand.wandUsed(); + afterZap.call(); } }); break; @@ -189,7 +188,7 @@ public class CursedWand { GameScene.add( Blob.seed( bolt.collisionPos, 200, ParalyticGas.class ) ); break; } - wand.wandUsed(); + afterZap.call(); } }); break; @@ -197,7 +196,7 @@ public class CursedWand { } - private static void uncommonEffect(final Wand wand, final Hero user, final Ballistica bolt){ + private static void uncommonEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //Random plant @@ -218,7 +217,7 @@ public class CursedWand { pos == Terrain.FURROWED_GRASS) { Dungeon.level.plant((Plant.Seed) Generator.random(Generator.Category.SEED), pos); } - wand.wandUsed(); + afterZap.call(); } }); break; @@ -234,7 +233,7 @@ public class CursedWand { case 0: user.HP = Math.min(user.HT, user.HP + damage); user.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); - target.damage(damage, wand); + target.damage(damage, origin); target.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10); break; case 1: @@ -243,18 +242,18 @@ public class CursedWand { 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()) { - Dungeon.fail( wand.getClass() ); - GLog.n(Messages.get(CursedWand.class, "ondeath", wand.name())); + if (!user.isAlive() && origin != null) { + Dungeon.fail( origin.getClass() ); + GLog.n(Messages.get(CursedWand.class, "ondeath", origin.name())); } break; } - wand.wandUsed(); + afterZap.call(); } }); } else { GLog.i(Messages.get(CursedWand.class, "nothing")); - wand.wandUsed(); + afterZap.call(); } break; @@ -263,7 +262,7 @@ public class CursedWand { cursedFX(user, bolt, new Callback() { public void call() { new Bomb().explode(bolt.collisionPos); - wand.wandUsed(); + afterZap.call(); } }); break; @@ -274,13 +273,13 @@ public class CursedWand { Buff.prolong(user, Recharging.class, 20f); ScrollOfRecharging.charge(user); SpellSprite.show(user, SpellSprite.CHARGE); - wand.wandUsed(); + afterZap.call(); break; } } - private static void rareEffect(final Wand wand, final Hero user, final Ballistica bolt){ + private static void rareEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //sheep transformation @@ -304,7 +303,7 @@ public class CursedWand { } else { GLog.i(Messages.get(CursedWand.class, "nothing")); } - wand.wandUsed(); + afterZap.call(); } }); break; @@ -312,7 +311,7 @@ public class CursedWand { //curses! case 1: CursingTrap.curse(user); - wand.wandUsed(); + afterZap.call(); break; //inter-level teleportation @@ -339,18 +338,18 @@ public class CursedWand { ScrollOfTeleportation.teleportHero(user); } - wand.wandUsed(); + afterZap.call(); break; //summon monsters case 3: new SummoningTrap().set( user.pos ).activate(); - wand.wandUsed(); + afterZap.call(); break; } } - private static void veryRareEffect(final Wand wand, final Hero user, final Ballistica bolt){ + private static void veryRareEffect(final Item origin, final Hero user, final Ballistica bolt, final Callback afterZap){ switch(Random.Int(4)){ //great forest fire! @@ -365,7 +364,7 @@ public class CursedWand { Sample.INSTANCE.play(Assets.SND_TELEPORT); GLog.p(Messages.get(CursedWand.class, "grass")); GLog.w(Messages.get(CursedWand.class, "fire")); - wand.wandUsed(); + afterZap.call(); break; //superpowered mimic @@ -387,8 +386,8 @@ public class CursedWand { } else { GLog.i(Messages.get(CursedWand.class, "nothing")); } - - wand.wandUsed(); + + afterZap.call(); } }); break; @@ -400,7 +399,7 @@ public class CursedWand { if(Messages.lang() != Languages.ENGLISH){ //Don't bother doing this joke to none-english speakers, I doubt it would translate. GLog.i(Messages.get(CursedWand.class, "nothing")); - wand.wandUsed(); + afterZap.call(); } else { GameScene.show( new WndOptions("CURSED WAND ERROR", "this application will now self-destruct", "abort", "retry", "fail") { @@ -421,14 +420,17 @@ public class CursedWand { ShatteredPixelDungeon.reportException(e); //oookay maybe don't kill the game if the save failed. GLog.i(Messages.get(CursedWand.class, "nothing")); - wand.wandUsed(); + afterZap.call(); } break; //random transmogrification case 3: - wand.wandUsed(); - wand.detach(user.belongings.backpack); + if (origin == null){ + cursedZap(origin, user, bolt, afterZap); + return; + } + origin.detach(user.belongings.backpack); Item result; do { result = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR, @@ -436,9 +438,13 @@ public class CursedWand { } while (result.cursed); if (result.isUpgradable()) result.upgrade(); result.cursed = result.cursedKnown = true; - GLog.w( Messages.get(CursedWand.class, "transmogrify") ); + if (origin instanceof Wand){ + GLog.w( Messages.get(CursedWand.class, "transmogrify_wand") ); + } else { + GLog.w( Messages.get(CursedWand.class, "transmogrify_other") ); + } Dungeon.level.drop(result, user.pos).sprite.drop(); - wand.wandUsed(); + afterZap.call(); break; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index 0354bca11..175fd1edd 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -430,7 +430,15 @@ public abstract class Wand extends Item { Invisibility.dispel(); if (curWand.cursed){ - CursedWand.cursedZap(curWand, curUser, new Ballistica( curUser.pos, target, Ballistica.MAGIC_BOLT)); + CursedWand.cursedZap(curWand, + curUser, + new Ballistica(curUser.pos, target, Ballistica.MAGIC_BOLT), + new Callback() { + @Override + public void call() { + curWand.wandUsed(); + } + }); if (!curWand.cursedKnown){ GLog.n(Messages.get(Wand.class, "curse_discover", curWand.name())); } 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 e241da163..41eceb5bc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java @@ -40,6 +40,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfArcaneArmor; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch; @@ -59,6 +60,7 @@ 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.WildEnergy; import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; @@ -351,22 +353,24 @@ public class QuickRecipe extends Component { result.add(new QuickRecipe(new ArcaneCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Scroll.PlaceHolder(), new Plant.Seed.PlaceHolder())), new ArcaneCatalyst())); return result; case 8: + result.add(new QuickRecipe(new CausticBrew.Recipe())); result.add(new QuickRecipe(new InfernalBrew.Recipe())); result.add(new QuickRecipe(new BlizzardBrew.Recipe())); result.add(new QuickRecipe(new ShockingBrew.Recipe())); - result.add(new QuickRecipe(new CausticBrew.Recipe())); result.add(null); result.add(null); result.add(new QuickRecipe(new ElixirOfHoneyedHealing.Recipe())); - result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe())); result.add(new QuickRecipe(new ElixirOfMight.Recipe())); + result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe())); result.add(new QuickRecipe(new ElixirOfDragonsBlood.Recipe())); result.add(new QuickRecipe(new ElixirOfIcyTouch.Recipe())); result.add(new QuickRecipe(new ElixirOfToxicEssence.Recipe())); + result.add(new QuickRecipe(new ElixirOfArcaneArmor.Recipe())); return result; case 9: result.add(new QuickRecipe(new MagicalPorter.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(null); diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties index 7b13684b5..83c75fa88 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties @@ -52,6 +52,9 @@ actors.buffs.adrenalinesurge.desc=A surge of great might, but sadly not permanen actors.buffs.amok.name=Amok actors.buffs.amok.desc=Amok causes a state of great rage and confusion in its target.\n\nWhen a creature is amoked, they will attack whatever is near them, whether they be friend or foe.\n\nTurns of amok remaining: %s. +actors.buffs.arcanearmor.name=Arcane Armor +actors.buffs.arcanearmor.desc=A thin shield is surrounding you, blocking some of the damage from magical attacks.\n\nYour magical armor is currently boosted by: 0-%d.\n\nTurns until arcane armor weakens: %s. + actors.buffs.artifactrecharge.name=Artifact Recharging actors.buffs.artifactrecharge.desc=Energy is coursing through you, increasing the rate your equipped artifacts charge.\n\nEach artifact is affected a little differently, but they will all be less limited by their charge meter.\n\nTurns remaining: %s. 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 cb9685a5f..a61fa630b 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 @@ -566,12 +566,12 @@ items.potions.potionoftoxicgas.desc=Uncorking or shattering this pressurized gla ###brews +items.potions.brews.causticbrew.name=caustic brew +items.potions.brews.causticbrew.desc=This brew will spread corrosive ooze in a wide area around the location it shatters in. Anything caught by the ooze will slowly melt if it can't wash it off in water. + items.potions.brews.blizzardbrew.name=blizzard brew items.potions.brews.blizzardbrew.desc=When shattered, this brew will unleash a swirling blizzard which spreads like a gas. -items.potions.brews.frigidbrew.name=frigid brew -items.potions.brews.frigidbrew.desc=This brew combines the properties of a frost and storm clouds potion. When thrown it will erupt into a cloud which both freezes and spreads water to surrounding terrain. - items.potions.brews.infernalbrew.name=infernal brew items.potions.brews.infernalbrew.desc=When shattered, this brew will unleash a raging inferno which spreads like a gas. @@ -581,6 +581,9 @@ items.potions.brews.shockingbrew.desc=When shattered, this brew will unleash an ###elixirs +items.potions.elixirs.elixirofarcanearmor.name=elixir of arcane armor +items.potions.elixirs.elixirofarcanearmor.desc=This elixir will grant the drinker a long lasting resistance to magical damage. + items.potions.elixirs.elixirofaquaticrejuvenation.name=elixir of aquatic rejuvenation items.potions.elixirs.elixirofaquaticrejuvenation.desc=This elixir contains the remains of Goo enhanced with a healing potion. While it will not provide immediate healing, it will steadily restore a greater amount of health while you are standing in water. items.potions.elixirs.elixirofaquaticrejuvenation$aquahealing.name=Aquatic Healing @@ -976,6 +979,9 @@ 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.wildenergy.name=wild energy +items.spells.wildenergy.desc=This spell contains some of the cursed energy which powered DM-300. When cast, it will grant you several turns of recharging and mystical energy, while also triggering a random cursed wand effect. You are able to choose a direction for this cursed magic to shoot in, however. + ###runestones items.stones.inventorystone.ac_use=USE @@ -1039,7 +1045,8 @@ items.wands.cursedwand.ondeath=You were killed by your own %s. items.wands.cursedwand.nothing=Nothing happens. items.wands.cursedwand.grass=Grass erupts around you! items.wands.cursedwand.fire=You smell burning... -items.wands.cursedwand.transmogrify=Your wand transmogrifies into a different item! +items.wands.cursedwand.transmogrify_wand=Your wand transmogrifies into a different item! +items.wands.cursedwand.transmogrify_other=Your item transmogrifies into something different! items.wands.wand.ac_zap=ZAP items.wands.wand.fizzles=Your wand fizzles; it must not have enough charge.