Unique types for building filters

This commit is contained in:
yairm210
2021-11-21 21:02:45 +02:00
parent 4b5a709ee0
commit 59c5d2b10c
4 changed files with 18 additions and 8 deletions

View File

@ -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) }

View File

@ -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 })

View File

@ -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 /////////////////////////////////////////

View File

@ -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))