diff --git a/core/src/com/unciv/models/UnitAction.kt b/core/src/com/unciv/models/UnitAction.kt index 01bc2d6e2b..7e4cca8679 100644 --- a/core/src/com/unciv/models/UnitAction.kt +++ b/core/src/com/unciv/models/UnitAction.kt @@ -98,7 +98,7 @@ enum class UnitActionType( Repair(Constants.repair, { ImageGetter.getUnitActionPortrait("Repair") }, 'r', UncivSound.Construction), Create("Create", - null, 'i', UncivSound.Chimes), + null, 'i', false, UncivSound.Chimes), HurryResearch("{Hurry Research} (${Fonts.death})", { ImageGetter.getUnitActionPortrait("HurryResearch") }, 'g', UncivSound.Chimes), StartGoldenAge("Start Golden Age", diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 160ab7976a..609105f68b 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -506,6 +506,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: ///////////////////////////////////////// region UNIT ACTION MODIFIERS ///////////////////////////////////////// UnitActionConsumeUnit("by consuming this unit", UniqueTarget.UnitActionModifier), + UnitActionMovementCost("for [amount] movement", UniqueTarget.UnitActionModifier), // endregion 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 6db6651c58..7f369af574 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 @@ -483,6 +483,9 @@ object UnitActions { unitTile.stopWorkingOnImprovement() improvement.handleImprovementCompletion(unit) + // without this the world screen won't the improvement because it isn't the 'last seen improvement' + unit.civ.cache.updateViewableTiles() + if (unique.type == UniqueType.ConstructImprovementConsumingUnit) unit.consume() else activateSideEffects(unit, unique) }.takeIf { @@ -680,21 +683,29 @@ object UnitActions { ) } + fun getMovementPointsToUse(actionUnique: Unique): Int { + val movementCost = actionUnique.conditionals.filter { it.type == UniqueType.UnitActionMovementCost }.minOfOrNull { it.params[0].toInt() } + if (movementCost != null) return movementCost + return 1 + } + fun activateSideEffects(unit: MapUnit, actionUnique: Unique){ - var conditionalsWithNoSideEffect = 0 + val movementCost = getMovementPointsToUse(actionUnique) + unit.useMovementPoints(movementCost.toFloat()) + for (conditional in actionUnique.conditionals){ when (conditional.type){ UniqueType.UnitActionConsumeUnit -> unit.consume() - else -> conditionalsWithNoSideEffect++ + else -> continue } } - if (conditionalsWithNoSideEffect == actionUnique.conditionals.size) - unit.useMovementPoints(1f) } fun getSideEffectString(actionUnique: Unique): String { val effects = ArrayList() if (actionUnique.conditionals.any { it.type == UniqueType.UnitActionConsumeUnit }) effects += Fonts.death.toString() + else effects += getMovementPointsToUse(actionUnique).toString() + Fonts.movement + return if (effects.isEmpty()) "" else "(${effects.joinToString { it.tr() }})" } diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsTable.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsTable.kt index 04105363fb..48fcc81b6e 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsTable.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsTable.kt @@ -8,12 +8,12 @@ import com.unciv.UncivGame import com.unciv.logic.map.mapunit.MapUnit import com.unciv.models.UnitAction import com.unciv.models.UnitActionType -import com.unciv.ui.images.IconTextButton import com.unciv.ui.components.KeyCharAndCode import com.unciv.ui.components.UncivTooltip.Companion.addTooltip import com.unciv.ui.components.extensions.disable import com.unciv.ui.components.extensions.keyShortcuts import com.unciv.ui.components.extensions.onActivation +import com.unciv.ui.images.IconTextButton import com.unciv.ui.screens.worldscreen.WorldScreen class UnitActionsTable(val worldScreen: WorldScreen) : Table() { @@ -53,7 +53,7 @@ class UnitActionsTable(val worldScreen: WorldScreen) : Table() { // overlay, since the user definitely wants to interact with the new unit. worldScreen.mapHolder.removeUnitActionOverlay() if (UncivGame.Current.settings.autoUnitCycle - && (unitAction.type.isSkippingToNextUnit || unit.currentMovement == 0f)) { + && (unit.isDestroyed || unitAction.type.isSkippingToNextUnit || unit.currentMovement == 0f)) { worldScreen.switchToNextUnit() } } diff --git a/docs/Modders/uniques.md b/docs/Modders/uniques.md index 0b29039eda..1763ac47d8 100644 --- a/docs/Modders/uniques.md +++ b/docs/Modders/uniques.md @@ -1978,6 +1978,11 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl ??? example "<by consuming this unit>" Applicable to: UnitActionModifier +??? example "<for [amount] movement>" + Example: "<for [3] movement>" + + Applicable to: UnitActionModifier + *[action]: An action that a unit can perform. Currently, there are only two actions part of this: 'Spread Religion' and 'Remove Foreign religions from your own cities' *[amount]: This indicates a whole number, possibly with a + or - sign, such as `2`, `+13`, or `-3`.