From cb25e327622ff0a1032654b86db84167c6ccf21c Mon Sep 17 00:00:00 2001 From: SomeTroglodyte <63000004+SomeTroglodyte@users.noreply.github.com> Date: Thu, 23 Mar 2023 08:17:12 +0100 Subject: [PATCH] "Sleep until healed" knows when you can't (#9003) --- core/src/com/unciv/logic/map/mapunit/MapUnit.kt | 8 ++++++++ core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt | 6 +----- .../ui/screens/worldscreen/unit/actions/UnitActions.kt | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt index 28f40807af..065665b15d 100644 --- a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt +++ b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt @@ -414,6 +414,14 @@ class MapUnit : IsPartOfGameInfoSerialization { return getMatchingUniques(UniqueType.HealAdjacentUnits).sumOf { it.params[0].toInt() } } + fun getHealAmountForCurrentTile() = when { + isEmbarked() -> 0 // embarked units can't heal + health >= 100 -> 0 // No need to heal if at max health + hasUnique(UniqueType.HealOnlyByPillaging, checkCivInfoUniques = true) -> 0 + else -> rankTileForHealing(getTile()) + } + fun canHealInCurrentTile() = getHealAmountForCurrentTile() > 0 + // Only military land units can truly "garrison" fun canGarrison() = isMilitary() && baseUnit.isLandUnit() diff --git a/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt b/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt index 12ab5443a7..14d5867537 100644 --- a/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt +++ b/core/src/com/unciv/logic/map/mapunit/UnitTurnManager.kt @@ -66,11 +66,7 @@ class UnitTurnManager(val unit: MapUnit) { private fun healUnit() { - if (unit.isEmbarked()) return // embarked units can't heal - if (unit.health >= 100) return // No need to heal if at max health - if (unit.hasUnique(UniqueType.HealOnlyByPillaging, checkCivInfoUniques = true)) return - - val amountToHealBy = unit.rankTileForHealing(unit.getTile()) + val amountToHealBy = unit.getHealAmountForCurrentTile() if (amountToHealBy == 0) return unit.healBy(amountToHealBy) diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt index b7f035c6ae..84b4db301a 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt @@ -601,7 +601,7 @@ object UnitActions { if (isDamaged && !showingAdditionalActions) { actionList += UnitAction(UnitActionType.SleepUntilHealed, action = { unit.action = UnitActionType.SleepUntilHealed.value } - .takeIf { !unit.isSleepingUntilHealed() } + .takeIf { !unit.isSleepingUntilHealed() && unit.canHealInCurrentTile() } ) } else if (isDamaged || !showingAdditionalActions) { actionList += UnitAction(UnitActionType.Sleep,