"Can instantly construct a [improvementFilter] improvement" works with improvementFilter

This commit is contained in:
Yair Morgenstern
2023-12-07 23:09:05 +02:00
parent 2fbe227285
commit 40283078d4

View File

@ -227,45 +227,43 @@ object UnitActionsFromUniques {
val civResources = unit.civ.getCivResourcesByName() val civResources = unit.civ.getCivResourcesByName()
for (unique in uniquesToCheck) { for (unique in uniquesToCheck) {
// Skip actions with a "[amount] extra times" conditional - these are treated in addTriggerUniqueActions instead val improvementFilter = unique.params[0]
val improvementName = unique.params[0] val improvements = tile.ruleset.tileImprovements.values.filter { it.matchesFilter(improvementFilter) }
val improvement = tile.ruleset.tileImprovements[improvementName]
?: continue
// Try to skip Improvements we can never build for (improvement in improvements) {
// (getImprovementBuildingProblems catches those so the button is always disabled, but it nevertheless looks nicer) // Try to skip Improvements we can never build
if (tile.improvementFunctions.getImprovementBuildingProblems(improvement, unit.civ).any { it.permanent }) // (getImprovementBuildingProblems catches those so the button is always disabled, but it nevertheless looks nicer)
continue if (tile.improvementFunctions.getImprovementBuildingProblems(improvement, unit.civ).any { it.permanent })
continue
val resourcesAvailable = improvement.uniqueObjects.none { val resourcesAvailable = improvement.uniqueObjects.none { improvementUnique ->
improvementUnique -> improvementUnique.isOfType(UniqueType.ConsumesResources) &&
improvementUnique.isOfType(UniqueType.ConsumesResources) && (civResources[improvementUnique.params[1]] ?: 0) < improvementUnique.params[0].toInt()
(civResources[improvementUnique.params[1]] ?: 0) < improvementUnique.params[0].toInt() }
}
finalActions += UnitAction(UnitActionType.CreateImprovement, finalActions += UnitAction(UnitActionType.CreateImprovement,
title = UnitActionModifiers.actionTextWithSideEffects( title = UnitActionModifiers.actionTextWithSideEffects(
"Create [$improvementName]", "Create [${improvement.name}]",
unique, unique,
unit unit
), ),
action = { action = {
val unitTile = unit.getTile() val unitTile = unit.getTile()
unitTile.changeImprovement(improvementName, unit.civ, unit) unitTile.changeImprovement(improvement.name, unit.civ, unit)
// without this the world screen won't show the improvement because it isn't the 'last seen improvement' unit.civ.cache.updateViewableTiles() // to update 'last seen improvement'
unit.civ.cache.updateViewableTiles()
UnitActionModifiers.activateSideEffects(unit, unique) UnitActionModifiers.activateSideEffects(unit, unique)
}.takeIf { }.takeIf {
resourcesAvailable resourcesAvailable
&& unit.currentMovement > 0f && unit.currentMovement > 0f
&& tile.improvementFunctions.canBuildImprovement(improvement, unit.civ) && tile.improvementFunctions.canBuildImprovement(improvement, unit.civ)
// Next test is to prevent interfering with UniqueType.CreatesOneImprovement - // Next test is to prevent interfering with UniqueType.CreatesOneImprovement -
// not pretty, but users *can* remove the building from the city queue an thus clear this: // not pretty, but users *can* remove the building from the city queue an thus clear this:
&& !tile.isMarkedForCreatesOneImprovement() && !tile.isMarkedForCreatesOneImprovement()
&& !tile.isImpassible() // Not 100% sure that this check is necessary... && !tile.isImpassible() // Not 100% sure that this check is necessary...
}) })
}
} }
return finalActions return finalActions
} }