mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-21 05:09:25 +07:00
Simplified mod management, in preparation for mod information within the maps
This commit is contained in:
@ -498,14 +498,15 @@ open class TileInfo {
|
|||||||
&& (terrainFeature == Constants.jungle || terrainFeature == Constants.forest)
|
&& (terrainFeature == Constants.jungle || terrainFeature == Constants.forest)
|
||||||
&& isFriendlyTerritory(civInfo)
|
&& isFriendlyTerritory(civInfo)
|
||||||
|
|
||||||
fun isRulesetCompatible(ruleset: Ruleset): Boolean {
|
fun getRulesetIncompatability(ruleset: Ruleset):String{
|
||||||
if (!ruleset.terrains.containsKey(baseTerrain)) return false
|
if (!ruleset.terrains.containsKey(baseTerrain)) return "Base terrain $baseTerrain does not exist in ruleset!"
|
||||||
if (terrainFeature != null && !ruleset.terrains.containsKey(terrainFeature)) return false
|
if (terrainFeature != null && !ruleset.terrains.containsKey(terrainFeature)) return "Terrain feature $terrainFeature does not exist in ruleset!"
|
||||||
if (resource != null && !ruleset.tileResources.containsKey(resource)) return false
|
if (resource != null && !ruleset.tileResources.containsKey(resource)) return "Resource $resource does not exist in ruleset!"
|
||||||
if (improvement != null && !ruleset.tileImprovements.containsKey(baseTerrain)) return false
|
if (improvement != null && !ruleset.tileImprovements.containsKey(baseTerrain)) return "Improvement $improvement does not exist in ruleset!"
|
||||||
return true
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
//region state-changing functions
|
//region state-changing functions
|
||||||
@ -515,6 +516,8 @@ open class TileInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setTerrainTransients() {
|
fun setTerrainTransients() {
|
||||||
|
if (!ruleset.terrains.containsKey(baseTerrain))
|
||||||
|
throw Exception()
|
||||||
baseTerrainObject = ruleset.terrains[baseTerrain]!!
|
baseTerrainObject = ruleset.terrains[baseTerrain]!!
|
||||||
isWater = getBaseTerrain().type == TerrainType.Water
|
isWater = getBaseTerrain().type == TerrainType.Water
|
||||||
isLand = getBaseTerrain().type == TerrainType.Land
|
isLand = getBaseTerrain().type == TerrainType.Land
|
||||||
|
@ -352,13 +352,13 @@ object RulesetCache :HashMap<String,Ruleset>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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 {
|
fun getComplexRuleset(gameParameters: GameParameters): Ruleset {
|
||||||
val newRuleset = Ruleset()
|
val newRuleset = Ruleset()
|
||||||
val loadedMods = gameParameters.mods.filter { containsKey(it) }.map { this[it]!! }
|
val loadedMods = gameParameters.mods.filter { containsKey(it) }.map { this[it]!! }
|
||||||
if (loadedMods.none { it.modOptions.isBaseRuleset })
|
if (loadedMods.none { it.modOptions.isBaseRuleset })
|
||||||
newRuleset.add(this[gameParameters.baseRuleset.fullName]!!)
|
newRuleset.add(getBaseRuleset())
|
||||||
for (mod in loadedMods.sortedByDescending { it.modOptions.isBaseRuleset }) {
|
for (mod in loadedMods.sortedByDescending { it.modOptions.isBaseRuleset }) {
|
||||||
newRuleset.add(mod)
|
newRuleset.add(mod)
|
||||||
newRuleset.mods += mod.name
|
newRuleset.mods += mod.name
|
||||||
|
@ -13,13 +13,14 @@ import com.unciv.ui.utils.toLabel
|
|||||||
class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraStageBaseScreen, onUpdate: (String) -> Unit): Table(){
|
class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraStageBaseScreen, onUpdate: (String) -> Unit): Table(){
|
||||||
init {
|
init {
|
||||||
val modRulesets = RulesetCache.values.filter { it.name != "" }
|
val modRulesets = RulesetCache.values.filter { it.name != "" }
|
||||||
|
val mods = gameParameters.mods
|
||||||
|
|
||||||
val baseRulesetCheckboxes = ArrayList<CheckBox>()
|
val baseRulesetCheckboxes = ArrayList<CheckBox>()
|
||||||
val extentionRulesetModButtons = ArrayList<CheckBox>()
|
val extentionRulesetModButtons = ArrayList<CheckBox>()
|
||||||
|
|
||||||
for (mod in modRulesets) {
|
for (mod in modRulesets) {
|
||||||
val checkBox = CheckBox(mod.name.tr(), CameraStageBaseScreen.skin)
|
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 {
|
checkBox.onChange {
|
||||||
if (checkBox.isChecked) {
|
if (checkBox.isChecked) {
|
||||||
val modLinkErrors = mod.checkModLinks()
|
val modLinkErrors = mod.checkModLinks()
|
||||||
@ -29,19 +30,19 @@ class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraSta
|
|||||||
return@onChange
|
return@onChange
|
||||||
}
|
}
|
||||||
|
|
||||||
val previousMods = gameParameters.mods.toList()
|
val previousMods = mods.toList()
|
||||||
|
|
||||||
if (mod.modOptions.isBaseRuleset)
|
if (mod.modOptions.isBaseRuleset)
|
||||||
for (oldBaseRuleset in previousMods) // so we don't get concurrent modification excpetions
|
for (oldBaseRuleset in previousMods) // so we don't get concurrent modification excpetions
|
||||||
if (modRulesets.firstOrNull { it.name == oldBaseRuleset }?.modOptions?.isBaseRuleset == true)
|
if (modRulesets.firstOrNull { it.name == oldBaseRuleset }?.modOptions?.isBaseRuleset == true)
|
||||||
gameParameters.mods.remove(oldBaseRuleset)
|
mods.remove(oldBaseRuleset)
|
||||||
gameParameters.mods.add(mod.name)
|
mods.add(mod.name)
|
||||||
|
|
||||||
var isCompatibleWithCurrentRuleset = true
|
var isCompatibleWithCurrentRuleset = true
|
||||||
var complexModLinkErrors = ""
|
var complexModLinkErrors = ""
|
||||||
try {
|
try {
|
||||||
val newRuleset = RulesetCache.getComplexRuleset(gameParameters)
|
val newRuleset = RulesetCache.getComplexRuleset(gameParameters)
|
||||||
newRuleset.modOptions.isBaseRuleset = true
|
newRuleset.modOptions.isBaseRuleset = true // This is so the checkModLinks finds all connections
|
||||||
complexModLinkErrors = newRuleset.checkModLinks()
|
complexModLinkErrors = newRuleset.checkModLinks()
|
||||||
if (complexModLinkErrors != "") isCompatibleWithCurrentRuleset = false
|
if (complexModLinkErrors != "") isCompatibleWithCurrentRuleset = false
|
||||||
} catch (x: Exception) {
|
} catch (x: Exception) {
|
||||||
@ -53,13 +54,13 @@ class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraSta
|
|||||||
if (!isCompatibleWithCurrentRuleset) {
|
if (!isCompatibleWithCurrentRuleset) {
|
||||||
ToastPopup("The mod you selected is incompatible with the defined ruleset!\n\n$complexModLinkErrors", screen)
|
ToastPopup("The mod you selected is incompatible with the defined ruleset!\n\n$complexModLinkErrors", screen)
|
||||||
checkBox.isChecked = false
|
checkBox.isChecked = false
|
||||||
gameParameters.mods.clear()
|
mods.clear()
|
||||||
gameParameters.mods.addAll(previousMods)
|
mods.addAll(previousMods)
|
||||||
return@onChange
|
return@onChange
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
gameParameters.mods.remove(mod.name)
|
mods.remove(mod.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
onUpdate(mod.name)
|
onUpdate(mod.name)
|
||||||
|
Reference in New Issue
Block a user