mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-24 03:53:12 -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
|
package com.unciv.logic
|
||||||
|
|
||||||
|
import com.unciv.logic.city.CityInfo
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
import com.unciv.logic.civilization.Notification
|
import com.unciv.logic.civilization.Notification
|
||||||
import com.unciv.logic.map.TileInfo
|
import com.unciv.logic.map.TileInfo
|
||||||
@ -15,6 +16,7 @@ class GameInfo {
|
|||||||
var civilizations = mutableListOf<CivilizationInfo>()
|
var civilizations = mutableListOf<CivilizationInfo>()
|
||||||
var tileMap: TileMap = TileMap()
|
var tileMap: TileMap = TileMap()
|
||||||
var turns = 1
|
var turns = 1
|
||||||
|
@Transient var tilesToCities = HashMap<TileInfo,CityInfo>()
|
||||||
|
|
||||||
|
|
||||||
fun getPlayerCivilization(): CivilizationInfo = civilizations[0]
|
fun getPlayerCivilization(): CivilizationInfo = civilizations[0]
|
||||||
@ -53,6 +55,7 @@ class GameInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
turns++
|
turns++
|
||||||
|
updateTilesToCities()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun placeBarbarianUnit(tileToPlace: TileInfo?) {
|
fun placeBarbarianUnit(tileToPlace: TileInfo?) {
|
||||||
@ -81,9 +84,15 @@ class GameInfo {
|
|||||||
for (civInfo in civilizations)
|
for (civInfo in civilizations)
|
||||||
for (cityInfo in civInfo.cities)
|
for (cityInfo in civInfo.cities)
|
||||||
cityInfo.cityStats.update()
|
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())
|
(attacker as MapUnitCombatant).unit.moveToTile(city.getCenterTile())
|
||||||
|
city.civInfo.gameInfo.updateTilesToCities()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -33,7 +33,7 @@ class CivilizationInfo {
|
|||||||
var scienceVictory = ScienceVictoryManager()
|
var scienceVictory = ScienceVictoryManager()
|
||||||
|
|
||||||
var cities = ArrayList<CityInfo>()
|
var cities = ArrayList<CityInfo>()
|
||||||
var exploredTiles = ArrayList<Vector2>()
|
var exploredTiles = HashSet<Vector2>()
|
||||||
|
|
||||||
fun getCivilization(): Civilization {return GameBasics.Civilizations[civName]!!}
|
fun getCivilization(): Civilization {return GameBasics.Civilizations[civName]!!}
|
||||||
|
|
||||||
|
@ -24,7 +24,10 @@ class TileInfo {
|
|||||||
var roadStatus = RoadStatus.None
|
var roadStatus = RoadStatus.None
|
||||||
var turnsToImprovement: Int = 0
|
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
|
val lastTerrain: Terrain
|
||||||
get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!!
|
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.scenes.scene2d.ui.Table
|
||||||
import com.badlogic.gdx.utils.Align
|
import com.badlogic.gdx.utils.Align
|
||||||
import com.unciv.UnCivGame
|
import com.unciv.UnCivGame
|
||||||
|
import com.unciv.logic.city.CityInfo
|
||||||
import com.unciv.logic.map.TileInfo
|
import com.unciv.logic.map.TileInfo
|
||||||
import com.unciv.ui.cityscreen.CityScreen
|
import com.unciv.ui.cityscreen.CityScreen
|
||||||
import com.unciv.ui.cityscreen.addClickListener
|
import com.unciv.ui.cityscreen.addClickListener
|
||||||
@ -55,11 +56,40 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
|||||||
if (tileInfo.isWorked() && city!!.civInfo.isPlayerCivilization() && populationImage == null)
|
if (tileInfo.isWorked() && city!!.civInfo.isPlayerCivilization() && populationImage == null)
|
||||||
addPopulationIcon()
|
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 (city != null && tileInfo.isCityCenter()) {
|
||||||
if (cityButton == null) {
|
if (cityButton == null) {
|
||||||
cityButton = Table()
|
cityButton = Table()
|
||||||
cityButton!!.background = ImageGetter.getDrawable("skin/civTableBackground.png")
|
cityButton!!.background = ImageGetter.getDrawable("skin/civTableBackground.png")
|
||||||
cityButton!!.isTransform=true
|
cityButton!!.isTransform = true
|
||||||
|
|
||||||
addActor(cityButton)
|
addActor(cityButton)
|
||||||
zIndex = parent.children.size // so this tile is rendered over neighboring tiles
|
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 cityButtonText = city.name + " (" + city.population.population + ")"
|
||||||
val label = Label(cityButtonText, CameraStageBaseScreen.skin)
|
val label = Label(cityButtonText, CameraStageBaseScreen.skin)
|
||||||
val labelStyle = Label.LabelStyle(label.style)
|
val labelStyle = Label.LabelStyle(label.style)
|
||||||
labelStyle.fontColor= city.civInfo.getCivilization().getColor()
|
labelStyle.fontColor = city.civInfo.getCivilization().getColor()
|
||||||
label.style=labelStyle
|
label.style = labelStyle
|
||||||
if(city.civInfo.isPlayerCivilization())
|
if (city.civInfo.isPlayerCivilization())
|
||||||
label.addClickListener {
|
label.addClickListener {
|
||||||
UnCivGame.Current.screen = CityScreen(city)
|
UnCivGame.Current.screen = CityScreen(city)
|
||||||
}
|
}
|
||||||
@ -83,34 +113,10 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) {
|
|||||||
toFront()
|
toFront()
|
||||||
}
|
}
|
||||||
|
|
||||||
cityButton!!.setPosition(width/2 - cityButton!!.width / 2,
|
cityButton!!.setPosition(width / 2 - cityButton!!.width / 2,
|
||||||
height/2 - cityButton!!.height/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)
|
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
|
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!
|
tile.unit = null // Remove settler!
|
||||||
|
unit.civInfo.gameInfo.updateTilesToCities()
|
||||||
},
|
},
|
||||||
unit.currentMovement != 0f &&
|
unit.currentMovement != 0f &&
|
||||||
!tile.getTilesInDistance(2).any { it.isCityCenter() })
|
!tile.getTilesInDistance(2).any { it.isCityCenter() })
|
||||||
|
Loading…
x
Reference in New Issue
Block a user