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.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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
left = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void prolong( int amount ){
|
||||||
|
left += amount;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int icon() {
|
public int icon() {
|
||||||
return BuffIndicator.RECHARGING;
|
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 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user