diff --git a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexicon.java b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexicon.java index 9e454c908..0e53feb74 100644 --- a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexicon.java +++ b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexicon.java @@ -10,10 +10,12 @@ */ package vazkii.botania.client.gui.lexicon; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Queue; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -28,6 +30,7 @@ import org.lwjgl.opengl.GL11; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.LexiconCategory; +import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.client.core.handler.ClientTickHandler; import vazkii.botania.client.core.helper.RenderHelper; import vazkii.botania.client.core.proxy.ClientProxy; @@ -35,7 +38,9 @@ import vazkii.botania.client.gui.lexicon.button.GuiButtonBookmark; import vazkii.botania.client.gui.lexicon.button.GuiButtonCategory; import vazkii.botania.client.gui.lexicon.button.GuiButtonInvisible; import vazkii.botania.client.lib.LibResources; +import vazkii.botania.common.core.handler.SheddingHandler; import vazkii.botania.common.item.ItemLexicon; +import vazkii.botania.common.lexicon.LexiconData; public class GuiLexicon extends GuiScreen { @@ -46,6 +51,8 @@ public class GuiLexicon extends GuiScreen { public static List bookmarks = new ArrayList(); boolean bookmarksNeedPopulation = false; + public static Queue tutorial = new ArrayDeque(); + public static final ResourceLocation texture = new ResourceLocation(LibResources.GUI_LEXICON); public static final ResourceLocation textureToff = new ResourceLocation(LibResources.GUI_TOFF); @@ -53,6 +60,11 @@ public class GuiLexicon extends GuiScreen { public float partialTicks = 0F; public float timeDelta = 0F; + private static final int TUTORIAL_ARROW_WIDTH = 10; + private static final int TUTORIAL_ARROW_HEIGHT = 12; + boolean hasTutorialArrow; + int tutorialArrowX, tutorialArrowY; + List allCategories; String title; @@ -61,9 +73,15 @@ public class GuiLexicon extends GuiScreen { int left, top; @Override - public void initGui() { + public final void initGui() { super.initGui(); + onInitGui(); + + putTutorialArrow(); + } + + public void onInitGui() { allCategories = new ArrayList(BotaniaAPI.getAllCategories()); Collections.sort(allCategories); @@ -152,8 +170,17 @@ public class GuiLexicon extends GuiScreen { RenderHelper.renderTooltip(par1, par2, Arrays.asList(EnumChatFormatting.GOLD + "#goldfishchris", EnumChatFormatting.RED + "INTENSIFY HIM")); } } - + super.drawScreen(par1, par2, par3); + + if(hasTutorialArrow) { + mc.renderEngine.bindTexture(texture); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 0.7F + (float) (Math.sin((float) (ClientTickHandler.ticksInGame + par3) * 0.3F) + 1) * 0.15F); + drawTexturedModalRect(tutorialArrowX, tutorialArrowY, 20, 200, TUTORIAL_ARROW_WIDTH, TUTORIAL_ARROW_HEIGHT); + GL11.glDisable(GL11.GL_BLEND); + } } public void drawBookmark(int x, int y, String s, boolean drawLeft) { @@ -294,6 +321,56 @@ public class GuiLexicon extends GuiScreen { } } + public static void startTutorial() { + tutorial.clear(); + tutorial.add(LexiconData.lexicon); + tutorial.add(LexiconData.flowers); + tutorial.add(LexiconData.apothecary); + tutorial.add(LexiconData.pureDaisy); + tutorial.add(LexiconData.wand); + tutorial.add(LexiconData.manaIntro); + tutorial.add(LexiconData.pool); + tutorial.add(LexiconData.spreader); + tutorial.add(LexiconData.generatingIntro); + tutorial.add(LexiconData.daybloom); + tutorial.add(LexiconData.endoflame); + tutorial.add(LexiconData.openCrate); + tutorial.add(LexiconData.functionalIntro); + tutorial.add(LexiconData.runicAltar); + tutorial.add(LexiconData.baublesIntro); + tutorial.add(LexiconData.manaTransport); + tutorial.add(LexiconData.manasteelGear); + tutorial.add(LexiconData.dispenserTweaks); + if(SheddingHandler.hasShedding()) + tutorial.add(LexiconData.shedding); + } + + public final void putTutorialArrow() { + hasTutorialArrow = !tutorial.isEmpty(); + if(hasTutorialArrow) + positionTutorialArrow(); + } + + public void positionTutorialArrow() { + LexiconEntry entry = tutorial.peek(); + LexiconCategory category = entry.category; + + List buttons = buttonList; + for(GuiButton button : buttons) + if(button instanceof GuiButtonCategory) { + GuiButtonCategory catButton = (GuiButtonCategory) button; + if(catButton.getCategory() == category) { + orientTutorialArrowWithButton(button); + break; + } + } + } + + public void orientTutorialArrowWithButton(GuiButton button) { + tutorialArrowX = button.xPosition - TUTORIAL_ARROW_WIDTH; + tutorialArrowY = button.yPosition - TUTORIAL_ARROW_HEIGHT; + } + boolean closeScreenOnInvKey() { return true; } @@ -323,3 +400,4 @@ public class GuiLexicon extends GuiScreen { return entryGui.page < entryGui.entry.pages.size(); } } + diff --git a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconEntry.java b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconEntry.java index e471bd2bc..11943768a 100644 --- a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconEntry.java +++ b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconEntry.java @@ -15,6 +15,8 @@ import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; @@ -22,6 +24,7 @@ import org.lwjgl.input.Mouse; import vazkii.botania.api.internal.IGuiLexiconEntry; import vazkii.botania.api.lexicon.IAddonEntry; +import vazkii.botania.api.lexicon.LexiconCategory; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.lexicon.LexiconPage; import vazkii.botania.client.core.handler.ClientTickHandler; @@ -50,8 +53,8 @@ public class GuiLexiconEntry extends GuiLexicon implements IGuiLexiconEntry, IPa } @Override - public void initGui() { - super.initGui(); + public void onInitGui() { + super.onInitGui(); buttonList.add(backButton = new GuiButtonBackWithShift(0, left + guiWidth / 2 - 8, top + guiHeight + 2)); buttonList.add(leftButton = new GuiButtonPage(1, left, top + guiHeight - 10, false)); @@ -161,6 +164,31 @@ public class GuiLexiconEntry extends GuiLexicon implements IGuiLexiconEntry, IPa public void updateScreen() { LexiconPage page = entry.pages.get(this.page); page.updateScreen(this); + + + if(this.page == entry.pages.size() - 1) { + LexiconEntry entry = tutorial.peek(); + if(entry == this.entry) { + tutorial.poll(); + positionTutorialArrow(); + if(tutorial.isEmpty()) { + mc.thePlayer.addChatMessage(new ChatComponentTranslation("botaniamisc.tutorialEnded").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); + hasTutorialArrow = false; + } + } + } + } + + @Override + public void positionTutorialArrow() { + LexiconEntry entry = tutorial.peek(); + if(entry != this.entry) { + orientTutorialArrowWithButton(backButton); + return; + } + + if(rightButton.enabled && rightButton.visible) + orientTutorialArrowWithButton(rightButton); } @Override diff --git a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconIndex.java b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconIndex.java index f468ca5e7..e04b57b1a 100644 --- a/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconIndex.java +++ b/src/main/java/vazkii/botania/client/gui/lexicon/GuiLexiconIndex.java @@ -28,6 +28,7 @@ import vazkii.botania.api.lexicon.LexiconCategory; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.client.core.handler.ClientTickHandler; import vazkii.botania.client.gui.lexicon.button.GuiButtonBack; +import vazkii.botania.client.gui.lexicon.button.GuiButtonCategory; import vazkii.botania.client.gui.lexicon.button.GuiButtonInvisible; import vazkii.botania.client.gui.lexicon.button.GuiButtonPage; @@ -70,8 +71,8 @@ public class GuiLexiconIndex extends GuiLexicon implements IParented { } @Override - public void initGui() { - super.initGui(); + public void onInitGui() { + super.onInitGui(); if(!GuiLexicon.isValidLexiconGui(this)) { currentOpenLexicon = new GuiLexicon(); @@ -130,6 +131,28 @@ public class GuiLexiconIndex extends GuiLexicon implements IParented { drawTexturedModalRect(left + 134, top + guiHeight - 26, 86, 180, 12, 12); } } + + @Override + public void positionTutorialArrow() { + LexiconEntry entry = tutorial.peek(); + LexiconCategory category = entry.category; + if(category != this.category) { + orientTutorialArrowWithButton(backButton); + return; + } + + List buttons = buttonList; + for(GuiButton button : buttons) { + int index = button.id + page * 12; + if(index >= entriesToDisplay.size()) + continue; + + if(entry == entriesToDisplay.get(index)) { + orientTutorialArrowWithButton(button); + break; + } + } + } @Override protected void actionPerformed(GuiButton par1GuiButton) { diff --git a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java index ea616efa2..24d129b77 100644 --- a/src/main/java/vazkii/botania/common/lexicon/LexiconData.java +++ b/src/main/java/vazkii/botania/common/lexicon/LexiconData.java @@ -44,7 +44,9 @@ import vazkii.botania.common.lib.LibLexicon; public final class LexiconData { + public static LexiconEntry tutorial; public static LexiconEntry introVideo; + public static LexiconEntry flowers; public static LexiconEntry apothecary; public static LexiconEntry lexicon; @@ -232,6 +234,8 @@ public final class LexiconData { LexiconCategory categoryMisc = BotaniaAPI.categoryMisc; // BASICS ENTRIES + tutorial = new TLexiconEntry(); + introVideo = new BLexiconEntry(LibLexicon.BASICS_INTRO_VIDEO, categoryBasics); introVideo.setPriority().setLexiconPages(new PageGuide("0")); diff --git a/src/main/java/vazkii/botania/common/lexicon/TLexiconEntry.java b/src/main/java/vazkii/botania/common/lexicon/TLexiconEntry.java new file mode 100644 index 000000000..adaab5ae7 --- /dev/null +++ b/src/main/java/vazkii/botania/common/lexicon/TLexiconEntry.java @@ -0,0 +1,29 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Feb 16, 2015, 1:41:58 PM (GMT)] + */ +package vazkii.botania.common.lexicon; + +import vazkii.botania.api.BotaniaAPI; +import vazkii.botania.api.lexicon.LexiconCategory; +import vazkii.botania.api.lexicon.LexiconEntry; +import vazkii.botania.common.Botania; +import vazkii.botania.common.lexicon.page.PageTutorial; +import vazkii.botania.common.lib.LibLexicon; + +public class TLexiconEntry extends BLexiconEntry { + + public TLexiconEntry() { + super(LibLexicon.BASICS_TUTORIAL, BotaniaAPI.categoryBasics); + setPriority(); + setLexiconPages(new PageTutorial("0")); + } + + +} diff --git a/src/main/java/vazkii/botania/common/lexicon/page/PageGuide.java b/src/main/java/vazkii/botania/common/lexicon/page/PageGuide.java index 18257f7f0..35ff293a9 100644 --- a/src/main/java/vazkii/botania/common/lexicon/page/PageGuide.java +++ b/src/main/java/vazkii/botania/common/lexicon/page/PageGuide.java @@ -46,5 +46,4 @@ public class PageGuide extends PageText { } catch(Exception e) { } } - } diff --git a/src/main/java/vazkii/botania/common/lexicon/page/PageTutorial.java b/src/main/java/vazkii/botania/common/lexicon/page/PageTutorial.java new file mode 100644 index 000000000..434097ef4 --- /dev/null +++ b/src/main/java/vazkii/botania/common/lexicon/page/PageTutorial.java @@ -0,0 +1,53 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Feb 16, 2015, 1:39:10 PM (GMT)] + */ +package vazkii.botania.common.lexicon.page; + +import java.awt.Desktop; +import java.net.URI; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import vazkii.botania.api.internal.IGuiLexiconEntry; +import vazkii.botania.client.gui.lexicon.GuiLexicon; + +public class PageTutorial extends PageText { + + GuiButton button; + + public PageTutorial(String unlocalizedName) { + super(unlocalizedName); + } + + @Override + public void onOpened(IGuiLexiconEntry gui) { + button = new GuiButton(101, gui.getLeft() + 30, gui.getTop() + gui.getHeight() - 50, gui.getWidth() - 60, 20, StatCollector.translateToLocal("botaniamisc.startTutorial")); + gui.getButtonList().add(button); + } + + @Override + public void onClosed(IGuiLexiconEntry gui) { + gui.getButtonList().remove(button); + } + + @Override + public void onActionPerformed(IGuiLexiconEntry gui, GuiButton button) { + if(button == this.button) { + GuiLexicon.startTutorial(); + Minecraft.getMinecraft().displayGuiScreen(new GuiLexicon()); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentTranslation("botaniamisc.tutorialStarted").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GREEN))); + } + } + +} diff --git a/src/main/java/vazkii/botania/common/lib/LibLexicon.java b/src/main/java/vazkii/botania/common/lib/LibLexicon.java index 457e91d4f..04effdc98 100644 --- a/src/main/java/vazkii/botania/common/lib/LibLexicon.java +++ b/src/main/java/vazkii/botania/common/lib/LibLexicon.java @@ -24,7 +24,9 @@ public final class LibLexicon { public static final String CATEGORY_ALFHOMANCY = "alfhomancy"; public static final String CATEGORY_MISC = "misc"; + public static final String BASICS_TUTORIAL = "tutorial"; public static final String BASICS_INTRO_VIDEO = "introVideo"; + public static final String BASICS_FLOWERS = "flowers"; public static final String BASICS_APOTHECARY = "apothecary"; public static final String BASICS_LEXICON = "lexicon"; diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index 366704989..465eb68b1 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -80,6 +80,9 @@ botaniamisc.requestMsg=Requested %d x "%s" out of %d. %d taken. botaniamisc.nearIndex0=Corporea Index nearby! botaniamisc.nearIndex1=Anything you say will be botaniamisc.nearIndex2=intercepted as a request +botaniamisc.startTutorial=Start Tutorial +botaniamisc.tutorialStarted=You have started your tutorial, follow the red arrows to be guides through the basics of Botania! +botaniamisc.tutorialEnded=Your tutorial is over, you should now have a basic idea of how Botania works, make sure to read through the other pages at your leisure to learn more ways of using the mod. # NEI INTEGRATION botania.nei.brewery=Botanical Brewery @@ -1069,6 +1072,10 @@ botania.category.misc=Miscellaneous # LEXICON ENTRIES # - BASIC +# -- TUTORIAL OF THE BASICS +botania.entry.tutorial=A Tutorial of the Basics +botania.page.tutorial0=While one could just go through the various entries in the book at their issue, there's also a "guided tour" of sorts available. Clicking the button below will guide you through the pages useful to getting the gist of the basic concepts of Botania. + # -- AN INTRODUCTORY CLIP botania.entry.introVideo=An Introductory Clip botania.page.introVideo0=For those readers who are not quite readers, a short video guide covering the basics of Botania is also available. It's to keep in note that this guide acts as an aid and not a substitution for the contents of the &1Lexica Botania&0. diff --git a/src/main/resources/assets/botania/textures/gui/lexicon.png b/src/main/resources/assets/botania/textures/gui/lexicon.png index 8b7a26b5b..7acb244f6 100644 Binary files a/src/main/resources/assets/botania/textures/gui/lexicon.png and b/src/main/resources/assets/botania/textures/gui/lexicon.png differ