diff --git a/core/src/com/unciv/models/ruleset/Belief.kt b/core/src/com/unciv/models/ruleset/Belief.kt index 9499f0f24a..b8661696a4 100644 --- a/core/src/com/unciv/models/ruleset/Belief.kt +++ b/core/src/com/unciv/models/ruleset/Belief.kt @@ -2,6 +2,7 @@ package com.unciv.models.ruleset import com.unciv.UncivGame import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.stats.INamed import com.unciv.models.translations.tr @@ -30,7 +31,8 @@ class Belief : RulesetObject() { if (type != BeliefType.None) textList += FormattedLine("{Type}: $type", color = type.color, centered = centerType) uniqueObjects.forEach { - textList += FormattedLine(it) + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) } return textList } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index a5f07c9ff7..9357edb9dd 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -259,8 +259,10 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { if (replacementTextForUniques.isNotEmpty()) textList += FormattedLine(replacementTextForUniques) else - for (unique in getUniquesStrings()) - textList += FormattedLine(Unique(unique)) + uniqueObjects.forEach { + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) + } } if (!stats.isEmpty()) { diff --git a/core/src/com/unciv/models/ruleset/Nation.kt b/core/src/com/unciv/models/ruleset/Nation.kt index 51132aaf63..ad4f7091ef 100644 --- a/core/src/com/unciv/models/ruleset/Nation.kt +++ b/core/src/com/unciv/models/ruleset/Nation.kt @@ -5,6 +5,7 @@ import com.unciv.Constants import com.unciv.UncivGame import com.unciv.logic.civilization.CityStateType import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.translations.squareBraceRegex @@ -117,7 +118,8 @@ class Nation : RulesetObject() { textList += FormattedLine(uniqueText, indent = 1) } else { uniqueObjects.forEach { - textList += FormattedLine(it) + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) } textList += FormattedLine() } @@ -246,11 +248,14 @@ class Nation : RulesetObject() { // This does not use the auto-linking FormattedLine(Unique) for two reasons: // would look a little chaotic as unit uniques unlike most uniques are a HashSet and thus do not preserve order // No .copy() factory on FormattedLine and no FormattedLine(Unique, all other val's) constructor either - for (unique in unit.uniques.filterNot { it in originalUnit.uniques }) - textList += FormattedLine(unique, indent=1) - for (unique in originalUnit.uniques.filterNot { it in unit.uniques }) + for (unique in unit.uniqueObjects.filterNot { it.text in originalUnit.uniques || it.hasFlag(UniqueFlag.HideInCivilopedia) }) { + + textList += FormattedLine(unique.text.tr(), indent = 1) + } + for (unique in originalUnit.uniqueObjects.filterNot { it.text in unit.uniques || it.hasFlag(UniqueFlag.HideInCivilopedia) }) { textList += FormattedLine("Lost ability".tr() + " (" + "vs [${originalUnit.name}]".tr() + "): " + - unique.tr(), indent=1) + unique.text.tr(), indent = 1) + } for (promotion in unit.promotions.filter { it !in originalUnit.promotions }) { val effect = ruleset.unitPromotions[promotion]!!.uniquesWithEffect() // "{$promotion} ({$effect})" won't work as effect may contain [] and tr() does not support that kind of nesting diff --git a/core/src/com/unciv/models/ruleset/Policy.kt b/core/src/com/unciv/models/ruleset/Policy.kt index c9b465b17c..e9938b5f8c 100644 --- a/core/src/com/unciv/models/ruleset/Policy.kt +++ b/core/src/com/unciv/models/ruleset/Policy.kt @@ -1,5 +1,6 @@ package com.unciv.models.ruleset +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.translations.tr import com.unciv.ui.civilopedia.FormattedLine @@ -89,7 +90,10 @@ open class Policy : RulesetObject() { if (uniques.isNotEmpty()) { lineList += FormattedLine() - for (unique in uniqueObjects) lineList += FormattedLine(unique) + uniqueObjects.forEach { + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + lineList += FormattedLine(it) + } } return lineList diff --git a/core/src/com/unciv/models/ruleset/tech/Technology.kt b/core/src/com/unciv/models/ruleset/tech/Technology.kt index 9c739346cd..cec6e3eb49 100644 --- a/core/src/com/unciv/models/ruleset/tech/Technology.kt +++ b/core/src/com/unciv/models/ruleset/tech/Technology.kt @@ -6,6 +6,7 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetObject +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit @@ -198,7 +199,10 @@ class Technology: RulesetObject() { if (uniques.isNotEmpty()) { lineList += FormattedLine() - for (unique in uniqueObjects) lineList += FormattedLine(unique) + uniqueObjects.forEach { + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + lineList += FormattedLine(it) + } } var wantEmpty = true diff --git a/core/src/com/unciv/models/ruleset/tile/Terrain.kt b/core/src/com/unciv/models/ruleset/tile/Terrain.kt index de02bdf421..6cccd3a74c 100644 --- a/core/src/com/unciv/models/ruleset/tile/Terrain.kt +++ b/core/src/com/unciv/models/ruleset/tile/Terrain.kt @@ -5,6 +5,7 @@ import com.unciv.Constants import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetStatsObject +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.ui.civilopedia.FormattedLine @@ -115,7 +116,8 @@ class Terrain : RulesetStatsObject() { if (turnsInto == null && displayAs(TerrainType.Land, ruleset) && !isRough()) textList += FormattedLine("Open terrain") // Rough is in uniques uniqueObjects.forEach { - textList += FormattedLine(it) + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) } textList += FormattedLine() diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index 237a422503..11c678ea4b 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -29,6 +29,8 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s val isLocalEffect = params.contains("in this city") val isAntiLocalEffect = params.contains("in other cities") + fun hasFlag(flag: UniqueFlag) = type != null && type.flags.contains(flag) + fun isOfType(uniqueType: UniqueType) = uniqueType == type fun conditionalsApply(civInfo: CivilizationInfo? = null, city: CityInfo? = null): Boolean { diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 6b31da4fa6..b414a0483d 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -55,7 +55,11 @@ enum class UniqueTarget(val inheritsFrom:UniqueTarget?=null) { } } -enum class UniqueType(val text:String, vararg targets: UniqueTarget) { +enum class UniqueFlag { + HideInCivilopedia, +} + +enum class UniqueType(val text:String, vararg targets: UniqueTarget, val flags: List = emptyList()) { //////////////////////////////////////// GLOBAL UNIQUES //////////////////////////////////////// @@ -275,21 +279,21 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget) { CanEnterIceTiles("Can enter ice tiles", UniqueTarget.Unit), CannotEnterOcean("Cannot enter ocean tiles", UniqueTarget.Unit), CannotEnterOceanUntilAstronomy("Cannot enter ocean tiles until Astronomy", UniqueTarget.Unit), - CannotBeBarbarian("Never appears as a Barbarian unit", UniqueTarget.Unit), + CannotBeBarbarian("Never appears as a Barbarian unit", UniqueTarget.Unit, flags = listOf(UniqueFlag.HideInCivilopedia)), ///////////////////////////////////////// TILE UNIQUES ///////////////////////////////////////// - NaturalWonderNeighborCount("Must be adjacent to [amount] [simpleTerrain] tiles", UniqueTarget.Terrain), - NaturalWonderNeighborsRange("Must be adjacent to [amount] to [amount] [simpleTerrain] tiles", UniqueTarget.Terrain), - NaturalWonderSmallerLandmass("Must not be on [amount] largest landmasses", UniqueTarget.Terrain), - NaturalWonderLargerLandmass("Must be on [amount] largest landmasses", UniqueTarget.Terrain), - NaturalWonderLatitude("Occurs on latitudes from [amount] to [amount] percent of distance equator to pole", UniqueTarget.Terrain), - NaturalWonderGroups("Occurs in groups of [amount] to [amount] tiles", UniqueTarget.Terrain), - NaturalWonderConvertNeighbors("Neighboring tiles will convert to [baseTerrain]", UniqueTarget.Terrain), + NaturalWonderNeighborCount("Must be adjacent to [amount] [simpleTerrain] tiles", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderNeighborsRange("Must be adjacent to [amount] to [amount] [simpleTerrain] tiles", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderSmallerLandmass("Must not be on [amount] largest landmasses", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderLargerLandmass("Must be on [amount] largest landmasses", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderLatitude("Occurs on latitudes from [amount] to [amount] percent of distance equator to pole", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderGroups("Occurs in groups of [amount] to [amount] tiles", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + NaturalWonderConvertNeighbors("Neighboring tiles will convert to [baseTerrain]", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), // The "Except [terrainFilter]" could theoretically be implemented with a conditional - NaturalWonderConvertNeighborsExcept("Neighboring tiles except [baseTerrain] will convert to [baseTerrain]", UniqueTarget.Terrain), + NaturalWonderConvertNeighborsExcept("Neighboring tiles except [baseTerrain] will convert to [baseTerrain]", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), DamagesContainingUnits("Units ending their turn on this terrain take [amount] damage", UniqueTarget.Terrain), TerrainGrantsPromotion("Grants [promotion] ([comment]) to adjacent [mapUnitFilter] units for the rest of the game", UniqueTarget.Terrain), @@ -303,10 +307,10 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget) { BlocksLineOfSightAtSameElevation("Blocks line-of-sight from tiles at same elevation", UniqueTarget.Terrain), VisibilityElevation("Has an elevation of [amount] for visibility calculations", UniqueTarget.Terrain), - NoNaturalGeneration("Doesn't generate naturally", UniqueTarget.Terrain), - TileGenerationConditions("Occurs at temperature between [amount] and [amount] and humidity between [amount] and [amount]", UniqueTarget.Terrain), - OccursInChains("Occurs in chains at high elevations", UniqueTarget.Terrain), - OccursInGroups("Occurs in groups around high elevations", UniqueTarget.Terrain), + NoNaturalGeneration("Doesn't generate naturally", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + TileGenerationConditions("Occurs at temperature between [amount] and [amount] and humidity between [amount] and [amount]", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + OccursInChains("Occurs in chains at high elevations", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), + OccursInGroups("Occurs in groups around high elevations", UniqueTarget.Terrain, flags = listOf(UniqueFlag.HideInCivilopedia)), RareFeature("Rare feature", UniqueTarget.Terrain), ResistsNukes("Resistant to nukes", UniqueTarget.Terrain), diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 472b23ef66..70c9e2d6ab 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -7,6 +7,7 @@ import com.unciv.logic.map.MapUnit import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetObject import com.unciv.models.ruleset.unique.StateForConditionals +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.Stat @@ -133,8 +134,10 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { textList += FormattedLine(replacementTextForUniques) } else if (uniques.isNotEmpty()) { textList += FormattedLine() - for (uniqueObject in uniqueObjects.sortedBy { it.text }) - textList += FormattedLine(uniqueObject) + uniqueObjects.sortedBy { it.text }.forEach { + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) + } } val resourceRequirements = getResourceRequirements() diff --git a/core/src/com/unciv/models/ruleset/unit/Promotion.kt b/core/src/com/unciv/models/ruleset/unit/Promotion.kt index 4a7ba632f9..ff025ec3a1 100644 --- a/core/src/com/unciv/models/ruleset/unit/Promotion.kt +++ b/core/src/com/unciv/models/ruleset/unit/Promotion.kt @@ -2,6 +2,7 @@ package com.unciv.models.ruleset.unit import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetObject +import com.unciv.models.ruleset.unique.UniqueFlag import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.translations.tr @@ -47,8 +48,9 @@ class Promotion : RulesetObject() { override fun getCivilopediaTextLines(ruleset: Ruleset): List { val textList = ArrayList() - for (unique in uniqueObjects) { - textList += FormattedLine(unique) + uniqueObjects.forEach { + if (!it.hasFlag(UniqueFlag.HideInCivilopedia)) + textList += FormattedLine(it) } val filteredPrerequisites = prerequisites.mapNotNull {