From a4c520fd26a2c2fbe2071a23587762749b5194bd Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Sun, 12 Sep 2021 20:21:46 +0200 Subject: [PATCH] Added "Consumes [amount] [resource]" for improvements (#5129) * Added "Consumes [amount] [resource]" for improvements * It now also works for placeable improvements * Made construction grayed out instead of disappear when no resources available --- core/src/com/unciv/logic/city/CityInfo.kt | 14 +++++++++++++- core/src/com/unciv/logic/map/TileInfo.kt | 4 ++++ .../com/unciv/ui/worldscreen/unit/UnitActions.kt | 15 ++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 7e9906f1a4..2e63950e4e 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -269,10 +269,11 @@ class CityInfo { val amount = getTileResourceAmount(tileInfo) * civInfo.getResourceModifier(resource) if (amount > 0) cityResources.add(resource, amount, "Tiles") } + for (tileInfo in getTiles()) { if (tileInfo.improvement == null) continue val tileImprovement = tileInfo.getTileImprovement() - for (unique in tileImprovement!!.uniqueObjects) + for (unique in tileImprovement!!.uniqueObjects) { if (unique.placeholderText == "Provides [] []") { val resource = getRuleset().tileResources[unique.params[1]] ?: continue cityResources.add( @@ -281,13 +282,24 @@ class CityInfo { "Tiles" ) } + if (unique.placeholderText == "Consumes [] []") { + val resource = getRuleset().tileResources[unique.params[1]] ?: continue + cityResources.add( + resource, + -1 * unique.params[0].toInt(), + "Improvements" + ) + } + } } + for (building in cityConstructions.getBuiltBuildings()) { for ((resourceName, amount) in building.getResourceRequirements()) { val resource = getRuleset().tileResources[resourceName]!! cityResources.add(resource, -amount, "Buildings") } } + for (unique in getLocalMatchingUniques("Provides [] []")) { // E.G "Provides [1] [Iron]" val resource = getRuleset().tileResources[unique.params[1]] if (resource != null) { diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 1e7a7add73..2b759c8955 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -383,6 +383,10 @@ open class TileInfo { it.placeholderText == "Cannot be built on [] tiles until [] is discovered" && matchesTerrainFilter(it.params[0]) && !civInfo.tech.isResearched(it.params[1]) } -> false + improvement.uniqueObjects.any { + it.placeholderText == "Consumes [] []" + && civInfo.getCivResourcesByName()[it.params[1]]!! < it.params[0].toInt() + } -> false else -> canImprovementBeBuiltHere(improvement, hasViewableResource(civInfo)) } } diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 56b05348f7..e8f7849b2f 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -8,7 +8,6 @@ import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.PlayerType -import com.unciv.logic.civilization.ReligionState import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers import com.unciv.logic.map.MapUnit @@ -585,11 +584,19 @@ object UnitActions { var uniquesToCheck = unit.getMatchingUniques("Can construct []") if (unit.religiousActionsUnitCanDo().all { unit.abilityUsesLeft[it] == unit.maxAbilityUses[it] }) uniquesToCheck += unit.getMatchingUniques("Can construct [] if it hasn't used other actions yet") + val civResources = unit.civInfo.getCivResourcesByName() for (unique in uniquesToCheck) { val improvementName = unique.params[0] val improvement = tile.ruleset.tileImprovements[improvementName] ?: continue + + var resourcesAvailable = true + if (improvement.uniqueObjects.any { + it.placeholderText == "Consumes [] []" && civResources[unique.params[1]] ?: 0 < unique.params[0].toInt() + }) + resourcesAvailable = false + finalActions += UnitAction(UnitActionType.Create, title = "Create [$improvementName]", action = { @@ -609,8 +616,10 @@ object UnitActions { addStatsPerGreatPersonUsage(unit) unit.destroy() }.takeIf { - unit.currentMovement > 0f && tile.canBuildImprovement(improvement, unit.civInfo) - && !tile.isImpassible() // Not 100% sure that this check is necessary... + resourcesAvailable + && unit.currentMovement > 0f + && tile.canBuildImprovement(improvement, unit.civInfo) + && !tile.isImpassible() // Not 100% sure that this check is necessary... }) } return finalActions