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.Electricity;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Adrenaline; 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.Bleeding;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Bless;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; 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.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; 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.Brimstone;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements;
@ -355,6 +357,12 @@ public abstract class Char extends Actor {
dmg = Math.round( dmg * resist( srcClass )); 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) { if (buff( Paralysis.class ) != null) {
buff( Paralysis.class ).processDamage(dmg); 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; left = amount;
} }
public void prolong( int amount ){
left += amount;
}
@Override @Override
public int icon() { public int icon() {
return BuffIndicator.RECHARGING; 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 RARE_CHANCE = 0.09f;
private static float VERY_RARE_CHANCE = 0.01f; 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})){ switch (Random.chances(new float[]{COMMON_CHANCE, UNCOMMON_CHANCE, RARE_CHANCE, VERY_RARE_CHANCE})){
case 0: case 0:
default: default:
commonEffect(wand, user, bolt); commonEffect(origin, user, bolt, afterZap);
break; break;
case 1: case 1:
uncommonEffect(wand, user, bolt); uncommonEffect(origin, user, bolt, afterZap);
break; break;
case 2: case 2:
rareEffect(wand, user, bolt); rareEffect(origin, user, bolt, afterZap);
break; break;
case 3: case 3:
veryRareEffect(wand, user, bolt); veryRareEffect(origin, user, bolt, afterZap);
break; 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)){ switch(Random.Int(4)){
//anti-entropy //anti-entropy
@ -120,7 +120,7 @@ public class CursedWand {
Buff.affect(target, Frost.class, Frost.duration(target) * Random.Float(3f, 5f)); Buff.affect(target, Frost.class, Frost.duration(target) * Random.Float(3f, 5f));
break; break;
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -130,7 +130,7 @@ public class CursedWand {
cursedFX(user, bolt, new Callback() { cursedFX(user, bolt, new Callback() {
public void call() { public void call() {
GameScene.add( Blob.seed(bolt.collisionPos, 30, Regrowth.class)); GameScene.add( Blob.seed(bolt.collisionPos, 30, Regrowth.class));
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -140,7 +140,7 @@ public class CursedWand {
switch(Random.Int(2)){ switch(Random.Int(2)){
case 0: case 0:
ScrollOfTeleportation.teleportHero(user); ScrollOfTeleportation.teleportHero(user);
wand.wandUsed(); afterZap.call();
break; break;
case 1: case 1:
cursedFX(user, bolt, new Callback() { cursedFX(user, bolt, new Callback() {
@ -148,7 +148,6 @@ public class CursedWand {
Char ch = Actor.findChar( bolt.collisionPos ); Char ch = Actor.findChar( bolt.collisionPos );
if (ch == user){ if (ch == user){
ScrollOfTeleportation.teleportHero(user); ScrollOfTeleportation.teleportHero(user);
wand.wandUsed();
} else if (ch != null && !ch.properties().contains(Char.Property.IMMOVABLE)) { } else if (ch != null && !ch.properties().contains(Char.Property.IMMOVABLE)) {
int count = 10; int count = 10;
int pos; int pos;
@ -167,7 +166,7 @@ public class CursedWand {
ch.sprite.visible = Dungeon.level.heroFOV[pos]; ch.sprite.visible = Dungeon.level.heroFOV[pos];
} }
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -189,7 +188,7 @@ public class CursedWand {
GameScene.add( Blob.seed( bolt.collisionPos, 200, ParalyticGas.class ) ); GameScene.add( Blob.seed( bolt.collisionPos, 200, ParalyticGas.class ) );
break; break;
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; 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)){ switch(Random.Int(4)){
//Random plant //Random plant
@ -218,7 +217,7 @@ public class CursedWand {
pos == Terrain.FURROWED_GRASS) { pos == Terrain.FURROWED_GRASS) {
Dungeon.level.plant((Plant.Seed) Generator.random(Generator.Category.SEED), pos); Dungeon.level.plant((Plant.Seed) Generator.random(Generator.Category.SEED), pos);
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -234,7 +233,7 @@ public class CursedWand {
case 0: case 0:
user.HP = Math.min(user.HT, user.HP + damage); user.HP = Math.min(user.HT, user.HP + damage);
user.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); 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); target.sprite.emitter().start(ShadowParticle.UP, 0.05f, 10);
break; break;
case 1: case 1:
@ -243,18 +242,18 @@ public class CursedWand {
target.HP = Math.min(target.HT, target.HP + damage); target.HP = Math.min(target.HT, target.HP + damage);
target.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3); target.sprite.emitter().burst(Speck.factory(Speck.HEALING), 3);
Sample.INSTANCE.play(Assets.SND_CURSED); Sample.INSTANCE.play(Assets.SND_CURSED);
if (!user.isAlive()) { if (!user.isAlive() && origin != null) {
Dungeon.fail( wand.getClass() ); Dungeon.fail( origin.getClass() );
GLog.n(Messages.get(CursedWand.class, "ondeath", wand.name())); GLog.n(Messages.get(CursedWand.class, "ondeath", origin.name()));
} }
break; break;
} }
wand.wandUsed(); afterZap.call();
} }
}); });
} else { } else {
GLog.i(Messages.get(CursedWand.class, "nothing")); GLog.i(Messages.get(CursedWand.class, "nothing"));
wand.wandUsed(); afterZap.call();
} }
break; break;
@ -263,7 +262,7 @@ public class CursedWand {
cursedFX(user, bolt, new Callback() { cursedFX(user, bolt, new Callback() {
public void call() { public void call() {
new Bomb().explode(bolt.collisionPos); new Bomb().explode(bolt.collisionPos);
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -274,13 +273,13 @@ public class CursedWand {
Buff.prolong(user, Recharging.class, 20f); Buff.prolong(user, Recharging.class, 20f);
ScrollOfRecharging.charge(user); ScrollOfRecharging.charge(user);
SpellSprite.show(user, SpellSprite.CHARGE); SpellSprite.show(user, SpellSprite.CHARGE);
wand.wandUsed(); afterZap.call();
break; 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)){ switch(Random.Int(4)){
//sheep transformation //sheep transformation
@ -304,7 +303,7 @@ public class CursedWand {
} else { } else {
GLog.i(Messages.get(CursedWand.class, "nothing")); GLog.i(Messages.get(CursedWand.class, "nothing"));
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -312,7 +311,7 @@ public class CursedWand {
//curses! //curses!
case 1: case 1:
CursingTrap.curse(user); CursingTrap.curse(user);
wand.wandUsed(); afterZap.call();
break; break;
//inter-level teleportation //inter-level teleportation
@ -339,18 +338,18 @@ public class CursedWand {
ScrollOfTeleportation.teleportHero(user); ScrollOfTeleportation.teleportHero(user);
} }
wand.wandUsed(); afterZap.call();
break; break;
//summon monsters //summon monsters
case 3: case 3:
new SummoningTrap().set( user.pos ).activate(); new SummoningTrap().set( user.pos ).activate();
wand.wandUsed(); afterZap.call();
break; 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)){ switch(Random.Int(4)){
//great forest fire! //great forest fire!
@ -365,7 +364,7 @@ public class CursedWand {
Sample.INSTANCE.play(Assets.SND_TELEPORT); Sample.INSTANCE.play(Assets.SND_TELEPORT);
GLog.p(Messages.get(CursedWand.class, "grass")); GLog.p(Messages.get(CursedWand.class, "grass"));
GLog.w(Messages.get(CursedWand.class, "fire")); GLog.w(Messages.get(CursedWand.class, "fire"));
wand.wandUsed(); afterZap.call();
break; break;
//superpowered mimic //superpowered mimic
@ -388,7 +387,7 @@ public class CursedWand {
GLog.i(Messages.get(CursedWand.class, "nothing")); GLog.i(Messages.get(CursedWand.class, "nothing"));
} }
wand.wandUsed(); afterZap.call();
} }
}); });
break; break;
@ -400,7 +399,7 @@ public class CursedWand {
if(Messages.lang() != Languages.ENGLISH){ if(Messages.lang() != Languages.ENGLISH){
//Don't bother doing this joke to none-english speakers, I doubt it would translate. //Don't bother doing this joke to none-english speakers, I doubt it would translate.
GLog.i(Messages.get(CursedWand.class, "nothing")); GLog.i(Messages.get(CursedWand.class, "nothing"));
wand.wandUsed(); afterZap.call();
} else { } else {
GameScene.show( GameScene.show(
new WndOptions("CURSED WAND ERROR", "this application will now self-destruct", "abort", "retry", "fail") { new WndOptions("CURSED WAND ERROR", "this application will now self-destruct", "abort", "retry", "fail") {
@ -421,14 +420,17 @@ public class CursedWand {
ShatteredPixelDungeon.reportException(e); ShatteredPixelDungeon.reportException(e);
//oookay maybe don't kill the game if the save failed. //oookay maybe don't kill the game if the save failed.
GLog.i(Messages.get(CursedWand.class, "nothing")); GLog.i(Messages.get(CursedWand.class, "nothing"));
wand.wandUsed(); afterZap.call();
} }
break; break;
//random transmogrification //random transmogrification
case 3: case 3:
wand.wandUsed(); if (origin == null){
wand.detach(user.belongings.backpack); cursedZap(origin, user, bolt, afterZap);
return;
}
origin.detach(user.belongings.backpack);
Item result; Item result;
do { do {
result = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR, result = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR,
@ -436,9 +438,13 @@ public class CursedWand {
} while (result.cursed); } while (result.cursed);
if (result.isUpgradable()) result.upgrade(); if (result.isUpgradable()) result.upgrade();
result.cursed = result.cursedKnown = true; 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(); Dungeon.level.drop(result, user.pos).sprite.drop();
wand.wandUsed(); afterZap.call();
break; break;
} }
} }

View File

@ -430,7 +430,15 @@ public abstract class Wand extends Item {
Invisibility.dispel(); Invisibility.dispel();
if (curWand.cursed){ 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){ if (!curWand.cursedKnown){
GLog.n(Messages.get(Wand.class, "curse_discover", curWand.name())); 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.InfernalBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; 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.ElixirOfDragonsBlood;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch; 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.PhaseShift;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap; import com.shatteredpixel.shatteredpixeldungeon.items.spells.ReclaimTrap;
import com.shatteredpixel.shatteredpixeldungeon.items.spells.Recycle; 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.stones.Runestone;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.TippedDart; 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())); result.add(new QuickRecipe(new ArcaneCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Scroll.PlaceHolder(), new Plant.Seed.PlaceHolder())), new ArcaneCatalyst()));
return result; return result;
case 8: case 8:
result.add(new QuickRecipe(new CausticBrew.Recipe()));
result.add(new QuickRecipe(new InfernalBrew.Recipe())); result.add(new QuickRecipe(new InfernalBrew.Recipe()));
result.add(new QuickRecipe(new BlizzardBrew.Recipe())); result.add(new QuickRecipe(new BlizzardBrew.Recipe()));
result.add(new QuickRecipe(new ShockingBrew.Recipe())); result.add(new QuickRecipe(new ShockingBrew.Recipe()));
result.add(new QuickRecipe(new CausticBrew.Recipe()));
result.add(null); result.add(null);
result.add(null); result.add(null);
result.add(new QuickRecipe(new ElixirOfHoneyedHealing.Recipe())); 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 ElixirOfMight.Recipe()));
result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe()));
result.add(new QuickRecipe(new ElixirOfDragonsBlood.Recipe())); result.add(new QuickRecipe(new ElixirOfDragonsBlood.Recipe()));
result.add(new QuickRecipe(new ElixirOfIcyTouch.Recipe())); result.add(new QuickRecipe(new ElixirOfIcyTouch.Recipe()));
result.add(new QuickRecipe(new ElixirOfToxicEssence.Recipe())); result.add(new QuickRecipe(new ElixirOfToxicEssence.Recipe()));
result.add(new QuickRecipe(new ElixirOfArcaneArmor.Recipe()));
return result; return result;
case 9: case 9:
result.add(new QuickRecipe(new MagicalPorter.Recipe())); result.add(new QuickRecipe(new MagicalPorter.Recipe()));
result.add(new QuickRecipe(new PhaseShift.Recipe())); result.add(new QuickRecipe(new PhaseShift.Recipe()));
result.add(new QuickRecipe(new WildEnergy.Recipe()));
result.add(new QuickRecipe(new BeaconOfReturning.Recipe())); result.add(new QuickRecipe(new BeaconOfReturning.Recipe()));
result.add(null); result.add(null);
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.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.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.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. 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 ###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.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.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.name=infernal brew
items.potions.brews.infernalbrew.desc=When shattered, this brew will unleash a raging inferno which spreads like a gas. 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 ###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.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.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 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.prompt=Choose a target
items.spells.targetedspell.inv_title=Infuse an item 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 ###runestones
items.stones.inventorystone.ac_use=USE 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.nothing=Nothing happens.
items.wands.cursedwand.grass=Grass erupts around you! items.wands.cursedwand.grass=Grass erupts around you!
items.wands.cursedwand.fire=You smell burning... 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.ac_zap=ZAP
items.wands.wand.fizzles=Your wand fizzles; it must not have enough charge. items.wands.wand.fizzles=Your wand fizzles; it must not have enough charge.