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
This commit is contained in:
Evan Debenham 2019-01-18 22:24:52 -05:00
parent 84f6be71db
commit 0bcac361ea
26 changed files with 425 additions and 127 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -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;

View File

@ -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(),

View File

@ -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 <http://www.gnu.org/licenses/>
*/
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<Class<? extends Potion>, 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<Item> 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<Item> 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<Item> ingredients) {
for (Item i : ingredients){
i.quantity(i.quantity()-1);
}
return sampleOutput(null);
}
@Override
public Item sampleOutput(ArrayList<Item> ingredients) {
return new AlchemicalCatalyst();
}
}
}

View File

@ -139,6 +139,8 @@ public class Potion extends Item {
private static final HashSet<Class<?extends Potion>> 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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<?extends Scroll>, Class<?extends Runestone>> stones = new HashMap<>();

View File

@ -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;

View File

@ -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;

View File

@ -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 <http://www.gnu.org/licenses/>
*/
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<Class<? extends Scroll>, 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<Item> 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<Item> 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<Item> ingredients) {
for (Item i : ingredients){
i.quantity(i.quantity()-1);
}
return sampleOutput(null);
}
@Override
public Item sampleOutput(ArrayList<Item> ingredients) {
return new ArcaneCatalyst();
}
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
}
}
}

View File

@ -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;
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);
}
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;
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_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);
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
assignItemRect(BREW_CAUSTIC, 12, 14);
assignItemRect(BREW_INFERNAL, 12, 14);
assignItemRect(BREW_BLIZZARD, 12, 14);
assignItemRect(BREW_SHOCKING, 12, 14);
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{
for (int i = BREWS; i < BREWS+16; i++)
assignItemRect(i, 12, 14);
}
//sprites still pretty WIP
//16 free slots
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;

View File

@ -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;

View File

@ -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

View File

@ -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