Resolved #1782 - air units are no longer sent to join non-transporting units exiting the city

Transportation logic cleanup
This commit is contained in:
Yair Morgenstern 2020-01-27 00:04:45 +02:00
parent 7b5e1e3cbf
commit daa3c8fcec
5 changed files with 31 additions and 20 deletions

View File

@ -50,7 +50,7 @@ class WorkerAutomation(val unit: MapUnit) {
&& tileCanBeImproved(it, unit.civInfo) }
}
val mostUndevelopedCity = unit.civInfo.cities
val mostUndevelopedCity = unit.civInfo.cities.asSequence()
.filter { citiesToNumberOfUnimprovedTiles[it.id]!! > 0 }
.sortedByDescending { citiesToNumberOfUnimprovedTiles[it.id] }
.firstOrNull { unit.movement.canReach(it.getCenterTile()) } //goto most undeveloped city

View File

@ -568,6 +568,25 @@ class MapUnit {
return percent
}
fun canTransport(mapUnit: MapUnit): Boolean {
if(type!=UnitType.WaterAircraftCarrier && type!=UnitType.WaterMissileCarrier)
return false
if(!mapUnit.type.isAirUnit()) return false
if(type==UnitType.WaterMissileCarrier && mapUnit.type!=UnitType.Missile)
return false
if(type==UnitType.WaterAircraftCarrier && mapUnit.type==UnitType.Missile)
return false
if(owner!=mapUnit.owner) return false
var unitCapacity = 0
if (getUniques().contains("Can carry 2 aircraft")) unitCapacity=2
unitCapacity += getUniques().count { it == "Can carry 1 extra air unit" }
if(currentTile.airUnits.filter { it.isTransported }.size>=unitCapacity) return false
return true
}
fun interceptDamagePercentBonus():Int{
var sum=0
for(unique in getUniques().filter { it.startsWith("Bonus when intercepting") }){

View File

@ -239,15 +239,16 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
unit.action=null // unfortify/setup after moving
// If this unit is a carrier, keep record of its air payload whereabouts.
var origin = unit.getTile()
val origin = unit.getTile()
unit.removeFromTile()
unit.putInTile(destination)
for(payload in origin.getUnits().filter { it.isTransported }){ // bring along the payloads
payload.removeFromTile()
payload.putInTile(destination)
payload.isTransported = true // restore the flag to not leave the payload in the city
if(unit.canTransport(payload)) {
payload.removeFromTile()
payload.putInTile(destination)
payload.isTransported = true // restore the flag to not leave the payload in the city
}
}
// Unit maintenance changed
@ -295,15 +296,9 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
if (tile.militaryUnit != null) {
val unitAtDestination = tile.militaryUnit!!
var unitCapacity = if (unitAtDestination.getUniques().contains("Can carry 2 aircraft")) 2 else 0
unitCapacity += unitAtDestination.getUniques().count { it == "Can carry 1 extra air unit" }
return ((unitAtDestination.type.isAircraftCarrierUnit() && !unit.type.isMissileUnit()) ||
(unitAtDestination.type.isMissileCarrierUnit() && unit.type.isMissileUnit()))
&& unitAtDestination.owner == unit.owner && tile.airUnits.filter { it.isTransported }.size < unitCapacity
} else
return false
return unitAtDestination.canTransport(unit)
}
return false
}

View File

@ -72,9 +72,6 @@ enum class UnitType{
|| this==Missile
}
fun isMissileUnit():Boolean{
return this == Missile
}
fun isAircraftCarrierUnit():Boolean{
return this == WaterAircraftCarrier

View File

@ -130,7 +130,7 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
unitList.addAll(tileInfo.getCity()!!.getCenterTile().getUnits())
} else if (tileInfo.militaryUnit!=null &&
(tileInfo.militaryUnit!!.type.isAircraftCarrierUnit() || tileInfo.militaryUnit!!.type.isMissileCarrierUnit()) &&
tileInfo.militaryUnit!!.civInfo==worldScreen.viewingCiv && !tileInfo.airUnits.isEmpty()) {
tileInfo.militaryUnit!!.civInfo==worldScreen.viewingCiv && tileInfo.airUnits.isNotEmpty()) {
unitList.addAll(tileInfo.getUnits())
}