From 034f6b0860f6cd4e81fa3cfc2da354a899cc3e61 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 20 Aug 2018 09:19:37 +0300 Subject: [PATCH] Finding map tiles now works with a matrix instead of a map - works MUCH faster! --- core/src/com/unciv/logic/map/TileMap.kt | 37 +++++++++++++++++++------ 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index 5f512ef836..092f44dfec 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -9,7 +9,9 @@ import com.unciv.models.gamebasics.GameBasics class TileMap { @Transient lateinit var gameInfo: GameInfo - @Transient private var tileMap = HashMap() + @Transient var tileMatrix=ArrayList>() // this works several times faster than a hashmap, the performance difference is really astounding + @Transient var leftX=0 + @Transient var bottomY=0 @Deprecated("as of 2.7.10") private var tiles = HashMap() @@ -18,6 +20,12 @@ class TileMap { constructor() // for json parsing, we need to have a default constructor + fun clone(): TileMap { + val toReturn = TileMap() + toReturn.tileList.addAll(tileList.map { it.clone() }) + return toReturn + } + val values: Collection get() = tileList @@ -28,11 +36,17 @@ class TileMap { } operator fun contains(vector: Vector2): Boolean { - return tileMap.containsKey(vector.toString()) + val arrayXIndex = vector.x.toInt()-leftX + if(arrayXIndex<0 || arrayXIndex>=tileMatrix.size) return false + val arrayYIndex = vector.y.toInt()-bottomY + if(arrayYIndex<0 || arrayYIndex>=tileMatrix[arrayXIndex].size) return false + return tileMatrix[arrayXIndex][arrayYIndex] != null } operator fun get(vector: Vector2): TileInfo { - return tileMap[vector.toString()]!! + val arrayXIndex = vector.x.toInt()-leftX + val arrayYIndex = vector.y.toInt()-bottomY + return tileMatrix[arrayXIndex][arrayYIndex]!! } fun getTilesInDistance(origin: Vector2, distance: Int): List { @@ -67,9 +81,19 @@ class TileMap { if(tiles.any()) // tileList.addAll(tiles.values) - tileMap.putAll(tileList.associateBy { it.position.toString() }) + var topY=tileList.map { it.position.y.toInt() }.max()!! + bottomY= tileList.map { it.position.y.toInt() }.min()!! + var rightX=tileList.map { it.position.x.toInt() }.max()!! + leftX = tileList.map { it.position.x.toInt() }.min()!! + + for(x in leftX..rightX){ + val row = ArrayList() + for(y in bottomY..topY) row.add(null) + tileMatrix.add(row) + } for (tileInfo in values){ + tileMatrix[tileInfo.position.x.toInt()-leftX][tileInfo.position.y.toInt()-bottomY] = tileInfo tileInfo.tileMap = this if(tileInfo.militaryUnit!=null) tileInfo.militaryUnit!!.currentTile = tileInfo if(tileInfo.civilianUnit!=null) tileInfo.civilianUnit!!.currentTile = tileInfo @@ -87,10 +111,5 @@ class TileMap { return path } - fun clone(): TileMap { - val toReturn = TileMap() - toReturn.tileList.addAll(tileList.map { it.clone() }) - return toReturn - } } \ No newline at end of file