From f820b75fff0d58c900dad57f08bebf40acec291b Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 20 Aug 2018 09:17:40 +0300 Subject: [PATCH] Json is apparently not thread safe, so we now create a new instance for each stringify --- android/build.gradle | 4 +-- core/src/com/unciv/UnCivGame.kt | 2 -- core/src/com/unciv/logic/GameInfo.kt | 2 +- core/src/com/unciv/logic/GameSaver.kt | 4 +-- core/src/com/unciv/logic/HexMath.kt | 4 +-- core/src/com/unciv/logic/map/MapUnit.kt | 12 ++++----- core/src/com/unciv/logic/map/TileInfo.kt | 34 +++++++++++++----------- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 44a5993461..d42d41e43a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.game" minSdkVersion 14 targetSdkVersion 26 - versionCode 122 - versionName "2.7.9" + versionCode 124 + versionName "2.7.9.2" } buildTypes { release { diff --git a/core/src/com/unciv/UnCivGame.kt b/core/src/com/unciv/UnCivGame.kt index 8d54d76b89..017802f477 100644 --- a/core/src/com/unciv/UnCivGame.kt +++ b/core/src/com/unciv/UnCivGame.kt @@ -2,7 +2,6 @@ package com.unciv import com.badlogic.gdx.Game import com.badlogic.gdx.Gdx -import com.badlogic.gdx.utils.Json import com.unciv.logic.GameInfo import com.unciv.logic.GameSaver import com.unciv.models.gamebasics.GameBasics @@ -12,7 +11,6 @@ import com.unciv.ui.worldscreen.WorldScreen class UnCivGame : Game() { var gameInfo: GameInfo = GameInfo() lateinit var settings : GameSettings - val json = Json().apply { setIgnoreDeprecated(true); setIgnoreUnknownFields(true) } /** * This exists so that when debugging we can see the entire map. diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 9e2fc0725d..60d92aeaa8 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -22,8 +22,8 @@ class GameInfo { //region pure functions fun clone():GameInfo{ val toReturn = GameInfo() - toReturn.civilizations.addAll(civilizations.map { it.clone() }) toReturn.tileMap=tileMap.clone() + toReturn.civilizations.addAll(civilizations.map { it.clone() }) toReturn.notifications.addAll(notifications) toReturn.turns=turns toReturn.setTransients() diff --git a/core/src/com/unciv/logic/GameSaver.kt b/core/src/com/unciv/logic/GameSaver.kt index f3d8408b14..6252e78b0a 100644 --- a/core/src/com/unciv/logic/GameSaver.kt +++ b/core/src/com/unciv/logic/GameSaver.kt @@ -2,14 +2,14 @@ package com.unciv.logic import com.badlogic.gdx.Gdx import com.badlogic.gdx.files.FileHandle +import com.badlogic.gdx.utils.Json import com.unciv.GameSettings import com.unciv.OldGameSettings -import com.unciv.UnCivGame class GameSaver { private val saveFilesFolder = "SaveFiles" - fun json() = UnCivGame.Current.json + fun json() = Json().apply { setIgnoreDeprecated(true); setIgnoreUnknownFields(true) } // Json() is NOT THREAD SAFE so we need to create a new one for each function fun getSave(GameName: String): FileHandle { return Gdx.files.local("$saveFilesFolder/$GameName") diff --git a/core/src/com/unciv/logic/HexMath.kt b/core/src/com/unciv/logic/HexMath.kt index 67d29146cf..017e3e2cfa 100644 --- a/core/src/com/unciv/logic/HexMath.kt +++ b/core/src/com/unciv/logic/HexMath.kt @@ -55,12 +55,12 @@ class HexMath { } for (i in 0 until distance) { // 8 to 10 vectors.add(Current.cpy()) - vectors.add(origin.cpy().scl(2f).sub(Current)) // Get vector on other side of cloick + vectors.add(origin.cpy().scl(2f).sub(Current)) // Get vector on other side of clock Current.add(1f, 1f) } for (i in 0 until distance) { // 10 to 12 vectors.add(Current.cpy()) - vectors.add(origin.cpy().scl(2f).sub(Current)) // Get vector on other side of cloick + vectors.add(origin.cpy().scl(2f).sub(Current)) // Get vector on other side of clock Current.add(0f, 1f) } return vectors diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 7d639773f0..e4a6c82a76 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -24,13 +24,13 @@ class MapUnit { //region pure functions fun clone(): MapUnit { val toReturn = MapUnit() - toReturn.action=action - toReturn.currentMovement=currentMovement - toReturn.name=name - toReturn.promotions=promotions.clone() - toReturn.health=health - toReturn.attacksThisTurn=attacksThisTurn toReturn.owner=owner + toReturn.name=name + toReturn.currentMovement=currentMovement + toReturn.health=health + toReturn.action=action + toReturn.attacksThisTurn=attacksThisTurn + toReturn.promotions=promotions.clone() return toReturn } diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 532ad1f0c7..d3317ecd69 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -17,7 +17,6 @@ open class TileInfo { var militaryUnit:MapUnit?=null var civilianUnit:MapUnit?=null - fun getUnits()= listOf(militaryUnit,civilianUnit).filterNotNull() var position: Vector2 = Vector2.Zero lateinit var baseTerrain: String @@ -29,6 +28,25 @@ open class TileInfo { var roadStatus = RoadStatus.None var turnsToImprovement: Int = 0 + + fun clone(): TileInfo { + val toReturn = TileInfo() + if(militaryUnit!=null) toReturn.militaryUnit=militaryUnit!!.clone() + if(civilianUnit!=null) toReturn.civilianUnit=civilianUnit!!.clone() + toReturn.position=position.cpy() + toReturn.baseTerrain=baseTerrain + toReturn.terrainFeature=terrainFeature + toReturn.resource=resource + toReturn.improvement=improvement + toReturn.improvementInProgress=improvementInProgress + toReturn.roadStatus=roadStatus + toReturn.turnsToImprovement=turnsToImprovement + return toReturn + } + + + fun getUnits()= listOf(militaryUnit,civilianUnit).filterNotNull() + fun getCity(): CityInfo? { return tileMap.gameInfo.tilesToCities.get(this) //return tileMap.gameInfo.civilizations.flatMap { it.cities }.firstOrNull{it.tiles.contains(position)} @@ -210,18 +228,4 @@ open class TileInfo { } fun arialDistanceTo(otherTile:TileInfo) = abs(position.x-otherTile.position.x) + abs(position.y-otherTile.position.y) - fun clone(): TileInfo { - val toReturn = TileInfo() - if(civilianUnit!=null) toReturn.civilianUnit=civilianUnit!!.clone() - if(militaryUnit!=null) toReturn.militaryUnit=militaryUnit!!.clone() - toReturn.improvement=improvement - toReturn.position=position - toReturn.baseTerrain=baseTerrain - toReturn.terrainFeature=terrainFeature - toReturn.improvementInProgress=improvementInProgress - toReturn.resource=resource - toReturn.roadStatus=roadStatus - toReturn.turnsToImprovement=turnsToImprovement - return toReturn - } } \ No newline at end of file