From 374a1f1bb7b884622824d804592b83bb7d4094bc Mon Sep 17 00:00:00 2001 From: Roman / Linnea Gräf Date: Thu, 8 Jun 2023 09:34:43 +0200 Subject: NEUConfig: Add manadatory IQ test to api tab (#703) --- .../notenoughupdates/options/NEUConfig.java | 4 + .../notenoughupdates/options/NEUConfigEditor.java | 10 +- .../options/seperateSections/ApiData.java | 9 ++ .../notenoughupdates/miscfeatures/IQTest.kt | 109 +++++++++++++++++++++ 4 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/io/github/moulberry/notenoughupdates/miscfeatures/IQTest.kt diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java index 2d66f595..7513a5b3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -30,6 +30,7 @@ import io.github.moulberry.notenoughupdates.core.config.annotations.Category; import io.github.moulberry.notenoughupdates.core.config.gui.GuiPositionEditor; import io.github.moulberry.notenoughupdates.dungeons.GuiDungeonMapEditor; import io.github.moulberry.notenoughupdates.miscfeatures.FairySouls; +import io.github.moulberry.notenoughupdates.miscfeatures.IQTest; import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor; import io.github.moulberry.notenoughupdates.miscgui.NEUOverlayPlacements; @@ -168,6 +169,9 @@ public class NEUConfig extends Config { case 26: OverlayManager.powderGrindingOverlay.reset(); return; + case 27: + IQTest.testIQ(); + return; default: System.err.printf("Unknown runnableId = %d in category %s%n", runnableId, activeConfigCategory); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java index 2b12118c..62bb730b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java @@ -32,6 +32,7 @@ import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import io.github.moulberry.notenoughupdates.miscfeatures.IQTest; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; @@ -120,14 +121,14 @@ public class NEUConfigEditor extends GuiElement { if (categoryOpen != null) { for (Map.Entry category : processedConfig.entrySet()) { if (category.getValue().name.equalsIgnoreCase(categoryOpen)) { - selectedCategory = category.getKey(); + setSelectedCategory(category.getKey()); break; } } if (selectedCategory == null) { for (Map.Entry category : processedConfig.entrySet()) { if (category.getValue().name.toLowerCase().startsWith(categoryOpen.toLowerCase())) { - selectedCategory = category.getKey(); + setSelectedCategory(category.getKey()); break; } } @@ -135,7 +136,7 @@ public class NEUConfigEditor extends GuiElement { if (selectedCategory == null) { for (Map.Entry category : processedConfig.entrySet()) { if (category.getValue().name.toLowerCase().contains(categoryOpen.toLowerCase())) { - selectedCategory = category.getKey(); + setSelectedCategory(category.getKey()); break; } } @@ -152,6 +153,9 @@ public class NEUConfigEditor extends GuiElement { } private LinkedHashMap getOptionsInCategory(ConfigProcessor.ProcessedCategory cat) { + if (cat.options.containsKey("apiDataUnlocked") && !NotEnoughUpdates.INSTANCE.config.apiData.apiDataUnlocked) { + return IQTest.getOptions(); + } LinkedHashMap newMap = new LinkedHashMap<>(cat.options); if (searchedOptions != null) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java index 63faf940..3267e661 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java @@ -28,6 +28,15 @@ import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditor import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class ApiData { + + @Expose + @ConfigOption( + name = "Unlock the API data tab", + desc = "If you turn this off, you will need to re-do the IQ test" + ) + @ConfigEditorBoolean + public boolean apiDataUnlocked = false; + @Expose @ConfigOption( name = "Api Key", diff --git a/src/main/kotlin/io/github/moulberry/notenoughupdates/miscfeatures/IQTest.kt b/src/main/kotlin/io/github/moulberry/notenoughupdates/miscfeatures/IQTest.kt new file mode 100644 index 00000000..157050b3 --- /dev/null +++ b/src/main/kotlin/io/github/moulberry/notenoughupdates/miscfeatures/IQTest.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2023 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + +package io.github.moulberry.notenoughupdates.miscfeatures + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates +import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorButton +import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorFSR +import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorText +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor.ProcessedOption +import io.github.moulberry.notenoughupdates.util.Calculator +import io.github.moulberry.notenoughupdates.util.Calculator.CalculatorException +import java.math.BigDecimal +import kotlin.random.Random + +object IQTest { + fun randOperator() = listOf("+", "*").random() + fun randNum() = Random.nextInt(1, 20) + val question = "${randNum()} ${randOperator()} ${randNum()} ${randOperator()} ${randNum()}" + + @JvmStatic + fun testIQ() { + val testedAnswer = try { + Calculator.calculate(answer) + } catch (e: CalculatorException) { + wrongAnswer() + return + } + val realAnswer = Calculator.calculate(question) + if (testedAnswer.subtract(realAnswer).abs() < BigDecimal.valueOf(0.1)) { + NotEnoughUpdates.INSTANCE.config.apiData.apiDataUnlocked = true + lastAnsweredTimestamp = 0L + } else { + wrongAnswer() + } + } + + private fun wrongAnswer() { + lastAnsweredTimestamp = System.currentTimeMillis() + } + + var lastAnsweredTimestamp = 0L + + @JvmField + @Suppress("UNUSED") + var buttonPlaceHolder = false + + @JvmField + var answer = "" + + val answerOption = ProcessedOption( + "IQ Test Question", + "Please type out the answer to §a$question", + -1, + javaClass.getField("answer"), + this, + arrayOf() + ).also { + it.editor = GuiOptionEditorText(it) + } + val warningOption = ProcessedOption( + "§4§lWARNING", + "§4§lThis page is dangerous. Please make sure you know what you are doing!", + -1, + javaClass.getField("buttonPlaceHolder"), + this, + arrayOf() + ).also { + it.editor = GuiOptionEditorButton(it, 27, "SUBMIT", NotEnoughUpdates.INSTANCE.config) + } + val wrongOption = ProcessedOption( + "§4Wrong Answer", + "§4Please think twice before accessing it.", + -1, + javaClass.getField("buttonPlaceHolder"), + this, + arrayOf() + ).also { + it.editor = GuiOptionEditorFSR(it, -1, "", NotEnoughUpdates.INSTANCE.config) + } + + + @get:JvmStatic + val options + get() = LinkedHashMap().also { + it["iqTestAnswer"] = answerOption + it["iqTestSubmit"] = warningOption + + if (System.currentTimeMillis() - lastAnsweredTimestamp < 10_000L) { + it["iqTestWrong"] = wrongOption + } + } +} -- cgit