diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 4a50ac5d3b..0063427fbb 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -483,7 +483,7 @@ open class TileInfo { // Tiles with no terrains, and no turns to build, are like great improvements - they're placeable improvement.terrainsCanBeBuiltOn.isEmpty() && improvement.turnsToBuild == 0 && isLand -> true improvement.terrainsCanBeBuiltOn.contains(topTerrain.name) -> true - improvement.uniqueObjects.filter { it.placeholderText == "Must be next to []" }.any { + improvement.uniqueObjects.filter { it.type == UniqueType.MustBeNextTo }.any { val filter = it.params[0] if (filter == "River") return@any !isAdjacentToRiver() else return@any !neighbors.any { neighbor -> neighbor.matchesFilter(filter) } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index fbedcd79ba..f8edc217e0 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -454,12 +454,12 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { for (unique in uniqueObjects) { when (unique.placeholderText) { // Deprecated since 3.16.11, replace with "Not displayed [...] construction without []" - "Not displayed as an available construction unless [] is built" -> + UniqueType.NotDisplayedUnlessOtherBuildingBuilt.placeholderText -> if (!cityConstructions.containsBuildingOrEquivalent(unique.params[0])) rejectionReasons.add(RejectionReason.ShouldNotBeDisplayed) // - "Not displayed as an available construction without []" -> + UniqueType.NotDisplayedWithout.placeholderText -> if (unique.params[0] in ruleSet.tileResources && !civInfo.hasResource(unique.params[0]) || unique.params[0] in ruleSet.buildings && !cityConstructions.containsBuildingOrEquivalent(unique.params[0]) || unique.params[0] in ruleSet.technologies && !civInfo.tech.isResearched(unique.params[0]) @@ -470,22 +470,22 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction { "Enables nuclear weapon" -> if (!cityConstructions.cityInfo.civInfo.gameInfo.gameParameters.nuclearWeaponsEnabled) rejectionReasons.add(RejectionReason.DisabledBySetting) - "Must be on []" -> + UniqueType.MustBeOn.placeholderText -> if (!cityCenter.matchesTerrainFilter(unique.params[0], civInfo)) rejectionReasons.add(RejectionReason.MustBeOnTile.apply { errorMessage = unique.text }) - "Must not be on []" -> + UniqueType.MustNotBeOn.placeholderText -> if (cityCenter.matchesTerrainFilter(unique.params[0], civInfo)) rejectionReasons.add(RejectionReason.MustNotBeOnTile.apply { errorMessage = unique.text }) - "Must be next to []" -> + UniqueType.MustBeNextTo.placeholderText -> if (// Fresh water is special, in that rivers are not tiles themselves but also fit the filter. !(unique.params[0] == "Fresh water" && cityCenter.isAdjacentToRiver()) && cityCenter.getTilesInDistance(1).none { it.matchesFilter(unique.params[0], civInfo) } ) rejectionReasons.add(RejectionReason.MustBeNextToTile.apply { errorMessage = unique.text }) - "Must not be next to []" -> + UniqueType.MustNotBeNextTo.placeholderText -> if (cityCenter.getTilesInDistance(1).any { it.matchesFilter(unique.params[0], civInfo) }) rejectionReasons.add(RejectionReason.MustNotBeNextToTile.apply { errorMessage = unique.text }) diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index ec8c12b3b3..d596a75311 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -197,6 +197,16 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget, val flags: CannotBeBuiltWith("Cannot be built with [buildingName]", UniqueTarget.Building), RequiresAnotherBuilding("Requires a [buildingName] in this city", UniqueTarget.Building), + NotDisplayedWithout("Not displayed as an available construction without [buildingName/tech/resource/policy]", UniqueTarget.Building, UniqueTarget.Unit), + //UniqueType added in 3.18.4 + @Deprecated("As of 3.16.11", ReplaceWith("Not displayed as an available construction without [buildingName]"), DeprecationLevel.WARNING) + NotDisplayedUnlessOtherBuildingBuilt("Not displayed as an available construction unless [buildingName] is built", UniqueTarget.Building), + + MustBeOn("Must be on [terrainFilter]", UniqueTarget.Building), + MustNotBeOn("Must not be on [terrainFilter]", UniqueTarget.Building), + MustBeNextTo("Must be next to [terrainFilter]", UniqueTarget.Building), + MustNotBeNextTo("Must not be next to [terrainFilter]", UniqueTarget.Building), + ///////////////////////////////////////// UNIT UNIQUES ///////////////////////////////////////// diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 70c9e2d6ab..a932510960 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -379,7 +379,7 @@ class BaseUnit : RulesetObject(), INonPerpetualConstruction { if (isWaterUnit() && !cityConstructions.cityInfo.isCoastal()) rejectionReasons.add(RejectionReason.WaterUnitsInCoastalCities) val civInfo = cityConstructions.cityInfo.civInfo - for (unique in uniqueObjects.filter { it.placeholderText == "Not displayed as an available construction without []" }) { + for (unique in uniqueObjects.filter { it.type == UniqueType.NotDisplayedWithout }) { val filter = unique.params[0] if (filter in civInfo.gameInfo.ruleSet.tileResources && !civInfo.hasResource(filter) || filter in civInfo.gameInfo.ruleSet.buildings && !cityConstructions.containsBuildingOrEquivalent(filter))