diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index ed791cf676..4afeb45818 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -281,9 +281,9 @@ class UnitAutomation{ } fun tryBombardEnemy(city: CityInfo): Boolean { - val target = chooseBombardTarget(city) - if (target == null) return false - if (city.canAttack()) { + if (!city.attackedThisTurn) { + val target = chooseBombardTarget(city) + if (target == null) return false val enemy = Battle(city.civInfo.gameInfo).getMapCombatantOfTile(target)!! Battle(city.civInfo.gameInfo).attack(CityCombatant(city), enemy) return true diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 2c7eb86f71..fa396fba43 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -89,7 +89,7 @@ class Battle(val gameInfo:GameInfo) { if(unit.isFortified() || unit.action=="Sleep") attacker.unit.action=null // but not, for instance, if it's Set Up - then it should definitely keep the action! } else if (attacker is CityCombatant) { - attacker.city.attacksThisTurn ++ + attacker.city.attackedThisTurn = true } // XP! diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 75b5070a2e..886970cc02 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -195,7 +195,6 @@ class BattleDamage{ fun calculateDamageToAttacker(attacker: ICombatant, defender: ICombatant): Int { if(attacker.isRanged()) return 0 - if(attacker is CityCombatant) return 0 if(defender.getUnitType().isCivilian()) return 0 val ratio = getDefendingStrength(attacker,defender) / getAttackingStrength(attacker,defender) return (ratio * 30 * getHealthDependantDamageRatio(defender)).toInt() diff --git a/core/src/com/unciv/logic/battle/CityCombatant.kt b/core/src/com/unciv/logic/battle/CityCombatant.kt index 61cc4777a7..27b785f638 100644 --- a/core/src/com/unciv/logic/battle/CityCombatant.kt +++ b/core/src/com/unciv/logic/battle/CityCombatant.kt @@ -14,6 +14,7 @@ class CityCombatant(val city: CityInfo) : ICombatant { override fun isDefeated(): Boolean = city.health==1 override fun isInvisible(): Boolean = false override fun getCivInfo(): CivilizationInfo = city.civInfo + override fun canAttack(): Boolean = (!city.attackedThisTurn) override fun takeDamage(damage: Int) { city.health -= damage diff --git a/core/src/com/unciv/logic/battle/ICombatant.kt b/core/src/com/unciv/logic/battle/ICombatant.kt index 7946226d79..3b942c607b 100644 --- a/core/src/com/unciv/logic/battle/ICombatant.kt +++ b/core/src/com/unciv/logic/battle/ICombatant.kt @@ -17,6 +17,7 @@ interface ICombatant{ fun getTile(): TileInfo fun isInvisible(): Boolean fun getCivInfo(): CivilizationInfo + fun canAttack(): Boolean fun isMelee(): Boolean { return this.getUnitType().isMelee() diff --git a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt index 3dfe904d01..a510f0153e 100644 --- a/core/src/com/unciv/logic/battle/MapUnitCombatant.kt +++ b/core/src/com/unciv/logic/battle/MapUnitCombatant.kt @@ -13,6 +13,7 @@ class MapUnitCombatant(val unit: MapUnit) : ICombatant { override fun isDefeated(): Boolean = unit.health <= 0 override fun isInvisible(): Boolean = unit.isInvisible() override fun getCivInfo(): CivilizationInfo = unit.civInfo + override fun canAttack(): Boolean = unit.canAttack() override fun takeDamage(damage: Int) { unit.health -= damage diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index 9b1b59cfcd..ed7f1845c1 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -18,6 +18,7 @@ class CityInfo { @Transient lateinit var civInfo: CivilizationInfo @Transient var isConnectedToCapital = false @Transient lateinit var ccenterTile:TileInfo // 'cached' for better performance + @Transient val range = 2 var location: Vector2 = Vector2.Zero var name: String = "" @@ -32,8 +33,7 @@ class CityInfo { var tiles = HashSet() var workedTiles = HashSet() var isBeingRazed = false - var attacksThisTurn = 0 - val range = 2 + var attackedThisTurn = false constructor() // for json parsing, we need to have a default constructor constructor(civInfo: CivilizationInfo, cityLocation: Vector2) { @@ -85,7 +85,7 @@ class CityInfo { toReturn.workedTiles = workedTiles toReturn.isBeingRazed=isBeingRazed toReturn.isConnectedToCapital = isConnectedToCapital - toReturn.attacksThisTurn = attacksThisTurn + toReturn.attackedThisTurn = attackedThisTurn return toReturn } @@ -195,7 +195,7 @@ class CityInfo { health = min(health + 20, getMaxHealth()) population.unassignExtraPopulation() } - attacksThisTurn = 0 + attackedThisTurn = false } fun destroyCity() { @@ -236,8 +236,5 @@ class CityInfo { return false } - fun canAttack(): Boolean { - return (attacksThisTurn == 0) - } //endregion } \ No newline at end of file diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index cda890b46d..435038d3f8 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -130,18 +130,19 @@ class BattleTable(val worldScreen: WorldScreen): Table() { val attackButton = TextButton(attackText.tr(), skin).apply { color= Color.RED } var attackableEnemy : UnitAutomation.AttackableTile? = null - var canAttack : Boolean = false + var canAttack : Boolean = attacker.canAttack() - if (attacker is MapUnitCombatant) { - attacker.unit.getDistanceToTiles() - attackableEnemy = UnitAutomation().getAttackableEnemies(attacker.unit, attacker.unit.getDistanceToTiles()) - .firstOrNull{ it.tileToAttack == defender.getTile()} - canAttack = (attacker.unit.canAttack() && attackableEnemy != null) - } - else if (attacker is CityCombatant) - { - canAttack = (attacker.city.canAttack()) - && UnitAutomation().getBombardTargets(attacker.city).contains(defender.getTile()) + if (canAttack) { + if (attacker is MapUnitCombatant) { + attacker.unit.getDistanceToTiles() + attackableEnemy = UnitAutomation().getAttackableEnemies(attacker.unit, attacker.unit.getDistanceToTiles()) + .firstOrNull{ it.tileToAttack == defender.getTile()} + canAttack = attackableEnemy != null + } + else if (attacker is CityCombatant) + { + canAttack = UnitAutomation().getBombardTargets(attacker.city).contains(defender.getTile()) + } } if(!canAttack) attackButton.disable()