From 27708be1121d369dd39b55ff8ae5cd88b9a3ddcc Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 28 Sep 2018 19:57:58 -0400 Subject: [PATCH] v0.7.0: many alchemy balance changes --- core/src/main/assets/items.png | Bin 18664 -> 18637 bytes .../shatteredpixeldungeon/actors/Char.java | 3 + .../actors/buffs/Combo.java | 2 + .../actors/buffs/EarthImbue.java | 1 + .../actors/buffs/FireImbue.java | 2 +- .../actors/buffs/FrostImbue.java | 68 ++++++++++++++++++ .../actors/buffs/Ooze.java | 31 +++++++- .../actors/buffs/ToxicImbue.java | 2 +- .../actors/mobs/FetidRat.java | 2 +- .../actors/mobs/Goo.java | 2 +- .../actors/mobs/Yog.java | 2 +- .../shatteredpixeldungeon/items/Recipe.java | 4 +- .../items/armor/curses/Corrosion.java | 2 +- .../items/bombs/Bomb.java | 24 +++---- .../items/bombs/Flashbang.java | 2 +- .../items/bombs/Noisemaker.java | 4 +- .../{HealingBomb.java => RegrowthBomb.java} | 48 +++++++++++-- .../items/food/Blandfruit.java | 2 +- .../items/food/Feast.java | 2 +- .../items/potions/brews/BlizzardBrew.java | 2 +- .../items/potions/brews/CausticBrew.java | 4 +- .../items/potions/brews/FrostfireBrew.java | 2 +- .../items/potions/brews/InfernalBrew.java | 2 +- .../items/potions/brews/ShockingBrew.java | 2 +- .../elixirs/ElixirOfAquaticRejuvenation.java | 2 +- .../potions/elixirs/ElixirOfDragonsBlood.java | 2 +- .../elixirs/ElixirOfHoneyedHealing.java | 2 +- ...arthenPower.java => ElixirOfIcyTouch.java} | 24 +++---- .../items/potions/elixirs/ElixirOfMight.java | 2 +- .../potions/elixirs/ElixirOfToxicEssence.java | 2 +- .../items/spells/Alchemize.java | 4 +- .../items/spells/AquaBlast.java | 2 +- .../items/spells/BeaconOfReturning.java | 2 +- .../items/spells/CurseInfusion.java | 2 +- .../items/spells/FeatherFall.java | 2 +- .../items/spells/MagicalPorter.java | 8 +-- .../items/spells/PhaseShift.java | 4 +- .../items/spells/ReclaimTrap.java | 2 +- .../items/spells/Recycle.java | 6 +- .../items/wands/WandOfCorrosion.java | 2 +- .../items/weapon/enchantments/Chilling.java | 1 + .../levels/traps/OozeTrap.java | 2 +- .../sprites/ItemSpriteSheet.java | 8 +-- .../messages/actors/actors.properties | 5 +- .../messages/items/items.properties | 12 ++-- .../messages/journal/journal.properties | 6 +- 46 files changed, 231 insertions(+), 86 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/FrostImbue.java rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/{HealingBomb.java => RegrowthBomb.java} (54%) rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/{ElixirOfEarthenPower.java => ElixirOfIcyTouch.java} (76%) diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index 44015b8c3bd6102fead840ad18e57c3babae49c7..a1df69abcf6b6985dc2d542385a26a6c17b734d1 100644 GIT binary patch literal 18637 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%0A7YCe!MZ2&|LE3g1CTEtF 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 QxDQCc)78&qol`;+0BY-Q>;M1& literal 18664 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 + */ + +package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; + +import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SnowParticle; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; +import com.watabou.noosa.Image; + +public class FrostImbue extends FlavourBuff { + + { + type = buffType.POSITIVE; + announced = true; + } + + public static final float DURATION = 50f; + + public void proc(Char enemy){ + Buff.affect(enemy, Chill.class, 2f); + enemy.sprite.emitter().burst( SnowParticle.FACTORY, 2 ); + } + + @Override + public int icon() { + return BuffIndicator.FROST; + } + + @Override + public void tintIcon(Image icon) { + greyIcon(icon, 5f, cooldown()); + } + + @Override + public String toString() { + return Messages.get(this, "name"); + } + + @Override + public String desc() { + return Messages.get(this, "desc", dispTurns()); + } + + { + immunities.add( Frost.class ); + immunities.add( Chill.class ); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java index 1bfb4063c..061350524 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Ooze.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; import com.watabou.utils.Random; public class Ooze extends Buff { @@ -34,6 +35,26 @@ public class Ooze extends Buff { announced = true; } + private float left; + private static final String LEFT = "left"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEFT, left ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + //pre-0.7.0 + if (bundle.contains( LEFT )) { + left = bundle.getFloat(LEFT); + } else { + left = 20; + } + } + @Override public int icon() { return BuffIndicator.OOZE; @@ -51,7 +72,11 @@ public class Ooze extends Buff { @Override public String desc() { - return Messages.get(this, "desc"); + return Messages.get(this, "desc", dispTurns(left)); + } + + public void set(float left){ + this.left = left; } @Override @@ -66,6 +91,10 @@ public class Ooze extends Buff { GLog.n( Messages.get(this, "ondeath") ); } spend( TICK ); + left -= TICK; + if (left <= 0){ + detach(); + } } else { detach(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java index 93ac05e29..d7755500f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/ToxicImbue.java @@ -36,7 +36,7 @@ public class ToxicImbue extends Buff { announced = true; } - public static final float DURATION = 30f; + public static final float DURATION = 50f; protected float left; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java index 7db4b4a92..3522f1754 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/FetidRat.java @@ -61,7 +61,7 @@ public class FetidRat extends Rat { public int attackProc( Char enemy, int damage ) { damage = super.attackProc( enemy, damage ); if (Random.Int(3) == 0) { - Buff.affect(enemy, Ooze.class); + Buff.affect(enemy, Ooze.class).set( 20f ); } return damage; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java index a91d3e404..5ac89966c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java @@ -123,7 +123,7 @@ public class Goo extends Mob { public int attackProc( Char enemy, int damage ) { damage = super.attackProc( enemy, damage ); if (Random.Int( 3 ) == 0) { - Buff.affect( enemy, Ooze.class ); + Buff.affect( enemy, Ooze.class ).set( 20f ); enemy.sprite.burst( 0x000000, 5 ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java index 6f574aefb..e0bb8d6a5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Yog.java @@ -238,7 +238,7 @@ public class Yog extends Mob { damage = super.attackProc( enemy, damage ); if (Random.Int( 3 ) == 0) { - Buff.affect( enemy, Ooze.class ); + Buff.affect( enemy, Ooze.class ).set( 20f ); enemy.sprite.burst( 0xFF000000, 5 ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java index 067c0388d..f78fcbd06 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -37,8 +37,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.WickedBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfAquaticRejuvenation; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDragonsBlood; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfEarthenPower; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfHoneyedHealing; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfIcyTouch; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfMight; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfRestoration; import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfToxicEssence; @@ -167,7 +167,7 @@ public abstract class Recipe { new Bomb.EnhanceBomb(), new ElixirOfAquaticRejuvenation.Recipe(), new ElixirOfDragonsBlood.Recipe(), - new ElixirOfEarthenPower.Recipe(), + new ElixirOfIcyTouch.Recipe(), new ElixirOfHoneyedHealing.Recipe(), new ElixirOfRestoration.Recipe(), new ElixirOfToxicEssence.Recipe(), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Corrosion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Corrosion.java index 31de58b9b..e23f1c1b8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Corrosion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/curses/Corrosion.java @@ -43,7 +43,7 @@ public class Corrosion extends Armor.Glyph { for (int i : PathFinder.NEIGHBOURS9){ Splash.at(pos+i, 0x000000, 5); if (Actor.findChar(pos+i) != null) - Buff.affect(Actor.findChar(pos+i), Ooze.class); + Buff.affect(Actor.findChar(pos+i), Ooze.class).set( 20f ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java index 51957b4dd..0b451ab29 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Bomb.java @@ -234,7 +234,7 @@ public class Bomb extends Item { public static class Fuse extends Actor{ { - actPriority = BUFF_PRIO; //as if it were a buff + actPriority = BLOB_PRIO+1; //after hero, before other actors } private Bomb bomb; @@ -303,7 +303,7 @@ public class Bomb extends Item { static { validIngredients.put(PotionOfLiquidFlame.class, Firebomb.class); validIngredients.put(PotionOfFrost.class, FrostBomb.class); - validIngredients.put(PotionOfHealing.class, HealingBomb.class); + validIngredients.put(PotionOfHealing.class, RegrowthBomb.class); validIngredients.put(PotionOfInvisibility.class, Flashbang.class); validIngredients.put(ScrollOfRecharging.class, ShockBomb.class); @@ -317,18 +317,18 @@ public class Bomb extends Item { private static final HashMap, Integer> bombCosts = new HashMap<>(); static { - bombCosts.put(Firebomb.class, 2); - bombCosts.put(FrostBomb.class, 1); - bombCosts.put(HealingBomb.class, 4); - bombCosts.put(Flashbang.class, 3); + bombCosts.put(Firebomb.class, 4); + bombCosts.put(FrostBomb.class, 3); + bombCosts.put(RegrowthBomb.class, 6); + bombCosts.put(Flashbang.class, 5); - bombCosts.put(ShockBomb.class, 3); - bombCosts.put(HolyBomb.class, 4); - bombCosts.put(WoollyBomb.class, 1); - bombCosts.put(Noisemaker.class, 2); + bombCosts.put(ShockBomb.class, 5); + bombCosts.put(HolyBomb.class, 6); + bombCosts.put(WoollyBomb.class, 3); + bombCosts.put(Noisemaker.class, 4); - bombCosts.put(ArcaneBomb.class, 6); - bombCosts.put(ShrapnelBomb.class, 6); + bombCosts.put(ArcaneBomb.class, 8); + bombCosts.put(ShrapnelBomb.class, 8); } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Flashbang.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Flashbang.java index 189221bc5..02ab68653 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Flashbang.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Flashbang.java @@ -59,7 +59,7 @@ public class Flashbang extends Bomb { Level l = Dungeon.level; for (Char ch : Actor.chars()){ if (ch.fieldOfView != null && ch.fieldOfView[cell]){ - int power = 10 - l.distance(ch.pos, cell); + int power = 15 - 2*l.distance(ch.pos, cell); if (power > 0){ Buff.prolong(ch, Blindness.class, power); Buff.prolong(ch, Cripple.class, power); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java index fe7e60c29..a96ee94fe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/Noisemaker.java @@ -65,7 +65,7 @@ public class Noisemaker extends Bomb { public void set(int cell){ floor = Dungeon.depth; this.cell = cell; - left = 5; + left = 8; } @Override @@ -88,7 +88,7 @@ public class Noisemaker extends Bomb { } if (left > 0) { - spend(TICK * 20f); + spend(TICK * 15f); left--; } else { detach(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/HealingBomb.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/RegrowthBomb.java similarity index 54% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/HealingBomb.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/RegrowthBomb.java index fc9054d62..32f901853 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/HealingBomb.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/bombs/RegrowthBomb.java @@ -25,20 +25,30 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Regrowth; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Healing; import com.shatteredpixel.shatteredpixeldungeon.effects.Splash; +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing; +import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.watabou.noosa.audio.Sample; import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; -public class HealingBomb extends Bomb { +import java.util.ArrayList; + +public class RegrowthBomb extends Bomb { { //TODO visuals - image = ItemSpriteSheet.HEAL_BOMB; + image = ItemSpriteSheet.REGROWTH_BOMB; } @Override @@ -54,16 +64,44 @@ public class HealingBomb extends Bomb { //no regular explosion damage + ArrayList plantCandidates = new ArrayList<>(); + PathFinder.buildDistanceMap( cell, BArray.not( Dungeon.level.solid, null ), 2 ); for (int i = 0; i < PathFinder.distance.length; i++) { if (PathFinder.distance[i] < Integer.MAX_VALUE) { Char ch = Actor.findChar(i); if (ch != null){ - //same as a healing potion - Buff.affect( ch, Healing.class ).setHeal((int)(0.8f*ch.HT + 14), 0.25f, 0); - PotionOfHealing.cure( ch ); + if (ch.alignment == Dungeon.hero.alignment) { + //same as a healing dart + Buff.affect(ch, Healing.class).setHeal((int) (0.5f * ch.HT + 30), 0.25f, 0); + PotionOfHealing.cure(ch); + } + } else if ( Dungeon.level.map[i] == Terrain.EMPTY || + Dungeon.level.map[i] == Terrain.EMBERS || + Dungeon.level.map[i] == Terrain.EMPTY_DECO || + Dungeon.level.map[i] == Terrain.GRASS || + Dungeon.level.map[i] == Terrain.HIGH_GRASS){ + + plantCandidates.add(i); } + GameScene.add( Blob.seed( i, 10, Regrowth.class ) ); } } + + Integer plantPos = Random.element(plantCandidates); + if (plantPos != null){ + Dungeon.level.plant((Plant.Seed) Generator.random(Generator.Category.SEED), plantPos); + plantCandidates.remove(plantPos); + } + + plantPos = Random.element(plantCandidates); + if (plantPos != null){ + if (Random.Int(2) == 0){ + Dungeon.level.plant( new WandOfRegrowth.Dewcatcher.Seed(), plantPos); + } else { + Dungeon.level.plant((Plant.Seed) Generator.random(Generator.Category.SEED), plantPos); + } + plantCandidates.remove(plantPos); + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java index e0d16ce78..c409dd3b3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Blandfruit.java @@ -273,7 +273,7 @@ public class Blandfruit extends Food { @Override public int cost(ArrayList ingredients) { - return 2; + return 3; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Feast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Feast.java index ad9410dc3..c2967645c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Feast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/food/Feast.java @@ -76,7 +76,7 @@ public class Feast extends Food { @Override public int cost(ArrayList ingredients) { - return 8; + return (int)Hunger.STARVING/50; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java index ea3daec84..f1b2e3faf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/BlizzardBrew.java @@ -55,7 +55,7 @@ public class BlizzardBrew extends Brew { inputs = new Class[]{PotionOfSnapFreeze.class, PotionOfFrost.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 6; output = BlizzardBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/CausticBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/CausticBrew.java index f64eea4e8..e444c3447 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/CausticBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/CausticBrew.java @@ -46,7 +46,7 @@ public class CausticBrew extends Brew { Char ch = Actor.findChar(cell + offset); if (ch != null){ - Buff.affect(ch, Ooze.class); + Buff.affect(ch, Ooze.class).set( 20f ); } } @@ -58,7 +58,7 @@ public class CausticBrew extends Brew { inputs = new Class[]{PotionOfToxicGas.class, GooBlob.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 8; output = CausticBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java index 3c12b6cee..73879759c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/FrostfireBrew.java @@ -75,7 +75,7 @@ public class FrostfireBrew extends Brew { inputs = new Class[]{PotionOfSnapFreeze.class, PotionOfLiquidFlame.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 8; output = FrostfireBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java index 396090106..761591bf6 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/InfernalBrew.java @@ -56,7 +56,7 @@ public class InfernalBrew extends Brew { inputs = new Class[]{PotionOfDragonsBreath.class, PotionOfLiquidFlame.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 6; output = InfernalBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java index 4f1484ce7..e9665b70e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/brews/ShockingBrew.java @@ -60,7 +60,7 @@ public class ShockingBrew extends Brew { inputs = new Class[]{PotionOfParalyticGas.class, PotionOfStormClouds.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 8; output = ShockingBrew.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java index a42a6a5e1..a72173bec 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfAquaticRejuvenation.java @@ -120,7 +120,7 @@ public class ElixirOfAquaticRejuvenation extends Elixir { inputs = new Class[]{PotionOfHealing.class, GooBlob.class}; inQuantity = new int[]{1, 1}; - cost = 3; + cost = 4; output = ElixirOfAquaticRejuvenation.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java index e518d7473..43af1c973 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfDragonsBlood.java @@ -56,7 +56,7 @@ public class ElixirOfDragonsBlood extends Elixir { inputs = new Class[]{PotionOfLiquidFlame.class, PotionOfPurity.class}; inQuantity = new int[]{1, 1}; - cost = 4; + cost = 6; output = ElixirOfDragonsBlood.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java index 298d9e89d..89f20b3b9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfHoneyedHealing.java @@ -71,7 +71,7 @@ public class ElixirOfHoneyedHealing extends Elixir { inputs = new Class[]{PotionOfHealing.class, Honeypot.ShatteredPot.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 4; output = ElixirOfHoneyedHealing.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java similarity index 76% rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java index 7949170ab..60000aa65 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfEarthenPower.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java @@ -22,40 +22,40 @@ package com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; -import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.EarthImbue; +import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.effects.particles.EarthParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHaste; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfParalyticGas; +import com.shatteredpixel.shatteredpixeldungeon.effects.particles.SnowParticle; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; -public class ElixirOfEarthenPower extends Elixir { +public class ElixirOfIcyTouch extends Elixir { { //TODO finish visuals - image = ItemSpriteSheet.ELIXIR_EARTH; + image = ItemSpriteSheet.ELIXIR_ICY; } @Override public void apply(Hero hero) { - Buff.affect(hero, EarthImbue.class, EarthImbue.DURATION); - hero.sprite.emitter().burst(EarthParticle.FACTORY, 5); + Buff.affect(hero, FrostImbue.class, FrostImbue.DURATION); + hero.sprite.emitter().burst(SnowParticle.FACTORY, 5); } @Override protected int splashColor() { - return 0xFF603913; + return 0xFF18C3E6; } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfParalyticGas.class, PotionOfHaste.class}; + inputs = new Class[]{PotionOfFrost.class, PotionOfPurity.class}; inQuantity = new int[]{1, 1}; - cost = 4; + cost = 6; - output = ElixirOfEarthenPower.class; + output = ElixirOfIcyTouch.class; outQuantity = 1; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java index d02631c1c..50b8d6e8e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfMight.java @@ -59,7 +59,7 @@ public class ElixirOfMight extends Elixir { inputs = new Class[]{PotionOfStrength.class}; inQuantity = new int[]{1}; - cost = 12; + cost = 15; output = ElixirOfMight.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java index c8afd80e4..13adc3e85 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfToxicEssence.java @@ -53,7 +53,7 @@ public class ElixirOfToxicEssence extends Elixir { inputs = new Class[]{PotionOfToxicGas.class, PotionOfPurity.class}; inQuantity = new int[]{1, 1}; - cost = 4; + cost = 6; output = ElixirOfToxicEssence.class; outQuantity = 1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java index 384bfdafd..82a8cb633 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java @@ -64,10 +64,10 @@ public class Alchemize extends Spell implements AlchemyScene.AlchemyProvider { inputs = new Class[]{ScrollOfRecharging.class, PotionOfLiquidFlame.class}; inQuantity = new int[]{1, 1}; - cost = 6; + cost = 10; output = Alchemize.class; - outQuantity = 3; + outQuantity = 5; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java index 9e3fe5caa..20db503c9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/AquaBlast.java @@ -77,7 +77,7 @@ public class AquaBlast extends TargetedSpell { inputs = new Class[]{ScrollOfIdentify.class, PotionOfStormClouds.class}; inQuantity = new int[]{1, 1}; - cost = 4; + cost = 3; output = AquaBlast.class; outQuantity = 8; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/BeaconOfReturning.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/BeaconOfReturning.java index f8bcb3611..05095e6d9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/BeaconOfReturning.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/BeaconOfReturning.java @@ -184,7 +184,7 @@ public class BeaconOfReturning extends Spell { cost = 12; output = BeaconOfReturning.class; - outQuantity = 4; + outQuantity = 3; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/CurseInfusion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/CurseInfusion.java index 5f120c735..09d9a1654 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/CurseInfusion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/CurseInfusion.java @@ -68,7 +68,7 @@ public class CurseInfusion extends InventorySpell { inputs = new Class[]{ScrollOfRemoveCurse.class, MetalShard.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 1; output = CurseInfusion.class; outQuantity = 3; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/FeatherFall.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/FeatherFall.java index 0cff96dfc..170824dfe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/FeatherFall.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/FeatherFall.java @@ -61,7 +61,7 @@ public class FeatherFall extends Spell { inputs = new Class[]{ScrollOfLullaby.class, PotionOfLevitation.class}; inQuantity = new int[]{1, 1}; - cost = 8; + cost = 6; output = FeatherFall.class; outQuantity = 2; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalPorter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalPorter.java index 1af7cda94..cb8dddf53 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalPorter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalPorter.java @@ -25,7 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.MerchantsBeacon; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMirrorImage; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -66,13 +66,13 @@ public class MagicalPorter extends InventorySpell { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfMirrorImage.class, MerchantsBeacon.class}; + inputs = new Class[]{ScrollOfIdentify.class, MerchantsBeacon.class}; inQuantity = new int[]{1, 1}; - cost = 2; + cost = 8; output = MagicalPorter.class; - outQuantity = 10; + outQuantity = 8; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java index bd84b4dbd..b0d5e21d7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/PhaseShift.java @@ -82,10 +82,10 @@ public class PhaseShift extends TargetedSpell { inputs = new Class[]{ScrollOfTeleportation.class, ScrollOfTerror.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 6; output = PhaseShift.class; - outQuantity = 8; + outQuantity = 5; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ReclaimTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ReclaimTrap.java index 64c0528c9..a60931206 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ReclaimTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ReclaimTrap.java @@ -62,7 +62,7 @@ public class ReclaimTrap extends TargetedSpell { inputs = new Class[]{ScrollOfRecharging.class, MetalShard.class}; inQuantity = new int[]{1, 1}; - cost = 5; + cost = 8; output = ReclaimTrap.class; outQuantity = 4; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Recycle.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Recycle.java index 63ebc5a58..427911411 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Recycle.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Recycle.java @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMirrorImage; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfDivination; import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; @@ -72,10 +72,10 @@ public class Recycle extends InventorySpell { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfTransmutation.class, ScrollOfMirrorImage.class}; + inputs = new Class[]{ScrollOfTransmutation.class, ScrollOfDivination.class}; inQuantity = new int[]{1, 1}; - cost = 6; + cost = 8; output = Recycle.class; outQuantity = 5; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorrosion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorrosion.java index 9bf24eaa6..f0f33a9c8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorrosion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/wands/WandOfCorrosion.java @@ -87,7 +87,7 @@ public class WandOfCorrosion extends Wand { // lvl 2 - 60% if (Random.Int( level() + 3 ) >= 2) { - Buff.affect( defender, Ooze.class ); + Buff.affect( defender, Ooze.class ).set( 20f ); CellEmitter.center(defender.pos).burst( CorrosionParticle.SPLASH, 5 ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Chilling.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Chilling.java index e8b0b3a0b..db3d2b059 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Chilling.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Chilling.java @@ -43,6 +43,7 @@ public class Chilling extends Weapon.Enchantment { if (Random.Int( level + 5 ) >= 4) { + //FIXME this should probably stack chilled Buff.prolong( defender, Chill.class, Random.Float( 2f, 3f ) ); Splash.at( defender.sprite.center(), 0xFFB2D6FF, 5); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/OozeTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/OozeTrap.java index 414de4f81..b91f5478d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/OozeTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/OozeTrap.java @@ -39,7 +39,7 @@ public class OozeTrap extends Trap { Char ch = Actor.findChar( pos ); if (ch != null){ - Buff.affect(ch, Ooze.class); + Buff.affect(ch, Ooze.class).set( 20f ); Splash.at( pos, 0x000000, 5); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java index 6936d3b9c..be930a894 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -142,7 +142,7 @@ public class ItemSpriteSheet { public static final int DBL_BOMB = BOMBS+1; public static final int FIRE_BOMB = BOMBS+2; public static final int FROST_BOMB = BOMBS+3; - public static final int HEAL_BOMB = BOMBS+4; + public static final int REGROWTH_BOMB = BOMBS+4; public static final int FLASHBANG = BOMBS+5; public static final int SHOCK_BOMB = BOMBS+6; public static final int HOLY_BOMB = BOMBS+7; @@ -156,7 +156,7 @@ public class ItemSpriteSheet { assignItemRect(DBL_BOMB, 14, 13); assignItemRect(FIRE_BOMB, 10, 13); assignItemRect(FROST_BOMB, 10, 13); - assignItemRect(HEAL_BOMB, 10, 13); + assignItemRect(REGROWTH_BOMB, 10, 13); assignItemRect(FLASHBANG, 10, 13); assignItemRect(SHOCK_BOMB, 10, 13); assignItemRect(HOLY_BOMB, 10, 13); @@ -528,7 +528,7 @@ public class ItemSpriteSheet { private static final int ELIXIRS = xy(1, 25); //16 slots public static final int ELIXIR_DRAGON = ELIXIRS+0; public static final int ELIXIR_TOXIC = ELIXIRS+1; - public static final int ELIXIR_EARTH = ELIXIRS+2; + public static final int ELIXIR_ICY = ELIXIRS+2; public static final int ELIXIR_MIGHT = ELIXIRS+3; public static final int ELIXIR_AQUA = ELIXIRS+4; public static final int ELIXIR_RESTO = ELIXIRS+5; @@ -537,7 +537,7 @@ public class ItemSpriteSheet { static{ assignItemRect(ELIXIR_DRAGON, 10, 14); assignItemRect(ELIXIR_TOXIC, 10, 14); - assignItemRect(ELIXIR_EARTH, 10, 14); + assignItemRect(ELIXIR_ICY, 10, 14); assignItemRect(ELIXIR_MIGHT, 10, 14); assignItemRect(ELIXIR_AQUA, 10, 14); assignItemRect(ELIXIR_RESTO, 10, 14); diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties index e4f635ae0..978d096af 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/actors/actors.properties @@ -141,6 +141,9 @@ actors.buffs.frost.name=Frozen actors.buffs.frost.freezes=%s freezes! actors.buffs.frost.desc=Not to be confused with freezing solid, this more benign freezing simply encases the target in ice.\n\nFreezing acts similarly to paralysis, making it impossible for the target to act. Unlike paralysis, freezing is immediately cancelled if the target takes damage, as the ice will shatter.\n\nTurns of freeze remaining: %s. +actors.buffs.frostimbue.name=Imbued with Frost +actors.buffs.frostimbue.desc=You are imbued with icy power!\n\nAll physical attacks will steadily stack chill on enemies. Additionally, you are completely immune to the cold.\n\nTurns of frost imbue remaining: %s. + actors.buffs.fury.name=Furious actors.buffs.fury.heromsg=You become furious! actors.buffs.fury.desc=You are angry, enemies won't like you when you're angry.\n\nA great rage burns within you, increasing the damage you deal with physical attacks by 50%%.\n\nThis rage will last as long as you are injured below 50%% health. @@ -198,7 +201,7 @@ actors.buffs.ooze.name=Caustic ooze actors.buffs.ooze.heromsg=Caustic ooze eats your flesh. Wash it away! actors.buffs.ooze.ondeath=You melt away... actors.buffs.ooze.rankings_desc=Dissolved -actors.buffs.ooze.desc=This sticky acid clings to flesh, slowly melting it away.\n\nOoze will deal consistent damage until it is washed off in water.\n\nOoze does not expire on its own and must be removed with water. +actors.buffs.ooze.desc=This sticky acid clings to flesh, slowly melting it away.\n\nOoze will deal consistent damage over time, but can be immediately washed off in water.\n\nTurns of ooze remaining: %s. actors.buffs.paralysis.name=Paralysed actors.buffs.paralysis.heromsg=You are paralysed! diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties index a2e2a9e8a..9def69044 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/items/items.properties @@ -377,9 +377,6 @@ items.bombs.flashbang.desc=This customized bomb will erupt into a burst of blind items.bombs.frostbomb.name=frost bomb items.bombs.frostbomb.desc=This bomb has been modified to burst into a sustained gust of freezing air when it explodes. -items.bombs.healingbomb.name=healing bomb -items.bombs.healingbomb.desc=This customized bomb will splash healing liquid all around it instead of exploding. Anything caught in the burst will be healed a considerable amount. - items.bombs.holybomb.name=holy bomb items.bombs.holybomb.desc=This bomb has been modified to flash holy light when it explodes, dealing bonus damage to undead and demonic enemies. @@ -389,6 +386,9 @@ items.bombs.noisemaker.desc=This customized bomb will repeatedly make noise inst items.bombs.shockbomb.name=shock bomb items.bombs.shockbomb.desc=This bomb has been modified to unleash a storm of electricity around it when it explodes. +items.bombs.regrowthbomb.name=regrowth bomb +items.bombs.regrowthbomb.desc=This customized bomb will splash life-giving liquid all around it instead of exploding. The area caught in the blast with rapidly sprout glass and plants, and any allies caught in the blast will be healed. + items.bombs.shrapnelbomb.name=shrapnel bomb items.bombs.shrapnelbomb.desc=This bomb has been modified with scraps of DM-300's metal, which will fragment and fly everywhere when it explodes. You had better hide behind something when using it... @@ -597,12 +597,12 @@ items.potions.elixirs.elixirofaquaticrejuvenation$aquahealing.desc=You have temp items.potions.elixirs.elixirofdragonsblood.name=elixir of dragon's blood items.potions.elixirs.elixirofdragonsblood.desc=When consumed, this elixir will send fiery power coursing through the drinker's veins. This effect will make the drinker immune to fire, and allow them to set enemies aflame with physical attacks. -items.potions.elixirs.elixirofearthenpower.name=elixir of earthen power -items.potions.elixirs.elixirofearthenpower.desc=When consumed, this elixir will allow the drinker to bend the earth around them to their will. Any physical attack the drinker makes will shift the earth under the target, slowing their movement speed. - items.potions.elixirs.elixirofhoneyedhealing.name=elixir of honeyed healing items.potions.elixirs.elixirofhoneyedhealing.desc=This elixir combines healing with the sweetness of honey. When drank, it will satisfy a small amount of hunger, but it can also be thrown to heal an ally.\n\nCreatures with an affinity for honey might be pacified if this item is used on them. +items.potions.elixirs.elixiroficytouch.name=elixir of icy touch +items.potions.elixirs.elixiroficytouch.desc=When consumed, this elixir will allow the drinker to sap the heat from enemies they attack. This effect will make the drinker immune to the cold, and allow them to chill enemies with physical attacks. + items.potions.elixirs.elixirofmight.name=elixir of might items.potions.elixirs.elixirofmight.msg_1=+1 str, +5 hp items.potions.elixirs.elixirofmight.msg_2=Newfound strength surges through your body. diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/journal/journal.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/journal/journal.properties index d05b190e3..8da1e6a65 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/journal/journal.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/journal/journal.properties @@ -42,11 +42,11 @@ journal.document.alchemy_guide.heal_elixirs.body=Healing elixirs are also quite journal.document.alchemy_guide.aoe_brews.title=Area of Effect Brews journal.document.alchemy_guide.aoe_brews.body=Area of effect brews spread a harmful effect over a large area. They are more expensive than combination brews, but also more powerful.\n\n\nAn infernal brew is created by mixing a potion of dragon's breath and a potion of liquid flame.\n\nA blizzard brew is created by mixing a potion of snap freeze and a potion of frost.\n\nA shocking brew is created by mixing a potion of paralytic gas and a potion of storm clouds.\n\nA caustic brew is created by mixing a potion of toxic gas and a blob of goo. journal.document.alchemy_guide.imbue_elixirs.title=Imbuing Elixirs -journal.document.alchemy_guide.imbue_elixirs.body=Imbuing Elixirs will imbue the drinker with a unique power which may be temporary or permanent. They are more expensive than healing elixirs, but also more powerful.\n\n\nAn elixir of dragon's blood is created by mixing a potion of liquid flame and a potion of purity.\n\nAn elixir of toxic essence is created by mixing a potion of toxic gas and a potion of purity.\n\nAn elixir of earthen power is created by mixing a potion of paralytic gas and a potion of haste.\n\nAn elixir of might is created by mixing a potion of strength and a large amount of alchemical energy. +journal.document.alchemy_guide.imbue_elixirs.body=Imbuing Elixirs will imbue the drinker with a unique power which may be temporary or permanent. They are more expensive than healing elixirs, but also more powerful.\n\n\nAn elixir of dragon's blood is created by mixing a potion of liquid flame and a potion of purity.\n\nAn elixir of toxic essence is created by mixing a potion of toxic gas and a potion of purity.\n\nAn elixir of icy touch is created by mixing a potion of frost and a potion of purity.\n\nAn elixir of might is created by mixing a potion of strength and a large amount of alchemical energy. journal.document.alchemy_guide.tele_spells.title=Teleportation Spells -journal.document.alchemy_guide.tele_spells.body=Combining certain ingredients in an alchemy pot will cause magical crystals to precipitate out of the water. The energy in these crystals can be channeled to cast spells! Most spells have multiple uses, but the specific amount varies by spell.\n\nTeleportation spells contain magic that changes the positioning of yourself, enemies, or items in various useful ways.\n\n\nMagical porter is created by mixing a scroll of mirror image with a merchant's beacon.\n\nPhase shift is created by mixing a scroll of teleportation with a scroll of terror.\n\nBeacon of returning is created by mixing a scroll of passage, a scroll of magic mapping, and a lot of alchemical energy. +journal.document.alchemy_guide.tele_spells.body=Combining certain ingredients in an alchemy pot will cause magical crystals to precipitate out of the water. The energy in these crystals can be channeled to cast spells! Most spells have multiple uses, but the specific amount varies by spell.\n\nTeleportation spells contain magic that changes the positioning of yourself, enemies, or items in various useful ways.\n\n\nMagical porter is created by mixing a scroll of identification with a merchant's beacon.\n\nPhase shift is created by mixing a scroll of teleportation with a scroll of terror.\n\nBeacon of returning is created by mixing a scroll of passage, a scroll of magic mapping, and a lot of alchemical energy. journal.document.alchemy_guide.item_spells.title=Item Manipulation Spells -journal.document.alchemy_guide.item_spells.body=Item manipulation spells affect the items in your inventory in a variety of different ways.\n\n\nMagical infusion is created by mixing a scroll of upgrade with a stone of enchantment.\n\nCurse infusion is created by mixing a scroll of remove curse with a cursed metal shard.\n\nAlchemize is created by mixing a scroll of recharging with a potion of liquid flame.\n\nRecycle is created by mixing a scroll of transmutation with a scroll of mirror image. +journal.document.alchemy_guide.item_spells.body=Item manipulation spells affect the items in your inventory in a variety of different ways.\n\n\nMagical infusion is created by mixing a scroll of upgrade with a stone of enchantment.\n\nCurse infusion is created by mixing a scroll of remove curse with a cursed metal shard.\n\nAlchemize is created by mixing a scroll of recharging with a potion of liquid flame.\n\nRecycle is created by mixing a scroll of transmutation with a scroll of divination. journal.document.alchemy_guide.enviro_spells.title=Environmental Spells journal.document.alchemy_guide.enviro_spells.body=Environmental spells give you new ways to change or interact with the terrain of the dungeon.\n\n\nReclaim trap is created by mixing a scroll of recharging with a cursed metal shard.\n\nAqua blast is created by mixing a scroll of identify with a potion of storm clouds.\n\nFeather fall is created by mixing a scroll of lullaby, a potion of levitation, and a good amount of alchemical energy.