v0.7.3: implemented two new boss recipes

This commit is contained in:
Evan Debenham 2019-05-10 01:22:48 -04:00
parent 7693bbcc80
commit a0224f0ed0
10 changed files with 335 additions and 44 deletions

View File

@ -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);
}

View File

@ -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 <http://www.gnu.org/licenses/>
*/
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 );
}
}

View File

@ -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;

View File

@ -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 <http://www.gnu.org/licenses/>
*/
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;
}
}
}

View File

@ -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 <http://www.gnu.org/licenses/>
*/
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;
}
}
}

View File

@ -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
@ -388,7 +387,7 @@ public class CursedWand {
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;
}
}

View File

@ -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()));
}

View File

@ -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);

View File

@ -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.

View File

@ -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.