From 74f59bd6274647ff44e3d309a7240f92d73c59fd Mon Sep 17 00:00:00 2001 From: yairm210 Date: Sun, 14 Jul 2024 13:48:28 +0300 Subject: [PATCH] Mod CI - Really autoupdate uniques --- .../ruleset/validation/UniqueAutoUpdater.kt | 107 ++++++++++++++++++ .../unciv/ui/popups/options/ModCheckTab.kt | 102 +---------------- .../com/unciv/app/desktop/DesktopLauncher.kt | 2 + 3 files changed, 114 insertions(+), 97 deletions(-) create mode 100644 core/src/com/unciv/models/ruleset/validation/UniqueAutoUpdater.kt diff --git a/core/src/com/unciv/models/ruleset/validation/UniqueAutoUpdater.kt b/core/src/com/unciv/models/ruleset/validation/UniqueAutoUpdater.kt new file mode 100644 index 0000000000..71d8cdb3cb --- /dev/null +++ b/core/src/com/unciv/models/ruleset/validation/UniqueAutoUpdater.kt @@ -0,0 +1,107 @@ +package com.unciv.models.ruleset.validation + +import com.unciv.models.ruleset.Ruleset +import com.unciv.models.ruleset.unique.Unique +import com.unciv.utils.Log +import com.unciv.utils.debug + +object UniqueAutoUpdater{ + + fun autoupdateUniques( + mod: Ruleset, + replaceableUniques: HashMap = getDeprecatedReplaceableUniques(mod) + ) { + val filesToReplace = listOf( + "Beliefs.json", + "Buildings.json", + "Nations.json", + "Policies.json", + "Techs.json", + "Terrains.json", + "TileImprovements.json", + "UnitPromotions.json", + "UnitTypes.json", + "Units.json", + "Ruins.json" + ) + + val jsonFolder = mod.folderLocation!!.child("jsons") + for (fileName in filesToReplace) { + val file = jsonFolder.child(fileName) + if (!file.exists() || file.isDirectory) continue + var newFileText = file.readString() + for ((original, replacement) in replaceableUniques) { + newFileText = newFileText.replace("\"$original\"", "\"$replacement\"") + } + file.writeString(newFileText, false) + } + } + + + + fun getDeprecatedReplaceableUniques(mod: Ruleset): HashMap { + + val objectsToCheck = sequenceOf( + mod.beliefs, + mod.buildings, + mod.nations, + mod.policies, + mod.technologies, + mod.terrains, + mod.tileImprovements, + mod.unitPromotions, + mod.unitTypes, + mod.units, + mod.ruinRewards + ) + val allDeprecatedUniques = HashSet() + val deprecatedUniquesToReplacementText = HashMap() + + val deprecatedUniques = objectsToCheck + .flatMap { it.values } + .flatMap { it.uniqueObjects } + .filter { it.getDeprecationAnnotation() != null } + + for (deprecatedUnique in deprecatedUniques) { + if (allDeprecatedUniques.contains(deprecatedUnique.text)) continue + allDeprecatedUniques.add(deprecatedUnique.text) + + // note that this replacement does not contain conditionals attached to the original! + + + var uniqueReplacementText = deprecatedUnique.getReplacementText(mod) + while (Unique(uniqueReplacementText).getDeprecationAnnotation() != null) + uniqueReplacementText = Unique(uniqueReplacementText).getReplacementText(mod) + + for (conditional in deprecatedUnique.conditionals) + uniqueReplacementText += " <${conditional.text}>" + val replacementUnique = Unique(uniqueReplacementText) + + val modInvariantErrors = UniqueValidator(mod).checkUnique( + replacementUnique, + false, + null, + true + ) + for (error in modInvariantErrors) + Log.error("ModInvariantError: %s - %s", error.text, error.errorSeverityToReport) + if (modInvariantErrors.isNotEmpty()) continue // errors means no autoreplace + + if (mod.modOptions.isBaseRuleset) { + val modSpecificErrors = UniqueValidator(mod).checkUnique( + replacementUnique, + false, + null, + true + ) + for (error in modSpecificErrors) + Log.error("ModSpecificError: %s - %s", error.text, error.errorSeverityToReport) + if (modSpecificErrors.isNotEmpty()) continue + } + + deprecatedUniquesToReplacementText[deprecatedUnique.text] = uniqueReplacementText + debug("Replace \"%s\" with \"%s\"", deprecatedUnique.text, uniqueReplacementText) + } + return deprecatedUniquesToReplacementText + } +} \ No newline at end of file diff --git a/core/src/com/unciv/ui/popups/options/ModCheckTab.kt b/core/src/com/unciv/ui/popups/options/ModCheckTab.kt index c558b68ab3..e32eba69be 100644 --- a/core/src/com/unciv/ui/popups/options/ModCheckTab.kt +++ b/core/src/com/unciv/ui/popups/options/ModCheckTab.kt @@ -8,9 +8,8 @@ import com.badlogic.gdx.utils.Align import com.unciv.UncivGame import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache -import com.unciv.models.ruleset.unique.Unique import com.unciv.models.ruleset.validation.RulesetErrorSeverity -import com.unciv.models.ruleset.validation.UniqueValidator +import com.unciv.models.ruleset.validation.UniqueAutoUpdater import com.unciv.models.translations.tr import com.unciv.ui.components.extensions.surroundWithCircle import com.unciv.ui.components.extensions.toLabel @@ -25,8 +24,6 @@ import com.unciv.ui.popups.ToastPopup import com.unciv.ui.screens.UniqueBuilderScreen import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.utils.Concurrency -import com.unciv.utils.Log -import com.unciv.utils.debug import com.unciv.utils.launchOnGLThread @@ -137,7 +134,7 @@ class ModCheckTab( it.add(openUniqueBuilderButton).row() if (!noProblem && mod.folderLocation != null) { - val replaceableUniques = getDeprecatedReplaceableUniques(mod) + val replaceableUniques = UniqueAutoUpdater.getDeprecatedReplaceableUniques(mod) if (replaceableUniques.isNotEmpty()) it.add("Autoupdate mod uniques".toTextButton() .onClick { autoUpdateUniques(screen, mod, replaceableUniques) }).row() @@ -172,101 +169,12 @@ class ModCheckTab( } - private fun getDeprecatedReplaceableUniques(mod: Ruleset): HashMap { - - val objectsToCheck = sequenceOf( - mod.beliefs, - mod.buildings, - mod.nations, - mod.policies, - mod.technologies, - mod.terrains, - mod.tileImprovements, - mod.unitPromotions, - mod.unitTypes, - mod.units, - mod.ruinRewards - ) - val allDeprecatedUniques = HashSet() - val deprecatedUniquesToReplacementText = HashMap() - - val deprecatedUniques = objectsToCheck - .flatMap { it.values } - .flatMap { it.uniqueObjects } - .filter { it.getDeprecationAnnotation() != null } - - - for (deprecatedUnique in deprecatedUniques) { - if (allDeprecatedUniques.contains(deprecatedUnique.text)) continue - allDeprecatedUniques.add(deprecatedUnique.text) - - // note that this replacement does not contain conditionals attached to the original! - - - var uniqueReplacementText = deprecatedUnique.getReplacementText(mod) - while (Unique(uniqueReplacementText).getDeprecationAnnotation() != null) - uniqueReplacementText = Unique(uniqueReplacementText).getReplacementText(mod) - - for (conditional in deprecatedUnique.conditionals) - uniqueReplacementText += " <${conditional.text}>" - val replacementUnique = Unique(uniqueReplacementText) - - val modInvariantErrors = UniqueValidator(mod).checkUnique( - replacementUnique, - false, - null, - true - ) - for (error in modInvariantErrors) - Log.error("ModInvariantError: %s - %s", error.text, error.errorSeverityToReport) - if (modInvariantErrors.isNotEmpty()) continue // errors means no autoreplace - - if (mod.modOptions.isBaseRuleset) { - val modSpecificErrors = UniqueValidator(mod).checkUnique( - replacementUnique, - false, - null, - true - ) - for (error in modSpecificErrors) - Log.error("ModSpecificError: %s - %s", error.text, error.errorSeverityToReport) - if (modSpecificErrors.isNotEmpty()) continue - } - - deprecatedUniquesToReplacementText[deprecatedUnique.text] = uniqueReplacementText - debug("Replace \"%s\" with \"%s\"", deprecatedUnique.text, uniqueReplacementText) - } - return deprecatedUniquesToReplacementText - } - private fun autoUpdateUniques(screen: BaseScreen, mod: Ruleset, replaceableUniques: HashMap) { - - val filesToReplace = listOf( - "Beliefs.json", - "Buildings.json", - "Nations.json", - "Policies.json", - "Techs.json", - "Terrains.json", - "TileImprovements.json", - "UnitPromotions.json", - "UnitTypes.json", - "Units.json", - "Ruins.json" - ) - - val jsonFolder = mod.folderLocation!!.child("jsons") - for (fileName in filesToReplace) { - val file = jsonFolder.child(fileName) - if (!file.exists() || file.isDirectory) continue - var newFileText = file.readString() - for ((original, replacement) in replaceableUniques) { - newFileText = newFileText.replace("\"$original\"", "\"$replacement\"") - } - file.writeString(newFileText, false) - } + UniqueAutoUpdater.autoupdateUniques(mod, replaceableUniques) val toastText = "Uniques updated!" ToastPopup(toastText, screen) runModChecker() } + } + diff --git a/desktop/src/com/unciv/app/desktop/DesktopLauncher.kt b/desktop/src/com/unciv/app/desktop/DesktopLauncher.kt index 25ffbc6cc3..c27befd30d 100644 --- a/desktop/src/com/unciv/app/desktop/DesktopLauncher.kt +++ b/desktop/src/com/unciv/app/desktop/DesktopLauncher.kt @@ -13,6 +13,7 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache import com.unciv.models.ruleset.validation.RulesetErrorSeverity import com.unciv.models.ruleset.validation.RulesetValidator +import com.unciv.models.ruleset.validation.UniqueAutoUpdater import com.unciv.ui.components.fonts.Fonts import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.utils.Display @@ -36,6 +37,7 @@ internal object DesktopLauncher { // Load the actual ruleset here ruleset.load(jsonsFolder) } + UniqueAutoUpdater.autoupdateUniques(ruleset) val errors = RulesetValidator(ruleset).getErrorList(true) println(errors.getErrorText(true)) exitProcess(if (errors.any { it.errorSeverityToReport == RulesetErrorSeverity.Error }) 1 else 0)