mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-14 09:48:12 +07:00
Added Undo button for unit moves!
This commit is contained in:
@ -414,7 +414,7 @@ class UncivFiles(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// keep auto-saves for the last 10 turns for debugging purposes
|
// keep auto-saves for the last 10 turns for debugging purposes
|
||||||
if(nextTurn) {
|
if (nextTurn) {
|
||||||
val newAutosaveFilename =
|
val newAutosaveFilename =
|
||||||
SAVE_FILES_FOLDER + File.separator + AUTOSAVE_FILE_NAME + "-${gameInfo.currentPlayer}-${gameInfo.turns}"
|
SAVE_FILES_FOLDER + File.separator + AUTOSAVE_FILE_NAME + "-${gameInfo.currentPlayer}-${gameInfo.turns}"
|
||||||
val file =
|
val file =
|
||||||
|
@ -7,17 +7,18 @@ import com.badlogic.gdx.scenes.scene2d.ui.Container
|
|||||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||||
import com.unciv.models.UncivSound
|
import com.unciv.models.UncivSound
|
||||||
import com.unciv.models.translations.tr
|
import com.unciv.models.translations.tr
|
||||||
import com.unciv.ui.images.ImageGetter
|
|
||||||
import com.unciv.ui.screens.overviewscreen.EspionageOverviewScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.TechButton
|
|
||||||
import com.unciv.ui.screens.pickerscreens.TechPickerScreen
|
|
||||||
import com.unciv.ui.screens.diplomacyscreen.DiplomacyScreen
|
|
||||||
import com.unciv.ui.components.BaseScreen
|
import com.unciv.ui.components.BaseScreen
|
||||||
import com.unciv.ui.components.Fonts
|
import com.unciv.ui.components.Fonts
|
||||||
import com.unciv.ui.components.extensions.colorFromRGB
|
import com.unciv.ui.components.extensions.colorFromRGB
|
||||||
import com.unciv.ui.components.extensions.onClick
|
import com.unciv.ui.components.extensions.onClick
|
||||||
import com.unciv.ui.components.extensions.toLabel
|
import com.unciv.ui.components.extensions.toLabel
|
||||||
|
import com.unciv.ui.images.ImageGetter
|
||||||
|
import com.unciv.ui.screens.diplomacyscreen.DiplomacyScreen
|
||||||
|
import com.unciv.ui.screens.overviewscreen.EspionageOverviewScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.TechButton
|
||||||
|
import com.unciv.ui.screens.pickerscreens.TechPickerScreen
|
||||||
|
import com.unciv.utils.concurrency.Concurrency
|
||||||
|
|
||||||
|
|
||||||
/** A holder for Tech, Policies and Diplomacy buttons going in the top left of the WorldScreen just under WorldScreenTopBar */
|
/** A holder for Tech, Policies and Diplomacy buttons going in the top left of the WorldScreen just under WorldScreenTopBar */
|
||||||
@ -30,6 +31,8 @@ class TechPolicyDiplomacyButtons(val worldScreen: WorldScreen) : Table(BaseScree
|
|||||||
private val policyScreenButton = Button(skin)
|
private val policyScreenButton = Button(skin)
|
||||||
private val diplomacyButtonHolder = Container<Button?>()
|
private val diplomacyButtonHolder = Container<Button?>()
|
||||||
private val diplomacyButton = Button(skin)
|
private val diplomacyButton = Button(skin)
|
||||||
|
private val undoButtonHolder = Container<Button?>()
|
||||||
|
private val undoButton = Button(skin)
|
||||||
private val espionageButtonHolder = Container<Button?>()
|
private val espionageButtonHolder = Container<Button?>()
|
||||||
private val espionageButton = Button(skin)
|
private val espionageButton = Button(skin)
|
||||||
|
|
||||||
@ -39,6 +42,7 @@ class TechPolicyDiplomacyButtons(val worldScreen: WorldScreen) : Table(BaseScree
|
|||||||
init {
|
init {
|
||||||
defaults().left()
|
defaults().left()
|
||||||
add(techButtonHolder).colspan(4).row()
|
add(techButtonHolder).colspan(4).row()
|
||||||
|
add(undoButtonHolder).padTop(10f).padRight(10f)
|
||||||
add(policyButtonHolder).padTop(10f).padRight(10f)
|
add(policyButtonHolder).padTop(10f).padRight(10f)
|
||||||
add(diplomacyButtonHolder).padTop(10f).padRight(10f)
|
add(diplomacyButtonHolder).padTop(10f).padRight(10f)
|
||||||
add(espionageButtonHolder).padTop(10f)
|
add(espionageButtonHolder).padTop(10f)
|
||||||
@ -51,6 +55,15 @@ class TechPolicyDiplomacyButtons(val worldScreen: WorldScreen) : Table(BaseScree
|
|||||||
game.pushScreen(TechPickerScreen(viewingCiv))
|
game.pushScreen(TechPickerScreen(viewingCiv))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
undoButton.add(ImageGetter.getImage("OtherIcons/Resume")).size(30f).pad(15f)
|
||||||
|
undoButton.onClick {
|
||||||
|
Concurrency.run {
|
||||||
|
// Most of the time we won't load this, so we only set transients once we see it's relevant
|
||||||
|
worldScreen.preActionGameInfo.setTransients()
|
||||||
|
game.loadGame(worldScreen.preActionGameInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
policyScreenButton.add(ImageGetter.getImage("PolicyIcons/Constitution")).size(30f).pad(15f)
|
policyScreenButton.add(ImageGetter.getImage("PolicyIcons/Constitution")).size(30f).pad(15f)
|
||||||
policyButtonHolder.onClick {
|
policyButtonHolder.onClick {
|
||||||
game.pushScreen(PolicyPickerScreen(worldScreen))
|
game.pushScreen(PolicyPickerScreen(worldScreen))
|
||||||
@ -69,6 +82,7 @@ class TechPolicyDiplomacyButtons(val worldScreen: WorldScreen) : Table(BaseScree
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun update(): Boolean {
|
fun update(): Boolean {
|
||||||
|
updateUndoButton()
|
||||||
updateTechButton()
|
updateTechButton()
|
||||||
updatePolicyButton()
|
updatePolicyButton()
|
||||||
val result = updateDiplomacyButton()
|
val result = updateDiplomacyButton()
|
||||||
@ -103,6 +117,17 @@ class TechPolicyDiplomacyButtons(val worldScreen: WorldScreen) : Table(BaseScree
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateUndoButton() {
|
||||||
|
// Don't show policies until they become relevant
|
||||||
|
if (worldScreen.gameInfo != worldScreen.preActionGameInfo) {
|
||||||
|
undoButtonHolder.touchable = Touchable.enabled
|
||||||
|
undoButtonHolder.actor = undoButton
|
||||||
|
} else {
|
||||||
|
undoButtonHolder.touchable = Touchable.disabled
|
||||||
|
undoButtonHolder.actor = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updatePolicyButton() {
|
private fun updatePolicyButton() {
|
||||||
// Don't show policies until they become relevant
|
// Don't show policies until they become relevant
|
||||||
if (viewingCiv.policies.adoptedPolicies.isNotEmpty() || viewingCiv.policies.canAdoptPolicy()) {
|
if (viewingCiv.policies.adoptedPolicies.isNotEmpty() || viewingCiv.policies.canAdoptPolicy()) {
|
||||||
|
@ -17,27 +17,21 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
|
|||||||
import com.badlogic.gdx.utils.Align
|
import com.badlogic.gdx.utils.Align
|
||||||
import com.unciv.Constants
|
import com.unciv.Constants
|
||||||
import com.unciv.UncivGame
|
import com.unciv.UncivGame
|
||||||
|
import com.unciv.logic.automation.unit.AttackableTile
|
||||||
import com.unciv.logic.automation.unit.BattleHelper
|
import com.unciv.logic.automation.unit.BattleHelper
|
||||||
import com.unciv.logic.automation.unit.UnitAutomation
|
import com.unciv.logic.automation.unit.UnitAutomation
|
||||||
import com.unciv.logic.battle.Battle
|
import com.unciv.logic.battle.Battle
|
||||||
import com.unciv.logic.battle.MapUnitCombatant
|
import com.unciv.logic.battle.MapUnitCombatant
|
||||||
import com.unciv.logic.city.City
|
import com.unciv.logic.city.City
|
||||||
import com.unciv.logic.civilization.Civilization
|
import com.unciv.logic.civilization.Civilization
|
||||||
|
import com.unciv.logic.map.TileMap
|
||||||
import com.unciv.logic.map.mapunit.MapUnit
|
import com.unciv.logic.map.mapunit.MapUnit
|
||||||
import com.unciv.logic.map.tile.Tile
|
import com.unciv.logic.map.tile.Tile
|
||||||
import com.unciv.logic.map.TileMap
|
|
||||||
import com.unciv.logic.automation.unit.AttackableTile
|
|
||||||
import com.unciv.models.UncivSound
|
import com.unciv.models.UncivSound
|
||||||
import com.unciv.models.helpers.MapArrowType
|
import com.unciv.models.helpers.MapArrowType
|
||||||
import com.unciv.models.helpers.MiscArrowTypes
|
import com.unciv.models.helpers.MiscArrowTypes
|
||||||
import com.unciv.models.ruleset.unique.UniqueType
|
import com.unciv.models.ruleset.unique.UniqueType
|
||||||
import com.unciv.ui.screens.basescreen.UncivStage
|
|
||||||
import com.unciv.ui.audio.SoundPlayer
|
import com.unciv.ui.audio.SoundPlayer
|
||||||
import com.unciv.ui.images.ImageGetter
|
|
||||||
import com.unciv.ui.components.tilegroups.TileGroupMap
|
|
||||||
import com.unciv.ui.components.tilegroups.TileGroup
|
|
||||||
import com.unciv.ui.components.tilegroups.TileSetStrings
|
|
||||||
import com.unciv.ui.components.tilegroups.WorldTileGroup
|
|
||||||
import com.unciv.ui.components.BaseScreen
|
import com.unciv.ui.components.BaseScreen
|
||||||
import com.unciv.ui.components.KeyCharAndCode
|
import com.unciv.ui.components.KeyCharAndCode
|
||||||
import com.unciv.ui.components.UnitGroup
|
import com.unciv.ui.components.UnitGroup
|
||||||
@ -50,6 +44,12 @@ import com.unciv.ui.components.extensions.onActivation
|
|||||||
import com.unciv.ui.components.extensions.onClick
|
import com.unciv.ui.components.extensions.onClick
|
||||||
import com.unciv.ui.components.extensions.surroundWithCircle
|
import com.unciv.ui.components.extensions.surroundWithCircle
|
||||||
import com.unciv.ui.components.extensions.toLabel
|
import com.unciv.ui.components.extensions.toLabel
|
||||||
|
import com.unciv.ui.components.tilegroups.TileGroup
|
||||||
|
import com.unciv.ui.components.tilegroups.TileGroupMap
|
||||||
|
import com.unciv.ui.components.tilegroups.TileSetStrings
|
||||||
|
import com.unciv.ui.components.tilegroups.WorldTileGroup
|
||||||
|
import com.unciv.ui.images.ImageGetter
|
||||||
|
import com.unciv.ui.screens.basescreen.UncivStage
|
||||||
import com.unciv.utils.Log
|
import com.unciv.utils.Log
|
||||||
import com.unciv.utils.concurrency.Concurrency
|
import com.unciv.utils.concurrency.Concurrency
|
||||||
import com.unciv.utils.concurrency.launchOnGLThread
|
import com.unciv.utils.concurrency.launchOnGLThread
|
||||||
@ -257,6 +257,8 @@ class WorldMapHolder(
|
|||||||
return@run
|
return@run
|
||||||
} // can't move here
|
} // can't move here
|
||||||
|
|
||||||
|
worldScreen.preActionGameInfo = worldScreen.gameInfo.clone()
|
||||||
|
|
||||||
launchOnGLThread {
|
launchOnGLThread {
|
||||||
try {
|
try {
|
||||||
// Because this is darned concurrent (as it MUST be to avoid ANRs),
|
// Because this is darned concurrent (as it MUST be to avoid ANRs),
|
||||||
|
@ -13,7 +13,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton
|
|||||||
import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
import com.badlogic.gdx.scenes.scene2d.ui.TextField
|
||||||
import com.badlogic.gdx.utils.Align
|
import com.badlogic.gdx.utils.Align
|
||||||
import com.unciv.Constants
|
import com.unciv.Constants
|
||||||
import com.unciv.ui.screens.mainmenuscreen.MainMenuScreen
|
|
||||||
import com.unciv.UncivGame
|
import com.unciv.UncivGame
|
||||||
import com.unciv.logic.GameInfo
|
import com.unciv.logic.GameInfo
|
||||||
import com.unciv.logic.UncivShowableException
|
import com.unciv.logic.UncivShowableException
|
||||||
@ -27,20 +26,6 @@ import com.unciv.logic.trade.TradeEvaluation
|
|||||||
import com.unciv.models.TutorialTrigger
|
import com.unciv.models.TutorialTrigger
|
||||||
import com.unciv.models.ruleset.tile.ResourceType
|
import com.unciv.models.ruleset.tile.ResourceType
|
||||||
import com.unciv.models.ruleset.unique.UniqueType
|
import com.unciv.models.ruleset.unique.UniqueType
|
||||||
import com.unciv.ui.screens.cityscreen.CityScreen
|
|
||||||
import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen
|
|
||||||
import com.unciv.ui.images.ImageGetter
|
|
||||||
import com.unciv.ui.screens.overviewscreen.EmpireOverviewScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.DiplomaticVoteResultScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.GreatPersonPickerScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen
|
|
||||||
import com.unciv.ui.screens.pickerscreens.TechPickerScreen
|
|
||||||
import com.unciv.ui.popups.Popup
|
|
||||||
import com.unciv.ui.popups.ToastPopup
|
|
||||||
import com.unciv.ui.popups.hasOpenPopups
|
|
||||||
import com.unciv.ui.screens.savescreens.LoadGameScreen
|
|
||||||
import com.unciv.ui.screens.savescreens.QuickSave
|
|
||||||
import com.unciv.ui.screens.savescreens.SaveGameScreen
|
|
||||||
import com.unciv.ui.components.BaseScreen
|
import com.unciv.ui.components.BaseScreen
|
||||||
import com.unciv.ui.components.KeyCharAndCode
|
import com.unciv.ui.components.KeyCharAndCode
|
||||||
import com.unciv.ui.components.extensions.centerX
|
import com.unciv.ui.components.extensions.centerX
|
||||||
@ -50,6 +35,21 @@ import com.unciv.ui.components.extensions.onClick
|
|||||||
import com.unciv.ui.components.extensions.setFontSize
|
import com.unciv.ui.components.extensions.setFontSize
|
||||||
import com.unciv.ui.components.extensions.toLabel
|
import com.unciv.ui.components.extensions.toLabel
|
||||||
import com.unciv.ui.components.extensions.toTextButton
|
import com.unciv.ui.components.extensions.toTextButton
|
||||||
|
import com.unciv.ui.images.ImageGetter
|
||||||
|
import com.unciv.ui.popups.Popup
|
||||||
|
import com.unciv.ui.popups.ToastPopup
|
||||||
|
import com.unciv.ui.popups.hasOpenPopups
|
||||||
|
import com.unciv.ui.screens.cityscreen.CityScreen
|
||||||
|
import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen
|
||||||
|
import com.unciv.ui.screens.mainmenuscreen.MainMenuScreen
|
||||||
|
import com.unciv.ui.screens.overviewscreen.EmpireOverviewScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.DiplomaticVoteResultScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.GreatPersonPickerScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen
|
||||||
|
import com.unciv.ui.screens.pickerscreens.TechPickerScreen
|
||||||
|
import com.unciv.ui.screens.savescreens.LoadGameScreen
|
||||||
|
import com.unciv.ui.screens.savescreens.QuickSave
|
||||||
|
import com.unciv.ui.screens.savescreens.SaveGameScreen
|
||||||
import com.unciv.ui.screens.victoryscreen.VictoryScreen
|
import com.unciv.ui.screens.victoryscreen.VictoryScreen
|
||||||
import com.unciv.ui.screens.worldscreen.bottombar.BattleTable
|
import com.unciv.ui.screens.worldscreen.bottombar.BattleTable
|
||||||
import com.unciv.ui.screens.worldscreen.bottombar.TileInfoTable
|
import com.unciv.ui.screens.worldscreen.bottombar.TileInfoTable
|
||||||
@ -126,6 +126,8 @@ class WorldScreen(
|
|||||||
|
|
||||||
var uiEnabled = true
|
var uiEnabled = true
|
||||||
|
|
||||||
|
var preActionGameInfo = gameInfo
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
// notifications are right-aligned, they take up only as much space as necessary.
|
// notifications are right-aligned, they take up only as much space as necessary.
|
||||||
|
Reference in New Issue
Block a user