Added 'for [amount] movement' unit action modifier

This commit is contained in:
Yair Morgenstern
2023-03-02 21:02:34 +02:00
parent 085c5d73e8
commit 06fa2c2378
5 changed files with 24 additions and 7 deletions

View File

@ -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",

View File

@ -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

View File

@ -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<String>()
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() }})"
}

View File

@ -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()
}
}