From 261e1047ff5dd7d22ff7d0d9912ba8e09eadeaed Mon Sep 17 00:00:00 2001 From: yairm210 Date: Sun, 24 Aug 2025 15:46:38 +0300 Subject: [PATCH] chore(purity): TargetHelper --- core/src/com/unciv/logic/automation/unit/UnitAutomation.kt | 1 + core/src/com/unciv/logic/battle/BattleUnitCapture.kt | 5 +++-- core/src/com/unciv/logic/battle/TargetHelper.kt | 6 ++++++ core/src/com/unciv/models/stats/Stats.kt | 2 ++ .../unciv/ui/screens/worldscreen/bottombar/BattleTable.kt | 4 ++++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/core/src/com/unciv/logic/automation/unit/UnitAutomation.kt b/core/src/com/unciv/logic/automation/unit/UnitAutomation.kt index ff9b7944d6..c48aeacc1f 100644 --- a/core/src/com/unciv/logic/automation/unit/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/unit/UnitAutomation.kt @@ -611,6 +611,7 @@ object UnitAutomation { return true } + @Readonly private fun chooseBombardTarget(city: City): ICombatant? { var targets = TargetHelper.getBombardableTiles(city).map { Battle.getMapCombatantOfTile(it)!! } .filterNot { it is MapUnitCombatant && diff --git a/core/src/com/unciv/logic/battle/BattleUnitCapture.kt b/core/src/com/unciv/logic/battle/BattleUnitCapture.kt index 4e430a855f..886481f028 100644 --- a/core/src/com/unciv/logic/battle/BattleUnitCapture.kt +++ b/core/src/com/unciv/logic/battle/BattleUnitCapture.kt @@ -13,6 +13,7 @@ import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.tile.Tile import com.unciv.models.ruleset.unique.GameContext import com.unciv.models.ruleset.unique.UniqueType +import yairm210.purity.annotations.Readonly import kotlin.math.min import kotlin.random.Random @@ -46,8 +47,8 @@ object BattleUnitCapture { return spawnCapturedUnit(defender, attacker) } - - + + @Readonly private fun unitCapturedPrizeShipsUnique(attacker: MapUnitCombatant, defender: MapUnitCombatant): Boolean { if (attacker.unit.getMatchingUniques(UniqueType.KillUnitCapture) .none { defender.matchesFilter(it.params[0]) } diff --git a/core/src/com/unciv/logic/battle/TargetHelper.kt b/core/src/com/unciv/logic/battle/TargetHelper.kt index 054a173632..54ffa16371 100644 --- a/core/src/com/unciv/logic/battle/TargetHelper.kt +++ b/core/src/com/unciv/logic/battle/TargetHelper.kt @@ -7,8 +7,10 @@ import com.unciv.logic.map.mapunit.movement.PathsToTilesWithinTurn import com.unciv.logic.map.tile.Tile import com.unciv.models.ruleset.unique.GameContext import com.unciv.models.ruleset.unique.UniqueType +import yairm210.purity.annotations.Readonly object TargetHelper { + @Readonly fun getAttackableEnemies( unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn, @@ -68,6 +70,7 @@ object TargetHelper { return attackableTiles } + @Readonly private fun getTilesToAttackFromWhenUnitMoves(unitDistanceToTiles: PathsToTilesWithinTurn, unitMustBeSetUp: Boolean, unit: MapUnit) = unitDistanceToTiles.asSequence() .map { (tile, distance) -> @@ -86,6 +89,7 @@ object TargetHelper { it.first == unit.getTile() || unit.movement.canMoveTo(it.first) } + @Readonly private fun tileContainsAttackableEnemy(unit: MapUnit, tile: Tile, tilesToCheck: List?): Boolean { if (tile !in (tilesToCheck ?: unit.civ.viewableTiles) || !containsAttackableEnemy(tile, MapUnitCombatant(unit)) ) return false @@ -94,6 +98,7 @@ object TargetHelper { return (!unit.baseUnit.isMelee() || mapCombatant !is MapUnitCombatant || !mapCombatant.unit.isCivilian() || unit.movement.canPassThrough(tile)) } + @Readonly fun containsAttackableEnemy(tile: Tile, combatant: ICombatant): Boolean { if (combatant is MapUnitCombatant && combatant.unit.isEmbarked() && !combatant.hasUnique(UniqueType.AttackOnSea)) { // Can't attack water units while embarked, only land @@ -146,6 +151,7 @@ object TargetHelper { } /** Get a list of visible tiles which have something attackable */ + @Readonly fun getBombardableTiles(city: City): Sequence = city.getCenterTile().getTilesInDistance(city.getBombardRange()) .filter { it.isVisible(city.civ) && containsAttackableEnemy(it, CityCombatant(city)) } diff --git a/core/src/com/unciv/models/stats/Stats.kt b/core/src/com/unciv/models/stats/Stats.kt index 17272ed80d..3a6feaffb7 100644 --- a/core/src/com/unciv/models/stats/Stats.kt +++ b/core/src/com/unciv/models/stats/Stats.kt @@ -189,6 +189,7 @@ open class Stats( // function that removes the icon from the Stats object since the circular icons all appear the same // delete this and replace above instances with toString() once the text-coloring-affecting-font-icons bug is fixed (e.g., in notification text) + @Readonly fun toStringWithoutIcons(): String { return this.joinToString { it.value.toInt().tr() + " " + it.key.name.tr().substring(startIndex = 1) @@ -196,6 +197,7 @@ open class Stats( } /** Return a string of just +/- value and Stat symbol*/ + @Readonly fun toStringOnlyIcons(addPlusSign: Boolean = true): String { return this.joinToString { (if (addPlusSign && it.value > 0) "+" else "") + it.value.toInt() + " " + it.key.character diff --git a/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt index 205465ffa8..9d33e132e5 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/bottombar/BattleTable.kt @@ -38,6 +38,7 @@ import com.unciv.ui.screens.worldscreen.WorldScreen import com.unciv.ui.screens.worldscreen.bottombar.BattleTableHelpers.battleAnimationDeferred import com.unciv.ui.screens.worldscreen.bottombar.BattleTableHelpers.getHealthBar import com.unciv.utils.DebugUtils +import yairm210.purity.annotations.Readonly import kotlin.math.max import kotlin.math.roundToInt @@ -97,6 +98,7 @@ class BattleTable(val worldScreen: WorldScreen) : Table() { } + @Readonly private fun tryGetAttacker(): ICombatant? { val unitTable = worldScreen.bottomUnitTable return if (unitTable.selectedUnit != null @@ -108,11 +110,13 @@ class BattleTable(val worldScreen: WorldScreen) : Table() { else null // no attacker } + @Readonly private fun tryGetDefender(): ICombatant? { val selectedTile = worldScreen.mapHolder.selectedTile ?: return null // no selected tile return tryGetDefenderAtTile(selectedTile, false) } + @Readonly private fun tryGetDefenderAtTile(selectedTile: Tile, includeFriendly: Boolean): ICombatant? { val attackerCiv = worldScreen.viewingCiv val defender: ICombatant? = Battle.getMapCombatantOfTile(selectedTile)