diff --git a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt index 03f9fedf51..0b31630d22 100644 --- a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt @@ -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()) diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 562a849f3b..2f77b09615 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -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() @@ -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 diff --git a/core/src/com/unciv/models/ruleset/unit/UnitType.kt b/core/src/com/unciv/models/ruleset/unit/UnitType.kt index 0aebcb7c0f..0db759f031 100644 --- a/core/src/com/unciv/models/ruleset/unit/UnitType.kt +++ b/core/src/com/unciv/models/ruleset/unit/UnitType.kt @@ -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 } \ No newline at end of file diff --git a/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt b/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt index a415f17574..27f2e885ff 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroupIcons.kt @@ -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) } diff --git a/core/src/com/unciv/ui/worldscreen/WorldMapHolder.kt b/core/src/com/unciv/ui/worldscreen/WorldMapHolder.kt index a43edfd3d9..f00f907a13 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldMapHolder.kt @@ -128,9 +128,7 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap var unitList = ArrayList() 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()) } diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index 4740d9922f..76d32e105c 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -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)