mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-21 13:18:56 +07:00
Mod CI - Really autoupdate uniques
This commit is contained in:
@ -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<String, String> = 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<String, String> {
|
||||||
|
|
||||||
|
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<String>()
|
||||||
|
val deprecatedUniquesToReplacementText = HashMap<String, String>()
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -8,9 +8,8 @@ import com.badlogic.gdx.utils.Align
|
|||||||
import com.unciv.UncivGame
|
import com.unciv.UncivGame
|
||||||
import com.unciv.models.ruleset.Ruleset
|
import com.unciv.models.ruleset.Ruleset
|
||||||
import com.unciv.models.ruleset.RulesetCache
|
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.RulesetErrorSeverity
|
||||||
import com.unciv.models.ruleset.validation.UniqueValidator
|
import com.unciv.models.ruleset.validation.UniqueAutoUpdater
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.components.extensions.surroundWithCircle
|
import com.unciv.ui.components.extensions.surroundWithCircle
|
||||||
import com.unciv.ui.components.extensions.toLabel
|
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.UniqueBuilderScreen
|
||||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||||
import com.unciv.utils.Concurrency
|
import com.unciv.utils.Concurrency
|
||||||
import com.unciv.utils.Log
|
|
||||||
import com.unciv.utils.debug
|
|
||||||
import com.unciv.utils.launchOnGLThread
|
import com.unciv.utils.launchOnGLThread
|
||||||
|
|
||||||
|
|
||||||
@ -137,7 +134,7 @@ class ModCheckTab(
|
|||||||
it.add(openUniqueBuilderButton).row()
|
it.add(openUniqueBuilderButton).row()
|
||||||
|
|
||||||
if (!noProblem && mod.folderLocation != null) {
|
if (!noProblem && mod.folderLocation != null) {
|
||||||
val replaceableUniques = getDeprecatedReplaceableUniques(mod)
|
val replaceableUniques = UniqueAutoUpdater.getDeprecatedReplaceableUniques(mod)
|
||||||
if (replaceableUniques.isNotEmpty())
|
if (replaceableUniques.isNotEmpty())
|
||||||
it.add("Autoupdate mod uniques".toTextButton()
|
it.add("Autoupdate mod uniques".toTextButton()
|
||||||
.onClick { autoUpdateUniques(screen, mod, replaceableUniques) }).row()
|
.onClick { autoUpdateUniques(screen, mod, replaceableUniques) }).row()
|
||||||
@ -172,101 +169,12 @@ class ModCheckTab(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun getDeprecatedReplaceableUniques(mod: Ruleset): HashMap<String, String> {
|
|
||||||
|
|
||||||
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<String>()
|
|
||||||
val deprecatedUniquesToReplacementText = HashMap<String, String>()
|
|
||||||
|
|
||||||
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<String, String>) {
|
private fun autoUpdateUniques(screen: BaseScreen, mod: Ruleset, replaceableUniques: HashMap<String, String>) {
|
||||||
|
UniqueAutoUpdater.autoupdateUniques(mod, replaceableUniques)
|
||||||
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)
|
|
||||||
}
|
|
||||||
val toastText = "Uniques updated!"
|
val toastText = "Uniques updated!"
|
||||||
ToastPopup(toastText, screen)
|
ToastPopup(toastText, screen)
|
||||||
runModChecker()
|
runModChecker()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ import com.unciv.models.ruleset.Ruleset
|
|||||||
import com.unciv.models.ruleset.RulesetCache
|
import com.unciv.models.ruleset.RulesetCache
|
||||||
import com.unciv.models.ruleset.validation.RulesetErrorSeverity
|
import com.unciv.models.ruleset.validation.RulesetErrorSeverity
|
||||||
import com.unciv.models.ruleset.validation.RulesetValidator
|
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.components.fonts.Fonts
|
||||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||||
import com.unciv.utils.Display
|
import com.unciv.utils.Display
|
||||||
@ -36,6 +37,7 @@ internal object DesktopLauncher {
|
|||||||
// Load the actual ruleset here
|
// Load the actual ruleset here
|
||||||
ruleset.load(jsonsFolder)
|
ruleset.load(jsonsFolder)
|
||||||
}
|
}
|
||||||
|
UniqueAutoUpdater.autoupdateUniques(ruleset)
|
||||||
val errors = RulesetValidator(ruleset).getErrorList(true)
|
val errors = RulesetValidator(ruleset).getErrorList(true)
|
||||||
println(errors.getErrorText(true))
|
println(errors.getErrorText(true))
|
||||||
exitProcess(if (errors.any { it.errorSeverityToReport == RulesetErrorSeverity.Error }) 1 else 0)
|
exitProcess(if (errors.any { it.errorSeverityToReport == RulesetErrorSeverity.Error }) 1 else 0)
|
||||||
|
Reference in New Issue
Block a user