Skip to content

Commit

Permalink
Implement a waiting command (#6884)
Browse files Browse the repository at this point in the history
  • Loading branch information
doublep committed May 21, 2022
1 parent 8b9946e commit 27a03bc
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 24 deletions.
32 changes: 24 additions & 8 deletions core/src/com/unciv/logic/civilization/CivilizationInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,12 @@ class CivilizationInfo {
*/
var attacksSinceTurnStart = ArrayList<HistoricalAttackMemory>()

/**
* Queue of all civilization units that have their actions possibly pending. Internally
* might include e.g. non-idle units, so must be filtered before being given to any outside code.
* (Should be small enough that using ArrayList is fine.)
*/
private var dueUnits = ArrayList<MapUnit>()
var hasMovedAutomatedUnits = false

@Transient
Expand Down Expand Up @@ -264,6 +270,7 @@ class CivilizationInfo {
toReturn.totalCultureForContests = totalCultureForContests
toReturn.totalFaithForContests = totalFaithForContests
toReturn.attacksSinceTurnStart = attacksSinceTurnStart.copy()
toReturn.dueUnits = ArrayList<MapUnit>(dueUnits)
toReturn.hasMovedAutomatedUnits = hasMovedAutomatedUnits
return toReturn
}
Expand Down Expand Up @@ -453,6 +460,8 @@ class CivilizationInfo {
newList.add(mapUnit)
units = newList

dueUnits.add(mapUnit)

if (updateCivInfo) {
// Not relevant when updating TileInfo transients, since some info of the civ itself isn't yet available,
// and in any case it'll be updated once civ info transients are
Expand All @@ -471,18 +480,23 @@ class CivilizationInfo {

fun getIdleUnits() = getCivUnits().filter { it.isIdle() }

private fun getDueUnits() = getCivUnits().filter { it.due && it.isIdle() }
// Drop all units that are not really 'due' anymore. We do it here to avoid caring how and where it happened.
fun getDueUnits() = dueUnits.filter { it.due && !it.isDestroyed && it.isIdle() }

fun shouldGoToDueUnit() = UncivGame.Current.settings.checkForDueUnits && getDueUnits().any()

fun getNextDueUnit(): MapUnit? {
val dueUnits = getDueUnits()
if (dueUnits.any()) {
val unit = dueUnits.first()
unit.due = false
return unit
fun getNextDueUnit() = getDueUnits().firstOrNull()

fun cycleThroughDueUnits(): MapUnit? {
var realDueUnits = getDueUnits();
if (realDueUnits.any()) {
var unit = realDueUnits.first();
// We shift the unit to the back of the queue. However, the caller may clear its 'due' state if it wants.
dueUnits.remove(unit);
dueUnits.add(unit);
return unit;
}
return null
else return null;
}
//endregion

Expand Down Expand Up @@ -828,6 +842,8 @@ class CivilizationInfo {
fun startTurn() {
civConstructions.startTurn()
attacksSinceTurnStart.clear()
dueUnits.clear()
dueUnits.addAll(getCivUnits())
updateStatsForNextTurn() // for things that change when turn passes e.g. golden age, city state influence

// Do this after updateStatsForNextTurn but before cities.startTurn
Expand Down
2 changes: 2 additions & 0 deletions core/src/com/unciv/models/UnitAction.kt
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ enum class UnitActionType(
{ ImageGetter.getImage("OtherIcons/DisbandUnit") }, KeyCharAndCode.DEL),
GiftUnit("Gift unit",
{ ImageGetter.getImage("OtherIcons/Present") }, UncivSound.Silent),
Wait("Wait",
null, 'z', UncivSound.Silent),
ShowAdditionalActions("Show more",
{ imageGetShowMore() }, KeyCharAndCode(Input.Keys.PAGE_DOWN)),
HideAdditionalActions("Back",
Expand Down
34 changes: 20 additions & 14 deletions core/src/com/unciv/ui/worldscreen/WorldScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,11 @@ class WorldScreen(val gameInfo: GameInfo, val viewingCiv:CivilizationInfo) : Bas
// Don't select unit and change selectedCiv when centering as spectator
if (viewingCiv.isSpectator())
mapHolder.setCenterPosition(tileToCenterOn, immediately = true, selectUnit = false)
else
else {
mapHolder.setCenterPosition(tileToCenterOn, immediately = true, selectUnit = true)

if (viewingCiv.getNextDueUnit() == bottomUnitTable.selectedUnit)
viewingCiv.cycleThroughDueUnits()
}

tutorialController.allTutorialsShowedCallback = { shouldUpdate = true }

Expand Down Expand Up @@ -727,6 +729,21 @@ class WorldScreen(val gameInfo: GameInfo, val viewingCiv:CivilizationInfo) : Bas
}
}

fun switchToNextUnit() {
val nextDueUnit = viewingCiv.cycleThroughDueUnits()
if (nextDueUnit != null) {
mapHolder.setCenterPosition(
nextDueUnit.currentTile.position,
immediately = false,
selectUnit = false
)
bottomUnitTable.selectUnit(nextDueUnit)
shouldUpdate = true
// Unless 'wait' action is chosen, the unit will not be considered due anymore.
nextDueUnit.due = false
}
}

private fun updateNextTurnButton(isSomethingOpen: Boolean) {
nextTurnButton.update(isSomethingOpen, isPlayersTurn, waitingForAutosave, getNextTurnAction())
nextTurnButton.setPosition(stage.width - nextTurnButton.width - 10f, topBar.y - nextTurnButton.height - 10f)
Expand All @@ -741,18 +758,7 @@ class WorldScreen(val gameInfo: GameInfo, val viewingCiv:CivilizationInfo) : Bas
NextTurnAction("Waiting for other players...",Color.GRAY) {}

viewingCiv.shouldGoToDueUnit() ->
NextTurnAction("Next unit", Color.LIGHT_GRAY) {
val nextDueUnit = viewingCiv.getNextDueUnit()
if (nextDueUnit != null) {
mapHolder.setCenterPosition(
nextDueUnit.currentTile.position,
immediately = false,
selectUnit = false
)
bottomUnitTable.selectUnit(nextDueUnit)
shouldUpdate = true
}
}
NextTurnAction("Next unit", Color.LIGHT_GRAY) { switchToNextUnit() }

viewingCiv.cities.any { it.cityConstructions.currentConstructionFromQueue == "" } ->
NextTurnAction("Pick construction", Color.CORAL) {
Expand Down
18 changes: 16 additions & 2 deletions core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,10 @@ object UnitActions {
addTriggerUniqueActions(unit, actionList)
addAddInCapitalAction(unit, actionList, tile)


addToggleActionsAction(unit, actionList, unitTable)

addWaitAction(unit, actionList, worldScreen);

return actionList
}

Expand Down Expand Up @@ -832,4 +833,17 @@ object UnitActions {
)
}

}
private fun addWaitAction(unit: MapUnit, actionList: ArrayList<UnitAction>, worldScreen: WorldScreen) {
// This is only for idle units.
if (!unit.isIdle()) return
// Don't add if there are no idle units we could switch to,
if (!worldScreen.viewingCiv.getDueUnits().any()) return
actionList += UnitAction(
type = UnitActionType.Wait,
action = {
unit.due = true
worldScreen.switchToNextUnit()
}
)
}
}

0 comments on commit 27a03bc

Please sign in to comment.