From a6f6565112f891a3bac70bdc0f981c05145c1d43 Mon Sep 17 00:00:00 2001 From: vegeta1k95 <32207817+vegeta1k95@users.noreply.github.com> Date: Sun, 25 Dec 2022 07:36:37 +0100 Subject: [PATCH] Fix unit selection cycling (#8226) Co-authored-by: tunerzinc@gmail.com --- .../unciv/ui/worldscreen/unit/UnitTable.kt | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt index ce042b9395..9f9fda8603 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt @@ -25,6 +25,8 @@ import com.unciv.ui.utils.extensions.darken import com.unciv.ui.utils.extensions.onClick import com.unciv.ui.utils.extensions.toLabel import com.unciv.ui.worldscreen.WorldScreen +import com.unciv.utils.Log +import kotlin.system.measureTimeMillis class UnitTable(val worldScreen: WorldScreen) : Table() { private val prevIdleUnitButton = IdleUnitButton(this,worldScreen.mapHolder,true) @@ -286,7 +288,9 @@ class UnitTable(val worldScreen: WorldScreen) : Table() { // Do no select a different unit while in Air Sweep mode if (selectedUnit != null && selectedUnit!!.isPreparingAirSweep()) return - fun isViewingCiv(unit:MapUnit): Boolean = unit.civInfo == worldScreen.viewingCiv || worldScreen.viewingCiv.isSpectator() + fun MapUnit.isEligible(): Boolean = (this.civInfo == worldScreen.viewingCiv + || worldScreen.viewingCiv.isSpectator()) && this !in selectedUnits + fun MapUnit.isPrioritized(): Boolean = this.isGreatPerson() || this.hasUnique(UniqueType.FoundCity) // Civ 5 Order of selection: // 1. City @@ -295,37 +299,37 @@ class UnitTable(val worldScreen: WorldScreen) : Table() { // 4. Other civilian (Workers) // 5. None (Deselect) + val civUnit = selectedTile.civilianUnit + val milUnit = selectedTile.militaryUnit + val curUnit = selectedUnit + + val nextUnit: MapUnit? + val priorityUnit = when { + civUnit != null && civUnit.isEligible() && civUnit.isPrioritized() -> civUnit + milUnit != null && milUnit.isEligible() -> milUnit + civUnit != null && civUnit.isEligible() -> civUnit + else -> null + } + + if (curUnit == null) { + nextUnit = priorityUnit + } else { + + nextUnit = when { + curUnit == civUnit && milUnit != null && milUnit.isEligible() -> {if (civUnit.isPrioritized()) milUnit else null} + curUnit == milUnit && civUnit != null && civUnit.isEligible() -> {if (civUnit.isPrioritized()) null else civUnit} + else -> priorityUnit + } + } + when { forceSelectUnit != null -> selectUnit(forceSelectUnit) selectedTile.isCityCenter() && (selectedTile.getOwner() == worldScreen.viewingCiv || worldScreen.viewingCiv.isSpectator()) -> citySelected(selectedTile.getCity()!!) - - // Settlers and GP come first - - selectedTile.civilianUnit != null - && isViewingCiv(selectedTile.civilianUnit!!) - && (selectedTile.civilianUnit!!.isGreatPerson() || selectedTile.civilianUnit!!.hasUnique(UniqueType.FoundCity)) - && selectedTile.civilianUnit!! !in selectedUnits - && (selectedTile.militaryUnit == null || selectedUnit != selectedTile.militaryUnit) -> - selectUnit(selectedTile.civilianUnit!!, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) - - // Then military - selectedTile.militaryUnit != null - && isViewingCiv(selectedTile.militaryUnit!!) - && selectedTile.militaryUnit!! !in selectedUnits - && (selectedTile.civilianUnit == null || selectedUnit != selectedTile.civilianUnit) -> // Only select the military unit there if we do not currently have the civilian unit selected - selectUnit(selectedTile.militaryUnit!!, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) - - // Then the rest - selectedTile.civilianUnit != null - && isViewingCiv(selectedTile.civilianUnit!!) - && selectedTile.civilianUnit!! !in selectedUnits -> - selectUnit(selectedTile.civilianUnit!!, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) + nextUnit != null -> selectUnit(nextUnit, Gdx.input.isKeyPressed(Input.Keys.SHIFT_LEFT)) selectedTile == previouslySelectedUnit?.currentTile -> { - // tapping the same tile again will deselect a unit. - // important for single-tap-move to abort moving easily selectUnit() isVisible = false }