Added minimap!
Notifications now take up less of the increasingly valuabe screenspace
This commit is contained in:
parent
7002b8d55e
commit
83c235690a
9 changed files with 107 additions and 10 deletions
|
@ -10,10 +10,8 @@ import com.unciv.ui.utils.centerX
|
|||
|
||||
class CityTileGroup(private val city: CityInfo, tileInfo: TileInfo) : TileGroup(tileInfo) {
|
||||
|
||||
var yieldGroup: YieldGroup
|
||||
|
||||
init {
|
||||
this.yieldGroup = YieldGroup()
|
||||
addActor(yieldGroup)
|
||||
if (city.location == tileInfo.position) {
|
||||
populationImage = ImageGetter.getImage("StatIcons/City_Center_(Civ6).png")
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.unciv.logic.HexMath
|
|||
import com.unciv.logic.map.MapUnit
|
||||
import com.unciv.logic.map.RoadStatus
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.ui.cityscreen.YieldGroup
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.center
|
||||
import com.unciv.ui.utils.colorFromRGB
|
||||
|
@ -33,6 +34,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
|||
protected var militaryUnitImage: Group? = null
|
||||
private val circleImage = ImageGetter.getImage("OtherIcons/Circle.png") // for blue and red circles on the tile
|
||||
private val fogImage = ImageGetter.getImage("TerrainIcons/Fog.png")
|
||||
var yieldGroup = YieldGroup()
|
||||
|
||||
init {
|
||||
val groupSize = 54f
|
||||
|
|
|
@ -32,6 +32,11 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
|||
whiteHalo.toBack()
|
||||
}
|
||||
|
||||
init{
|
||||
yieldGroup.center(this)
|
||||
yieldGroup.moveBy(-22f,0f)
|
||||
}
|
||||
|
||||
|
||||
override fun update(isViewable: Boolean) {
|
||||
|
||||
|
@ -46,6 +51,10 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
|||
|| viewEntireMapForDebug) updateCityButton(city) // needs to be before the update so the units will be above the city button
|
||||
|
||||
super.update(isViewable)
|
||||
|
||||
yieldGroup.isVisible = !UnCivGame.Current.settings.showResourcesAndImprovements
|
||||
if(yieldGroup.isVisible)
|
||||
yieldGroup.setStats(tileInfo.getTileStats(UnCivGame.Current.gameInfo.getPlayerCivilization()))
|
||||
}
|
||||
|
||||
private fun updateCityButton(city: CityInfo?) {
|
||||
|
|
83
core/src/com/unciv/ui/worldscreen/Minimap.kt
Normal file
83
core/src/com/unciv/ui/worldscreen/Minimap.kt
Normal file
|
@ -0,0 +1,83 @@
|
|||
package com.unciv.ui.worldscreen
|
||||
|
||||
import com.badlogic.gdx.graphics.Color
|
||||
import com.badlogic.gdx.scenes.scene2d.Event
|
||||
import com.badlogic.gdx.scenes.scene2d.Group
|
||||
import com.badlogic.gdx.scenes.scene2d.InputListener
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Image
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
|
||||
import com.unciv.logic.HexMath
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.ui.cityscreen.addClickListener
|
||||
import com.unciv.ui.utils.ImageGetter
|
||||
import com.unciv.ui.utils.colorFromRGB
|
||||
|
||||
class Minimap(val tileMapHolder: TileMapHolder) : ScrollPane(null){
|
||||
val allTiles = Group()
|
||||
val tileImages = HashMap<TileInfo, Image>()
|
||||
|
||||
|
||||
fun setScrollToTileMapHolder(){
|
||||
scrollPercentX = tileMapHolder.scrollPercentX
|
||||
scrollPercentY = tileMapHolder.scrollPercentY
|
||||
}
|
||||
|
||||
init{
|
||||
var topX = 0f
|
||||
var topY = 0f
|
||||
var bottomX = 0f
|
||||
var bottomY = 0f
|
||||
|
||||
for (tileInfo in tileMapHolder.tileMap.values) {
|
||||
val hex = ImageGetter.getImage("TerrainIcons/Hexagon.png")
|
||||
|
||||
val positionalVector = HexMath().Hex2WorldCoords(tileInfo.position)
|
||||
val groupSize = 10f
|
||||
hex.setSize(groupSize,groupSize)
|
||||
hex.setPosition(positionalVector.x * 0.5f * groupSize,
|
||||
positionalVector.y * 0.5f * groupSize)
|
||||
hex.addClickListener {
|
||||
tileMapHolder.setCenterPosition(tileInfo.position);
|
||||
setScrollToTileMapHolder()
|
||||
}
|
||||
allTiles.addActor(hex)
|
||||
tileImages.put(tileInfo,hex)
|
||||
|
||||
topX = Math.max(topX, hex.x + groupSize)
|
||||
topY = Math.max(topY, hex.y + groupSize)
|
||||
bottomX = Math.min(bottomX, hex.x)
|
||||
bottomY = Math.min(bottomY, hex.y)
|
||||
}
|
||||
|
||||
for (group in allTiles.children) {
|
||||
group.moveBy(-bottomX, -bottomY)
|
||||
}
|
||||
|
||||
// there are tiles "below the zero",
|
||||
// so we zero out the starting position of the whole board so they will be displayed as well
|
||||
allTiles.setSize(10 + topX - bottomX, 10 + topY - bottomY)
|
||||
|
||||
widget = allTiles
|
||||
layout()
|
||||
updateVisualScroll()
|
||||
tileMapHolder.addListener(object : InputListener(){
|
||||
override fun handle(e: Event?): Boolean {
|
||||
setScrollToTileMapHolder()
|
||||
return true
|
||||
}
|
||||
})
|
||||
update()
|
||||
}
|
||||
|
||||
fun update(){
|
||||
val exploredTiles = tileMapHolder.worldScreen.civInfo.exploredTiles
|
||||
for(tileInfo in tileMapHolder.tileMap.values) {
|
||||
val RGB = tileInfo.getBaseTerrain().RGB!!
|
||||
val hex = tileImages[tileInfo]!!
|
||||
if (!exploredTiles.contains(tileInfo.position)) hex.color = Color.BLACK
|
||||
else if (tileInfo.isCityCenter()) hex.color = Color.WHITE
|
||||
else if (tileInfo.getCity() != null) hex.color = tileInfo.getOwner()!!.getCivilization().getColor()
|
||||
else hex.color = colorFromRGB(RGB[0], RGB[1], RGB[2]).lerp(Color.GRAY, 0.5f) // Todo add to baseterrain as function
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,7 +28,7 @@ class NotificationsScroll(private val notifications: List<Notification>, interna
|
|||
minitable.add(ImageGetter.getImage("OtherIcons/Circle.png")
|
||||
.apply { color=notification.color }).size(10f).pad(5f)
|
||||
minitable.background(ImageGetter.getDrawable("skin/civTableBackground.png"))
|
||||
minitable.add(label).pad(5f).padRight(10f)
|
||||
minitable.add(label).pad(3f).padRight(10f)
|
||||
|
||||
if (notification.location != null) {
|
||||
minitable.addClickListener {
|
||||
|
@ -36,7 +36,7 @@ class NotificationsScroll(private val notifications: List<Notification>, interna
|
|||
}
|
||||
}
|
||||
|
||||
notificationsTable.add(minitable).pad(5f)
|
||||
notificationsTable.add(minitable).pad(3f)
|
||||
notificationsTable.row()
|
||||
}
|
||||
notificationsTable.pack()
|
||||
|
|
|
@ -15,11 +15,10 @@ class TileInfoTable(private val worldScreen: WorldScreen) : Table() {
|
|||
internal fun updateTileTable(tile: TileInfo) {
|
||||
clearChildren()
|
||||
val civInfo = worldScreen.civInfo
|
||||
pad(20f)
|
||||
columnDefaults(0).padRight(10f)
|
||||
|
||||
if (civInfo.exploredTiles.contains(tile.position)) {
|
||||
add(getStatsTable(tile)).pad(20f)
|
||||
add(getStatsTable(tile)).pad(10f)
|
||||
add(Label(tile.toString(), skin)).colspan(2)
|
||||
}
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
|
|||
}
|
||||
|
||||
})
|
||||
layout() // Fit the scroll pane to the contents - otherwise, setScroll won't work!
|
||||
}
|
||||
|
||||
internal fun updateTiles() {
|
||||
|
@ -124,7 +125,6 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
|
|||
val tileGroup = tileGroups.values.first { it.tileInfo.position == vector }
|
||||
selectedTile = tileGroup.tileInfo
|
||||
worldScreen.bottomBar.unitTable.tileSelected(selectedTile!!)
|
||||
layout() // Fit the scroll pane to the contents - otherwise, setScroll won't work!
|
||||
// We want to center on the middle of TG (TG.getX()+TG.getWidth()/2)
|
||||
// and so the scroll position (== filter the screen starts) needs to be half a screen away
|
||||
scrollX = tileGroup.x + tileGroup.width / 2 - worldScreen.stage.width / 2
|
||||
|
|
|
@ -13,7 +13,6 @@ import com.unciv.ui.pickerscreens.TechPickerScreen
|
|||
import com.unciv.ui.utils.CameraStageBaseScreen
|
||||
import com.unciv.ui.utils.disable
|
||||
import com.unciv.ui.utils.enable
|
||||
import com.unciv.ui.utils.tr
|
||||
import com.unciv.ui.worldscreen.unit.UnitActionsTable
|
||||
|
||||
class WorldScreen : CameraStageBaseScreen() {
|
||||
|
@ -21,6 +20,7 @@ class WorldScreen : CameraStageBaseScreen() {
|
|||
internal val civInfo: CivilizationInfo = gameInfo.getPlayerCivilization()
|
||||
|
||||
val tileMapHolder: TileMapHolder = TileMapHolder(this, gameInfo.tileMap, civInfo)
|
||||
val minimap = Minimap(tileMapHolder)
|
||||
|
||||
internal var buttonScale = 0.9f
|
||||
private val topBar = WorldScreenTopBar(this)
|
||||
|
@ -40,12 +40,15 @@ class WorldScreen : CameraStageBaseScreen() {
|
|||
topBar.y - nextTurnButton.height - 10f)
|
||||
notificationsScroll = NotificationsScroll(gameInfo.notifications, this)
|
||||
notificationsScroll.width = stage.width/3
|
||||
notificationsScroll.height = stage.height/3
|
||||
Label("", skin).style.font.data.setScale(1.5f)
|
||||
|
||||
minimap.setSize(stage.width/5,stage.height/5)
|
||||
minimap.x = stage.width - minimap.width
|
||||
|
||||
tileMapHolder.addTiles()
|
||||
|
||||
stage.addActor(tileMapHolder)
|
||||
stage.addActor(minimap)
|
||||
stage.addActor(topBar)
|
||||
stage.addActor(nextTurnButton)
|
||||
stage.addActor(techButton)
|
||||
|
@ -70,6 +73,8 @@ class WorldScreen : CameraStageBaseScreen() {
|
|||
|
||||
updateTechButton()
|
||||
bottomBar.update(tileMapHolder.selectedTile) // has to come before tilemapholder update because the tilemapholder actions depend on the selected unit!
|
||||
minimap.update()
|
||||
minimap.y = bottomBar.height
|
||||
|
||||
unitActionsTable.update(bottomBar.unitTable.selectedUnit)
|
||||
unitActionsTable.y = bottomBar.height
|
||||
|
|
|
@ -33,3 +33,4 @@ class WorldScreenBottomBar(val worldScreen: WorldScreen) : Table(){
|
|||
pack()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue