From 6f608edeedc522fba97509bc0573ace51010e3b9 Mon Sep 17 00:00:00 2001 From: Lizbeth Rika Date: Mon, 16 Feb 2015 14:11:32 +0000 Subject: [PATCH] Added Tutorial Mode. --- .../client/gui/lexicon/GuiLexicon.java | 82 +++++++++++++++++- .../client/gui/lexicon/GuiLexiconEntry.java | 32 ++++++- .../client/gui/lexicon/GuiLexiconIndex.java | 27 +++++- .../botania/common/lexicon/LexiconData.java | 4 + .../botania/common/lexicon/TLexiconEntry.java | 29 +++++++ .../common/lexicon/page/PageGuide.java | 1 - .../common/lexicon/page/PageTutorial.java | 53 +++++++++++ .../vazkii/botania/common/lib/LibLexicon.java | 2 + .../resources/assets/botania/lang/en_US.lang | 7 ++ .../assets/botania/textures/gui/lexicon.png | Bin 48532 -> 63164 bytes 10 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 src/main/java/vazkii/botania/common/lexicon/TLexiconEntry.java create mode 100644 src/main/java/vazkii/botania/common/lexicon/page/PageTutorial.java 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 8b7a26b5b56571cb1298f12a0eaf945b79c0c92a..7acb244f6132045ab4c8f9022b78c303ed56c9d9 100644 GIT binary patch delta 27482 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 delta 12737 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 AO#lD@