mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-04 15:27:50 +07:00
Construction automation constructs attacking units even if they provide unneeded slots
This commit is contained in:
@ -13,8 +13,6 @@ import com.unciv.models.ruleset.unique.UniqueType
|
|||||||
import com.unciv.models.ruleset.unit.BaseUnit
|
import com.unciv.models.ruleset.unit.BaseUnit
|
||||||
import com.unciv.models.stats.Stats
|
import com.unciv.models.stats.Stats
|
||||||
import com.unciv.ui.victoryscreen.RankingType
|
import com.unciv.ui.victoryscreen.RankingType
|
||||||
import kotlin.math.max
|
|
||||||
import kotlin.math.sqrt
|
|
||||||
|
|
||||||
object Automation {
|
object Automation {
|
||||||
|
|
||||||
@ -99,9 +97,10 @@ object Automation {
|
|||||||
militaryUnits = militaryUnits.filter { !it.isWaterUnit() }
|
militaryUnits = militaryUnits.filter { !it.isWaterUnit() }
|
||||||
|
|
||||||
|
|
||||||
val carryingUnits = militaryUnits.filter { it.hasUnique(UniqueType.CarryAirUnits) }.toList()
|
val carryingOnlyUnits = militaryUnits.filter { it.hasUnique(UniqueType.CarryAirUnits)
|
||||||
|
&& it.hasUnique(UniqueType.CannotAttack) }.toList()
|
||||||
|
|
||||||
for (unit in carryingUnits)
|
for (unit in carryingOnlyUnits)
|
||||||
if (providesUnneededCarryingSlots(unit, city.civInfo))
|
if (providesUnneededCarryingSlots(unit, city.civInfo))
|
||||||
militaryUnits = militaryUnits.filterNot { it == unit }
|
militaryUnits = militaryUnits.filterNot { it == unit }
|
||||||
|
|
||||||
|
@ -8,11 +8,12 @@ import com.unciv.logic.map.MapUnit
|
|||||||
import com.unciv.logic.map.PathsToTilesWithinTurn
|
import com.unciv.logic.map.PathsToTilesWithinTurn
|
||||||
import com.unciv.logic.map.TileInfo
|
import com.unciv.logic.map.TileInfo
|
||||||
import com.unciv.models.AttackableTile
|
import com.unciv.models.AttackableTile
|
||||||
|
import com.unciv.models.ruleset.unique.UniqueType
|
||||||
|
|
||||||
object BattleHelper {
|
object BattleHelper {
|
||||||
|
|
||||||
fun tryAttackNearbyEnemy(unit: MapUnit, stayOnTile: Boolean = false): Boolean {
|
fun tryAttackNearbyEnemy(unit: MapUnit, stayOnTile: Boolean = false): Boolean {
|
||||||
if (unit.hasUnique("Cannot attack")) return false
|
if (unit.hasUnique(UniqueType.CannotAttack)) return false
|
||||||
val attackableEnemies = getAttackableEnemies(unit, unit.movement.getDistanceToTiles(), stayOnTile=stayOnTile)
|
val attackableEnemies = getAttackableEnemies(unit, unit.movement.getDistanceToTiles(), stayOnTile=stayOnTile)
|
||||||
// Only take enemies we can fight without dying
|
// Only take enemies we can fight without dying
|
||||||
.filter {
|
.filter {
|
||||||
|
@ -377,7 +377,7 @@ class Ruleset {
|
|||||||
lines += "${unit.name} upgrades to itself!"
|
lines += "${unit.name} upgrades to itself!"
|
||||||
if (!unit.isCivilian() && unit.strength == 0)
|
if (!unit.isCivilian() && unit.strength == 0)
|
||||||
lines += "${unit.name} is a military unit but has no assigned strength!"
|
lines += "${unit.name} is a military unit but has no assigned strength!"
|
||||||
if (unit.isRanged() && unit.rangedStrength == 0 && "Cannot attack" !in unit.uniques)
|
if (unit.isRanged() && unit.rangedStrength == 0 && !unit.hasUnique(UniqueType.CannotAttack))
|
||||||
lines += "${unit.name} is a ranged unit but has no assigned rangedStrength!"
|
lines += "${unit.name} is a ranged unit but has no assigned rangedStrength!"
|
||||||
|
|
||||||
checkUniques(unit, lines, UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant)
|
checkUniques(unit, lines, UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant)
|
||||||
|
@ -171,6 +171,7 @@ enum class UniqueType(val text:String, vararg targets: UniqueTarget) {
|
|||||||
MayFoundReligion("May found a religion", UniqueTarget.Unit),
|
MayFoundReligion("May found a religion", UniqueTarget.Unit),
|
||||||
MayEnhanceReligion("May enhance a religion", UniqueTarget.Unit),
|
MayEnhanceReligion("May enhance a religion", UniqueTarget.Unit),
|
||||||
NormalVisionWhenEmbarked("Normal vision when embarked", UniqueTarget.Unit, UniqueTarget.Global),
|
NormalVisionWhenEmbarked("Normal vision when embarked", UniqueTarget.Unit, UniqueTarget.Global),
|
||||||
|
CannotAttack("Cannot attack", UniqueTarget.Unit),
|
||||||
|
|
||||||
@Deprecated("As of 3.17.5", ReplaceWith("[amount] Movement <for [mapUnitFilter] units>"), DeprecationLevel.WARNING)
|
@Deprecated("As of 3.17.5", ReplaceWith("[amount] Movement <for [mapUnitFilter] units>"), DeprecationLevel.WARNING)
|
||||||
MovementUnits("+[amount] Movement for all [mapUnitFilter] units", UniqueTarget.Global),
|
MovementUnits("+[amount] Movement for all [mapUnitFilter] units", UniqueTarget.Global),
|
||||||
|
@ -59,7 +59,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
|
|||||||
val unitTable = worldScreen.bottomUnitTable
|
val unitTable = worldScreen.bottomUnitTable
|
||||||
return if (unitTable.selectedUnit != null
|
return if (unitTable.selectedUnit != null
|
||||||
&& !unitTable.selectedUnit!!.isCivilian()
|
&& !unitTable.selectedUnit!!.isCivilian()
|
||||||
&& !unitTable.selectedUnit!!.hasUnique("Cannot attack"))
|
&& !unitTable.selectedUnit!!.hasUnique(UniqueType.CannotAttack))
|
||||||
MapUnitCombatant(unitTable.selectedUnit!!)
|
MapUnitCombatant(unitTable.selectedUnit!!)
|
||||||
else if (unitTable.selectedCity != null)
|
else if (unitTable.selectedCity != null)
|
||||||
CityCombatant(unitTable.selectedCity!!)
|
CityCombatant(unitTable.selectedCity!!)
|
||||||
|
Reference in New Issue
Block a user