Performance improvement - added baseTerrain transient in tileInfo

This commit is contained in:
Yair Morgenstern 2018-11-24 21:58:39 +02:00
parent 347d329233
commit 6c9297abc2
4 changed files with 68 additions and 65 deletions

View File

@ -243,7 +243,7 @@ open class RandomMapGenerator {
var tileResources = GameBasics.TileResources.values.toList() var tileResources = GameBasics.TileResources.values.toList()
// Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer. // Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer.
tileResources = tileResources.filter { it.terrainsCanBeFoundOn.contains(tileInfo.lastTerrain.name) } tileResources = tileResources.filter { it.terrainsCanBeFoundOn.contains(tileInfo.getLastTerrain().name) }
var resource: TileResource? = null var resource: TileResource? = null
when { when {

View File

@ -13,6 +13,7 @@ import kotlin.math.abs
open class TileInfo { open class TileInfo {
@Transient lateinit var tileMap: TileMap @Transient lateinit var tileMap: TileMap
@Transient var owningCity:CityInfo?=null @Transient var owningCity:CityInfo?=null
@Transient lateinit var baseTerrainObject:Terrain
var militaryUnit:MapUnit?=null var militaryUnit:MapUnit?=null
var civilianUnit:MapUnit?=null var civilianUnit:MapUnit?=null
@ -43,7 +44,7 @@ open class TileInfo {
return toReturn return toReturn
} }
//region pure functions
fun getUnits(): List<MapUnit> { fun getUnits(): List<MapUnit> {
val list = ArrayList<MapUnit>(2) val list = ArrayList<MapUnit>(2)
if(militaryUnit!=null) list.add(militaryUnit!!) if(militaryUnit!=null) list.add(militaryUnit!!)
@ -52,12 +53,9 @@ open class TileInfo {
// this used to be "return listOf(militaryUnit,civilianUnit).filterNotNull()" but profiling revealed that that took considerably longer // this used to be "return listOf(militaryUnit,civilianUnit).filterNotNull()" but profiling revealed that that took considerably longer
} }
fun getCity(): CityInfo? { fun getCity(): CityInfo? = owningCity
return owningCity
}
val lastTerrain: Terrain fun getLastTerrain(): Terrain = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!!
get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!!
fun getTileResource(): TileResource = fun getTileResource(): TileResource =
if (resource == null) throw Exception("No resource exists for this tile!") if (resource == null) throw Exception("No resource exists for this tile!")
@ -78,18 +76,15 @@ open class TileInfo {
return internalNeighbors!! return internalNeighbors!!
} }
val height: Int fun getHeight(): Int {
get() { var height = 0
var height = 0 if (listOf("Forest", "Jungle").contains(terrainFeature)) height += 1
if (listOf("Forest", "Jungle").contains(terrainFeature)) height += 1 if ("Hill" == baseTerrain) height += 2
if ("Hill" == baseTerrain) height += 2 return height
return height
}
fun getBaseTerrain(): Terrain {
return GameBasics.Terrains[baseTerrain]!!
} }
fun getBaseTerrain(): Terrain = baseTerrainObject
fun getOwner(): CivilizationInfo? { fun getOwner(): CivilizationInfo? {
val containingCity = getCity() val containingCity = getCity()
if(containingCity==null) return null if(containingCity==null) return null
@ -100,6 +95,13 @@ open class TileInfo {
return if (terrainFeature == null) null else GameBasics.Terrains[terrainFeature!!] return if (terrainFeature == null) null else GameBasics.Terrains[terrainFeature!!]
} }
fun isWorked(): Boolean {
val city = getCity()
return city!=null && city.workedTiles.contains(position)
}
fun isLand() = getBaseTerrain().type==TerrainType.Land
fun isWater() = getBaseTerrain().type==TerrainType.Water
fun getTileStats(observingCiv: CivilizationInfo): Stats { fun getTileStats(observingCiv: CivilizationInfo): Stats {
return getTileStats(getCity(), observingCiv) return getTileStats(getCity(), observingCiv)
@ -188,15 +190,37 @@ open class TileInfo {
} }
fun startWorkingOnImprovement(improvement: TileImprovement, civInfo: CivilizationInfo) { fun hasViewableResource(civInfo: CivilizationInfo): Boolean {
improvementInProgress = improvement.name return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
turnsToImprovement = improvement.getTurnsToBuild(civInfo)
} }
fun stopWorkingOnImprovement() { fun hasIdleUnit(): Boolean {
improvementInProgress = null return getUnits().any{it.isIdle()}
} }
fun getViewableTiles(distance:Int): MutableList<TileInfo> {
return tileMap.getViewableTiles(this.position,distance)
}
fun getTilesInDistance(distance:Int): List<TileInfo> {
return tileMap.getTilesInDistance(position,distance)
}
fun getTilesAtDistance(distance:Int): List<TileInfo> {
return tileMap.getTilesAtDistance(position,distance)
}
fun getDefensiveBonus(): Float {
var bonus = getBaseTerrain().defenceBonus
if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus
return bonus
}
fun arialDistanceTo(otherTile:TileInfo): Int {
val xDelta = position.x-otherTile.position.x
val yDelta = position.y-otherTile.position.y
return listOf(abs(xDelta),abs(yDelta), abs(xDelta-yDelta)).max()!!.toInt()
}
override fun toString(): String { override fun toString(): String {
val SB = StringBuilder() val SB = StringBuilder()
@ -233,43 +257,28 @@ open class TileInfo {
return SB.toString().trim() return SB.toString().trim()
} }
fun hasViewableResource(civInfo: CivilizationInfo): Boolean { //endregion
return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
//region state-changing functions
fun setTransients(){
baseTerrainObject = GameBasics.Terrains[baseTerrain]!!
if(militaryUnit!=null) militaryUnit!!.currentTile = this
if(civilianUnit!=null) civilianUnit!!.currentTile = this
for (unit in getUnits()) {
unit.assignOwner(tileMap.gameInfo.civilizations.first { it.civName == unit.owner })
unit.setTransients()
}
} }
fun hasIdleUnit(): Boolean { fun startWorkingOnImprovement(improvement: TileImprovement, civInfo: CivilizationInfo) {
return getUnits().any{it.isIdle()} improvementInProgress = improvement.name
turnsToImprovement = improvement.getTurnsToBuild(civInfo)
} }
fun getViewableTiles(distance:Int): MutableList<TileInfo> { fun stopWorkingOnImprovement() {
return tileMap.getViewableTiles(this.position,distance) improvementInProgress = null
}
fun getTilesInDistance(distance:Int): List<TileInfo> {
return tileMap.getTilesInDistance(position,distance)
}
fun getTilesAtDistance(distance:Int): List<TileInfo> {
return tileMap.getTilesAtDistance(position,distance)
}
fun getDefensiveBonus(): Float {
var bonus = getBaseTerrain().defenceBonus
if(terrainFeature!=null) bonus += getTerrainFeature()!!.defenceBonus
return bonus
}
fun isWorked(): Boolean {
val city = getCity()
return city!=null && city.workedTiles.contains(position)
}
fun isLand() = getBaseTerrain().type==TerrainType.Land
fun isWater() = getBaseTerrain().type==TerrainType.Water
fun arialDistanceTo(otherTile:TileInfo): Int {
val xDelta = position.x-otherTile.position.x
val yDelta = position.y-otherTile.position.y
return listOf(abs(xDelta),abs(yDelta), abs(xDelta-yDelta)).max()!!.toInt()
} }
//endregion
} }

View File

@ -91,7 +91,7 @@ class TileMap {
val viewableTiles = getTilesInDistance(position, 1).toMutableList() val viewableTiles = getTilesInDistance(position, 1).toMutableList()
for (i in 1..sightDistance) { // in each layer, for (i in 1..sightDistance) { // in each layer,
getTilesAtDistance(position, i).filterTo(viewableTiles) // take only tiles which have a visible neighbor, which is lower than the tile getTilesAtDistance(position, i).filterTo(viewableTiles) // take only tiles which have a visible neighbor, which is lower than the tile
{ tile -> tile.neighbors.any{viewableTiles.contains(it) && (it.height==0 || it.height < tile.height)} } { tile -> tile.neighbors.any{viewableTiles.contains(it) && (it.getHeight() ==0 || it.getHeight() < tile.getHeight())} }
} }
return viewableTiles return viewableTiles
@ -115,13 +115,7 @@ class TileMap {
for (tileInfo in values){ for (tileInfo in values){
tileMatrix[tileInfo.position.x.toInt()-leftX][tileInfo.position.y.toInt()-bottomY] = tileInfo tileMatrix[tileInfo.position.x.toInt()-leftX][tileInfo.position.y.toInt()-bottomY] = tileInfo
tileInfo.tileMap = this tileInfo.tileMap = this
if(tileInfo.militaryUnit!=null) tileInfo.militaryUnit!!.currentTile = tileInfo tileInfo.setTransients()
if(tileInfo.civilianUnit!=null) tileInfo.civilianUnit!!.currentTile = tileInfo
for (unit in tileInfo.getUnits()) {
unit.assignOwner(gameInfo.civilizations.first { it.civName == unit.owner })
unit.setTransients()
}
} }
} }

View File

@ -28,7 +28,7 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
if(unit.hasUnique("Double movement in coast") && to.baseTerrain=="Coast") if(unit.hasUnique("Double movement in coast") && to.baseTerrain=="Coast")
return 1/2f return 1/2f
return to.lastTerrain.movementCost.toFloat() // no road return to.getLastTerrain().movementCost.toFloat() // no road
} }