diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionModifiers.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionModifiers.kt index b538eca387..c8d56f06da 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionModifiers.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionModifiers.kt @@ -9,6 +9,11 @@ import com.unciv.ui.components.Fonts object UnitActionModifiers { + fun getUsableUnitActionUniques(unit:MapUnit, actionUniqueType: UniqueType) = + unit.getMatchingUniques(actionUniqueType) + .filter { it.conditionals.none { it.type == UniqueType.UnitActionExtraLimitedTimes } } + .filter { usagesLeft(unit, it) != 0 } + private fun getMovementPointsToUse(actionUnique: Unique): Int { val movementCost = actionUnique.conditionals .filter { it.type == UniqueType.UnitActionMovementCost } diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsFromUniques.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsFromUniques.kt index 6d164366e4..b48621cc7f 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsFromUniques.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsFromUniques.kt @@ -60,13 +60,12 @@ object UnitActionsFromUniques { * (no movement left, too close to another city). */ fun getFoundCityAction(unit: MapUnit, tile: Tile): UnitAction? { - val unique = unit.getMatchingUniques(UniqueType.FoundCity) - .filter { unique -> unique.conditionals.none { it.type == UniqueType.UnitActionExtraLimitedTimes } } - .firstOrNull() - if (unique == null || tile.isWater || tile.isImpassible()) return null + val unique = UnitActionModifiers.getUsableUnitActionUniques(unit, UniqueType.FoundCity) + .firstOrNull() ?: return null + + if (tile.isWater || tile.isImpassible()) return null // Spain should still be able to build Conquistadors in a one city challenge - but can't settle them if (unit.civ.isOneCityChallenger() && unit.civ.hasEverOwnedOriginalCapital) return null - if (UnitActionModifiers.usagesLeft(unit, unique) ==0) return null if (unit.currentMovement <= 0 || !tile.canBeSettled()) return UnitAction(UnitActionType.FoundCity, action = null) @@ -227,17 +226,15 @@ object UnitActionsFromUniques { fun getImprovementConstructionActions(unit: MapUnit, tile: Tile): ArrayList { val finalActions = ArrayList() - val uniquesToCheck = unit.getMatchingUniques(UniqueType.ConstructImprovementInstantly) + val uniquesToCheck = UnitActionModifiers.getUsableUnitActionUniques(unit, UniqueType.ConstructImprovementInstantly) + val civResources = unit.civ.getCivResourcesByName() for (unique in uniquesToCheck) { // Skip actions with a "[amount] extra times" conditional - these are treated in addTriggerUniqueActions instead - if (unique.conditionals.any { it.type == UniqueType.UnitActionExtraLimitedTimes }) continue - val improvementName = unique.params[0] val improvement = tile.ruleset.tileImprovements[improvementName] ?: continue - if (UnitActionModifiers.usagesLeft(unit, unique) == 0) continue val resourcesAvailable = improvement.uniqueObjects.none { improvementUnique ->