diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png
index c5f5313c6..35ac6d847 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/items/journal/AlchemyPage.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/AlchemyPage.java
new file mode 100644
index 000000000..5182a8988
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/AlchemyPage.java
@@ -0,0 +1,43 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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.journal;
+
+import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
+
+public class AlchemyPage extends DocumentPage {
+
+ {
+ image = ItemSpriteSheet.ALCH_PAGE;
+ }
+
+ @Override
+ public Document document() {
+ return Document.ALCHEMY_GUIDE;
+ }
+
+ @Override
+ public String desc() {
+ return Messages.get(this, "desc", document().pageTitle(page()));
+ }
+}
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 53eba9eaf..a38096519 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
@@ -263,8 +263,8 @@ public abstract class Scroll extends Item {
stones.put(ScrollOfMirrorImage.class, StoneOfFlock.class);
amnts.put(ScrollOfMirrorImage.class, 3);
- stones.put(ScrollOfRetribution.class, StoneOfBlast.class);
- amnts.put(ScrollOfRetribution.class, 2);
+ stones.put(ScrollOfRetribution.class, StoneOfBlast.class);
+ amnts.put(ScrollOfRetribution.class, 2);
stones.put(ScrollOfRage.class, StoneOfAggression.class);
amnts.put(ScrollOfRage.class, 3);
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 2583d7370..1f799508a 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/journal/Document.java
@@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.journal;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.watabou.utils.Bundle;
import java.util.ArrayList;
@@ -31,8 +32,13 @@ import java.util.LinkedHashMap;
import java.util.List;
public enum Document {
-
- ADVENTURERS_GUIDE;
+
+ ADVENTURERS_GUIDE(ItemSpriteSheet.GUIDE_PAGE),
+ ALCHEMY_GUIDE(ItemSpriteSheet.ALCH_PAGE);
+
+ Document( int sprite ){
+ pageSprite = sprite;
+ }
private LinkedHashMap pages = new LinkedHashMap<>();
@@ -53,6 +59,20 @@ public enum Document {
return pages.containsKey(page) && pages.get(page);
}
+ public boolean hasAnyPages(){
+ for (String p : pages.keySet()){
+ if (pages.get(p)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private int pageSprite;
+ public int pageSprite(){
+ return pageSprite;
+ }
+
public String title(){
return Messages.get( this, name() + ".title");
}
@@ -79,6 +99,15 @@ public enum Document {
ADVENTURERS_GUIDE.pages.put("Dieing", false);
ADVENTURERS_GUIDE.pages.put("Looting", false);
ADVENTURERS_GUIDE.pages.put("Magic", false);
+
+ ALCHEMY_GUIDE.pages.put("Potions", false);
+ ALCHEMY_GUIDE.pages.put("Stones", false);
+ ALCHEMY_GUIDE.pages.put("Darts", false);
+ ALCHEMY_GUIDE.pages.put("Exotics", false);
+ ALCHEMY_GUIDE.pages.put("Bombs", false);
+ ALCHEMY_GUIDE.pages.put("teaser1", false);
+ ALCHEMY_GUIDE.pages.put("teaser2", false);
+ ALCHEMY_GUIDE.pages.put("teaser3", false);
}
private static final String DOCUMENTS = "documents";
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java
index 6b51536b8..038bbfd2c 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/LaboratoryRoom.java
@@ -25,8 +25,10 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Alchemy;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
+import com.shatteredpixel.shatteredpixeldungeon.items.journal.AlchemyPage;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
+import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
@@ -34,6 +36,9 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.watabou.utils.Point;
import com.watabou.utils.Random;
+import java.util.ArrayList;
+import java.util.Collection;
+
public class LaboratoryRoom extends SpecialRoom {
public void paint( Level level ) {
@@ -71,6 +76,30 @@ public class LaboratoryRoom extends SpecialRoom {
level.drop( prize( level ), pos );
}
+ //guide pages
+ Collection allPages = Document.ALCHEMY_GUIDE.pages();
+ ArrayList missingPages = new ArrayList<>();
+ for ( String page : allPages){
+ if (!Document.ALCHEMY_GUIDE.hasPage(page)){
+ missingPages.add(page);
+ }
+ }
+
+ //drops a page every room for now
+ //TODO make pages rarer as players get more, once more alchemy comes out
+ //3 to ensure teaser pages aren't found
+ if(missingPages.size() > 3){
+ AlchemyPage p = new AlchemyPage();
+ p.page(missingPages.get(0));
+ int pos;
+ do {
+ pos = level.pointToCell(random());
+ } while (
+ level.map[pos] != Terrain.EMPTY_SP ||
+ level.heaps.get( pos ) != null);
+ level.drop( p, pos );
+ }
+
if (level instanceof RegularLevel && ((RegularLevel)level).hasPitRoom()){
entrance.set( Door.Type.REGULAR );
} else {
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 2d9254bd4..0a8793145 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/ItemSpriteSheet.java
@@ -65,12 +65,14 @@ public class ItemSpriteSheet {
public static final int SANDBAG = UNCOLLECTIBLE+3;
public static final int GUIDE_PAGE = UNCOLLECTIBLE+5;
+ public static final int ALCH_PAGE = UNCOLLECTIBLE+6;
static{
assignItemRect(GOLD, 15, 13);
assignItemRect(DEWDROP, 10, 10);
assignItemRect(PETAL, 8, 8);
assignItemRect(SANDBAG, 10, 10);
assignItemRect(GUIDE_PAGE, 10, 11);
+ assignItemRect(ALCH_PAGE, 10, 11);
}
private static final int CONTAINERS = xy(1, 3); //16 slots
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndAlchemy.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndAlchemy.java
index 9b403f01c..883073c3b 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndAlchemy.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndAlchemy.java
@@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.Recipe;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart;
+import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -188,7 +189,7 @@ public class WndAlchemy extends Window {
@Override
protected void onClick() {
super.onClick();
- ShatteredPixelDungeon.scene().addToFront(new WndMessage(Messages.get(WndAlchemy.class, "recipes_text")));
+ ShatteredPixelDungeon.scene().addToFront(new WndDocument(Document.ALCHEMY_GUIDE));
}
};
btnRecipes.setRect(5, h, btnWidth, 18);
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDocument.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDocument.java
new file mode 100644
index 000000000..1a3488636
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDocument.java
@@ -0,0 +1,209 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2018 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.windows;
+
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
+import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
+import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
+import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
+import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
+import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline;
+import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane;
+import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
+import com.watabou.noosa.BitmapText;
+import com.watabou.noosa.ColorBlock;
+import com.watabou.noosa.Image;
+import com.watabou.noosa.ui.Component;
+
+import java.util.ArrayList;
+
+//FIXME lots of copy-pasta from WndJournal here. should generalize some of this. Primarily ListItem
+public class WndDocument extends Window {
+
+ private static final int WIDTH_P = 120;
+ private static final int HEIGHT_P = 160;
+
+ private static final int WIDTH_L = 160;
+ private static final int HEIGHT_L = 128;
+
+ private static final int ITEM_HEIGHT = 18;
+
+ private ScrollPane list;
+ private ArrayList pages = new ArrayList<>();
+
+ public WndDocument( Document doc ){
+
+ int w = SPDSettings.landscape() ? WIDTH_L : WIDTH_P;
+ int h = SPDSettings.landscape() ? HEIGHT_L : HEIGHT_P;
+
+ resize(w, h);
+
+ list = new ScrollPane( new Component() ){
+ @Override
+ public void onClick( float x, float y ) {
+ int size = pages.size();
+ for (int i=0; i < size; i++) {
+ if (pages.get( i ).onClick( x, y )) {
+ break;
+ }
+ }
+ }
+ };
+ add( list );
+
+ list.setRect( 0, 0, w, h);
+
+ Component content = list.content();
+
+ float pos = 0;
+
+ ColorBlock line = new ColorBlock( w, 1, 0xFF222222);
+ line.y = pos;
+ content.add(line);
+
+ RenderedTextMultiline title = PixelScene.renderMultiline(doc.title(), 9);
+ title.hardlight(TITLE_COLOR);
+ title.maxWidth( w - 2 );
+ title.setPos( (w - title.width())/2f, pos + 1 + ((ITEM_HEIGHT) - title.height())/2f);
+ PixelScene.align(title);
+ content.add(title);
+
+ pos += Math.max(ITEM_HEIGHT, title.height());
+
+ for (String page : doc.pages()){
+ docPage item = new docPage( doc, page );
+
+ item.setRect( 0, pos, w, ITEM_HEIGHT );
+ content.add( item );
+
+ pos += item.height();
+ pages.add(item);
+ }
+
+ content.setSize( w, pos );
+ list.setSize( list.width(), list.height() );
+
+ }
+
+ private static class docPage extends ListItem {
+
+ private boolean found = false;
+
+ private Document doc;
+ private String page;
+
+ public docPage(Document doc, String page ){
+ super( new ItemSprite( doc.pageSprite(), null),
+ Messages.titleCase(doc.pageTitle(page)), -1);
+
+ this.doc = doc;
+
+ this.page = page;
+ found = doc.hasPage(page);
+
+ if (!found) {
+ icon.hardlight( 0.5f, 0.5f, 0.5f);
+ label.text( Messages.titleCase(Messages.get( WndDocument.class, "missing" )));
+ label.hardlight( 0x999999 );
+ }
+
+ }
+
+ public boolean onClick( float x, float y ) {
+ if (inside( x, y ) && found) {
+ GameScene.show( new WndStory( doc.pageBody(page) ));
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ }
+
+ private static class ListItem extends Component {
+
+ protected RenderedTextMultiline label;
+ protected BitmapText depth;
+ protected ColorBlock line;
+ protected Image icon;
+
+ public ListItem( Image icon, String text ) {
+ this(icon, text, -1);
+ }
+
+ public ListItem( Image icon, String text, int d ) {
+ super();
+
+ this.icon.copy(icon);
+
+ label.text( text );
+
+ if (d >= 0) {
+ depth.text(Integer.toString(d));
+ depth.measure();
+
+ if (d == Dungeon.depth) {
+ label.hardlight(TITLE_COLOR);
+ depth.hardlight(TITLE_COLOR);
+ }
+ }
+ }
+
+ @Override
+ protected void createChildren() {
+ label = PixelScene.renderMultiline( 7 );
+ add( label );
+
+ icon = new Image();
+ add( icon );
+
+ depth = new BitmapText( PixelScene.pixelFont);
+ add( depth );
+
+ line = new ColorBlock( 1, 1, 0xFF222222);
+ add(line);
+
+ }
+
+ @Override
+ protected void layout() {
+
+ icon.y = y + 1 + (height() - 1 - icon.height()) / 2f;
+ PixelScene.align(icon);
+
+ depth.x = icon.x + (icon.width - depth.width()) / 2f;
+ depth.y = icon.y + (icon.height - depth.height()) / 2f + 1;
+ PixelScene.align(depth);
+
+ line.size(width, 1);
+ line.x = 0;
+ line.y = y;
+
+ label.maxWidth((int)(width - icon.width() - 8 - 1));
+ label.setPos(icon.x + icon.width() + 1, y + 1 + (height() - label.height()) / 2f);
+ PixelScene.align(label);
+ }
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java
index ecd3bb659..92ab857df 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndJournal.java
@@ -223,7 +223,7 @@ public class WndJournal extends WndTabbed {
line.y = pos;
content.add(line);
- RenderedTextMultiline title = PixelScene.renderMultiline(Document.ADVENTURERS_GUIDE.title(), 9);
+ RenderedTextMultiline title = PixelScene.renderMultiline(Messages.get(this, "title"), 9);
title.hardlight(TITLE_COLOR);
title.maxWidth( (int)width() - 2 );
title.setPos( (width() - title.width())/2f, pos + 1 + ((ITEM_HEIGHT) - title.height())/2f);
@@ -232,8 +232,8 @@ public class WndJournal extends WndTabbed {
pos += Math.max(ITEM_HEIGHT, title.height());
- for (String page : Document.ADVENTURERS_GUIDE.pages()){
- GuideItem item = new GuideItem( page );
+ for (Document doc : Document.values()){
+ GuideItem item = new GuideItem( doc );
item.setRect( 0, pos, width(), ITEM_HEIGHT );
content.add( item );
@@ -249,18 +249,18 @@ public class WndJournal extends WndTabbed {
private static class GuideItem extends ListItem {
private boolean found = false;
- private String page;
+ private Document doc;
- public GuideItem( String page ){
- super( new ItemSprite( ItemSpriteSheet.GUIDE_PAGE, null),
- Messages.titleCase(Document.ADVENTURERS_GUIDE.pageTitle(page)), -1);
+ public GuideItem( Document doc ){
+ super( new ItemSprite( doc.pageSprite(), null),
+ Messages.titleCase( doc.title() ), -1);
- this.page = page;
- found = Document.ADVENTURERS_GUIDE.hasPage(page);
+ this.doc = doc;
+ found = doc.hasAnyPages();
if (!found) {
icon.hardlight( 0.5f, 0.5f, 0.5f);
- label.text( Messages.titleCase(Messages.get( this, "missing" )));
+ label.text( Messages.titleCase( "???" ));
label.hardlight( 0x999999 );
}
@@ -268,7 +268,7 @@ public class WndJournal extends WndTabbed {
public boolean onClick( float x, float y ) {
if (inside( x, y ) && found) {
- GameScene.show( new WndStory( Document.ADVENTURERS_GUIDE.pageBody(page) ));
+ GameScene.show( new WndDocument(doc));
return true;
} else {
return false;
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 8f176f786..4065e4dcc 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
@@ -447,6 +447,9 @@ items.food.pasty.cane_desc=A huge sugary sweet candy cane! It's big enough to fi
items.journal.documentpage.name=torn page
items.journal.documentpage.desc=A lone page, probably torn from a book of some sort. You'll need to pick it up to read it.
+items.journal.alchemypage.name=torn alchemy book page
+items.journal.alchemypage.desc=A torn page from a guidebook on alchemy.\n\nMost of the text is too small to read at a distance, but you can make out the title of the page:\n\n_"%s"_
+
items.journal.guidepage.name=torn guidebook page
items.journal.guidepage.desc=A torn page from an adventuring guidebook.\n\nMost of the text is too small to read at a distance, but you can make out the title of the page:\n\n_"%s"_
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 a29462674..0c12e8efc 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
@@ -20,6 +20,18 @@ journal.document.adventurers_guide.looting.body=Specific rooms will often contai
journal.document.adventurers_guide.magic.title=Magical Attacks
journal.document.adventurers_guide.magic.body=Magical attacks cut right through armor and are extremely difficult to dodge.\n\nThis means that damage you deal with wands will be very reliable, but also makes magical enemies extremely dangerous.\n\nMagical attacks always have a caveat though. In the case of wands it's their limited charges, wands become almost useless if they aren't given time to recharge. Magic that enemies use will always have some form of weakness as well. \n\nWhen facing enemies that use magic it is extremely important to figure out how to evade their magic, rather than just eating the damage from it.
+journal.document.alchemy_guide.title=Alchemy Guide
+journal.document.alchemy_guide.potions.title=Creating Potions
+journal.document.alchemy_guide.potions.body=Welcome to Practical Applications of Alchemy! This book serves as a recipe reference for hobbyist alchemists and adventurers looking to get their hands dirty.\n\nWe will start with the most iconic alchemy recipe: Place any three seeds into an alchemy pot to brew a potion!\n\nEvery seed type has a potion counterpart. The potion you create may relate to one of the seeds used, but there is a chance it will be random as well. Using multiple of the same type of seed will decrease the chance for a random potion.
+journal.document.alchemy_guide.stones.title=Creating Runestones
+journal.document.alchemy_guide.stones.body=Mixing a single scroll into an alchemy pot will imbue its magic into two or three rocks within the pot. This creates runestones that correspond to that scroll.\n\nRunestones are a lesser variant of scrolls, just as seeds are a lesser variant of potions. Unlike seeds however, runestones cannot be combined to make a scroll.
+journal.document.alchemy_guide.darts.title=Tipping Darts
+journal.document.alchemy_guide.darts.body=A single seed can be combined with one or two darts to tip them. Each type of seed produces its own type of tipped dart, with a unique effect.\n\nTipped darts only last for one use however, and will revert to regular darts when recovered.
+journal.document.alchemy_guide.exotics.title=Exotic Potions and Scrolls
+journal.document.alchemy_guide.exotics.body=The power of a potion of scroll can be augmented to create a new 'exotic' variant. These exotic items have more powerful effects, but they are often useful in different ways as well.\n\nCombining a potion and any two seeds will produce an exotic potion. Combining a scroll with any two runestones will produce an exotic scroll.
+journal.document.alchemy_guide.bombs.title=Enhanced Bombs
+journal.document.alchemy_guide.bombs.body=A standard black powder bomb can be enhanced through the use of alchemy. Mix a bomb with either a seed or runestone, and a specific potion or scroll to create an enhanced bomb.\n\nThe potion or scroll used will affect the enhanced bomb produced, and only some potions or scrolls can create enhanced bombs.
+
journal.notes$landmark.well_of_health=well of health
journal.notes$landmark.well_of_awareness=well of awareness
journal.notes$landmark.well_of_transmutation=well of transmutation
diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties
index 59c02b5f6..064521c30 100644
--- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties
+++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties
@@ -17,6 +17,8 @@ windows.wndchooseway.cancel=I'll decide later
windows.wndclass.mastery=Mastery
+windows.wnddocument.missing=page missing
+
windows.wnderror.title=ERROR
windows.wndgame.settings=Settings
@@ -60,6 +62,7 @@ windows.wndinfotrap.inactive=This trap is inactive, and can no longer be trigger
windows.wndjournal.guide=Guide
windows.wndjournal.notes=Notes
windows.wndjournal.items=Items
+windows.wndjournal$guidetab.title=Guidebooks
windows.wndjournal$guidetab$guideitem.missing=page missing
windows.wndjournal$notestab.keys=Keys
windows.wndjournal$notestab.landmarks=Landmarks