diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png
index 552bf308a..18d7be011 100644
Binary files a/core/src/main/assets/items.png and b/core/src/main/assets/items.png differ
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