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
This commit is contained in:
Xander Lenstra 2021-09-12 20:21:46 +02:00 committed by GitHub
parent af20124e5d
commit a4c520fd26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 4 deletions

View File

@ -269,10 +269,11 @@ class CityInfo {
val amount = getTileResourceAmount(tileInfo) * civInfo.getResourceModifier(resource) val amount = getTileResourceAmount(tileInfo) * civInfo.getResourceModifier(resource)
if (amount > 0) cityResources.add(resource, amount, "Tiles") if (amount > 0) cityResources.add(resource, amount, "Tiles")
} }
for (tileInfo in getTiles()) { for (tileInfo in getTiles()) {
if (tileInfo.improvement == null) continue if (tileInfo.improvement == null) continue
val tileImprovement = tileInfo.getTileImprovement() val tileImprovement = tileInfo.getTileImprovement()
for (unique in tileImprovement!!.uniqueObjects) for (unique in tileImprovement!!.uniqueObjects) {
if (unique.placeholderText == "Provides [] []") { if (unique.placeholderText == "Provides [] []") {
val resource = getRuleset().tileResources[unique.params[1]] ?: continue val resource = getRuleset().tileResources[unique.params[1]] ?: continue
cityResources.add( cityResources.add(
@ -281,13 +282,24 @@ class CityInfo {
"Tiles" "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 (building in cityConstructions.getBuiltBuildings()) {
for ((resourceName, amount) in building.getResourceRequirements()) { for ((resourceName, amount) in building.getResourceRequirements()) {
val resource = getRuleset().tileResources[resourceName]!! val resource = getRuleset().tileResources[resourceName]!!
cityResources.add(resource, -amount, "Buildings") cityResources.add(resource, -amount, "Buildings")
} }
} }
for (unique in getLocalMatchingUniques("Provides [] []")) { // E.G "Provides [1] [Iron]" for (unique in getLocalMatchingUniques("Provides [] []")) { // E.G "Provides [1] [Iron]"
val resource = getRuleset().tileResources[unique.params[1]] val resource = getRuleset().tileResources[unique.params[1]]
if (resource != null) { if (resource != null) {

View File

@ -383,6 +383,10 @@ open class TileInfo {
it.placeholderText == "Cannot be built on [] tiles until [] is discovered" && it.placeholderText == "Cannot be built on [] tiles until [] is discovered" &&
matchesTerrainFilter(it.params[0]) && !civInfo.tech.isResearched(it.params[1]) matchesTerrainFilter(it.params[0]) && !civInfo.tech.isResearched(it.params[1])
} -> false } -> false
improvement.uniqueObjects.any {
it.placeholderText == "Consumes [] []"
&& civInfo.getCivResourcesByName()[it.params[1]]!! < it.params[0].toInt()
} -> false
else -> canImprovementBeBuiltHere(improvement, hasViewableResource(civInfo)) else -> canImprovementBeBuiltHere(improvement, hasViewableResource(civInfo))
} }
} }

View File

@ -8,7 +8,6 @@ import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.civilization.PlayerType 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.DiplomacyFlags
import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
@ -585,11 +584,19 @@ object UnitActions {
var uniquesToCheck = unit.getMatchingUniques("Can construct []") var uniquesToCheck = unit.getMatchingUniques("Can construct []")
if (unit.religiousActionsUnitCanDo().all { unit.abilityUsesLeft[it] == unit.maxAbilityUses[it] }) if (unit.religiousActionsUnitCanDo().all { unit.abilityUsesLeft[it] == unit.maxAbilityUses[it] })
uniquesToCheck += unit.getMatchingUniques("Can construct [] if it hasn't used other actions yet") uniquesToCheck += unit.getMatchingUniques("Can construct [] if it hasn't used other actions yet")
val civResources = unit.civInfo.getCivResourcesByName()
for (unique in uniquesToCheck) { for (unique in uniquesToCheck) {
val improvementName = unique.params[0] val improvementName = unique.params[0]
val improvement = tile.ruleset.tileImprovements[improvementName] val improvement = tile.ruleset.tileImprovements[improvementName]
?: continue ?: 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, finalActions += UnitAction(UnitActionType.Create,
title = "Create [$improvementName]", title = "Create [$improvementName]",
action = { action = {
@ -609,8 +616,10 @@ object UnitActions {
addStatsPerGreatPersonUsage(unit) addStatsPerGreatPersonUsage(unit)
unit.destroy() unit.destroy()
}.takeIf { }.takeIf {
unit.currentMovement > 0f && tile.canBuildImprovement(improvement, unit.civInfo) resourcesAvailable
&& !tile.isImpassible() // Not 100% sure that this check is necessary... && unit.currentMovement > 0f
&& tile.canBuildImprovement(improvement, unit.civInfo)
&& !tile.isImpassible() // Not 100% sure that this check is necessary...
}) })
} }
return finalActions return finalActions