From e0040588a0f71471cd72c2d901f3bc6709fa79e5 Mon Sep 17 00:00:00 2001 From: metablaster <44481081+metablaster@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:52:42 +0200 Subject: [PATCH] Nukes don't require line of sight to hit target tile (#13618) * can nuke in range without visibility * can not nuke unexplored tiles * remove redundant check * getTilesInDistance instead of aerialDistanceTo * revert suggested change --- core/src/com/unciv/logic/battle/Nuke.kt | 11 +++++++---- .../ui/screens/worldscreen/bottombar/BattleTable.kt | 4 +--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/src/com/unciv/logic/battle/Nuke.kt b/core/src/com/unciv/logic/battle/Nuke.kt index 113a820dda..09da8020ad 100644 --- a/core/src/com/unciv/logic/battle/Nuke.kt +++ b/core/src/com/unciv/logic/battle/Nuke.kt @@ -29,12 +29,15 @@ object Nuke { * Both [BattleTable.simulateNuke] and [AirUnitAutomation.automateNukes] check range, so that check is omitted here. */ fun mayUseNuke(nuke: MapUnitCombatant, targetTile: Tile): Boolean { - if (nuke.getTile() == targetTile) return false - // Can only nuke visible Tiles - if (!targetTile.isVisible(nuke.getCivInfo())) return false + val attackerCiv = nuke.getCivInfo() + val launchTile = nuke.getTile() + + if (launchTile == targetTile) return false + if (!targetTile.isExplored(attackerCiv)) return false + // Can only nuke in unit's range, visibility (line of sight) doesn't matter + if (launchTile.aerialDistanceTo(targetTile) > nuke.unit.getRange()) return false var canNuke = true - val attackerCiv = nuke.getCivInfo() fun checkDefenderCiv(defenderCiv: Civilization?) { if (defenderCiv == null) return // Allow nuking yourself! (Civ5 source: CvUnit::isNukeVictim) diff --git a/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt index 486d37f901..bf0c7207a2 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt @@ -343,9 +343,7 @@ class BattleTable(val worldScreen: WorldScreen) : Table() { val attackButton = "NUKE".toTextButton().apply { color = Color.RED } - val canReach = attacker.unit.currentTile.getTilesInDistance(attacker.unit.getRange()).contains(targetTile) - - if (!worldScreen.isPlayersTurn || !attacker.canAttack() || !canReach || !canNuke) { + if (!worldScreen.isPlayersTurn || !attacker.canAttack() || !canNuke) { attackButton.disable() attackButton.label.color = Color.GRAY }