From a2764d7b91ab6ac26574384af53833f31a951a43 Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Tue, 8 Jan 2019 20:16:18 +0800 Subject: [PATCH] Ai uses bombardment. --- core/src/com/unciv/UnCivGame.kt | 2 +- .../logic/automation/NextTurnAutomation.kt | 6 ++++++ .../unciv/logic/automation/UnitAutomation.kt | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/src/com/unciv/UnCivGame.kt b/core/src/com/unciv/UnCivGame.kt index c7b9ca494f..edbe309f62 100644 --- a/core/src/com/unciv/UnCivGame.kt +++ b/core/src/com/unciv/UnCivGame.kt @@ -20,7 +20,7 @@ class UnCivGame : Game() { val viewEntireMapForDebug = false // For when you need to test something in an advanced game and don't have time to faff around - val superchargedForDebug = true + val superchargedForDebug = false lateinit var worldScreen: WorldScreen diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 4c0d8b2849..a8beadae50 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -1,5 +1,6 @@ package com.unciv.logic.automation +import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.MapUnit import com.unciv.logic.trade.TradeLogic @@ -15,6 +16,7 @@ class NextTurnAutomation{ adoptPolicy(civInfo) exchangeLuxuries(civInfo) declareWar(civInfo) + automateCityBombardment(civInfo) automateUnits(civInfo) reassignWorkedTiles(civInfo) trainSettler(civInfo) @@ -116,6 +118,10 @@ class NextTurnAutomation{ for (unit in generals) UnitAutomation().automateUnitMoves(unit) } + private fun automateCityBombardment(civInfo: CivilizationInfo) { + for (city in civInfo.cities) UnitAutomation().tryBombardEnemy(city) + } + private fun reassignWorkedTiles(civInfo: CivilizationInfo) { for (city in civInfo.cities) { city.workedTiles = hashSetOf() diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index ae6ef35aa4..64aca85956 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -4,6 +4,7 @@ import com.unciv.UnCivGame import com.unciv.logic.HexMath import com.unciv.logic.battle.Battle import com.unciv.logic.battle.BattleDamage +import com.unciv.logic.battle.CityCombatant import com.unciv.logic.battle.MapUnitCombatant import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.CivilizationInfo @@ -285,6 +286,17 @@ class UnitAutomation{ return false } + fun tryBombardEnemy(city: CityInfo): Boolean { + val target = chooseBombardTarget(city) + if (target == null) return false + if (city.attacksThisTurn == 0) { + val enemy = Battle(city.civInfo.gameInfo).getMapCombatantOfTile(target)!! + Battle(city.civInfo.gameInfo).attack(CityCombatant(city), enemy) + return true + } + return false + } + private fun chooseAttackTarget(unit: MapUnit, attackableEnemies: List): AttackableTile? { val cityTilesToAttack = attackableEnemies.filter { it.tileToAttack.isCityCenter() } val nonCityTilesToAttack = attackableEnemies.filter { !it.tileToAttack.isCityCenter() } @@ -304,6 +316,12 @@ class UnitAutomation{ return enemyTileToAttack } + private fun chooseBombardTarget(city: CityInfo) : TileInfo? { + val targets = getBombardTargets(city) + if (targets.isEmpty()) return null + return targets.minBy { Battle(city.civInfo.gameInfo).getMapCombatantOfTile(it)!!.getHealth() } + } + private fun tryGarrisoningUnit(unit: MapUnit): Boolean { if(unit.type.isMelee() || unit.type.isWaterUnit()) return false // don't garrison melee units, they're not that good at it val citiesWithoutGarrison = unit.civInfo.cities.filter {