diff --git a/main/src/net/liplum/CioMod.kt b/main/src/net/liplum/CioMod.kt index 42d3ab3f..6264f8f1 100644 --- a/main/src/net/liplum/CioMod.kt +++ b/main/src/net/liplum/CioMod.kt @@ -31,7 +31,6 @@ import net.liplum.script.NpcSystem import net.liplum.update.Updater import net.liplum.welcome.FirstLoaded import net.liplum.welcome.Welcome -import net.liplum.welcome.WelcomeList import plumy.core.ClientOnly import plumy.core.HeadlessOnly import java.io.File @@ -129,7 +128,6 @@ class CioMod : Mod() { Core.app.post { CioShaderLoader.init() safeCall { - WelcomeList.loadList() Welcome.load() } DebugOnly { diff --git a/main/src/net/liplum/ui/CioUI.kt b/main/src/net/liplum/ui/CioUI.kt index 8553cc13..2e28781c 100644 --- a/main/src/net/liplum/ui/CioUI.kt +++ b/main/src/net/liplum/ui/CioUI.kt @@ -24,16 +24,17 @@ import net.liplum.common.util.getF import net.liplum.common.util.randomExcept import net.liplum.event.CioInitEvent import net.liplum.function.MapCleaner -import net.liplum.utils.IsLocal -import net.liplum.utils.safeCall import net.liplum.ui.settings.* import net.liplum.ui.settings.AnySetting.Companion.addAny import net.liplum.ui.settings.CheckSettingX.Companion.addCheckPref import net.liplum.ui.settings.SliderSettingX.Companion.addSliderSettingX import net.liplum.update.Updater +import net.liplum.utils.IsLocal +import net.liplum.utils.safeCall import net.liplum.welcome.Conditions import net.liplum.welcome.Welcome -import net.liplum.welcome.WelcomeList +import net.liplum.welcome.Welcomes +import net.liplum.welcome.findAll import plumy.core.ClientOnly import plumy.core.NonSteamOnly import plumy.dsl.bundle @@ -166,7 +167,7 @@ object CioUI { Updater.accessJob?.join() if (!failed) { if (Updater.requireUpdate) { - val updateTips = WelcomeList.findAll { tip -> + val updateTips = Welcomes.findAll { tip -> tip.condition == Conditions.CheckUpdate } if (updateTips.isEmpty()) { diff --git a/main/src/net/liplum/welcome/Welcome.kt b/main/src/net/liplum/welcome/Welcome.kt index 5ca1ed9d..ef2c0039 100644 --- a/main/src/net/liplum/welcome/Welcome.kt +++ b/main/src/net/liplum/welcome/Welcome.kt @@ -10,12 +10,12 @@ import mindustry.game.EventType.Trigger import mindustry.io.JsonIO import net.liplum.CioMod import net.liplum.Meta -import net.liplum.Var import net.liplum.Settings.CioVersion import net.liplum.Settings.ClickWelcomeTimes import net.liplum.Settings.LastWelcomeID import net.liplum.Settings.ShouldShowWelcome import net.liplum.Settings.ShowUpdate +import net.liplum.Var import net.liplum.annotations.Only import net.liplum.annotations.SubscribeEvent import net.liplum.blocks.tmtrainer.RandomName @@ -52,7 +52,7 @@ object Welcome { } @JvmStatic fun judgeWelcome() { - val allTips = info.scenes.map { WelcomeList[it] }.distinct().toList() + val allTips = info.scenes.map { Welcomes[it] }.distinct().toList() val tipsCanShow = allTips.filter { it.condition.canShow(it) } val allCandidates = tipsCanShow.allMaxBy { it.condition.priority(it) } if (allCandidates.isEmpty()) { @@ -198,7 +198,7 @@ object Welcome { companion object { fun Entity.showTipByID(id: String): Entity { - tip = WelcomeList[id] + tip = Welcomes[id] showTip() return this } diff --git a/main/src/net/liplum/welcome/WelcomeList.kt b/main/src/net/liplum/welcome/WelcomeList.kt deleted file mode 100644 index adfeb8a5..00000000 --- a/main/src/net/liplum/welcome/WelcomeList.kt +++ /dev/null @@ -1,69 +0,0 @@ -package net.liplum.welcome - -import arc.struct.Seq -import arc.util.serialization.JsonValue -import mindustry.io.JsonIO -import net.liplum.common.Res -import net.liplum.common.util.getValue - -object WelcomeList { - var list: Map = emptyMap() - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun loadList() { - val json = Res("Welcomes.json").readAllText() - val array = JsonIO.json.fromJson(Seq::class.java, json) as Seq - val all = HashMap() - for (entry in array) { - val id = entry.get("ID").asString() - val iconPath: String? = entry.get("IconPath")?.asString() - val template: String? = entry.get("Template")?.asString() - val condition: String? = entry.get("Condition")?.asString() - val chance: Int? = entry.get("Chance")?.asInt() - val data: JsonValue? = entry.get("Data") - all[id] = WelcomeTip().apply { - this.id = id - iconPath?.let { this.iconPath = it } - template?.let { this.templateID = it } - data?.let { j -> - this.data = j.associate { it.name to it.getValue() } - } - condition?.let { this.conditionID = it } - chance?.let { this.chance = it } - } - } - list = all - } - - operator fun get(id: String) = list[id] ?: WelcomeTip.Default - inline fun find(filter: (WelcomeTip) -> Boolean): WelcomeTip? { - return list.values.find(filter) - } - - inline fun findAll(filter: (WelcomeTip) -> Boolean): List { - return list.values.filter(filter) - } -} - -class WelcomeTip { - @JvmField var id: String = DefaultID - @JvmField var conditionID: String = DefaultCondition - @JvmField var templateID: String = DefaultTemplateID - @JvmField var iconPath: String = DefaultIconPath - @JvmField var chance: Int = DefaultChance - @JvmField var data: Map = emptyMap() - override fun toString() = id - val template: WelcomeTemplate - get() = TemplateRegistry[templateID] - val condition: Condition - get() = ConditionRegistry[conditionID] - - companion object { - val Default = WelcomeTip() - const val DefaultID = "Default" - const val DefaultCondition = "ShowWelcome" - const val DefaultTemplateID = "Story" - const val DefaultChance = 1000 - const val DefaultIconPath = "icon" - } -} diff --git a/main/src/net/liplum/welcome/WelcomeTip.kt b/main/src/net/liplum/welcome/WelcomeTip.kt new file mode 100644 index 00000000..d221b591 --- /dev/null +++ b/main/src/net/liplum/welcome/WelcomeTip.kt @@ -0,0 +1,25 @@ +package net.liplum.welcome + +class WelcomeTip( + @JvmField var id: String = DefaultID, + @JvmField var conditionID: String = DefaultCondition, + @JvmField var templateID: String = DefaultTemplateID, + @JvmField var iconPath: String = DefaultIconPath, + @JvmField var chance: Int = DefaultChance, + @JvmField var data: Map = emptyMap(), +) { + override fun toString() = id + val template: WelcomeTemplate + get() = TemplateRegistry[templateID] + val condition: Condition + get() = ConditionRegistry[conditionID] + + companion object { + val Default = WelcomeTip() + const val DefaultID = "Default" + const val DefaultCondition = "ShowWelcome" + const val DefaultTemplateID = "Story" + const val DefaultChance = 1000 + const val DefaultIconPath = "icon" + } +} diff --git a/main/src/net/liplum/welcome/Welcomes.kt b/main/src/net/liplum/welcome/Welcomes.kt new file mode 100644 index 00000000..c13e0ec7 --- /dev/null +++ b/main/src/net/liplum/welcome/Welcomes.kt @@ -0,0 +1,127 @@ +package net.liplum.welcome + +object Welcomes { + val tips = listOf( + WelcomeTip( + id = "Default", + templateID = "Story", + ), + WelcomeTip( + id = "EmploymentVerification", + templateID = "SpecialDishes", + ), + WelcomeTip( + id = "Discord", + templateID = "DoAction", + data = mapOf( + "YesAction" to "OpenLink", + "Link" to "@link", + ), + iconPath = "discord", + chance = 750, + ), + WelcomeTip( + id = "UpdateECHO", + templateID = "Update", + data = mapOf( + "ActionA" to "UpdateCyberIO", + "ActionC" to "@SkipThisUpdate", + ), + iconPath = "update-icon", + conditionID = "CheckUpdate", + ), + WelcomeTip( + id = "ResearchProject", + iconPath = "welcome-holo-project", + conditionID = "SpecialDishes", + ), + WelcomeTip( + id = "TheSHIP", + ), + WelcomeTip( + id = "ECHO", + ), + WelcomeTip( + id = "NewBrains", + iconPath = "heimdall", + ), + WelcomeTip( + id = "AdBlock", + templateID = "DoAction", + iconPath = "ad-block", + data = mapOf( + "NoAction" to "StopReceiveWelcome", + ), + chance = 300, + ), + WelcomeTip( + id = "404NotFound", + templateID = "PlainText", + iconPath = "ad-block", + conditionID = "SettingsReq", + data = mapOf( + "FontSize" to 1.2, + "ShowPoliteWelcome" to false, + "CExpression" to "@ClickWelcomeTimes > 5 && @ShouldShowWelcome", + ), + chance = 200, + ), + WelcomeTip( + id = "OhNo", + iconPath = "@error", + data = mapOf( + "ShowPoliteWelcome" to false, + ), + chance = 200, + ), + WelcomeTip( + id = "RateUs", + templateID = "RateStar", + iconPath = "@error", + data = mapOf( + "StarNumber" to 5, + "InactiveStarIconPath" to "star-inactive", + "ActiveStarIconPath" to "star", + "StarSize" to 60.0, + ), + chance = 200, + ), + WelcomeTip( + id = "ErekirDetected", + iconPath = "spec-erekir", + conditionID = "SpecialDishes", + ), + WelcomeTip( + id = "SetOutErekir", + templateID = "DoAction", + conditionID = "SettingsReq", + iconPath = "spec-erekir", + data = mapOf( + "ShowPoliteWelcome" to true, + "CExpression" to "@ContentSpecific == vanilla && @ShouldShowWelcome", + "YesAction" to "Navigation", + "Locator" to "/CyberIO/ContentSpecific", + ), + ), + WelcomeTip( + id = "CyberionForErekir", + conditionID = "SettingsReq", + iconPath = "cyberion-for-erekir", + data = mapOf( + "ShowPoliteWelcome" to true, + "CExpression" to "@ContentSpecific == erekir && @ShouldShowWelcome", + ), + ), + ) + val id2Tips = tips.associateBy { it.id } + +} + +operator fun Welcomes.get(id: String) = id2Tips[id] ?: WelcomeTip.Default +inline fun Welcomes.find(filter: (WelcomeTip) -> Boolean): WelcomeTip? { + return id2Tips.values.find(filter) +} + +inline fun Welcomes.findAll(filter: (WelcomeTip) -> Boolean): List { + return id2Tips.values.filter(filter) +} \ No newline at end of file diff --git a/meta/Welcomes.json b/meta/Welcomes.json deleted file mode 100644 index 51770421..00000000 --- a/meta/Welcomes.json +++ /dev/null @@ -1,110 +0,0 @@ -[ - { - "ID": "Default", - "Template": "Story" - }, - { - "ID": "EmploymentVerification", - "Template": "SpecialDishes" - }, - { - "ID": "Discord", - "Template": "DoAction", - "Data": { - "YesAction": "OpenLink", - "Link": "@link" - }, - "IconPath": "discord", - "Chance": 750 - }, - { - "ID": "UpdateECHO", - "IconPath": "update-icon", - "Template": "Update", - "Data": { - "ActionA": "UpdateCyberIO", - "ActionC": "SkipThisUpdate" - }, - "Condition": "CheckUpdate" - }, - { - "ID": "ResearchProject", - "Condition": "SpecialDishes", - "IconPath": "welcome-holo-project" - }, - { - "ID": "TheSHIP" - }, - { - "ID": "ECHO" - }, - { - "ID": "NewBrains", - "IconPath": "heimdall" - }, - { - "ID": "AdBlock", - "Template": "DoAction", - "IconPath": "ad-block", - "Data": { - "NoAction": "StopReceiveWelcome" - }, - "Chance": 300 - }, - { - "ID": "404NotFound", - "Template": "PlainText", - "Condition": "SettingsReq", - "Data": { - "FontSize": 1.2, - "ShowPoliteWelcome": false, - "CExpression": "@ClickWelcomeTimes > 5 && @ShouldShowWelcome" - }, - "Chance": 200 - }, - { - "ID": "OhNo", - "IconPath": "@error", - "Data": { - "ShowPoliteWelcome": false - }, - "Chance": 200 - }, - { - "ID": "RateUs", - "Template": "RateStar", - "Data": { - "StarNumber": 5, - "InactiveStarIconPath": "star-inactive", - "ActiveStarIconPath": "star", - "StarSize": 60.0 - }, - "Chance": 200 - }, - { - "ID": "ErekirDetected", - "Condition": "SpecialDishes", - "IconPath": "spec-erekir" - }, - { - "ID": "SetOutErekir", - "Condition": "SettingsReq", - "IconPath": "spec-erekir", - "Template": "DoAction", - "Data": { - "ShowPoliteWelcome": true, - "CExpression": "@ContentSpecific == vanilla && @ShouldShowWelcome", - "YesAction": "Navigation", - "Locator": "/CyberIO/ContentSpecific" - } - }, - { - "ID": "CyberionForErekir", - "Condition": "SettingsReq", - "IconPath": "cyberion-for-erekir", - "Data": { - "ShowPoliteWelcome": true, - "CExpression": "@ContentSpecific == erekir && @ShouldShowWelcome" - } - } -] \ No newline at end of file