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

View File

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

View File

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