From 0bcac361ea888282946c9536f85f52bf2fb72257 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 18 Jan 2019 22:24:52 -0500 Subject: [PATCH] v0.7.2: significant alchemy system changes: - added catalysts, which make advanced alchemy more flexible - changed many advanced alchemy recipes to tie into catalysts - removed several elixirs and brews which offered no new gameplay - adjusted magical infusion due to it now using catalysts - adjusted journal to reflect all these changes --- core/src/main/assets/items.png | Bin 19312 -> 19434 bytes .../actors/hero/HeroClass.java | 1 - .../shatteredpixeldungeon/items/Recipe.java | 15 +- .../items/potions/AlchemicalCatalyst.java | 139 ++++++++++++++++++ .../items/potions/Potion.java | 21 ++- .../items/potions/brews/BlizzardBrew.java | 6 +- .../items/potions/brews/InfernalBrew.java | 6 +- .../items/potions/brews/ShockingBrew.java | 6 +- .../potions/elixirs/ElixirOfDragonsBlood.java | 8 +- .../potions/elixirs/ElixirOfIcyTouch.java | 8 +- .../potions/elixirs/ElixirOfToxicEssence.java | 4 +- .../items/scrolls/Scroll.java | 25 +++- .../items/spells/Alchemize.java | 7 +- .../items/spells/AquaBlast.java | 5 +- .../items/spells/ArcaneCatalyst.java | 137 +++++++++++++++++ .../items/spells/BeaconOfReturning.java | 3 +- .../items/spells/FeatherFall.java | 5 +- .../items/spells/MagicalInfusion.java | 20 +-- .../items/spells/MagicalPorter.java | 5 +- .../items/spells/PhaseShift.java | 3 +- .../items/spells/Recycle.java | 5 +- .../journal/Document.java | 9 +- .../sprites/ItemSpriteSheet.java | 66 ++++----- .../shatteredpixeldungeon/ui/QuickRecipe.java | 28 ++-- .../messages/items/items.properties | 10 +- .../messages/journal/journal.properties | 10 +- 26 files changed, 425 insertions(+), 127 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/AlchemicalCatalyst.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ArcaneCatalyst.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index 552bf308aa286a081986ac9706c296c85eb18385..18d7be011807c4808100a15778ab4854ffbc07b5 100644 GIT binary patch literal 19434 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 literal 19312 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 diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java index b288d0407..a5b6c00bc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/HeroClass.java @@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.hero; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; -import com.shatteredpixel.shatteredpixeldungeon.BuildConfig; import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; 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 02db3b005..6ab2f71d1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Recipe.java @@ -27,11 +27,9 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bombs.Bomb; import com.shatteredpixel.shatteredpixeldungeon.items.food.Blandfruit; import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.FrigidBrew; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.FrostfireBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.ShockingBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.WickedBrew; @@ -40,14 +38,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfDr 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; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfVitality; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize; import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning; import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall; @@ -106,6 +103,7 @@ public abstract class Recipe { int[] needed = inQuantity.clone(); + //TODO is this right? for (Item ingredient : ingredients){ for (int i = 0; i < inputs.length; i++){ if (ingredient.getClass() == inputs[i]){ @@ -180,18 +178,15 @@ public abstract class Recipe { new Blandfruit.CookFruit(), new TippedDart.TipDart(), new Bomb.EnhanceBomb(), + new AlchemicalCatalyst.Recipe(), + new ArcaneCatalyst.Recipe(), new ElixirOfAquaticRejuvenation.Recipe(), new ElixirOfDragonsBlood.Recipe(), new ElixirOfIcyTouch.Recipe(), new ElixirOfMight.Recipe(), new ElixirOfHoneyedHealing.Recipe(), - new ElixirOfRestoration.Recipe(), new ElixirOfToxicEssence.Recipe(), - new ElixirOfVitality.Recipe(), new BlizzardBrew.Recipe(), - new CausticBrew.Recipe(), - new FrigidBrew.Recipe(), - new FrostfireBrew.Recipe(), new InfernalBrew.Recipe(), new ShockingBrew.Recipe(), new WickedBrew.Recipe(), diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/AlchemicalCatalyst.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/AlchemicalCatalyst.java new file mode 100644 index 000000000..7bbeb393e --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/AlchemicalCatalyst.java @@ -0,0 +1,139 @@ +/* + * 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 + */ + +package com.shatteredpixel.shatteredpixeldungeon.items.potions; + +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; +import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +import java.util.ArrayList; +import java.util.HashMap; + +public class AlchemicalCatalyst extends Potion { + + { + image = ItemSpriteSheet.POTION_CATALYST; + + } + + private static HashMap, Float> potionChances = new HashMap<>(); + static{ + potionChances.put(PotionOfHealing.class, 3f); + potionChances.put(PotionOfMindVision.class, 2f); + potionChances.put(PotionOfFrost.class, 2f); + potionChances.put(PotionOfLiquidFlame.class, 2f); + potionChances.put(PotionOfToxicGas.class, 2f); + potionChances.put(PotionOfHaste.class, 2f); + potionChances.put(PotionOfInvisibility.class, 2f); + potionChances.put(PotionOfLevitation.class, 2f); + potionChances.put(PotionOfParalyticGas.class, 2f); + potionChances.put(PotionOfPurity.class, 2f); + potionChances.put(PotionOfExperience.class, 1f); + } + + @Override + public void apply(Hero hero) { + try { + Potion p = Random.chances(potionChances).newInstance(); + p.anonymize(); + p.apply(hero); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + } + } + + @Override + public void shatter(int cell) { + try { + Potion p = Random.chances(potionChances).newInstance(); + p.anonymize(); + curItem = p; + p.shatter(cell); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + } + } + + @Override + public boolean isKnown() { + return true; + } + + @Override + public int price() { + return 40 * quantity; + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe { + + @Override + public boolean testIngredients(ArrayList ingredients) { + boolean potion = false; + boolean secondary = false; + + for (Item i : ingredients){ + if (i instanceof Plant.Seed || i instanceof Runestone){ + secondary = true; + //if it is a regular or exotic potion + } else if (ExoticPotion.regToExo.containsKey(i.getClass()) + || ExoticPotion.regToExo.containsValue(i.getClass())) { + potion = true; + } + } + + return potion && secondary; + } + + @Override + public int cost(ArrayList ingredients) { + for (Item i : ingredients){ + if (i instanceof Plant.Seed){ + return 1; + } else if (i instanceof Runestone){ + return 2; + } + } + return 1; + } + + @Override + public Item brew(ArrayList ingredients) { + + for (Item i : ingredients){ + i.quantity(i.quantity()-1); + } + + return sampleOutput(null); + } + + @Override + public Item sampleOutput(ArrayList ingredients) { + return new AlchemicalCatalyst(); + } + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java index edbb5b645..69630ee82 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/Potion.java @@ -139,6 +139,8 @@ public class Potion extends Item { private static final HashSet> canThrowPots = new HashSet<>(); static{ + canThrowPots.add(AlchemicalCatalyst.class); + canThrowPots.add(PotionOfPurity.class); canThrowPots.add(PotionOfLevitation.class); @@ -408,7 +410,7 @@ public class Potion extends Item { } protected int splashColor(){ - return ItemSprite.pick( image, 5, 9 ); + return anonymous ? 0x00AAFF : ItemSprite.pick( image, 5, 9 ); } protected void splash( int cell ) { @@ -434,6 +436,23 @@ public class Potion extends Item { return 30 * quantity; } + public static class PlaceHolder extends Potion { + + { + image = ItemSpriteSheet.POTION_HOLDER; + } + + @Override + public boolean isSimilar(Item item) { + return ExoticPotion.regToExo.containsKey(item.getClass()) + || ExoticPotion.regToExo.containsValue(item.getClass()); + } + + @Override + public String info() { + return ""; + } + } public static class SeedToPotion extends Recipe { 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 7f7d509f9..e763610e9 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 @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blizzard; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -50,13 +50,13 @@ public class BlizzardBrew extends Brew { @Override public int price() { //prices of ingredients - return quantity * (50 + 30); + return quantity * (30 + 40); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfSnapFreeze.class, PotionOfFrost.class}; + inputs = new Class[]{PotionOfFrost.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; 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 e658e4d90..a7448ca7a 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 @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Inferno; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDragonsBreath; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -53,13 +53,13 @@ public class InfernalBrew extends Brew { @Override public int price() { //prices of ingredients - return quantity * (50 + 30); + return quantity * (30 + 40); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfDragonsBreath.class, PotionOfLiquidFlame.class}; + inputs = new Class[]{PotionOfLiquidFlame.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; 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 0bd04179f..09b46cd23 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 @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Electricity; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfParalyticGas; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfStormClouds; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; @@ -57,13 +57,13 @@ public class ShockingBrew extends Brew { @Override public int price() { //prices of ingredients - return quantity * (40 + 60); + return quantity * (40 + 40); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfParalyticGas.class, PotionOfStormClouds.class}; + inputs = new Class[]{PotionOfParalyticGas.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 8; 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 1056532ed..e341e1630 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 @@ -26,8 +26,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.FlameParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfDragonsBreath; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; @@ -53,13 +53,13 @@ public class ElixirOfDragonsBlood extends Elixir { @Override public int price() { //prices of ingredients - return quantity * (30 + 40); + return quantity * (50 + 40); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfLiquidFlame.class, PotionOfPurity.class}; + inputs = new Class[]{PotionOfDragonsBreath.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java index 4783bc49c..8fd7aa7b5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/potions/elixirs/ElixirOfIcyTouch.java @@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; 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.items.potions.AlchemicalCatalyst; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfSnapFreeze; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; public class ElixirOfIcyTouch extends Elixir { @@ -50,13 +50,13 @@ public class ElixirOfIcyTouch extends Elixir { @Override public int price() { //prices of ingredients - return quantity * (30 + 40); + return quantity * (50 + 40); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfFrost.class, PotionOfPurity.class}; + inputs = new Class[]{PotionOfSnapFreeze.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; 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 d41a54a96..159bf4f12 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 @@ -25,7 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ToxicImbue; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PoisonParticle; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -56,7 +56,7 @@ public class ElixirOfToxicEssence extends Elixir { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{PotionOfToxicGas.class, PotionOfPurity.class}; + inputs = new Class[]{PotionOfToxicGas.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java index a91b3967c..bd1c8ce06 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/Scroll.java @@ -192,8 +192,8 @@ public abstract class Scroll extends Item { public abstract void doRead(); - //currently only used in scrolls owned by the unstable spellbook - public abstract void empoweredRead(); + //currently unused. Used to be used for unstable spellbook prior to 0.7.0 + public void empoweredRead(){}; protected void readAnimation() { curUser.spend( TIME_TO_READ ); @@ -267,6 +267,27 @@ public abstract class Scroll extends Item { return 30 * quantity; } + public static class PlaceHolder extends Scroll { + + { + image = ItemSpriteSheet.SCROLL_HOLDER; + } + + @Override + public boolean isSimilar(Item item) { + return ExoticScroll.regToExo.containsKey(item.getClass()) + || ExoticScroll.regToExo.containsValue(item.getClass()); + } + + @Override + public void doRead() {} + + @Override + public String info() { + return ""; + } + } + public static class ScrollToStone extends Recipe { private static HashMap, Class> stones = new HashMap<>(); 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 fa75c28d5..8140bcf73 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 @@ -23,8 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.spells; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.scenes.AlchemyScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -61,13 +60,13 @@ public class Alchemize extends Spell implements AlchemyScene.AlchemyProvider { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((30 + 30) / 4f)); + return Math.round(quantity * ((40 + 40) / 4f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfRecharging.class, PotionOfLiquidFlame.class}; + inputs = new Class[]{ArcaneCatalyst.class, AlchemicalCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; 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 b252bf208..6f7bc7d78 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 @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.Splash; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfStormClouds; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; @@ -74,13 +73,13 @@ public class AquaBlast extends TargetedSpell { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((30 + 60) / 12f)); + return Math.round(quantity * ((60 + 40) / 12f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfIdentify.class, PotionOfStormClouds.class}; + inputs = new Class[]{PotionOfStormClouds.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 4; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ArcaneCatalyst.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ArcaneCatalyst.java new file mode 100644 index 000000000..61f043953 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/ArcaneCatalyst.java @@ -0,0 +1,137 @@ +/* + * 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 + */ + +package com.shatteredpixel.shatteredpixeldungeon.items.spells; + +import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMirrorImage; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; +import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; +import com.shatteredpixel.shatteredpixeldungeon.items.stones.Runestone; +import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; +import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +import java.util.ArrayList; +import java.util.HashMap; + +public class ArcaneCatalyst extends Spell { + + { + image = ItemSpriteSheet.SCROLL_CATALYST; + } + + private static HashMap, Float> scrollChances = new HashMap<>(); + static{ + scrollChances.put( ScrollOfIdentify.class, 3f ); + scrollChances.put( ScrollOfRemoveCurse.class, 2f ); + scrollChances.put( ScrollOfMagicMapping.class, 2f ); + scrollChances.put( ScrollOfMirrorImage.class, 2f ); + scrollChances.put( ScrollOfRecharging.class, 2f ); + scrollChances.put( ScrollOfLullaby.class, 2f ); + scrollChances.put( ScrollOfRetribution.class, 2f ); + scrollChances.put( ScrollOfRage.class, 2f ); + scrollChances.put( ScrollOfTeleportation.class, 2f ); + scrollChances.put( ScrollOfTerror.class, 2f ); + scrollChances.put( ScrollOfTransmutation.class, 1f ); + } + + @Override + protected void onCast(Hero hero) { + + detach( curUser.belongings.backpack ); + updateQuickslot(); + + try { + Scroll s = Random.chances(scrollChances).newInstance(); + s.anonymize(); + curItem = s; + s.doRead(); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + } + } + + @Override + public int price() { + return 40 * quantity; + } + + public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe { + + @Override + public boolean testIngredients(ArrayList ingredients) { + boolean scroll = false; + boolean secondary = false; + + for (Item i : ingredients){ + if (i instanceof Plant.Seed || i instanceof Runestone){ + secondary = true; + //if it is a regular or exotic potion + } else if (ExoticScroll.regToExo.containsKey(i.getClass()) + || ExoticScroll.regToExo.containsValue(i.getClass())) { + scroll = true; + } + } + + return scroll && secondary; + } + + @Override + public int cost(ArrayList ingredients) { + for (Item i : ingredients){ + if (i instanceof Plant.Seed){ + return 2; + } else if (i instanceof Runestone){ + return 1; + } + } + return 1; + } + + @Override + public Item brew(ArrayList ingredients) { + + for (Item i : ingredients){ + i.quantity(i.quantity()-1); + } + + return sampleOutput(null); + } + + @Override + public Item sampleOutput(ArrayList ingredients) { + return new ArcaneCatalyst(); + } + } +} 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 cfb87ef07..7e39b57e2 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 @@ -29,7 +29,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPassage; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -183,7 +182,7 @@ public class BeaconOfReturning extends Spell { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfPassage.class, ScrollOfMagicMapping.class}; + inputs = new Class[]{ScrollOfPassage.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 10; 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 8a5ac98cc..9562a06ab 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 @@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -60,13 +59,13 @@ public class FeatherFall extends Spell { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((40 + 30) / 2f)); + return Math.round(quantity * ((30 + 40) / 2f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfLullaby.class, PotionOfLevitation.class}; + inputs = new Class[]{PotionOfLevitation.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java index 034dc48c6..139c2d3cb 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/MagicalInfusion.java @@ -27,8 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade; -import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment; -import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -38,21 +36,19 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; public class MagicalInfusion extends InventorySpell { { - mode = WndBag.Mode.ENCHANTABLE; + mode = WndBag.Mode.UPGRADEABLE; image = ItemSpriteSheet.MAGIC_INFUSE; } @Override protected void onItemSelected( Item item ) { - if (item instanceof SpiritBow){ - if (((SpiritBow) item).enchantment == null){ - ((Weapon)item).enchant(); - } - } else if (item instanceof Weapon) { + if (item instanceof Weapon && ((Weapon) item).enchantment != null) { ((Weapon) item).upgrade(true); - } else { + } else if (item instanceof Armor && ((Armor) item).glyph != null) { ((Armor) item).upgrade(true); + } else { + item.upgrade(); } GLog.p( Messages.get(this, "infuse", item.name()) ); @@ -66,16 +62,16 @@ public class MagicalInfusion extends InventorySpell { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((50 + 30) / 1f)); + return Math.round(quantity * ((50 + 40) / 1f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfUpgrade.class, StoneOfEnchantment.class}; + inputs = new Class[]{ScrollOfUpgrade.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; - cost = 3; + cost = 5; output = MagicalInfusion.class; outQuantity = 1; 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 c1e058c71..767cbe76a 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,6 @@ 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.ScrollOfIdentify; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; @@ -65,13 +64,13 @@ public class MagicalPorter extends InventorySpell { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((30 + 5) / 8f)); + return Math.round(quantity * ((5 + 40) / 8f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfIdentify.class, MerchantsBeacon.class}; + inputs = new Class[]{MerchantsBeacon.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 4; 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 63214a402..ef056b307 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 @@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; -import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTerror; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; @@ -85,7 +84,7 @@ public class PhaseShift extends TargetedSpell { public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfTeleportation.class, ScrollOfTerror.class}; + inputs = new Class[]{ScrollOfTeleportation.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; 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 e1a6aa3a1..796c54f26 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 @@ -32,7 +32,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotio import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTransmutation; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; -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; @@ -94,13 +93,13 @@ public class Recycle extends InventorySpell { @Override public int price() { //prices of ingredients, divided by output quantity - return Math.round(quantity * ((50 + 50) / 8f)); + return Math.round(quantity * ((50 + 40) / 8f)); } public static class Recipe extends com.shatteredpixel.shatteredpixeldungeon.items.Recipe.SimpleRecipe { { - inputs = new Class[]{ScrollOfTransmutation.class, ScrollOfDivination.class}; + inputs = new Class[]{ScrollOfTransmutation.class, ArcaneCatalyst.class}; inQuantity = new int[]{1, 1}; cost = 6; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java index 14397a6d2..d8957f4fe 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java @@ -119,8 +119,8 @@ public enum Document { ALCHEMY_GUIDE.pages.put("Exotic_Scrolls", false); ALCHEMY_GUIDE.pages.put("Energy_Food", false); ALCHEMY_GUIDE.pages.put("Bombs", false); - ALCHEMY_GUIDE.pages.put("Brews", false); - ALCHEMY_GUIDE.pages.put("Elixirs", false); + ALCHEMY_GUIDE.pages.put("Catalysts", false); + ALCHEMY_GUIDE.pages.put("Brews_Elixirs", false); ALCHEMY_GUIDE.pages.put("Spells", false); } @@ -161,6 +161,11 @@ public enum Document { if (doc.pages.containsKey(page)) { doc.pages.put(page, true); } + //pre-0.7.2 saves + else if (page.equals("Brews")){ + doc.pages.put("Catalysts", true); + doc.pages.put("Brews_Elixirs", true); + } } } } 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 498f11c38..6d3acd61b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java @@ -50,7 +50,7 @@ public class ItemSpriteSheet { public static final int SCROLL_HOLDER = PLACEHOLDERS+11; public static final int SEED_HOLDER = PLACEHOLDERS+10; public static final int STONE_HOLDER = PLACEHOLDERS+12; - public static final int BREW_HOLDER = PLACEHOLDERS+13; + public static final int CATA_HOLDER = PLACEHOLDERS+13; public static final int ELIXIR_HOLDER = PLACEHOLDERS+14; public static final int SPELL_HOLDER = PLACEHOLDERS+15; static{ @@ -67,7 +67,7 @@ public class ItemSpriteSheet { assignItemRect(SEED_HOLDER, 10, 10); assignItemRect(SCROLL_HOLDER, 15, 14); assignItemRect(STONE_HOLDER, 14, 12); - assignItemRect(BREW_HOLDER, 12, 14); + assignItemRect(CATA_HOLDER, 6, 15); assignItemRect(ELIXIR_HOLDER, 12, 14); assignItemRect(SPELL_HOLDER, 8, 16); } @@ -443,9 +443,12 @@ public class ItemSpriteSheet { public static final int SCROLL_BERKANAN = SCROLLS+9; public static final int SCROLL_ODAL = SCROLLS+10; public static final int SCROLL_TIWAZ = SCROLLS+11; + + public static final int SCROLL_CATALYST = SCROLLS+13; static { for (int i = SCROLLS; i < SCROLLS+16; i++) assignItemRect(i, 15, 14); + assignItemRect(SCROLL_CATALYST, 9, 9); } private static final int EXOTIC_SCROLLS = xy(1, 20); //16 slots @@ -497,9 +500,11 @@ public class ItemSpriteSheet { public static final int POTION_CHARCOAL = POTIONS+9; public static final int POTION_SILVER = POTIONS+10; public static final int POTION_IVORY = POTIONS+11; + public static final int POTION_CATALYST = POTIONS+13; static { for (int i = POTIONS; i < POTIONS+16; i++) assignItemRect(i, 12, 14); + assignItemRect(POTION_CATALYST, 6, 15); } private static final int EXOTIC_POTIONS = xy(1, 23); //16 slots @@ -538,46 +543,31 @@ public class ItemSpriteSheet { assignItemRect(i, 10, 10); } - 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_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; - public static final int ELIXIR_SURGE = ELIXIRS+6; - public static final int ELIXIR_HONEY = ELIXIRS+7; + private static final int BREWS = xy(1, 25); //8 slots + public static final int BREW_INFERNAL = BREWS+0; + public static final int BREW_BLIZZARD = BREWS+1; + public static final int BREW_SHOCKING = BREWS+3; + public static final int BREW_CAUSTIC = BREWS+4; + public static final int BREW_WICKED = BREWS+5; //discontinued + public static final int BREW_FRIGID = BREWS+6; //discontinued + public static final int BREW_FROSTFIRE = BREWS+7; //discontinued + + private static final int ELIXIRS = xy(9, 25); //8 slots + public static final int ELIXIR_HONEY = ELIXIRS+0; + public static final int ELIXIR_AQUA = ELIXIRS+1; + public static final int ELIXIR_MIGHT = ELIXIRS+2; + public static final int ELIXIR_DRAGON = ELIXIRS+3; + public static final int ELIXIR_ICY = ELIXIRS+4; + public static final int ELIXIR_TOXIC = ELIXIRS+5; + public static final int ELIXIR_RESTO = ELIXIRS+6; //discontinued + public static final int ELIXIR_SURGE = ELIXIRS+7; //discontinued static{ - assignItemRect(ELIXIR_DRAGON, 12, 14); - assignItemRect(ELIXIR_TOXIC, 12, 14); - assignItemRect(ELIXIR_ICY, 12, 14); - assignItemRect(ELIXIR_MIGHT, 12, 14); - assignItemRect(ELIXIR_AQUA, 12, 14); - assignItemRect(ELIXIR_RESTO, 12, 14); - assignItemRect(ELIXIR_SURGE, 12, 14); - assignItemRect(ELIXIR_HONEY, 12, 14); + for (int i = BREWS; i < BREWS+16; i++) + assignItemRect(i, 12, 14); } - private static final int BREWS = xy(1, 26); //16 slots - public static final int BREW_WICKED = BREWS+0; - public static final int BREW_FRIGID = BREWS+1; - public static final int BREW_FROSTFIRE= BREWS+2; + //16 free slots - public static final int BREW_CAUSTIC = BREWS+4; - public static final int BREW_INFERNAL = BREWS+5; - public static final int BREW_BLIZZARD = BREWS+6; - public static final int BREW_SHOCKING = BREWS+7; - static{ - assignItemRect(BREW_WICKED, 12, 14); - assignItemRect(BREW_FRIGID, 12, 14); - assignItemRect(BREW_FROSTFIRE, 12, 14); - - assignItemRect(BREW_CAUSTIC, 12, 14); - assignItemRect(BREW_INFERNAL, 12, 14); - assignItemRect(BREW_BLIZZARD, 12, 14); - assignItemRect(BREW_SHOCKING, 12, 14); - } - //sprites still pretty WIP private static final int SPELLS = xy(1, 27); //16 slots public static final int PHASE_SHIFT = SPELLS+0; public static final int AQUA_BLAST = SPELLS+1; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java index 1131e95ae..e68a6dc68 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/QuickRecipe.java @@ -33,27 +33,24 @@ import com.shatteredpixel.shatteredpixeldungeon.items.food.MeatPie; import com.shatteredpixel.shatteredpixeldungeon.items.food.MysteryMeat; import com.shatteredpixel.shatteredpixeldungeon.items.food.Pasty; import com.shatteredpixel.shatteredpixeldungeon.items.food.StewedMeat; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.AlchemicalCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.BlizzardBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.CausticBrew; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.FrigidBrew; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.FrostfireBrew; import com.shatteredpixel.shatteredpixeldungeon.items.potions.brews.InfernalBrew; 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.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; -import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.ElixirOfVitality; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.ExoticPotion; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ExoticScroll; import com.shatteredpixel.shatteredpixeldungeon.items.spells.Alchemize; import com.shatteredpixel.shatteredpixeldungeon.items.spells.AquaBlast; +import com.shatteredpixel.shatteredpixeldungeon.items.spells.ArcaneCatalyst; import com.shatteredpixel.shatteredpixeldungeon.items.spells.BeaconOfReturning; import com.shatteredpixel.shatteredpixeldungeon.items.spells.CurseInfusion; import com.shatteredpixel.shatteredpixeldungeon.items.spells.FeatherFall; @@ -344,27 +341,26 @@ public class QuickRecipe extends Component { } return result; case 7: - result.add(new QuickRecipe(new WickedBrew.Recipe())); - result.add(new QuickRecipe(new FrigidBrew.Recipe())); - result.add(new QuickRecipe(new FrostfireBrew.Recipe())); + result.add(new QuickRecipe(new AlchemicalCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Potion.PlaceHolder(), new Plant.Seed.PlaceHolder())), new AlchemicalCatalyst())); + result.add(new QuickRecipe(new AlchemicalCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Potion.PlaceHolder(), new Runestone.PlaceHolder())), new AlchemicalCatalyst())); result.add(null); result.add(null); + result.add(new QuickRecipe(new ArcaneCatalyst.Recipe(), new ArrayList<>(Arrays.asList(new Scroll.PlaceHolder(), new Runestone.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; + case 8: 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())); - return result; - case 8: - result.add(new QuickRecipe(new ElixirOfRestoration.Recipe())); - result.add(new QuickRecipe(new ElixirOfVitality.Recipe())); + result.add(null); + result.add(null); result.add(new QuickRecipe(new ElixirOfHoneyedHealing.Recipe())); result.add(new QuickRecipe(new ElixirOfAquaticRejuvenation.Recipe())); - result.add(null); - result.add(null); + result.add(new QuickRecipe(new ElixirOfMight.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 ElixirOfMight.Recipe())); return result; case 9: result.add(new QuickRecipe(new MagicalPorter.Recipe())); @@ -377,8 +373,8 @@ public class QuickRecipe extends Component { result.add(new QuickRecipe(new ReclaimTrap.Recipe())); result.add(null); result.add(null); - result.add(new QuickRecipe(new MagicalInfusion.Recipe())); result.add(new QuickRecipe(new CurseInfusion.Recipe())); + result.add(new QuickRecipe(new MagicalInfusion.Recipe())); result.add(new QuickRecipe(new Alchemize.Recipe())); result.add(new QuickRecipe(new Recycle.Recipe())); return result; 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 50047dbad..ed41cba04 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 @@ -515,8 +515,12 @@ items.potions.potion.no=No, I changed my mind items.potions.potion.sure_drink=Are you sure you want to drink it? In most cases you should throw such potions at your enemies. items.potions.potion.sure_throw=Are you sure you want to throw it? In most cases it makes sense to drink it. items.potions.potion.shatter=The flask shatters and the liquid splashes harmlessly. +items.potions.potion$placeholder.name=potion items.potions.potion$seedtopotion.name=Random Potion +items.potions.alchemicalcatalyst.name=alchemical catalyst +items.potions.alchemicalcatalyst.desc=This thin vial of magical liquid is made from the deconstructed essence of a potion. The liquid is translucent, and glows with shifting colors of the rainbow.\n\nThis catalyst is primarily useful as an alchemy ingredient, but you can also use it directly to get the effect of a random potion. + items.potions.potionofexperience.name=potion of experience items.potions.potionofexperience.desc=The storied experiences of multitudes of battles reduced to liquid form, this draught will instantly raise your experience level. @@ -803,6 +807,7 @@ items.scrolls.scroll.unknown_desc=An indecipherable magical rune is written on t items.scrolls.scroll.blinded=You can't read a scroll while blinded. items.scrolls.scroll.no_magic=You can't read a scroll while magic immune. items.scrolls.scroll.cursed=Your cursed spellbook prevents you from invoking this scroll's magic! A scroll of remove curse might be strong enough to still work though... +items.scrolls.scroll$placeholder.name=scroll items.scrolls.inventoryscroll.warning=Do you really want to cancel this scroll usage? It will be consumed anyway. items.scrolls.inventoryscroll.yes=Yes, I'm positive @@ -937,6 +942,9 @@ items.spells.alchemize.desc=This spell channels alchemical energy, allowing you items.spells.aquablast.name=aqua blast items.spells.aquablast.desc=This spell will create a burst of water at the target location. It isn't forceful enough to do damage (even to fiery enemies), but it will spread water to nearby terrain and very briefly stun anything caught in the center of the burst. +items.spells.arcanecatalyst.name=arcane catalyst +items.spells.arcanecatalyst.desc=This tiny dark crystal is made from the deconstructed magic of a scroll. It is quite heavy, despite its size.\n\nThis catalyst is primarily useful as an alchemy ingredient, but you can also channel the magic directly to get the effect of a random scroll. + items.spells.beaconofreturning.name=beacon of returning items.spells.beaconofreturning.preventing=The strong magic aura of this place prevents you from using the spell! items.spells.beaconofreturning.creatures=The Psychic aura of neighbouring creatures doesn't allow you to teleport at this moment. @@ -961,7 +969,7 @@ items.spells.spell.no_magic=You can't cast spells while magic immune. items.spells.magicalinfusion.name=magical infusion items.spells.magicalinfusion.inv_title=Infuse an item items.spells.magicalinfusion.infuse=Your %s is infused with arcane energy! -items.spells.magicalinfusion.desc=This spell will infuse a weapon or armor with powerful magical energy.\n\nIn addition to being upgraded, a weapon will gain a magical enchantment, or armor will be imbued with a magical glyph.\n\nIf the item already has an enchantment or glyph, it will not be erased by the upgrade. +items.spells.magicalinfusion.desc=This spell posses the same magical power as a scroll of upgrade, but in a more stable form.\n\nIn addition to upgrading an item, it will also never erase an enchantment on a weapon or glyph on armor. items.spells.magicalporter.name=magical porter items.spells.magicalporter.inv_title=Port an item 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 5850b4911..3293572b2 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 @@ -35,12 +35,12 @@ journal.document.alchemy_guide.energy_food.title=Energy and Food journal.document.alchemy_guide.energy_food.body=Some recipes require energy from the alchemy pot itself. Energy is used in recipes that produce more than the sum of their ingredients.\n\nNot all energy recipes are especially mystical however. These recipes more resemble traditional cooking than alchemy. journal.document.alchemy_guide.bombs.title=Enhanced Bombs journal.document.alchemy_guide.bombs.body=A standard black powder bomb can be mixed with a specific item to create an enhanced bomb. -journal.document.alchemy_guide.brews.title=Brews -journal.document.alchemy_guide.brews.body=Brews are made from potion-based recipes, and focus on harming your enemies. -journal.document.alchemy_guide.elixirs.title=Elixirs -journal.document.alchemy_guide.elixirs.body=Elixirs are made from potion-based recipes, and focus on healing or boosting your abilities. +journal.document.alchemy_guide.catalysts.title=Catalysts +journal.document.alchemy_guide.catalysts.body=Catalysts are made by combining a scroll or potion with a single seed or runestone. If the pair of items match, the alchemical energy cost is reduced.\n\nCatalysts are most useful as components in recipes covered in the next two pages, but also can be used in a pinch for a random effect. +journal.document.alchemy_guide.brews_elixirs.title=Brews and Elixirs +journal.document.alchemy_guide.brews_elixirs.body=Brews and elixirs are advanced potions which provide a variety of effects with a single use. journal.document.alchemy_guide.spells.title=Spells -journal.document.alchemy_guide.spells.body=Spells are made from scroll-based recipes, and provide a variety of effects with multiple uses. +journal.document.alchemy_guide.spells.body=Spells are contained in crystals and provide a variety of effects with multiple uses. journal.notes$landmark.well_of_health=well of health journal.notes$landmark.well_of_awareness=well of awareness