v0.7.0: implement an alchemy guidebook
This commit is contained in:
parent
425826e533
commit
b8ae27a2e1
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
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()));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
@ -32,7 +33,12 @@ 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<String, Boolean> 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";
|
||||
|
|
|
@ -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<String> allPages = Document.ALCHEMY_GUIDE.pages();
|
||||
ArrayList<String> 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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
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<docPage> 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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"_
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user