From a9fe8c42d89c4b792806791874308de7c4938122 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 12 Feb 2021 10:42:35 +0200 Subject: [PATCH] Simplified mod management, in preparation for mod information within the maps --- core/src/com/unciv/logic/map/TileInfo.kt | 15 +++++++++------ core/src/com/unciv/models/ruleset/Ruleset.kt | 4 ++-- .../unciv/ui/newgamescreen/ModCheckboxTable.kt | 17 +++++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index de6bf7b7b8..c2f7d96b95 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -498,14 +498,15 @@ open class TileInfo { && (terrainFeature == Constants.jungle || terrainFeature == Constants.forest) && isFriendlyTerritory(civInfo) - fun isRulesetCompatible(ruleset: Ruleset): Boolean { - if (!ruleset.terrains.containsKey(baseTerrain)) return false - if (terrainFeature != null && !ruleset.terrains.containsKey(terrainFeature)) return false - if (resource != null && !ruleset.tileResources.containsKey(resource)) return false - if (improvement != null && !ruleset.tileImprovements.containsKey(baseTerrain)) return false - return true + fun getRulesetIncompatability(ruleset: Ruleset):String{ + if (!ruleset.terrains.containsKey(baseTerrain)) return "Base terrain $baseTerrain does not exist in ruleset!" + if (terrainFeature != null && !ruleset.terrains.containsKey(terrainFeature)) return "Terrain feature $terrainFeature does not exist in ruleset!" + if (resource != null && !ruleset.tileResources.containsKey(resource)) return "Resource $resource does not exist in ruleset!" + if (improvement != null && !ruleset.tileImprovements.containsKey(baseTerrain)) return "Improvement $improvement does not exist in ruleset!" + return "" } + //endregion //region state-changing functions @@ -515,6 +516,8 @@ open class TileInfo { } fun setTerrainTransients() { + if (!ruleset.terrains.containsKey(baseTerrain)) + throw Exception() baseTerrainObject = ruleset.terrains[baseTerrain]!! isWater = getBaseTerrain().type == TerrainType.Water isLand = getBaseTerrain().type == TerrainType.Land diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index f89a7d20bb..9d2febe918 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -352,13 +352,13 @@ object RulesetCache :HashMap() { } - fun getBaseRuleset() = this[BaseRuleset.Civ_V_Vanilla.fullName]!! + fun getBaseRuleset() = this[BaseRuleset.Civ_V_Vanilla.fullName]!!.clone() // safeguard, o no-one edits the base ruleset by mistake fun getComplexRuleset(gameParameters: GameParameters): Ruleset { val newRuleset = Ruleset() val loadedMods = gameParameters.mods.filter { containsKey(it) }.map { this[it]!! } if (loadedMods.none { it.modOptions.isBaseRuleset }) - newRuleset.add(this[gameParameters.baseRuleset.fullName]!!) + newRuleset.add(getBaseRuleset()) for (mod in loadedMods.sortedByDescending { it.modOptions.isBaseRuleset }) { newRuleset.add(mod) newRuleset.mods += mod.name diff --git a/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt b/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt index 3abbb99ff1..fc923b8f8e 100644 --- a/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt @@ -13,13 +13,14 @@ import com.unciv.ui.utils.toLabel class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraStageBaseScreen, onUpdate: (String) -> Unit): Table(){ init { val modRulesets = RulesetCache.values.filter { it.name != "" } + val mods = gameParameters.mods val baseRulesetCheckboxes = ArrayList() val extentionRulesetModButtons = ArrayList() for (mod in modRulesets) { val checkBox = CheckBox(mod.name.tr(), CameraStageBaseScreen.skin) - if (mod.name in gameParameters.mods) checkBox.isChecked = true + if (mod.name in mods) checkBox.isChecked = true checkBox.onChange { if (checkBox.isChecked) { val modLinkErrors = mod.checkModLinks() @@ -29,19 +30,19 @@ class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraSta return@onChange } - val previousMods = gameParameters.mods.toList() + val previousMods = mods.toList() if (mod.modOptions.isBaseRuleset) for (oldBaseRuleset in previousMods) // so we don't get concurrent modification excpetions if (modRulesets.firstOrNull { it.name == oldBaseRuleset }?.modOptions?.isBaseRuleset == true) - gameParameters.mods.remove(oldBaseRuleset) - gameParameters.mods.add(mod.name) + mods.remove(oldBaseRuleset) + mods.add(mod.name) var isCompatibleWithCurrentRuleset = true var complexModLinkErrors = "" try { val newRuleset = RulesetCache.getComplexRuleset(gameParameters) - newRuleset.modOptions.isBaseRuleset = true + newRuleset.modOptions.isBaseRuleset = true // This is so the checkModLinks finds all connections complexModLinkErrors = newRuleset.checkModLinks() if (complexModLinkErrors != "") isCompatibleWithCurrentRuleset = false } catch (x: Exception) { @@ -53,13 +54,13 @@ class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraSta if (!isCompatibleWithCurrentRuleset) { ToastPopup("The mod you selected is incompatible with the defined ruleset!\n\n$complexModLinkErrors", screen) checkBox.isChecked = false - gameParameters.mods.clear() - gameParameters.mods.addAll(previousMods) + mods.clear() + mods.addAll(previousMods) return@onChange } } else { - gameParameters.mods.remove(mod.name) + mods.remove(mod.name) } onUpdate(mod.name)