Added validations for city-state uniques

This commit is contained in:
Yair Morgenstern
2022-11-21 23:03:52 +02:00
parent ee2ab74715
commit e83e733104
5 changed files with 52 additions and 145 deletions

View File

@ -39,7 +39,7 @@
"color": [255, 0, 0] "color": [255, 0, 0]
}, },
{ {
"name":"Religious", "name": "Religious",
"friendBonusUniques": [ "friendBonusUniques": [
"[+3 Faith] <before the [Medieval era]>", "[+3 Faith] <before the [Medieval era]>",
"[+6 Faith] <starting from the [Medieval era]> <before the [Industrial era]>", "[+6 Faith] <starting from the [Medieval era]> <before the [Industrial era]>",

View File

@ -1,32 +1,55 @@
[ [
{ {
"name":"Cultured", "name": "Cultured",
"friendBonusUniques": ["[+3 Culture]"], "friendBonusUniques": [
"allyBonusUniques": ["[+6 Culture]"], "[+3 Culture] <before the [Medieval era]>",
"[+6 Culture] <starting from the [Medieval era]> <before the [Industrial era]>",
"[+13 Culture] <starting from the [Industrial era]>"
],
"allyBonusUniques": [
"[+6 Culture] <before the [Medieval era]>",
"[+12 Culture] <starting from the [Medieval era]> <before the [Industrial era]>",
"[+26 Culture] <starting from the [Industrial era]>"
],
"color": [139, 96, 255] "color": [139, 96, 255]
}, },
{ {
"name":"Maritime", "name": "Maritime",
"friendBonusUniques": ["[+2 Food] [in capital]"], "friendBonusUniques": ["[+2 Food] [in capital]"],
"allyBonusUniques": ["[+2 Food] [in capital]", "[+1 Food] [in all cities]"], "allyBonusUniques": ["[+2 Food] [in capital]", "[+1 Food] [in all cities]"],
"color": [56, 255, 112] "color": [56, 255, 112]
}, },
{ {
"name":"Mercantile", "name": "Mercantile",
"friendBonusUniques": ["[+2 Happiness]"], "friendBonusUniques": [
"allyBonusUniques": ["[+2 Happiness]", "Provides a unique luxury"], "[+2 Happiness] <before the [Medieval era]>",
"[+3 Happiness] <starting from the [Medieval era]>"
],
"allyBonusUniques": [
"[+2 Happiness] <before the [Medieval era]>",
"[+3 Happiness] <starting from the [Medieval era]>",
"Provides a unique luxury"
],
"color": [255, 216, 0] "color": [255, 216, 0]
}, },
{ {
"name":"Militaristic", "name": "Militaristic",
"friendBonusUniques": ["Provides military units every ≈[20] turns"], "friendBonusUniques": ["Provides military units every ≈[20] turns"],
"allyBonusUniques": ["Provides military units every ≈[17] turns"], "allyBonusUniques": ["Provides military units every ≈[17] turns"],
"color": [255, 0, 0] "color": [255, 0, 0]
}, },
{ {
"name":"Religious", "name":"Religious",
"friendBonusUniques": ["[+3 Faith]"], "friendBonusUniques": [
"allyBonusUniques": ["[+6 Faith]"], "[+3 Faith] <before the [Medieval era]>",
"[+6 Faith] <starting from the [Medieval era]> <before the [Industrial era]>",
"[+13 Faith] <starting from the [Industrial era]>"
],
"allyBonusUniques": [
"[+6 Faith] <before the [Medieval era]>",
"[+12 Faith] <starting from the [Medieval era]> <before the [Industrial era]>",
"[+26 Faith] <starting from the [Industrial era]>"
],
"color": [255, 255, 255] "color": [255, 255, 255]
} }
] ]

View File

@ -14,20 +14,6 @@
"embarkDefense": 3, "embarkDefense": 3,
"startPercent": 0, "startPercent": 0,
"citySound": "cityAncient", "citySound": "cityAncient",
"friendBonus": {
"Cultured": ["Provides [+3 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+2] Happiness"],
"Religious": ["Provides [+3 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+6 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+2] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+6 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [255, 87, 35] "iconRGB": [255, 87, 35]
}, },
{ {
@ -44,20 +30,6 @@
"embarkDefense": 4, "embarkDefense": 4,
"startPercent": 10, "startPercent": 10,
"citySound": "cityClassical", "citySound": "cityClassical",
"friendBonus": {
"Cultured": ["Provides [+3 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+2] Happiness"],
"Religious": ["Provides [+3 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+6 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+2] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+6 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [233, 31, 99] "iconRGB": [233, 31, 99]
}, },
{ {
@ -76,20 +48,6 @@
"embarkDefense": 6, "embarkDefense": 6,
"startPercent": 25, "startPercent": 25,
"citySound": "cityMedieval", "citySound": "cityMedieval",
"friendBonus": {
"Cultured": ["Provides [+6 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+6 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+12 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+12 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [157, 39, 176] "iconRGB": [157, 39, 176]
}, },
{ {
@ -109,20 +67,6 @@
"embarkDefense": 8, "embarkDefense": 8,
"startPercent": 37, "startPercent": 37,
"citySound": "cityRenaissance", "citySound": "cityRenaissance",
"friendBonus": {
"Cultured": ["Provides [+6 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+6 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+12 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+12 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [104, 58, 183] "iconRGB": [104, 58, 183]
}, },
{ {
@ -143,20 +87,6 @@
"embarkDefense": 10, "embarkDefense": 10,
"startPercent": 50, "startPercent": 50,
"citySound": "cityIndustrial", "citySound": "cityIndustrial",
"friendBonus": {
"Cultured": ["Provides [+13 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+13 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+26 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+26 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [63, 81, 182], "iconRGB": [63, 81, 182],
}, },
{ {
@ -178,20 +108,6 @@
"embarkDefense": 13, "embarkDefense": 13,
"startPercent": 65, "startPercent": 65,
"citySound": "cityModern", "citySound": "cityModern",
"friendBonus": {
"Cultured": ["Provides [+13 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+13 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+26 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+26 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [33, 150, 243], "iconRGB": [33, 150, 243],
}, },
{ {
@ -214,20 +130,6 @@
"embarkDefense": 16, "embarkDefense": 16,
"startPercent": 65, "startPercent": 65,
"citySound": "cityAtomic", "citySound": "cityAtomic",
"friendBonus": {
"Cultured": ["Provides [+13 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+13 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+26 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+26 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [0, 150, 136], "iconRGB": [0, 150, 136],
}, },
{ {
@ -254,21 +156,6 @@
// But where is the modularity? The excluding of very specific wonders? That is no fun. // But where is the modularity? The excluding of very specific wonders? That is no fun.
// So we just write down the entire long list (sorted by era!) instead. // So we just write down the entire long list (sorted by era!) instead.
"citySound": "cityInformation", "citySound": "cityInformation",
"friendBonus": {
"Cultured": ["Provides [+13 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+13 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+26 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+26 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [76, 176, 81], "iconRGB": [76, 176, 81],
}, },
{ // Technically, this Era doesn't exist in the original game. { // Technically, this Era doesn't exist in the original game.
@ -294,21 +181,6 @@
"embarkDefense": 25, "embarkDefense": 25,
"startPercent": 80, "startPercent": 80,
"citySound": "cityFuture", "citySound": "cityFuture",
"friendBonus": {
"Cultured": ["Provides [+13 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn"],
"Mercantile": ["Provides [+3] Happiness"],
"Religious": ["Provides [+13 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[20] turns"]
},
"allyBonus": {
"Cultured": ["Provides [+26 Culture] per turn"],
"Maritime": ["Provides [+2 Food] [in capital] per turn", "Provides [+1 Food] [in all cities] per turn"],
"Mercantile": ["Provides [+3] Happiness", "Provides a unique luxury"],
"Religious": ["Provides [+26 Faith] per turn"],
"Militaristic": ["Provides military units every ≈[17] turns"]
},
"iconRGB": [76, 176, 81], "iconRGB": [76, 176, 81],
} }
] ]

View File

@ -11,7 +11,6 @@ import com.unciv.models.ruleset.unique.UniqueTarget
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.stats.INamed import com.unciv.models.stats.INamed
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import com.unciv.models.translations.fillPlaceholders
import com.unciv.ui.utils.getRelativeTextDistance import com.unciv.ui.utils.getRelativeTextDistance
class RulesetValidator(val ruleset: Ruleset) { class RulesetValidator(val ruleset: Ruleset) {
@ -277,10 +276,10 @@ class RulesetValidator(val ruleset: Ruleset) {
if (era.settlerPopulation <= 0) if (era.settlerPopulation <= 0)
lines += "Population in cities from settlers must be strictly positive! Found value ${era.settlerPopulation} for era ${era.name}" lines += "Population in cities from settlers must be strictly positive! Found value ${era.settlerPopulation} for era ${era.name}"
if (era.allyBonus.isEmpty() && rulesetHasCityStates) if (era.allyBonus.isNotEmpty())
lines.add("No ally bonus defined for era ${era.name}", RulesetErrorSeverity.Warning) lines.add("Era ${era.name} contains city-state bonuses. City-state bonuses are now defined in CityStateType.json", RulesetErrorSeverity.WarningOptionsOnly)
if (era.friendBonus.isEmpty() && rulesetHasCityStates) if (era.friendBonus.isNotEmpty())
lines.add("No friend bonus defined for era ${era.name}", RulesetErrorSeverity.Warning) lines.add("Era ${era.name} contains city-state bonuses. City-state bonuses are now defined in CityStateType.json", RulesetErrorSeverity.WarningOptionsOnly)
checkUniques(era, lines, rulesetSpecific, tryFixUnknownUniques) checkUniques(era, lines, rulesetSpecific, tryFixUnknownUniques)
@ -360,6 +359,19 @@ class RulesetValidator(val ruleset: Ruleset) {
lines += "Difficulty ${difficulty.name} contains starting unit $unitName which does not exist!" lines += "Difficulty ${difficulty.name} contains starting unit $unitName which does not exist!"
} }
for (cityStateType in ruleset.cityStateTypes.values) {
for (unique in cityStateType.allyBonusUniqueMap.getAllUniques() + cityStateType.friendBonusUniqueMap.getAllUniques()){
val errors = checkUnique(
unique,
tryFixUnknownUniques,
cityStateType.name,
rulesetSpecific,
UniqueTarget.CityState
)
lines.addAll(errors)
}
}
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
if (ruleset.modOptions.maxXPfromBarbarians != 30) { if (ruleset.modOptions.maxXPfromBarbarians != 30) {
lines.add("maxXPfromBarbarians is moved to the constants object, instead use: \nconstants: {\n maxXPfromBarbarians: ${ruleset.modOptions.maxXPfromBarbarians},\n}", RulesetErrorSeverity.Warning) lines.add("maxXPfromBarbarians is moved to the constants object, instead use: \nconstants: {\n maxXPfromBarbarians: ${ruleset.modOptions.maxXPfromBarbarians},\n}", RulesetErrorSeverity.Warning)

View File

@ -47,7 +47,7 @@ enum class UniqueTarget(val inheritsFrom: UniqueTarget? = null) {
// Other // Other
Speed, Speed,
Tutorial, Tutorial,
CityState, CityState(Global),
ModOptions, ModOptions,
Conditional, Conditional,
; ;