Mark bombard targets.

This commit is contained in:
Duan Tao 2019-01-08 18:35:14 +08:00
parent 9054496940
commit 7a17779bf4
3 changed files with 30 additions and 3 deletions

View File

@ -134,6 +134,17 @@ class UnitAutomation{
return true return true
} }
fun containsBombardableEnemy(tile: TileInfo, city: CityInfo): Boolean {
val tileCombatant = Battle(city.civInfo.gameInfo).getMapCombatantOfTile(tile)
if(tileCombatant==null) return false
if(tileCombatant.getCivilization()==city.civInfo) return false
if(!city.civInfo.isAtWarWith(tileCombatant.getCivilization())) return false
//city cannot bombard submarine
if (tileCombatant.isInvisible()) return false
return true
}
class AttackableTile(val tileToAttackFrom:TileInfo, val tileToAttack:TileInfo) class AttackableTile(val tileToAttackFrom:TileInfo, val tileToAttack:TileInfo)
fun getAttackableEnemies(unit: MapUnit, unitDistanceToTiles: HashMap<TileInfo, Float>, minMovementBeforeAttack: Float = 0.1f): ArrayList<AttackableTile> { fun getAttackableEnemies(unit: MapUnit, unitDistanceToTiles: HashMap<TileInfo, Float>, minMovementBeforeAttack: Float = 0.1f): ArrayList<AttackableTile> {
@ -162,6 +173,10 @@ class UnitAutomation{
return attackableTiles return attackableTiles
} }
fun getBombardTargets(city: CityInfo): List<TileInfo> {
return city.getCenterTile().getViewableTiles(city.range).filter { containsBombardableEnemy(it, city) }
}
private fun tryAdvanceTowardsCloseEnemy(unit: MapUnit): Boolean { private fun tryAdvanceTowardsCloseEnemy(unit: MapUnit): Boolean {
// this can be sped up if we check each layer separately // this can be sped up if we check each layer separately
var closeEnemies = unit.getTile().getTilesInDistance(5) var closeEnemies = unit.getTile().getTilesInDistance(5)

View File

@ -32,7 +32,7 @@ class CityInfo {
var tiles = HashSet<Vector2>() var tiles = HashSet<Vector2>()
var workedTiles = HashSet<Vector2>() var workedTiles = HashSet<Vector2>()
var isBeingRazed = false var isBeingRazed = false
val range = 2
constructor() // for json parsing, we need to have a default constructor constructor() // for json parsing, we need to have a default constructor
constructor(civInfo: CivilizationInfo, cityLocation: Vector2) { constructor(civInfo: CivilizationInfo, cityLocation: Vector2) {

View File

@ -11,6 +11,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener
import com.unciv.UnCivGame import com.unciv.UnCivGame
import com.unciv.logic.HexMath import com.unciv.logic.HexMath
import com.unciv.logic.automation.UnitAutomation import com.unciv.logic.automation.UnitAutomation
import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
@ -211,11 +212,13 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
moveHereButtonDto=null moveHereButtonDto=null
} }
if(worldScreen.bottomBar.unitTable.selectedUnit!=null){ if (worldScreen.bottomBar.unitTable.selectedCity!=null){
val city = worldScreen.bottomBar.unitTable.selectedCity!!
updateTilegroupsForSelectedCity(city, playerViewableTilePositions)
} else if(worldScreen.bottomBar.unitTable.selectedUnit!=null){
val unit = worldScreen.bottomBar.unitTable.selectedUnit!! val unit = worldScreen.bottomBar.unitTable.selectedUnit!!
updateTilegroupsForSelectedUnit(unit, playerViewableTilePositions) updateTilegroupsForSelectedUnit(unit, playerViewableTilePositions)
} }
else if(moveToOverlay!=null){ else if(moveToOverlay!=null){
moveToOverlay!!.remove() moveToOverlay!!.remove()
moveToOverlay=null moveToOverlay=null
@ -253,6 +256,15 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
} }
} }
private fun updateTilegroupsForSelectedCity(city: CityInfo, playerViewableTilePositions: HashSet<Vector2>) {
val attackableTiles: List<TileInfo> = UnitAutomation().getBombardTargets(city)
.filter { (UnCivGame.Current.viewEntireMapForDebug || playerViewableTilePositions.contains(it.position)) }
for (attackableTile in attackableTiles) {
tileGroups[attackableTile]!!.showCircle(colorFromRGB(237, 41, 57))
tileGroups[attackableTile]!!.showCrosshair()
}
}
fun setCenterPosition(vector: Vector2) { fun setCenterPosition(vector: Vector2) {
val tileGroup = tileGroups.values.first { it.tileInfo.position == vector } val tileGroup = tileGroups.values.first { it.tileInfo.position == vector }
selectedTile = tileGroup.tileInfo selectedTile = tileGroup.tileInfo