Json is apparently not thread safe, so we now create a new instance for each stringify

This commit is contained in:
Yair Morgenstern 2018-08-20 09:17:40 +03:00
parent 4c5e6a8a39
commit f820b75fff
7 changed files with 32 additions and 30 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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()

View File

@ -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")

View File

@ -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

View File

@ -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
}

View File

@ -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
}
}