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

View File

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

View File

@ -15,7 +15,6 @@ enum class UnitType{
WaterRanged, WaterRanged,
WaterSubmarine, WaterSubmarine,
WaterAircraftCarrier, WaterAircraftCarrier,
WaterMissileCarrier,
Fighter, Fighter,
Bomber, Bomber,
@ -55,16 +54,9 @@ enum class UnitType{
|| this == WaterMelee || this == WaterMelee
|| this == WaterCivilian || this == WaterCivilian
|| this == WaterAircraftCarrier || this == WaterAircraftCarrier
|| this == WaterMissileCarrier
fun isAirUnit() = fun isAirUnit() =
this == Bomber this == Bomber
|| this == Fighter || this == Fighter
|| this == Missile || 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 newImage.y += yFromCenter
// Display number of carried air units // Display number of carried air units
if ((unit.type.isAircraftCarrierUnit() || unit.type.isMissileCarrierUnit()) if (unit.getTile().airUnits.any { unit.canTransport(it) } && !unit.getTile().isCityCenter()) {
&& !unit.getTile().airUnits.isEmpty() && !unit.getTile().isCityCenter()) {
val holder = Table() val holder = Table()
val secondarycolor = unit.civInfo.nation.getInnerColor() val secondarycolor = unit.civInfo.nation.getInnerColor()
val airUnitTable = Table().apply { defaults().pad(5f) } 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>() var unitList = ArrayList<MapUnit>()
if (tileInfo.isCityCenter() && tileInfo.getOwner()==worldScreen.viewingCiv) { if (tileInfo.isCityCenter() && tileInfo.getOwner()==worldScreen.viewingCiv) {
unitList.addAll(tileInfo.getCity()!!.getCenterTile().getUnits()) unitList.addAll(tileInfo.getCity()!!.getCenterTile().getUnits())
} else if (tileInfo.militaryUnit!=null && } else if (tileInfo.airUnits.isNotEmpty() && tileInfo.airUnits.first().civInfo==worldScreen.viewingCiv) {
(tileInfo.militaryUnit!!.type.isAircraftCarrierUnit() || tileInfo.militaryUnit!!.type.isMissileCarrierUnit()) &&
tileInfo.militaryUnit!!.civInfo==worldScreen.viewingCiv && tileInfo.airUnits.isNotEmpty()) {
unitList.addAll(tileInfo.getUnits()) unitList.addAll(tileInfo.getUnits())
} }

View File

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