mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-29 23:10:39 -04:00
Performance improvement - added baseTerrain transient in tileInfo
This commit is contained in:
parent
347d329233
commit
6c9297abc2
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user