Splitting of vanilla and gods & kings rulesets -- Part 1: Groundwork (#5577)

* Copied files for Gods & Kings folder

* Added G&K and unified with mods in dropdown
This commit is contained in:
Xander Lenstra
2021-10-28 17:02:30 +02:00
committed by GitHub
parent defc9262c2
commit db6e588479
24 changed files with 8393 additions and 23 deletions

View File

@ -2,10 +2,13 @@ package com.unciv.models.metadata
import com.unciv.Constants
import com.unciv.logic.civilization.PlayerType
import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.RulesetCache
import com.unciv.models.ruleset.VictoryType
enum class BaseRuleset(val fullName:String){
Civ_V_Vanilla("Civ V - Vanilla"),
Civ_V_GnK("Civ V - Gods & Kings"),
}
class GameParameters { // Default values are the default new game
@ -29,8 +32,7 @@ class GameParameters { // Default values are the default new game
var startingEra = "Ancient era"
var isOnlineMultiplayer = false
var baseRuleset: BaseRuleset = BaseRuleset.Civ_V_Vanilla
var mods = LinkedHashSet<String>()
var mods = LinkedHashSet<String>(listOf(BaseRuleset.Civ_V_Vanilla.fullName))
fun clone(): GameParameters {
val parameters = GameParameters()
@ -46,7 +48,6 @@ class GameParameters { // Default values are the default new game
parameters.victoryTypes = ArrayList(victoryTypes)
parameters.startingEra = startingEra
parameters.isOnlineMultiplayer = isOnlineMultiplayer
parameters.baseRuleset = baseRuleset
parameters.mods = LinkedHashSet(mods)
return parameters
}

View File

@ -607,9 +607,13 @@ object RulesetCache : HashMap<String,Ruleset>() {
clear()
for (ruleset in BaseRuleset.values()) {
val fileName = "jsons/${ruleset.fullName}"
val fileHandle = if (consoleMode) FileHandle(fileName)
else Gdx.files.internal(fileName)
this[ruleset.fullName] = Ruleset().apply { load(fileHandle, printOutput) }
val fileHandle =
if (consoleMode) FileHandle(fileName)
else Gdx.files.internal(fileName)
this[ruleset.fullName] = Ruleset().apply {
load(fileHandle, printOutput)
name = ruleset.fullName
}
}
if (noMods) return

View File

@ -135,11 +135,45 @@ class GameOptionsTable(
}
private fun Table.addBaseRulesetSelectBox() {
if (BaseRuleset.values().size < 2) return
addSelectBox("{Base Ruleset}:", BaseRuleset.values().map { it.fullName }, gameParameters.baseRuleset.fullName)
{
gameParameters.baseRuleset = BaseRuleset.values().first { br -> br.fullName == it }
val baseRulesets =
RulesetCache.values
.filter { it.modOptions.isBaseRuleset }
.map { it.name }
.distinct()
if (baseRulesets.size < 2) return
// We sort the base rulesets such that the ones unciv provides are on the top,
// and the rest is alphabetically ordered.
val sortedBaseRulesets = baseRulesets.sortedWith(
compareBy(
{ ruleset ->
BaseRuleset.values()
.firstOrNull { br -> br.fullName == ruleset }?.ordinal
?: BaseRuleset.values().size
},
{ it }
)
)
addSelectBox(
"{Base Ruleset}:",
sortedBaseRulesets,
gameParameters.mods.first { RulesetCache[it]!!.modOptions.isBaseRuleset }
) { modToAdd ->
val old = gameParameters.mods.first { RulesetCache[it]!!.modOptions.isBaseRuleset }
// So there is a call loop here: addSelectBox -> onChange() -> update() -> getGameOptionsTable() -> addBaseRulesetSelectBox() -> addSelectBox()
// To prevent stack overflow errors, this loop needs to be broken _somewhere_, and this
// is the most 'local' place to do it.
if (old == modToAdd) return@addSelectBox
gameParameters.mods = LinkedHashSet(
listOf(
*gameParameters.mods
.filter { !RulesetCache[it]!!.modOptions.isBaseRuleset }
.toTypedArray(),
modToAdd
)
)
reloadRuleset()
update()
}
}

View File

@ -14,7 +14,7 @@ class ModCheckboxTable(
isPortrait: Boolean = false,
onUpdate: (String) -> Unit
): Table(){
private val modRulesets = RulesetCache.values.filter { it.name != "" }
private val modRulesets = RulesetCache.values.filter { it.name != "" && !it.modOptions.isBaseRuleset}
private val baseRulesetCheckboxes = ArrayList<CheckBox>()
private var lastToast: ToastPopup? = null
@ -29,22 +29,11 @@ class ModCheckboxTable(
onUpdate(mod.name)
}
}
if (mod.modOptions.isBaseRuleset) baseRulesetCheckboxes.add(checkBox)
else extensionRulesetModButtons.add(checkBox)
extensionRulesetModButtons.add(checkBox)
}
val padTop = if (isPortrait) 0f else 16f
if (baseRulesetCheckboxes.any()) {
add(ExpanderTab("Base ruleset mods:", persistenceID = "NewGameBaseMods") {
it.defaults().pad(5f,0f)
for (checkbox in baseRulesetCheckboxes) it.add(checkbox).row()
}).padTop(padTop).growX().row()
}
if (isPortrait && baseRulesetCheckboxes.any() && extensionRulesetModButtons.any())
addSeparator(Color.DARK_GRAY, height = 1f)
if (extensionRulesetModButtons.any()) {
add(ExpanderTab("Extension mods:", persistenceID = "NewGameExpansionMods") {
it.defaults().pad(5f,0f)