Resolved #12823 - "Cannot attack" accepts "vs" conditionals

This commit is contained in:
yairm210 2025-01-18 19:54:26 +02:00
parent 263bb53277
commit 629081f310

View File

@ -5,6 +5,7 @@ import com.unciv.logic.city.City
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.logic.map.mapunit.movement.PathsToTilesWithinTurn
import com.unciv.logic.map.tile.Tile
import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.UniqueType
object TargetHelper {
@ -112,22 +113,27 @@ object TargetHelper {
)
return false
if (combatant is MapUnitCombatant && combatant.hasUnique(UniqueType.CannotAttack))
return false
if (combatant is MapUnitCombatant) {
val stateForConditionals = StateForConditionals(
unit = (combatant as? MapUnitCombatant)?.unit, tile = tile,
ourCombatant = combatant, theirCombatant = tileCombatant, combatAction = CombatAction.Attack)
if (combatant is MapUnitCombatant &&
combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackUnits).run {
any() && none { tileCombatant.matchesFilter(it.params[0]) }
}
)
return false
if (combatant.hasUnique(UniqueType.CannotAttack, stateForConditionals))
return false
if (combatant is MapUnitCombatant &&
combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackTiles).run {
any() && none { tile.matchesFilter(it.params[0]) }
}
)
return false
if (combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackUnits, stateForConditionals).run {
any() && none { tileCombatant.matchesFilter(it.params[0]) }
}
)
return false
if (combatant.unit.getMatchingUniques(UniqueType.CanOnlyAttackTiles, stateForConditionals).run {
any() && none { tile.matchesFilter(it.params[0]) }
}
)
return false
}
// Only units with the right unique can view submarines (or other invisible units) from more then one tile away.
// Garrisoned invisible units can be attacked by anyone, as else the city will be in invincible.
@ -135,6 +141,7 @@ object TargetHelper {
return combatant is MapUnitCombatant
&& combatant.getCivInfo().viewableInvisibleUnitsTiles.map { it.position }.contains(tile.position)
}
return true
}