v0.7.3: implemented two new boss recipes
This commit is contained in:
parent
7693bbcc80
commit
a0224f0ed0
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue
Block a user