mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-28 21:58:54 +07:00
Got rid of useless WaterMissileCarrier promotion
Transportation refactor
This commit is contained in:
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
@ -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) }
|
||||
|
@ -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())
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user