mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-04 07:17:50 +07:00
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:
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user