From b8ae27a2e1209183434ba36ba21a53fbb8391e2e Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sat, 11 Aug 2018 18:12:52 -0400 Subject: [PATCH] v0.7.0: implement an alchemy guidebook --- core/src/main/assets/items.png | Bin 16705 -> 16745 bytes .../items/journal/AlchemyPage.java | 43 ++++ .../items/scrolls/Scroll.java | 4 +- .../journal/Document.java | 33 ++- .../levels/rooms/special/LaboratoryRoom.java | 29 +++ .../sprites/ItemSpriteSheet.java | 2 + .../windows/WndAlchemy.java | 3 +- .../windows/WndDocument.java | 209 ++++++++++++++++++ .../windows/WndJournal.java | 22 +- .../messages/items/items.properties | 3 + .../messages/journal/journal.properties | 12 + .../messages/windows/windows.properties | 3 + 12 files changed, 347 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/journal/AlchemyPage.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndDocument.java diff --git a/core/src/main/assets/items.png b/core/src/main/assets/items.png index c5f5313c6885d5b3d4be5515d70bd71651ef46bb..35ac6d847703f35acdfb133978886f62763da40b 100644 GIT binary patch literal 16745 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%0D4mFcUQZ#V)x0~w0!o{zP$JlE#^?{4 zwvm_&QjDOPhMHXa9tLQ!fBOG~HT`Yn$m6IoN`e#I=CH)ILah_RqK37peVDZzG=Y1b zOkU>BQ%HvX8?u-aW@y(0K&M=z908bE@bV}<*(0NofeVmGBYoV`1<(6@2GmB3=XeZI zF2?%20?|2?y3hCBBQZoLX}I}IFLUT%Ac&DU1860wC9jh z>%JsfSEUjm2AvnHdb?dsnw|!rwsMXI8n>KsCdQgPFJ;4nT#Qn%SDaV{qBZD4intC2NKCn} z3oC~(o3ZB_GVk;rv*mgQanFZJV@1~P?9)ANT!1L{U6lVIM;4(sA3mueLxxTef`)Uf z1r5lA&to6B^SCr~{omSh2_P*%S&b*mO*eZ5{fL39%s6fNaWeff(*Hb=jeF^*0{x=F c|F1uhag9B(B`vVYKU$6)I&rXYziagW0XD0thyVZp 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