mirror of
https://github.com/yairm210/Unciv.git
synced 2025-08-04 00:59:41 +07:00
Split tilemapholder overlay buttons to separate file
This commit is contained in:
@ -6,7 +6,7 @@ import com.unciv.logic.civilization.Civilization
|
||||
import com.unciv.models.metadata.GameSettings
|
||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||
import com.unciv.ui.screens.worldscreen.UndoHandler.Companion.clearUndoCheckpoints
|
||||
import com.unciv.ui.screens.worldscreen.WorldMapHolder
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapHolder
|
||||
import com.unciv.ui.screens.worldscreen.WorldScreen
|
||||
import com.unciv.ui.screens.worldscreen.unit.UnitTable
|
||||
|
||||
|
@ -49,7 +49,7 @@ 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.worldscreen.WorldMapTileUpdater.updateTiles
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapTileUpdater.updateTiles
|
||||
import com.unciv.ui.screens.worldscreen.bottombar.BattleTable
|
||||
import com.unciv.ui.screens.worldscreen.bottombar.TileInfoTable
|
||||
import com.unciv.ui.screens.worldscreen.mainmenu.WorldScreenMusicPopup
|
||||
@ -63,6 +63,7 @@ import com.unciv.ui.screens.worldscreen.topbar.WorldScreenTopBar
|
||||
import com.unciv.ui.screens.worldscreen.unit.AutoPlay
|
||||
import com.unciv.ui.screens.worldscreen.unit.UnitTable
|
||||
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsTable
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapHolder
|
||||
import com.unciv.utils.Concurrency
|
||||
import com.unciv.utils.debug
|
||||
import com.unciv.utils.launchOnGLThread
|
||||
|
@ -11,7 +11,7 @@ import com.unciv.logic.map.MapShape
|
||||
import com.unciv.logic.map.MapSize
|
||||
import com.unciv.ui.images.ClippingImage
|
||||
import com.unciv.ui.images.ImageGetter
|
||||
import com.unciv.ui.screens.worldscreen.WorldMapHolder
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapHolder
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.sqrt
|
||||
@ -73,8 +73,8 @@ class Minimap(val mapHolder: WorldMapHolder, minimapSize: Int, private val civIn
|
||||
} else {
|
||||
if (mapParameters.shape != MapShape.rectangular) {
|
||||
val diameter = mapParameters.mapSize.radius * 2f + 1f
|
||||
height = diameter.toFloat()
|
||||
width = diameter.toFloat()
|
||||
height = diameter
|
||||
width = diameter
|
||||
} else {
|
||||
height = mapParameters.mapSize.height.toFloat()
|
||||
width = mapParameters.mapSize.width.toFloat()
|
||||
@ -167,7 +167,7 @@ class Minimap(val mapHolder: WorldMapHolder, minimapSize: Int, private val civIn
|
||||
|
||||
/**### Transform and set coordinates for the scrollPositionIndicator.
|
||||
*
|
||||
* Requires [scrollPositionIndicator] to be a [ClippingImage] to keep the displayed portion of the indicator within the bounds of the minimap.
|
||||
* Requires [scrollPositionIndicators] to be [ClippingImage]s to keep the displayed portion of the indicator within the bounds of the minimap.
|
||||
*/
|
||||
private fun updateScrollPosition(
|
||||
worldWidth: Float,
|
||||
@ -178,9 +178,9 @@ class Minimap(val mapHolder: WorldMapHolder, minimapSize: Int, private val civIn
|
||||
Rectangle(x * other.x, y * other.y, width * other.x, height * other.y)
|
||||
|
||||
fun Actor.setViewport(rect: Rectangle) {
|
||||
x = rect.x;
|
||||
y = rect.y;
|
||||
width = rect.width;
|
||||
x = rect.x
|
||||
y = rect.y
|
||||
width = rect.width
|
||||
height = rect.height
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ import com.unciv.GUI
|
||||
import com.unciv.UncivGame
|
||||
import com.unciv.logic.civilization.Civilization
|
||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||
import com.unciv.ui.screens.worldscreen.WorldMapHolder
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapHolder
|
||||
|
||||
class MinimapHolder(val mapHolder: WorldMapHolder) : Table() {
|
||||
private val worldScreen = mapHolder.worldScreen
|
||||
|
@ -6,7 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.logic.map.mapunit.MapUnit
|
||||
import com.unciv.ui.images.ImageGetter
|
||||
import com.unciv.ui.screens.worldscreen.WorldMapHolder
|
||||
import com.unciv.ui.screens.worldscreen.worldmap.WorldMapHolder
|
||||
import com.unciv.ui.components.input.onClick
|
||||
import com.unciv.ui.components.extensions.pad
|
||||
|
||||
|
@ -0,0 +1,202 @@
|
||||
package com.unciv.ui.screens.worldscreen.worldmap
|
||||
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.badlogic.gdx.scenes.scene2d.Actor
|
||||
import com.badlogic.gdx.scenes.scene2d.Group
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.logic.automation.unit.UnitAutomation
|
||||
import com.unciv.logic.city.City
|
||||
import com.unciv.logic.map.mapunit.MapUnit
|
||||
import com.unciv.logic.map.tile.Tile
|
||||
import com.unciv.models.Spy
|
||||
import com.unciv.models.UncivSound
|
||||
import com.unciv.models.UnitActionType
|
||||
import com.unciv.models.translations.tr
|
||||
import com.unciv.ui.audio.SoundPlayer
|
||||
import com.unciv.ui.components.extensions.*
|
||||
import com.unciv.ui.components.input.KeyCharAndCode
|
||||
import com.unciv.ui.components.input.KeyboardBinding
|
||||
import com.unciv.ui.components.input.keyShortcuts
|
||||
import com.unciv.ui.components.input.onActivation
|
||||
import com.unciv.ui.components.widgets.UnitIconGroup
|
||||
import com.unciv.ui.images.ImageGetter
|
||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||
import com.unciv.ui.screens.overviewscreen.EspionageOverviewScreen
|
||||
|
||||
/** Interface for creating floating "action" buttons on tiles */
|
||||
interface OverlayButtonData{
|
||||
fun createButton(worldMapHolder: WorldMapHolder): Actor
|
||||
}
|
||||
|
||||
const val buttonSize = 60f
|
||||
val smallerCircleSizes = 25f
|
||||
|
||||
class MoveHereOverlayButtonData(val unitToTurnsToDestination: HashMap<MapUnit, Int>, val tile: Tile) :
|
||||
OverlayButtonData {
|
||||
override fun createButton(worldMapHolder: WorldMapHolder): Actor {
|
||||
return getMoveHereButton(worldMapHolder)
|
||||
}
|
||||
|
||||
private fun getMoveHereButton(worldMapHolder: WorldMapHolder): Group {
|
||||
val isParadrop = unitToTurnsToDestination.keys.all { it.isPreparingParadrop() }
|
||||
val image = if (isParadrop)
|
||||
ImageGetter.getUnitActionPortrait("Paradrop", buttonSize / 2)
|
||||
else ImageGetter.getStatIcon("Movement")
|
||||
.apply { color = Color.BLACK; width = buttonSize / 2; height = buttonSize / 2 }
|
||||
val moveHereButton = image
|
||||
.surroundWithCircle(buttonSize - 2, false)
|
||||
.surroundWithCircle(buttonSize, false, Color.BLACK)
|
||||
|
||||
if (!isParadrop) {
|
||||
val numberCircle = unitToTurnsToDestination.values.maxOrNull()!!.tr().toLabel(fontSize = 14)
|
||||
.apply { setAlignment(Align.center) }
|
||||
.surroundWithCircle(smallerCircleSizes - 2, color = BaseScreen.skinStrings.skinConfig.baseColor.darken(0.3f))
|
||||
.surroundWithCircle(smallerCircleSizes, false)
|
||||
moveHereButton.addActor(numberCircle)
|
||||
}
|
||||
|
||||
val firstUnit = unitToTurnsToDestination.keys.first()
|
||||
val unitIcon = if (unitToTurnsToDestination.size == 1) UnitIconGroup(firstUnit, smallerCircleSizes)
|
||||
else unitToTurnsToDestination.size.tr().toLabel(fontColor = firstUnit.civ.nation.getInnerColor()).apply { setAlignment(
|
||||
Align.center) }
|
||||
.surroundWithCircle(smallerCircleSizes).apply { circle.color = firstUnit.civ.nation.getOuterColor() }
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
moveHereButton.addActor(unitIcon)
|
||||
|
||||
val unitsThatCanMove = unitToTurnsToDestination.keys.filter { it.currentMovement > 0 }
|
||||
if (unitsThatCanMove.isEmpty()) moveHereButton.color.a = 0.5f
|
||||
else {
|
||||
moveHereButton.onActivation(UncivSound.Silent) {
|
||||
worldMapHolder.moveUnitToTargetTile(unitsThatCanMove, tile)
|
||||
}
|
||||
moveHereButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
}
|
||||
return moveHereButton
|
||||
}
|
||||
}
|
||||
|
||||
// Contains the data required to draw a "swap with" button
|
||||
class SwapWithOverlayButtonData(val unit: MapUnit, val tile: Tile) : OverlayButtonData {
|
||||
override fun createButton(worldMapHolder: WorldMapHolder): Actor {
|
||||
return getSwapWithButton(worldMapHolder)
|
||||
}
|
||||
|
||||
fun getSwapWithButton(worldMapHolder: WorldMapHolder): Group {
|
||||
val swapWithButton = Group()
|
||||
swapWithButton.setSize(buttonSize, buttonSize)
|
||||
swapWithButton.addActor(ImageGetter.getCircle(size = buttonSize))
|
||||
swapWithButton.addActor(
|
||||
ImageGetter.getImage("OtherIcons/Swap").apply {
|
||||
color = Color.BLACK
|
||||
setSize(buttonSize / 2)
|
||||
center(swapWithButton)
|
||||
}
|
||||
)
|
||||
|
||||
val unitIcon = UnitIconGroup(unit, smallerCircleSizes)
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
swapWithButton.addActor(unitIcon)
|
||||
|
||||
swapWithButton.onActivation(UncivSound.Silent) {
|
||||
worldMapHolder.swapMoveUnitToTargetTile(unit, tile)
|
||||
}
|
||||
swapWithButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
|
||||
return swapWithButton
|
||||
}
|
||||
}
|
||||
|
||||
// Contains the data required to draw a "connect road" button
|
||||
class ConnectRoadOverlayButtonData(val unit: MapUnit, val tile: Tile) : OverlayButtonData {
|
||||
override fun createButton(worldMapHolder: WorldMapHolder): Actor {
|
||||
return getConnectRoadButton(worldMapHolder)
|
||||
}
|
||||
|
||||
private fun getConnectRoadButton(worldMapHolder: WorldMapHolder): Group {
|
||||
val connectRoadButton = Group()
|
||||
connectRoadButton.setSize(buttonSize, buttonSize)
|
||||
connectRoadButton.addActor(ImageGetter.getUnitActionPortrait("RoadConnection", buttonSize * 0.8f).apply {
|
||||
center(connectRoadButton)
|
||||
}
|
||||
)
|
||||
|
||||
val unitIcon = UnitIconGroup(unit, smallerCircleSizes)
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
connectRoadButton.addActor(unitIcon)
|
||||
|
||||
connectRoadButton.onActivation(UncivSound.Silent) {
|
||||
connectRoadToTargetTile(worldMapHolder, unit, tile)
|
||||
}
|
||||
connectRoadButton.keyShortcuts.add(KeyboardBinding.ConnectRoad)
|
||||
|
||||
return connectRoadButton
|
||||
}
|
||||
|
||||
private fun connectRoadToTargetTile(worldMapHolder: WorldMapHolder, selectedUnit: MapUnit, targetTile: Tile) {
|
||||
selectedUnit.automatedRoadConnectionDestination = targetTile.position
|
||||
selectedUnit.automatedRoadConnectionPath = null
|
||||
selectedUnit.action = UnitActionType.ConnectRoad.value
|
||||
selectedUnit.automated = true
|
||||
UnitAutomation.automateUnitMoves(selectedUnit)
|
||||
|
||||
SoundPlayer.play(UncivSound("wagon"))
|
||||
|
||||
worldMapHolder.worldScreen.shouldUpdate = true
|
||||
worldMapHolder.removeUnitActionOverlay()
|
||||
|
||||
// Make highlighting go away
|
||||
worldMapHolder.worldScreen.bottomUnitTable.selectedUnitIsConnectingRoad = false
|
||||
}
|
||||
}
|
||||
|
||||
// Contains the data required to draw a "move spy" button
|
||||
class MoveSpyOverlayButtonData(val spy: Spy, val city: City?) : OverlayButtonData {
|
||||
override fun createButton(worldMapHolder: WorldMapHolder): Actor {
|
||||
return getMoveSpyButton(worldMapHolder)
|
||||
}
|
||||
|
||||
private fun getMoveSpyButton(worldMapHolder: WorldMapHolder): Group {
|
||||
val spyActionButton = Group()
|
||||
spyActionButton.setSize(buttonSize, buttonSize)
|
||||
spyActionButton.addActor(ImageGetter.getCircle(size = buttonSize))
|
||||
if (city != null) {
|
||||
spyActionButton.addActor(
|
||||
ImageGetter.getStatIcon("Movement").apply {
|
||||
name = "Button"
|
||||
color = Color.BLACK
|
||||
setSize(buttonSize / 2)
|
||||
center(spyActionButton)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
spyActionButton.addActor(
|
||||
ImageGetter.getImage("OtherIcons/Close").apply {
|
||||
name = "Button"
|
||||
color = Color.RED
|
||||
setSize(buttonSize / 2)
|
||||
center(spyActionButton)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
val worldScreen = worldMapHolder.worldScreen
|
||||
spyActionButton.onActivation(UncivSound.Silent) {
|
||||
if (city != null) {
|
||||
spy.moveTo(city)
|
||||
worldScreen.game.pushScreen(EspionageOverviewScreen(worldScreen.selectedCiv, worldScreen))
|
||||
} else {
|
||||
worldScreen.game.pushScreen(EspionageOverviewScreen(worldScreen.selectedCiv, worldScreen))
|
||||
worldScreen.bottomUnitTable.selectedSpy = null
|
||||
}
|
||||
worldMapHolder.removeUnitActionOverlay()
|
||||
worldMapHolder.selectedTile = null
|
||||
worldScreen.shouldUpdate = true
|
||||
worldScreen.bottomUnitTable.selectSpy(null)
|
||||
}
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.RETURN)
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.NUMPAD_ENTER)
|
||||
|
||||
return spyActionButton
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.unciv.ui.screens.worldscreen
|
||||
package com.unciv.ui.screens.worldscreen.worldmap
|
||||
|
||||
import com.badlogic.gdx.Application
|
||||
import com.badlogic.gdx.Gdx
|
||||
@ -13,7 +13,6 @@ import com.badlogic.gdx.scenes.scene2d.actions.Actions
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.UncivGame
|
||||
import com.unciv.logic.automation.unit.UnitAutomation
|
||||
import com.unciv.logic.battle.Battle
|
||||
import com.unciv.logic.battle.MapUnitCombatant
|
||||
import com.unciv.logic.battle.TargetHelper
|
||||
@ -26,24 +25,25 @@ import com.unciv.logic.map.mapunit.movement.UnitMovement
|
||||
import com.unciv.logic.map.tile.Tile
|
||||
import com.unciv.models.Spy
|
||||
import com.unciv.models.UncivSound
|
||||
import com.unciv.models.UnitActionType
|
||||
import com.unciv.models.translations.tr
|
||||
import com.unciv.ui.audio.SoundPlayer
|
||||
import com.unciv.ui.components.MapArrowType
|
||||
import com.unciv.ui.components.MiscArrowTypes
|
||||
import com.unciv.ui.components.extensions.*
|
||||
import com.unciv.ui.components.input.*
|
||||
import com.unciv.ui.components.extensions.center
|
||||
import com.unciv.ui.components.extensions.isShiftKeyPressed
|
||||
import com.unciv.ui.components.extensions.surroundWithCircle
|
||||
import com.unciv.ui.components.input.ActivationTypes
|
||||
import com.unciv.ui.components.input.ClickableCircle
|
||||
import com.unciv.ui.components.input.onActivation
|
||||
import com.unciv.ui.components.input.onClick
|
||||
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.components.widgets.UnitIconGroup
|
||||
import com.unciv.ui.components.widgets.ZoomableScrollPane
|
||||
import com.unciv.ui.images.ImageGetter
|
||||
import com.unciv.ui.screens.basescreen.BaseScreen
|
||||
import com.unciv.ui.screens.basescreen.UncivStage
|
||||
import com.unciv.ui.screens.overviewscreen.EspionageOverviewScreen
|
||||
import com.unciv.ui.screens.worldscreen.UndoHandler.Companion.recordUndoCheckpoint
|
||||
import com.unciv.ui.screens.worldscreen.WorldScreen
|
||||
import com.unciv.ui.screens.worldscreen.bottombar.BattleTableHelpers.battleAnimation
|
||||
import com.unciv.utils.Concurrency
|
||||
import com.unciv.utils.Log
|
||||
@ -58,6 +58,7 @@ class WorldMapHolder(
|
||||
internal var selectedTile: Tile? = null
|
||||
val tileGroups = HashMap<Tile, WorldTileGroup>()
|
||||
|
||||
/** Holds buttons created by [OverlayButtonData] implementations */
|
||||
internal val unitActionOverlays: ArrayList<Actor> = ArrayList()
|
||||
|
||||
internal val unitMovementPaths: HashMap<MapUnit, ArrayList<Tile>> = HashMap()
|
||||
@ -98,20 +99,6 @@ class WorldMapHolder(
|
||||
onZoomStopListener = { setActHit() }
|
||||
}
|
||||
|
||||
// Interface for classes that contain the data required to draw a button
|
||||
interface ButtonDto
|
||||
// Contains the data required to draw a "move here" button
|
||||
class MoveHereButtonDto(val unitToTurnsToDestination: HashMap<MapUnit, Int>, val tile: Tile) :
|
||||
ButtonDto
|
||||
// Contains the data required to draw a "swap with" button
|
||||
class SwapWithButtonDto(val unit: MapUnit, val tile: Tile) : ButtonDto
|
||||
|
||||
// Contains the data required to draw a "connect road" button
|
||||
class ConnectRoadButtonDto(val unit: MapUnit, val tile: Tile) : ButtonDto
|
||||
|
||||
// Contains the data required to draw a "move spy" button
|
||||
class MoveSpyButtonDto(val spy: Spy, val city: City?) : ButtonDto
|
||||
|
||||
|
||||
internal fun addTiles() {
|
||||
val tileSetStrings = TileSetStrings()
|
||||
@ -266,7 +253,7 @@ class WorldMapHolder(
|
||||
UncivGame.Current.settings.addCompletedTutorialTask(key)
|
||||
}
|
||||
|
||||
private fun moveUnitToTargetTile(selectedUnits: List<MapUnit>, targetTile: Tile) {
|
||||
internal fun moveUnitToTargetTile(selectedUnits: List<MapUnit>, targetTile: Tile) {
|
||||
// this can take a long time, because of the unit-to-tile calculation needed, so we put it in a different thread
|
||||
// THIS PART IS REALLY ANNOYING
|
||||
// So lets say you have 2 units you want to move in the same direction, right
|
||||
@ -381,7 +368,7 @@ class WorldMapHolder(
|
||||
)
|
||||
}
|
||||
|
||||
private fun swapMoveUnitToTargetTile(selectedUnit: MapUnit, targetTile: Tile) {
|
||||
internal fun swapMoveUnitToTargetTile(selectedUnit: MapUnit, targetTile: Tile) {
|
||||
markUnitMoveTutorialComplete(selectedUnit)
|
||||
selectedUnit.movement.swapMoveToTile(targetTile)
|
||||
|
||||
@ -397,24 +384,6 @@ class WorldMapHolder(
|
||||
removeUnitActionOverlay()
|
||||
}
|
||||
|
||||
private fun connectRoadToTargetTile(selectedUnit: MapUnit, targetTile: Tile) {
|
||||
selectedUnit.automatedRoadConnectionDestination = targetTile.position
|
||||
selectedUnit.automatedRoadConnectionPath = null
|
||||
selectedUnit.action = UnitActionType.ConnectRoad.value
|
||||
selectedUnit.automated = true
|
||||
UnitAutomation.automateUnitMoves(selectedUnit)
|
||||
|
||||
SoundPlayer.play(UncivSound("wagon"))
|
||||
|
||||
worldScreen.shouldUpdate = true
|
||||
removeUnitActionOverlay()
|
||||
|
||||
// Make highlighting go away
|
||||
worldScreen.bottomUnitTable.selectedUnitIsConnectingRoad = false
|
||||
|
||||
}
|
||||
|
||||
|
||||
private fun addTileOverlaysWithUnitMovement(selectedUnits: List<MapUnit>, tile: Tile) {
|
||||
Concurrency.run("TurnsToGetThere") {
|
||||
/** LibGdx sometimes has these weird errors when you try to edit the UI layout from 2 separate threads.
|
||||
@ -460,7 +429,7 @@ class WorldMapHolder(
|
||||
worldScreen.bottomUnitTable.selectUnit(selectedUnit) // keep moved unit selected
|
||||
} else {
|
||||
// add "move to" button if there is a path to tileInfo
|
||||
val moveHereButtonDto = MoveHereButtonDto(unitsWhoCanMoveThere, tile)
|
||||
val moveHereButtonDto = MoveHereOverlayButtonData(unitsWhoCanMoveThere, tile)
|
||||
addTileOverlays(tile, moveHereButtonDto)
|
||||
}
|
||||
worldScreen.shouldUpdate = true
|
||||
@ -479,7 +448,7 @@ class WorldMapHolder(
|
||||
}
|
||||
else {
|
||||
// Add "swap with" button
|
||||
val swapWithButtonDto = SwapWithButtonDto(selectedUnit, tile)
|
||||
val swapWithButtonDto = SwapWithOverlayButtonData(selectedUnit, tile)
|
||||
addTileOverlays(tile, swapWithButtonDto)
|
||||
}
|
||||
worldScreen.shouldUpdate = true
|
||||
@ -500,7 +469,7 @@ class WorldMapHolder(
|
||||
return@launchOnGLThread
|
||||
}
|
||||
unitConnectRoadPaths[selectedUnit] = roadPath
|
||||
val connectRoadButtonDto = ConnectRoadButtonDto(selectedUnit, tile)
|
||||
val connectRoadButtonDto = ConnectRoadOverlayButtonData(selectedUnit, tile)
|
||||
addTileOverlays(tile, connectRoadButtonDto)
|
||||
worldScreen.shouldUpdate = true
|
||||
}
|
||||
@ -510,22 +479,14 @@ class WorldMapHolder(
|
||||
|
||||
private fun addMovingSpyOverlay(spy: Spy, tile: Tile) {
|
||||
val city: City? = if (tile.isCityCenter() && spy.canMoveTo(tile.getCity()!!)) tile.getCity() else null
|
||||
addTileOverlays(tile, MoveSpyButtonDto(spy, city))
|
||||
addTileOverlays(tile, MoveSpyOverlayButtonData(spy, city))
|
||||
worldScreen.shouldUpdate = true
|
||||
}
|
||||
|
||||
private fun addTileOverlays(tile: Tile, buttonDto: ButtonDto? = null) {
|
||||
private fun addTileOverlays(tile: Tile, buttonDto: OverlayButtonData? = null) {
|
||||
val table = Table().apply { defaults().pad(10f) }
|
||||
if (buttonDto != null && worldScreen.canChangeState)
|
||||
table.add(
|
||||
when (buttonDto) {
|
||||
is MoveHereButtonDto -> getMoveHereButton(buttonDto)
|
||||
is SwapWithButtonDto -> getSwapWithButton(buttonDto)
|
||||
is ConnectRoadButtonDto -> getConnectRoadButton(buttonDto)
|
||||
is MoveSpyButtonDto -> getMoveSpyButton(buttonDto)
|
||||
else -> null
|
||||
}
|
||||
)
|
||||
table.add(buttonDto.createButton(this))
|
||||
|
||||
val unitList = ArrayList<MapUnit>()
|
||||
if (tile.isCityCenter()
|
||||
@ -553,134 +514,6 @@ class WorldMapHolder(
|
||||
|
||||
addOverlayOnTileGroup(tileGroups[tile]!!, table)
|
||||
table.moveBy(0f, 48f)
|
||||
|
||||
}
|
||||
|
||||
val buttonSize = 60f
|
||||
val smallerCircleSizes = 25f
|
||||
|
||||
private fun getMoveHereButton(dto: MoveHereButtonDto): Group {
|
||||
val isParadrop = dto.unitToTurnsToDestination.keys.all { it.isPreparingParadrop() }
|
||||
val image = if (isParadrop)
|
||||
ImageGetter.getUnitActionPortrait("Paradrop", buttonSize / 2)
|
||||
else ImageGetter.getStatIcon("Movement")
|
||||
.apply { color = Color.BLACK; width = buttonSize / 2; height = buttonSize / 2 }
|
||||
val moveHereButton = image
|
||||
.surroundWithCircle(buttonSize - 2, false)
|
||||
.surroundWithCircle(buttonSize, false, Color.BLACK)
|
||||
|
||||
if (!isParadrop) {
|
||||
val numberCircle = dto.unitToTurnsToDestination.values.maxOrNull()!!.tr().toLabel(fontSize = 14)
|
||||
.apply { setAlignment(Align.center) }
|
||||
.surroundWithCircle(smallerCircleSizes - 2, color = BaseScreen.skinStrings.skinConfig.baseColor.darken(0.3f))
|
||||
.surroundWithCircle(smallerCircleSizes, false)
|
||||
moveHereButton.addActor(numberCircle)
|
||||
}
|
||||
|
||||
val firstUnit = dto.unitToTurnsToDestination.keys.first()
|
||||
val unitIcon = if (dto.unitToTurnsToDestination.size == 1) UnitIconGroup(firstUnit, smallerCircleSizes)
|
||||
else dto.unitToTurnsToDestination.size.tr().toLabel(fontColor = firstUnit.civ.nation.getInnerColor()).apply { setAlignment(Align.center) }
|
||||
.surroundWithCircle(smallerCircleSizes).apply { circle.color = firstUnit.civ.nation.getOuterColor() }
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
moveHereButton.addActor(unitIcon)
|
||||
|
||||
val unitsThatCanMove = dto.unitToTurnsToDestination.keys.filter { it.currentMovement > 0 }
|
||||
if (unitsThatCanMove.isEmpty()) moveHereButton.color.a = 0.5f
|
||||
else {
|
||||
moveHereButton.onActivation(UncivSound.Silent) {
|
||||
moveUnitToTargetTile(unitsThatCanMove, dto.tile)
|
||||
}
|
||||
moveHereButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
}
|
||||
return moveHereButton
|
||||
}
|
||||
|
||||
private fun getSwapWithButton(dto: SwapWithButtonDto): Group {
|
||||
val swapWithButton = Group()
|
||||
swapWithButton.setSize(buttonSize, buttonSize)
|
||||
swapWithButton.addActor(ImageGetter.getCircle(size = buttonSize))
|
||||
swapWithButton.addActor(
|
||||
ImageGetter.getImage("OtherIcons/Swap").apply {
|
||||
color = Color.BLACK
|
||||
setSize(buttonSize / 2)
|
||||
center(swapWithButton)
|
||||
}
|
||||
)
|
||||
|
||||
val unitIcon = UnitIconGroup(dto.unit, smallerCircleSizes)
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
swapWithButton.addActor(unitIcon)
|
||||
|
||||
swapWithButton.onActivation(UncivSound.Silent) {
|
||||
swapMoveUnitToTargetTile(dto.unit, dto.tile)
|
||||
}
|
||||
swapWithButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
|
||||
return swapWithButton
|
||||
}
|
||||
|
||||
private fun getConnectRoadButton(dto: ConnectRoadButtonDto): Group {
|
||||
val connectRoadButton = Group()
|
||||
connectRoadButton.setSize(buttonSize, buttonSize)
|
||||
connectRoadButton.addActor(ImageGetter.getUnitActionPortrait("RoadConnection", buttonSize * 0.8f).apply {
|
||||
center(connectRoadButton)
|
||||
}
|
||||
)
|
||||
|
||||
val unitIcon = UnitIconGroup(dto.unit, smallerCircleSizes)
|
||||
unitIcon.y = buttonSize - unitIcon.height
|
||||
connectRoadButton.addActor(unitIcon)
|
||||
|
||||
connectRoadButton.onActivation(UncivSound.Silent) {
|
||||
connectRoadToTargetTile(dto.unit, dto.tile)
|
||||
}
|
||||
connectRoadButton.keyShortcuts.add(KeyboardBinding.ConnectRoad)
|
||||
|
||||
return connectRoadButton
|
||||
}
|
||||
|
||||
private fun getMoveSpyButton(dto: MoveSpyButtonDto): Group {
|
||||
val spyActionButton = Group()
|
||||
spyActionButton.setSize(buttonSize, buttonSize)
|
||||
spyActionButton.addActor(ImageGetter.getCircle(size = buttonSize))
|
||||
if (dto.city != null) {
|
||||
spyActionButton.addActor(
|
||||
ImageGetter.getStatIcon("Movement").apply {
|
||||
name = "Button"
|
||||
color = Color.BLACK
|
||||
setSize(buttonSize / 2)
|
||||
center(spyActionButton)
|
||||
}
|
||||
)
|
||||
} else {
|
||||
spyActionButton.addActor(
|
||||
ImageGetter.getImage("OtherIcons/Close").apply {
|
||||
name = "Button"
|
||||
color = Color.RED
|
||||
setSize(buttonSize / 2)
|
||||
center(spyActionButton)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
spyActionButton.onActivation(UncivSound.Silent) {
|
||||
if (dto.city != null) {
|
||||
dto.spy.moveTo(dto.city)
|
||||
worldScreen.game.pushScreen(EspionageOverviewScreen(worldScreen.selectedCiv, worldScreen))
|
||||
} else {
|
||||
worldScreen.game.pushScreen(EspionageOverviewScreen(worldScreen.selectedCiv, worldScreen))
|
||||
worldScreen.bottomUnitTable.selectedSpy = null
|
||||
}
|
||||
removeUnitActionOverlay()
|
||||
selectedTile = null
|
||||
worldScreen.shouldUpdate = true
|
||||
worldScreen.bottomUnitTable.selectSpy(null)
|
||||
}
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.TAB)
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.RETURN)
|
||||
spyActionButton.keyShortcuts.add(KeyCharAndCode.NUMPAD_ENTER)
|
||||
|
||||
return spyActionButton
|
||||
}
|
||||
|
||||
fun addOverlayOnTileGroup(group: TileGroup, actor: Actor) {
|
||||
@ -862,7 +695,6 @@ class WorldMapHolder(
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
// For debugging purposes
|
||||
override fun draw(batch: Batch?, parentAlpha: Float) = super.draw(batch, parentAlpha)
|
||||
override fun act(delta: Float) = super.act(delta)
|
@ -1,4 +1,4 @@
|
||||
package com.unciv.ui.screens.worldscreen
|
||||
package com.unciv.ui.screens.worldscreen.worldmap
|
||||
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.unciv.Constants
|
Reference in New Issue
Block a user