From b9a7f7e1d0915516be3c743a5ab33f275134d6aa Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 15 Jul 2019 22:45:32 +0300 Subject: [PATCH] Added Great War Bomber Air units now require Oil --- android/assets/jsons/Units.json | 15 +++++++++- android/build.gradle | 4 +-- .../automation/SpecificUnitAutomation.kt | 28 +++++++++++++++++++ .../unciv/logic/automation/UnitAutomation.kt | 6 ++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index 78dcd22822..099b4b903e 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -838,7 +838,6 @@ hurryCostModifier:20, attackSound:"shot" }, - { name:"Triplane", unitType:"Fighter", @@ -848,11 +847,25 @@ range:5, cost: 325, requiredTech:"Flight", + requiredResource:"Oil", hurryCostModifier:20, uniques:["[50]% chance to intercept air attacks","Bonus vs Bomber 150%", "6 tiles in every direction always visible"] attackSound:"shot" }, + { + name:"Great War Bomber", + unitType:"Bomber", + movement:1, + strength:50, + rangedStrength:50, + range:6, + cost: 325, + requiredTech:"Flight", + requiredResource:"Oil", + hurryCostModifier:20, + attackSound:"shot" + }, /* { diff --git a/android/build.gradle b/android/build.gradle index e93022ced5..148e927d8b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.app" minSdkVersion 14 targetSdkVersion 28 - versionCode 272 - versionName "2.18.1" + versionCode 273 + versionName "2.18.2" } // Had to add this crap for Travis to build, it wanted to sign the app diff --git a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt index 12fa87a87c..dd5bd0ac21 100644 --- a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt @@ -208,4 +208,32 @@ class SpecificUnitAutomation{ } + fun automateBomber(unit: MapUnit) { + if(UnitAutomation().tryAttackNearbyEnemy(unit)) return + + val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange()) + val immediatelyReachableCities = tilesInRange + .filter { it.isCityCenter() && it.getOwner()==unit.civInfo && unit.movement.canMoveTo(it)} + + for(city in immediatelyReachableCities){ + if(city.getTilesInDistance(unit.getRange()) + .any { UnitAutomation().containsAttackableEnemy(it,MapUnitCombatant(unit)) }) { + unit.movement.moveToTile(city) + return + } + } + + val pathsToCities = unit.movement.getArialPathsToCities() + if(pathsToCities.size==1) return // can't actually move anywhere else + + val citiesThatCanAttackFrom = pathsToCities.keys + .filter { it.getTilesInDistance(unit.getRange()) + .any { UnitAutomation().containsAttackableEnemy(it,MapUnitCombatant(unit)) } } + if(citiesThatCanAttackFrom.isEmpty()) return + + val closestCityThatCanAttackFrom = citiesThatCanAttackFrom.minBy { pathsToCities[it]!!.size }!! + val firstStepInPath = pathsToCities[closestCityThatCanAttackFrom]!!.first() + unit.movement.moveToTile(firstStepInPath) + } + } \ No newline at end of file diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index 58fced6259..264a198843 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -36,6 +36,9 @@ class UnitAutomation{ if(unit.type==UnitType.Fighter) return SpecificUnitAutomation().automateFighter(unit) + if(unit.type==UnitType.Bomber) + return SpecificUnitAutomation().automateBomber(unit) + if(unit.name.startsWith("Great") && unit.name in GreatPersonManager().statToGreatPersonMapping.values){ // So "Great War Infantry" isn't caught here return SpecificUnitAutomation().automateGreatPerson(unit) @@ -384,6 +387,8 @@ class UnitAutomation{ val cityTilesToAttack = attackableEnemies.filter { it.tileToAttack.isCityCenter() } val nonCityTilesToAttack = attackableEnemies.filter { !it.tileToAttack.isCityCenter() } + // todo add filter undefended tile if is air unit + var enemyTileToAttack: AttackableTile? = null val capturableCity = cityTilesToAttack.firstOrNull{it.tileToAttack.getCity()!!.health == 1} val cityWithHealthLeft = cityTilesToAttack.filter { it.tileToAttack.getCity()!!.health != 1 } // don't want ranged units to attack defeated cities @@ -394,6 +399,7 @@ class UnitAutomation{ else if (nonCityTilesToAttack.isNotEmpty()) // second priority, units enemyTileToAttack = nonCityTilesToAttack.minBy { Battle(unit.civInfo.gameInfo).getMapCombatantOfTile(it.tileToAttack)!!.getHealth() } + else if (cityWithHealthLeft!=null) enemyTileToAttack = cityWithHealthLeft// third priority, city return enemyTileToAttack