more ui improvements (#757)

* unit action: when an exclusive decision is made, deselect unit

* clicking on the unit information in the UnitTable will show that unit + minor fixes

* siege units won't show movement hints when set up, while packing up does not cost any movement points

* workers: highlight button when constructing an improvement, won't sleep then

* fixed broken saved game

* show messages if exploring is done or WorkerAutomation is done

* Revert "siege units won't show movement hints when set up, while packing up does not cost any movement points"

This reverts commit b805993a
This commit is contained in:
sulai 2019-05-16 16:54:58 +02:00 committed by Yair Morgenstern
parent 85b7607d58
commit 9ce7959d32
13 changed files with 50 additions and 15 deletions

View file

@ -408,5 +408,11 @@
Portuguese:"Encontramos um estoque de [quantidade] de ouro nas ruínas!" Portuguese:"Encontramos um estoque de [quantidade] de ouro nas ruínas!"
} }
"[unit] finished exploring.": {
"German": "[unit] hat die Erkundung abgeschlossen."
},
"[unit] has no work to do.": {
"German": "[unit] hat keine Arbeit mehr."
}
} }

View file

@ -1,5 +1,6 @@
package com.unciv.logic.automation package com.unciv.logic.automation
import com.badlogic.gdx.graphics.Color
import com.unciv.Constants import com.unciv.Constants
import com.unciv.UnCivGame import com.unciv.UnCivGame
import com.unciv.logic.battle.* import com.unciv.logic.battle.*
@ -9,6 +10,7 @@ import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.tr
import com.unciv.ui.worldscreen.unit.UnitAction import com.unciv.ui.worldscreen.unit.UnitAction
import com.unciv.ui.worldscreen.unit.UnitActions import com.unciv.ui.worldscreen.unit.UnitActions
@ -439,6 +441,7 @@ class UnitAutomation{
return return
} }
} }
unit.civInfo.addNotification("[${unit.name.tr()}] finished exploring.".tr(), unit.currentTile.position, Color.GRAY)
} }
} }

View file

@ -1,5 +1,6 @@
package com.unciv.logic.automation package com.unciv.logic.automation
import com.badlogic.gdx.graphics.Color
import com.unciv.Constants import com.unciv.Constants
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.BFS import com.unciv.logic.map.BFS
@ -8,6 +9,7 @@ import com.unciv.logic.map.RoadStatus
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.tile.TileImprovement import com.unciv.models.gamebasics.tile.TileImprovement
import com.unciv.models.gamebasics.tr
class WorkerAutomation(val unit: MapUnit) { class WorkerAutomation(val unit: MapUnit) {
@ -40,6 +42,9 @@ class WorkerAutomation(val unit: MapUnit) {
} }
if(tile.improvementInProgress!=null) return // we're working! if(tile.improvementInProgress!=null) return // we're working!
if(tryConnectingCities()) return //nothing to do, try again to connect cities if(tryConnectingCities()) return //nothing to do, try again to connect cities
unit.civInfo.addNotification("[${unit.name.tr()}] has no work to do.".tr(), unit.currentTile.position, Color.GRAY)
} }

View file

@ -310,8 +310,7 @@ class CivilizationInfo {
fun shouldGoToDueUnit() = UnCivGame.Current.settings.checkForDueUnits && getDueUnits().isNotEmpty() fun shouldGoToDueUnit() = UnCivGame.Current.settings.checkForDueUnits && getDueUnits().isNotEmpty()
fun getNextDueUnit(selectedUnit: MapUnit?): MapUnit? { fun getNextDueUnit(): MapUnit? {
selectedUnit?.due = false
val dueUnits = getDueUnits() val dueUnits = getDueUnits()
if(dueUnits.isNotEmpty()) { if(dueUnits.isNotEmpty()) {
val unit = dueUnits[0] val unit = dueUnits[0]

View file

@ -5,14 +5,14 @@ import com.badlogic.gdx.math.Vector2
class Notification { class Notification {
var text: String = "" var text: String = ""
var locations: List<Vector2> = listOf() var locations: ArrayList<Vector2> = ArrayList()
var color: Color = Color.BLACK var color: Color = Color.BLACK
internal constructor() // Needed for json deserialization internal constructor() // Needed for json deserialization
constructor(text: String, location: List<Vector2> = listOf(), color: Color) { constructor(text: String, locations: List<Vector2> = ArrayList(), color: Color) {
this.text = text this.text = text
this.locations = location this.locations = ArrayList(locations)
this.color = color this.color = color
} }
} }

View file

@ -209,6 +209,8 @@ open class TileInfo {
} }
fun hasImprovementInProgress() = improvementInProgress!=null
fun hasViewableResource(civInfo: CivilizationInfo): Boolean { fun hasViewableResource(civInfo: CivilizationInfo): Boolean {
return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!)) return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
} }

View file

@ -12,7 +12,7 @@ import com.unciv.ui.utils.ImageGetter
import com.unciv.ui.utils.onClick import com.unciv.ui.utils.onClick
import com.unciv.ui.utils.setFontColor import com.unciv.ui.utils.setFontColor
class ImprovementPickerScreen(tileInfo: TileInfo) : PickerScreen() { class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerScreen() {
private var selectedImprovement: TileImprovement? = null private var selectedImprovement: TileImprovement? = null
init { init {
@ -23,6 +23,7 @@ class ImprovementPickerScreen(tileInfo: TileInfo) : PickerScreen() {
rightSideButton.onClick { rightSideButton.onClick {
tileInfo.startWorkingOnImprovement(selectedImprovement!!, currentPlayerCiv) tileInfo.startWorkingOnImprovement(selectedImprovement!!, currentPlayerCiv)
if(tileInfo.civilianUnit!=null) tileInfo.civilianUnit!!.action=null // this is to "wake up" the worker if it's sleeping if(tileInfo.civilianUnit!=null) tileInfo.civilianUnit!!.action=null // this is to "wake up" the worker if it's sleeping
onAccept()
game.setWorldScreen() game.setWorldScreen()
dispose() dispose()
} }

View file

@ -73,6 +73,7 @@ class LoadScreen : PickerScreen() {
UnCivGame.Current.loadGame(loadedGame) UnCivGame.Current.loadGame(loadedGame)
}catch (ex:Exception){ }catch (ex:Exception){
errorLabel.setText("Could not load game from clipboard!".tr()) errorLabel.setText("Could not load game from clipboard!".tr())
ex.printStackTrace()
} }
} }
@ -101,6 +102,7 @@ class LoadScreen : PickerScreen() {
popup.addGoodSizedLabel(" paste into an email to yairm210@hotmail.com)").row() popup.addGoodSizedLabel(" paste into an email to yairm210@hotmail.com)").row()
popup.addGoodSizedLabel("I could maybe help you figure out what went wrong, since this isn't supposed to happen!").row() popup.addGoodSizedLabel("I could maybe help you figure out what went wrong, since this isn't supposed to happen!").row()
popup.open() popup.open()
ex.printStackTrace()
} }
} }

View file

@ -28,7 +28,8 @@ class NotificationsScroll(internal val worldScreen: WorldScreen) : ScrollPane(nu
listItem.background(ImageGetter.getDrawable("OtherIcons/civTableBackground.png")) listItem.background(ImageGetter.getDrawable("OtherIcons/civTableBackground.png"))
listItem.add(label).pad(5f).padRight(10f) listItem.add(label).pad(5f).padRight(10f)
// using a larger click area to avoid miss-clicking in between the messages on the map // using a large click area with no gap in between each message item.
// this avoids accidentally clicking in between the messages, resulting in a map click
val clickArea = Table().apply { val clickArea = Table().apply {
add(listItem).pad(3f) add(listItem).pad(3f)
touchable = Touchable.enabled touchable = Touchable.enabled

View file

@ -228,12 +228,12 @@ class WorldScreen : CameraStageBaseScreen() {
// cycle through units not yet done // cycle through units not yet done
if (currentPlayerCiv.shouldGoToDueUnit()) { if (currentPlayerCiv.shouldGoToDueUnit()) {
val nextDueUnit = currentPlayerCiv.getNextDueUnit(bottomBar.unitTable.selectedUnit) val nextDueUnit = currentPlayerCiv.getNextDueUnit()
if(nextDueUnit!=null) { if(nextDueUnit!=null) {
tileMapHolder.setCenterPosition(nextDueUnit.currentTile.position) tileMapHolder.setCenterPosition(nextDueUnit.currentTile.position)
shouldUpdate=true shouldUpdate=true
return@onClick
} }
return@onClick
} }
if (currentPlayerCiv.shouldOpenTechPicker()) { if (currentPlayerCiv.shouldOpenTechPicker()) {

View file

@ -158,7 +158,11 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
} }
} }
if(attackableEnemy == null) attackButton.disable() if (attackableEnemy == null) {
attackButton.disable()
attackButton.label.color = Color.GRAY
}
else { else {
attackButton.onClick { attackButton.onClick {
try { try {

View file

@ -39,16 +39,20 @@ class UnitActions {
} }
} }
if(!unit.isFortified() && (!unit.canFortify() || unit.health<100) && unit.currentMovement >0 && unit.action!="Set Up") { val workingOnImprovement = unit.hasUnique("Can build improvements on tiles") && unit.currentTile.hasImprovementInProgress()
if(!unit.isFortified() && (!unit.canFortify() || unit.health<100) && unit.currentMovement >0
&& unit.action!="Set Up" && !workingOnImprovement) {
val sleeping = unit.action == "Sleep" val sleeping = unit.action == "Sleep"
actionList += UnitAction("Sleep", !sleeping, sleeping) { actionList += UnitAction("Sleep", !sleeping, sleeping) {
unit.action = "Sleep" unit.action = "Sleep"
unitTable.selectedUnit = null
} }
} }
if(unit.canFortify()) { if(unit.canFortify()) {
actionList += UnitAction("Fortify", unit.currentMovement >0) { actionList += UnitAction("Fortify", unit.currentMovement >0) {
unit.action = "Fortify 0" unit.action = "Fortify 0"
unitTable.selectedUnit = null
}.sound("fortify") }.sound("fortify")
} else if (unit.isFortified()) { } else if (unit.isFortified()) {
actionList += UnitAction( actionList += UnitAction(
@ -126,9 +130,10 @@ class UnitActions {
unit.action="Set Up" unit.action="Set Up"
// setting up uses up all movement points // setting up uses up all movement points
// this is to avoid problems with the idle state: // this is to avoid problems with the idle state:
// - it should not be idle when setting up right now // - unit should not be idle when setting up right now
// - it should be idle when set up in the past // - unit should be idle when set up in the past
unit.currentMovement=0f unit.currentMovement=0f
unitTable.selectedUnit = null
}.sound("setup") }.sound("setup")
} }
@ -150,8 +155,9 @@ class UnitActions {
actionList += UnitAction("Construct improvement", actionList += UnitAction("Construct improvement",
unit.currentMovement >0 unit.currentMovement >0
&& !tile.isCityCenter() && !tile.isCityCenter()
&& GameBasics.TileImprovements.values.any { tile.canBuildImprovement(it, unit.civInfo) } && GameBasics.TileImprovements.values.any { tile.canBuildImprovement(it, unit.civInfo) },
) { worldScreen.game.screen = ImprovementPickerScreen(tile) } currentAction = unit.currentTile.hasImprovementInProgress()
) { worldScreen.game.screen = ImprovementPickerScreen(tile) { unitTable.selectedUnit = null } }
if("automation" == unit.action){ if("automation" == unit.action){
actionList += UnitAction("Stop automation", true) {unit.action = null} actionList += UnitAction("Stop automation", true) {unit.action = null}

View file

@ -71,6 +71,12 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){
separator= addSeparator().actor!! separator= addSeparator().actor!!
add(promotionsTable).colspan(2).row() add(promotionsTable).colspan(2).row()
add(unitDescriptionTable) add(unitDescriptionTable)
touchable = Touchable.enabled
onClick {
selectedUnit?.currentTile?.position?.let {
worldScreen.tileMapHolder.setCenterPosition(it)
}
}
}).expand() }).expand()
add(nextIdleUnitButton) add(nextIdleUnitButton)