mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-22 02:42:16 -04:00
Better performace by changing ExploredTiles to a hashset and ading a temporary TilesToCities hashmap
This commit is contained in:
parent
6cd78ca926
commit
cb381ec82e
@ -1,5 +1,6 @@
|
||||
package com.unciv.logic
|
||||
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.civilization.CivilizationInfo
|
||||
import com.unciv.logic.civilization.Notification
|
||||
import com.unciv.logic.map.TileInfo
|
||||
@ -15,6 +16,7 @@ class GameInfo {
|
||||
var civilizations = mutableListOf<CivilizationInfo>()
|
||||
var tileMap: TileMap = TileMap()
|
||||
var turns = 1
|
||||
@Transient var tilesToCities = HashMap<TileInfo,CityInfo>()
|
||||
|
||||
|
||||
fun getPlayerCivilization(): CivilizationInfo = civilizations[0]
|
||||
@ -53,6 +55,7 @@ class GameInfo {
|
||||
}
|
||||
|
||||
turns++
|
||||
updateTilesToCities()
|
||||
}
|
||||
|
||||
fun placeBarbarianUnit(tileToPlace: TileInfo?) {
|
||||
@ -81,9 +84,15 @@ class GameInfo {
|
||||
for (civInfo in civilizations)
|
||||
for (cityInfo in civInfo.cities)
|
||||
cityInfo.cityStats.update()
|
||||
|
||||
updateTilesToCities()
|
||||
}
|
||||
|
||||
|
||||
|
||||
fun updateTilesToCities(){
|
||||
tilesToCities.clear()
|
||||
for (city in civilizations.flatMap { it.cities }){
|
||||
for (tile in city.getTiles()) tilesToCities.put(tile,city)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,7 @@ class Battle(val gameInfo:GameInfo) {
|
||||
}
|
||||
}
|
||||
(attacker as MapUnitCombatant).unit.moveToTile(city.getCenterTile())
|
||||
city.civInfo.gameInfo.updateTilesToCities()
|
||||
}
|
||||
|
||||
}
|
@ -33,7 +33,7 @@ class CivilizationInfo {
|
||||
var scienceVictory = ScienceVictoryManager()
|
||||
|
||||
var cities = ArrayList<CityInfo>()
|
||||
var exploredTiles = ArrayList<Vector2>()
|
||||
var exploredTiles = HashSet<Vector2>()
|
||||
|
||||
fun getCivilization(): Civilization {return GameBasics.Civilizations[civName]!!}
|
||||
|
||||
|
@ -24,7 +24,10 @@ class TileInfo {
|
||||
var roadStatus = RoadStatus.None
|
||||
var turnsToImprovement: Int = 0
|
||||
|
||||
fun getCity(): CityInfo? = tileMap.gameInfo.civilizations.flatMap { it.cities }.firstOrNull{it.tiles.contains(position)}
|
||||
fun getCity(): CityInfo? {
|
||||
return tileMap.gameInfo.tilesToCities.get(this)
|
||||
//return tileMap.gameInfo.civilizations.flatMap { it.cities }.firstOrNull{it.tiles.contains(position)}
|
||||
}
|
||||
|
||||
val lastTerrain: Terrain
|
||||
get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!!
|
||||
|
@ -6,6 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.utils.Align
|
||||
import com.unciv.UnCivGame
|
||||
import com.unciv.logic.city.CityInfo
|
||||
import com.unciv.logic.map.TileInfo
|
||||
import com.unciv.ui.cityscreen.CityScreen
|
||||
import com.unciv.ui.cityscreen.addClickListener
|
||||
@ -55,11 +56,40 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
||||
if (tileInfo.isWorked() && city!!.civInfo.isPlayerCivilization() && populationImage == null)
|
||||
addPopulationIcon()
|
||||
|
||||
updateCityButton(city)
|
||||
updateUnitImage(isViewable)
|
||||
}
|
||||
|
||||
private fun updateUnitImage(isViewable: Boolean) {
|
||||
if (unitImage != null) { // The unit can change within one update - for instance, when attacking, the attacker replaces the defender!
|
||||
unitImage!!.remove()
|
||||
unitImage = null
|
||||
}
|
||||
|
||||
if (tileInfo.unit != null && isViewable) { // Tile is visible
|
||||
val unit = tileInfo.unit!!
|
||||
unitImage = getUnitImage(unit.name, unit.civInfo.getCivilization().getColor())
|
||||
addActor(unitImage!!)
|
||||
unitImage!!.setSize(20f, 20f)
|
||||
unitImage!!.setPosition(width / 2 - unitImage!!.width / 2,
|
||||
height / 2 - unitImage!!.height / 2 + 20) // top
|
||||
}
|
||||
|
||||
|
||||
if (unitImage != null) {
|
||||
if (!tileInfo.hasIdleUnit())
|
||||
unitImage!!.color = Color(1f, 1f, 1f, 0.5f)
|
||||
else
|
||||
unitImage!!.color = Color.WHITE
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateCityButton(city: CityInfo?) {
|
||||
if (city != null && tileInfo.isCityCenter()) {
|
||||
if (cityButton == null) {
|
||||
cityButton = Table()
|
||||
cityButton!!.background = ImageGetter.getDrawable("skin/civTableBackground.png")
|
||||
cityButton!!.isTransform=true
|
||||
cityButton!!.isTransform = true
|
||||
|
||||
addActor(cityButton)
|
||||
zIndex = parent.children.size // so this tile is rendered over neighboring tiles
|
||||
@ -68,9 +98,9 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
||||
val cityButtonText = city.name + " (" + city.population.population + ")"
|
||||
val label = Label(cityButtonText, CameraStageBaseScreen.skin)
|
||||
val labelStyle = Label.LabelStyle(label.style)
|
||||
labelStyle.fontColor= city.civInfo.getCivilization().getColor()
|
||||
label.style=labelStyle
|
||||
if(city.civInfo.isPlayerCivilization())
|
||||
labelStyle.fontColor = city.civInfo.getCivilization().getColor()
|
||||
label.style = labelStyle
|
||||
if (city.civInfo.isPlayerCivilization())
|
||||
label.addClickListener {
|
||||
UnCivGame.Current.screen = CityScreen(city)
|
||||
}
|
||||
@ -83,34 +113,10 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
||||
toFront()
|
||||
}
|
||||
|
||||
cityButton!!.setPosition(width/2 - cityButton!!.width / 2,
|
||||
height/2 - cityButton!!.height/2)
|
||||
cityButton!!.setPosition(width / 2 - cityButton!!.width / 2,
|
||||
height / 2 - cityButton!!.height / 2)
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (unitImage != null) { // The unit can change within one update - for instance, when attacking, the attacker replaces the defender!
|
||||
unitImage!!.remove()
|
||||
unitImage = null
|
||||
}
|
||||
|
||||
if (tileInfo.unit != null && isViewable) { // Tile is visible
|
||||
val unit = tileInfo.unit!!
|
||||
unitImage = getUnitImage(unit.name, unit.civInfo.getCivilization().getColor())
|
||||
addActor(unitImage!!)
|
||||
unitImage!!.setSize(20f, 20f)
|
||||
unitImage!!.setPosition(width/2 - unitImage!!.width/2,
|
||||
height/2 - unitImage!!.height/2 +20) // top
|
||||
}
|
||||
|
||||
|
||||
if (unitImage != null) {
|
||||
if (!tileInfo.hasIdleUnit())
|
||||
unitImage!!.color = Color(1f,1f,1f,0.5f)
|
||||
else
|
||||
unitImage!!.color = Color.WHITE
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -62,6 +62,7 @@ class UnitActions {
|
||||
unit.civInfo.addCity(tile.position)
|
||||
unitTable.currentlyExecutingAction = null // In case the settler was in the middle of doing something and we then founded a city with it
|
||||
tile.unit = null // Remove settler!
|
||||
unit.civInfo.gameInfo.updateTilesToCities()
|
||||
},
|
||||
unit.currentMovement != 0f &&
|
||||
!tile.getTilesInDistance(2).any { it.isCityCenter() })
|
||||
|
Loading…
x
Reference in New Issue
Block a user