mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-30 23:41:03 -04:00
Code cleanup.
This commit is contained in:
parent
2f22b1d576
commit
57dce317ea
@ -2,10 +2,7 @@ package com.unciv.logic.automation
|
|||||||
|
|
||||||
import com.unciv.UnCivGame
|
import com.unciv.UnCivGame
|
||||||
import com.unciv.logic.HexMath
|
import com.unciv.logic.HexMath
|
||||||
import com.unciv.logic.battle.Battle
|
import com.unciv.logic.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.city.CityInfo
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
import com.unciv.logic.civilization.DiplomaticStatus
|
import com.unciv.logic.civilization.DiplomaticStatus
|
||||||
@ -116,41 +113,38 @@ class UnitAutomation{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun containsAttackableEnemy(tile: TileInfo, unit: MapUnit): Boolean {
|
fun containsAttackableEnemy(tile: TileInfo, combatant: ICombatant): Boolean {
|
||||||
if(unit.isEmbarked()){
|
if(combatant is MapUnitCombatant){
|
||||||
if(unit.type.isRanged()) return false
|
if (combatant.unit.isEmbarked()) {
|
||||||
if(tile.isWater()) return false // can't attack water units while embarked, only land
|
if (combatant.isRanged()) return false
|
||||||
|
if (tile.isWater()) return false // can't attack water units while embarked, only land
|
||||||
|
}
|
||||||
|
if (combatant.unit.hasUnique("Can only attack water") && tile.isLand()) return false
|
||||||
}
|
}
|
||||||
if (unit.hasUnique("Can only attack water") && tile.isLand()) return false
|
|
||||||
val tileCombatant = Battle(unit.civInfo.gameInfo).getMapCombatantOfTile(tile)
|
val tileCombatant = Battle(combatant.getCivInfo().gameInfo).getMapCombatantOfTile(tile)
|
||||||
if(tileCombatant==null) return false
|
if(tileCombatant==null) return false
|
||||||
if(tileCombatant.getCivilization()==unit.civInfo ) return false
|
if(tileCombatant.getCivilization()==combatant.getCivInfo() ) return false
|
||||||
if(!unit.civInfo.isAtWarWith(tileCombatant.getCivilization())) return false
|
if(!combatant.getCivInfo().isAtWarWith(tileCombatant.getCivilization())) return false
|
||||||
|
|
||||||
//only submarine and destroyer can attack submarine
|
//only submarine and destroyer can attack submarine
|
||||||
if (tileCombatant.isInvisible()
|
//garisoned submarine can be attacked by anyone, or the city will be in invincible
|
||||||
&& (!unit.hasUnique("Can attack submarines") || !unit.civInfo.viewableInvisibleUnitsTiles.map { it.position }.contains(tile.position))){
|
if (tileCombatant.isInvisible() && !tile.isCityCenter()) {
|
||||||
|
if (combatant is MapUnitCombatant
|
||||||
|
&& combatant.unit.hasUnique("Can attack submarines")
|
||||||
|
&& combatant.getCivInfo().viewableInvisibleUnitsTiles.map { it.position }.contains(tile.position)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
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> {
|
||||||
val tilesWithEnemies = unit.civInfo.viewableTiles
|
val tilesWithEnemies = unit.civInfo.viewableTiles
|
||||||
.filter { containsAttackableEnemy(it,unit) }
|
.filter { containsAttackableEnemy(it, MapUnitCombatant(unit)) }
|
||||||
|
|
||||||
val rangeOfAttack = unit.getRange()
|
val rangeOfAttack = unit.getRange()
|
||||||
|
|
||||||
@ -175,13 +169,13 @@ class UnitAutomation{
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getBombardTargets(city: CityInfo): List<TileInfo> {
|
fun getBombardTargets(city: CityInfo): List<TileInfo> {
|
||||||
return city.getCenterTile().getViewableTiles(city.range).filter { containsBombardableEnemy(it, city) }
|
return city.getCenterTile().getViewableTiles(city.range).filter { containsAttackableEnemy(it, CityCombatant(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)
|
||||||
.filter{ containsAttackableEnemy(it, unit) && unit.movementAlgs().canReach(it)}
|
.filter{ containsAttackableEnemy(it, MapUnitCombatant(unit)) && unit.movementAlgs().canReach(it)}
|
||||||
if(unit.type.isRanged())
|
if(unit.type.isRanged())
|
||||||
closeEnemies = closeEnemies.filterNot { it.isCityCenter() && it.getCity()!!.health==1 }
|
closeEnemies = closeEnemies.filterNot { it.isCityCenter() && it.getCity()!!.health==1 }
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ class CityCombatant(val city: CityInfo) : ICombatant {
|
|||||||
override fun getName(): String = city.name
|
override fun getName(): String = city.name
|
||||||
override fun isDefeated(): Boolean = city.health==1
|
override fun isDefeated(): Boolean = city.health==1
|
||||||
override fun isInvisible(): Boolean = false
|
override fun isInvisible(): Boolean = false
|
||||||
|
override fun getCivInfo(): CivilizationInfo = city.civInfo
|
||||||
|
|
||||||
override fun takeDamage(damage: Int) {
|
override fun takeDamage(damage: Int) {
|
||||||
city.health -= damage
|
city.health -= damage
|
||||||
|
@ -16,6 +16,7 @@ interface ICombatant{
|
|||||||
fun getCivilization(): CivilizationInfo
|
fun getCivilization(): CivilizationInfo
|
||||||
fun getTile(): TileInfo
|
fun getTile(): TileInfo
|
||||||
fun isInvisible(): Boolean
|
fun isInvisible(): Boolean
|
||||||
|
fun getCivInfo(): CivilizationInfo
|
||||||
|
|
||||||
fun isMelee(): Boolean {
|
fun isMelee(): Boolean {
|
||||||
return this.getUnitType().isMelee()
|
return this.getUnitType().isMelee()
|
||||||
|
@ -12,6 +12,7 @@ class MapUnitCombatant(val unit: MapUnit) : ICombatant {
|
|||||||
override fun getName(): String = unit.name
|
override fun getName(): String = unit.name
|
||||||
override fun isDefeated(): Boolean = unit.health <= 0
|
override fun isDefeated(): Boolean = unit.health <= 0
|
||||||
override fun isInvisible(): Boolean = unit.isInvisible()
|
override fun isInvisible(): Boolean = unit.isInvisible()
|
||||||
|
override fun getCivInfo(): CivilizationInfo = unit.civInfo
|
||||||
|
|
||||||
override fun takeDamage(damage: Int) {
|
override fun takeDamage(damage: Int) {
|
||||||
unit.health -= damage
|
unit.health -= damage
|
||||||
|
Loading…
x
Reference in New Issue
Block a user