Got rid of useless WaterMissileCarrier promotion

Transportation refactor
This commit is contained in:
Yair Morgenstern
2020-03-24 17:53:14 +02:00
parent 81a4092538
commit 0355223c01
6 changed files with 34 additions and 45 deletions

View File

@ -255,8 +255,7 @@ class SpecificUnitAutomation {
val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange()*2)
val immediatelyReachableCities = tilesInRange
.filter { unit.movement.canMoveTo(it) && ((it.isCityCenter() && it.getOwner() == unit.civInfo) ||
(it.getUnits().any { mapUnit -> mapUnit.type.isMissileCarrierUnit() && mapUnit.civInfo == unit.civInfo }))}
.filter { unit.movement.canMoveTo(it) }
for (city in immediatelyReachableCities) {
if (city.getTilesInDistance(unit.getRange())
@ -272,9 +271,8 @@ class SpecificUnitAutomation {
}
private fun tryRelocateToCitiesWithEnemyNearBy(unit: MapUnit): Boolean {
val immediatelyReachableCitiesAndCarriers = unit.currentTile.getTilesInDistance(unit.getRange()*2)
.filter { unit.movement.canMoveTo(it) && ((it.isCityCenter() && it.getOwner() == unit.civInfo) ||
(it.getUnits().any { mapUnit -> mapUnit.type.isAircraftCarrierUnit() && mapUnit.civInfo == unit.civInfo })) }
val immediatelyReachableCitiesAndCarriers = unit.currentTile
.getTilesInDistance(unit.getRange()*2).filter { unit.movement.canMoveTo(it) }
for (city in immediatelyReachableCitiesAndCarriers) {
if (city.getTilesInDistance(unit.getRange())

View File

@ -118,7 +118,7 @@ class MapUnit {
return movement
}
// This SHOULD NOT be a hashset, because if it is, thenn promotions with the same text (e.g. barrage I, barrage II)
// This SHOULD NOT be a hashset, because if it is, then promotions with the same text (e.g. barrage I, barrage II)
// will not get counted twice!
@Transient var tempUniques= ArrayList<String>()
@ -471,10 +471,8 @@ class MapUnit {
civInfo.removeUnit(this)
civInfo.updateViewableTiles()
// all transported units should be destroyed as well
if (type.isAircraftCarrierUnit() || type.isMissileCarrierUnit()) {
currentTile.getUnits().filter { it.type.isAirUnit() && it.isTransported }
.forEach { unit -> unit.destroy() }
}
currentTile.getUnits().filter { it.isTransported && isTransportTypeOf(it) }
.forEach { unit -> unit.destroy() }
}
fun removeFromTile(){
@ -530,23 +528,21 @@ class MapUnit {
fun disband() {
// evacuation of transported units before disbanding, if possible
if (type.isAircraftCarrierUnit() || type.isMissileCarrierUnit()) {
for(unit in currentTile.getUnits().filter { it.type.isAirUnit() && it.isTransported }) {
// we disbanded a carrier in a city, it can still stay in the city
if (currentTile.isCityCenter() && unit.movement.canMoveTo(currentTile)) continue
// if no "fuel" to escape, should be disbanded as well
if (unit.currentMovement < 0.1)
unit.disband()
// let's find closest city or another carrier where it can be evacuated
val tileCanMoveTo = unit.currentTile.getTilesInDistance(unit.getRange()*2).
filterNot { it == currentTile }.firstOrNull{unit.movement.canMoveTo(it)}
for (unit in currentTile.getUnits().filter { it.isTransported && isTransportTypeOf(it) }) {
// we disbanded a carrier in a city, it can still stay in the city
if (currentTile.isCityCenter() && unit.movement.canMoveTo(currentTile)) continue
// if no "fuel" to escape, should be disbanded as well
if (unit.currentMovement < 0.1)
unit.disband()
// let's find closest city or another carrier where it can be evacuated
val tileCanMoveTo = unit.currentTile.getTilesInDistance(unit.getRange() * 2).filterNot { it == currentTile }.firstOrNull { unit.movement.canMoveTo(it) }
if (tileCanMoveTo!=null)
unit.movement.moveToTile(tileCanMoveTo)
else
unit.disband()
}
if (tileCanMoveTo != null)
unit.movement.moveToTile(tileCanMoveTo)
else
unit.disband()
}
destroy()
if (currentTile.getOwner() == civInfo)
civInfo.gold += baseUnit.getDisbandGold()
@ -632,18 +628,24 @@ class MapUnit {
return percent
}
fun canTransport(mapUnit: MapUnit): Boolean {
if(type!=UnitType.WaterAircraftCarrier && type!=UnitType.WaterMissileCarrier)
fun isTransportTypeOf(mapUnit: MapUnit): Boolean {
val isAircraftCarrier = getUniques().contains("Can carry 2 aircraft")
val isMissileCarrier = getUniques().contains("Can carry 2 missiles")
if(!isMissileCarrier && !isAircraftCarrier)
return false
if(!mapUnit.type.isAirUnit()) return false
if(type==UnitType.WaterMissileCarrier && mapUnit.type!=UnitType.Missile)
if(isMissileCarrier && mapUnit.type!=UnitType.Missile)
return false
if(type==UnitType.WaterAircraftCarrier && mapUnit.type==UnitType.Missile)
if(isAircraftCarrier && mapUnit.type==UnitType.Missile)
return false
return true
}
fun canTransport(mapUnit: MapUnit): Boolean {
if(!isTransportTypeOf(mapUnit)) return false
if(owner!=mapUnit.owner) return false
var unitCapacity = 0
if (getUniques().contains("Can carry 2 aircraft")) unitCapacity=2
var unitCapacity = 2
unitCapacity += getUniques().count { it == "Can carry 1 extra air unit" }
if(currentTile.airUnits.filter { it.isTransported }.size>=unitCapacity) return false

View File

@ -15,7 +15,6 @@ enum class UnitType{
WaterRanged,
WaterSubmarine,
WaterAircraftCarrier,
WaterMissileCarrier,
Fighter,
Bomber,
@ -55,16 +54,9 @@ enum class UnitType{
|| this == WaterMelee
|| this == WaterCivilian
|| this == WaterAircraftCarrier
|| this == WaterMissileCarrier
fun isAirUnit() =
this == Bomber
|| this == Fighter
|| this == Missile
fun isMissile() = this == Missile
fun isAircraftCarrierUnit() = this == WaterAircraftCarrier
fun isMissileCarrierUnit() = this == WaterMissileCarrier
}

View File

@ -65,8 +65,7 @@ class TileGroupIcons(val tileGroup: TileGroup){
newImage.y += yFromCenter
// Display number of carried air units
if ((unit.type.isAircraftCarrierUnit() || unit.type.isMissileCarrierUnit())
&& !unit.getTile().airUnits.isEmpty() && !unit.getTile().isCityCenter()) {
if (unit.getTile().airUnits.any { unit.canTransport(it) } && !unit.getTile().isCityCenter()) {
val holder = Table()
val secondarycolor = unit.civInfo.nation.getInnerColor()
val airUnitTable = Table().apply { defaults().pad(5f) }

View File

@ -128,9 +128,7 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
var unitList = ArrayList<MapUnit>()
if (tileInfo.isCityCenter() && tileInfo.getOwner()==worldScreen.viewingCiv) {
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.isNotEmpty()) {
} else if (tileInfo.airUnits.isNotEmpty() && tileInfo.airUnits.first().civInfo==worldScreen.viewingCiv) {
unitList.addAll(tileInfo.getUnits())
}

View File

@ -48,7 +48,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
val attacker = tryGetAttacker()
if(attacker==null){ hide(); return }
if (attacker.getUnitType().isMissile()) {
if (attacker.getUnitType()==UnitType.Missile) {
val selectedTile = worldScreen.mapHolder.selectedTile
if (selectedTile == null) { hide(); return } // no selected tile
simulateNuke(attacker as MapUnitCombatant, selectedTile)