From 8fcc58ee6bf8645992ac73be436b8e6d3bc84f96 Mon Sep 17 00:00:00 2001 From: Nicola Sovic Date: Sun, 12 Jun 2022 11:29:42 +0200 Subject: [PATCH] Finished load and save mechanic, v1.3.0 --- .gitignore | 1 + Assets/Scripts/ButtonHandler.cs | 1 + Assets/Scripts/ContentGenerator.cs | 77 ++++++ Assets/Scripts/Enemy.cs | 6 + Assets/Scripts/FileHandler.cs | 59 +++-- Assets/Scripts/NoiseGenerator.cs | 35 ++- Assets/Scripts/Player.cs | 1 + Assets/Scripts/Slimes/BasicSlime.cs | 16 +- Assets/Scripts/Tile.cs | 54 +++- Assets/Scripts/WorldGenerator.cs | 64 ++++- save.json | 378 +++------------------------- 11 files changed, 310 insertions(+), 382 deletions(-) diff --git a/.gitignore b/.gitignore index 8936e27..c7bea5f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ /[Ll]ogs/ /[Mm]emoryCaptures/ /[Pp]ackages/ +/[Ss]ave/ # Asset meta data should only be ignored when the corresponding asset is also ignored !/[Aa]ssets/**/*.meta diff --git a/Assets/Scripts/ButtonHandler.cs b/Assets/Scripts/ButtonHandler.cs index 2bcaf3d..d75c8a4 100644 --- a/Assets/Scripts/ButtonHandler.cs +++ b/Assets/Scripts/ButtonHandler.cs @@ -117,6 +117,7 @@ namespace Assets.Scripts public void saveGame() { audioHandler.playButtonClick(); + FileHandler.generateDirectory(); string saveString = "{\r\n\"player\": {\r\n" + player.saveGame(); saveString = saveString + "\r\n},\r\n\"world\": {\r\n" + worldGenerator.saveGame() + "\r\n}\r\n}"; FileHandler.saveGame(saveString, "./save.json"); diff --git a/Assets/Scripts/ContentGenerator.cs b/Assets/Scripts/ContentGenerator.cs index d92d878..4deb9b5 100644 --- a/Assets/Scripts/ContentGenerator.cs +++ b/Assets/Scripts/ContentGenerator.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -154,4 +155,80 @@ public class ContentGenerator : MonoBehaviour return boss; } } + + public GameObject loadObject(JToken json) + { + GameObject result = gameObject; + string name = json["objectname"].ToString().Replace("(Clone)", ""); + if (name.ToLower().Contains("stone")) + { + foreach (GameObject stone in stones) + { + if (stone.name == name) + { + result = stone; + break; + } + } + } + else + { + foreach (GameObject tree in trees) + { + if (tree.name == name) + { + result = tree; + break; + } + } + } + return result; + } + + public GameObject loadEnemy(JToken json) + { + GameObject result = gameObject; + string name = json["enemyname"].ToString().Replace("(Clone)", ""); + if (name.Split(' ').Length > 1) + { + name = name.Split(' ')[1]; + } + if (name == "(Boss)") + { + result = boss; + } + else + { + switch (name) + { + case "(Metal)": + name = "SlimeMetalIdle"; + break; + case "(MiniBoss)": + name = "SlimeMiniBossIdle"; + break; + case "(Water)": + name = "SlimeWaterIdle"; + break; + case "(Mage)": + name = "SlimeMageIdle"; + break; + case "(Warrior)": + name = "SlimeWarriorIdle"; + break; + default: + name = "SlimeBaseIdle"; + break; + } + foreach (GameObject enemy in enemies) + { + if (enemy.name == name) + { + result = enemy; + break; + } + } + } + return result; + } } diff --git a/Assets/Scripts/Enemy.cs b/Assets/Scripts/Enemy.cs index a587cd8..cdd72c4 100644 --- a/Assets/Scripts/Enemy.cs +++ b/Assets/Scripts/Enemy.cs @@ -1,5 +1,6 @@ using Assets.Scripts; using Assets.Scripts.Slimes; +using Newtonsoft.Json.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -130,5 +131,10 @@ namespace Assets.Scripts } return result; } + + public void loadEnemy(JToken json) + { + slime = new BasicSlime(json); + } } } \ No newline at end of file diff --git a/Assets/Scripts/FileHandler.cs b/Assets/Scripts/FileHandler.cs index 0882c07..5ec1d6b 100644 --- a/Assets/Scripts/FileHandler.cs +++ b/Assets/Scripts/FileHandler.cs @@ -16,14 +16,7 @@ namespace Assets.Scripts static StreamWriter sw; public static void saveGame(string data, string path) { - if (!File.Exists(path)) - { - sw = File.CreateText(path); - } - else - { - sw = new StreamWriter(path); - } + sw = new StreamWriter(path); sw.Write(data); sw.Flush(); sw.Close(); @@ -39,7 +32,7 @@ namespace Assets.Scripts { jsonString = jsonString + line.Replace("\r\n", ""); } - JArray json = JsonConvert.DeserializeObject(jsonString); + JObject json = JsonConvert.DeserializeObject(jsonString); player.loadPlayer(json["player"]); worldGenerator.loadWorld(json["world"]); } @@ -47,14 +40,7 @@ namespace Assets.Scripts public static void saveAudio(string path, float music, float effects) { - if (!File.Exists(path)) - { - sw = File.CreateText(path); - } - else - { - sw = new StreamWriter(path); - } + sw = new StreamWriter(path); sw.WriteLine("Music:" + music); sw.WriteLine("Effects:" + effects); sw.Flush(); @@ -86,5 +72,44 @@ namespace Assets.Scripts { return File.Exists("./save.json"); } + + public static void saveTile(string content, string path) + { + sw = new StreamWriter(path); + sw.Write(content); + sw.Flush(); + sw.Close(); + } + + public static void saveNoise(string content, string path) + { + sw = new StreamWriter(path, true); + sw.Write(content); + sw.Flush(); + sw.Close(); + } + + public static void generateDirectory() + { + if (!Directory.Exists("./save/")) + { + Directory.CreateDirectory("./save/"); + } + else + { + Directory.Delete("./save/"); + } + } + + public static string loadTile(string path) + { + string result = ""; + string[] lines = File.ReadAllLines(path); + foreach (string line in lines) + { + result = result + line.Replace("\r\n", ""); + } + return result; + } } } diff --git a/Assets/Scripts/NoiseGenerator.cs b/Assets/Scripts/NoiseGenerator.cs index c7d8647..44e3081 100644 --- a/Assets/Scripts/NoiseGenerator.cs +++ b/Assets/Scripts/NoiseGenerator.cs @@ -3,6 +3,8 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Linq; public class NoiseGenerator { @@ -230,7 +232,7 @@ public class NoiseGenerator tile.GetComponent().sharedMesh = mesh; } - public string saveTile(GameObject tile) + public void saveTile(GameObject tile, string path) { string result = ""; Vector3[] vertices = tile.GetComponent().mesh.vertices; @@ -247,13 +249,38 @@ public class NoiseGenerator result = result + "\r\n},\"colors\": {\r\n"; for (int i = 0; i < colors.Length; i++) { - result = result + FileHandler.generateJSON("color" + i, "\"" + colors[i].r + "/" + colors[i].g + "/" + colors[i].b + "\""); + result = result + FileHandler.generateJSON("color" + i, "\"" + colors[i].r + "/" + colors[i].g + "/" + colors[i].b + "/" + colors[i].a + "\""); if (i < colors.Length - 1) { result = result + ",\r\n"; } } - result = result + "\r\n}"; - return result; + result = result + "\r\n}\r\n}"; + FileHandler.saveNoise(result, path); + } + + public void loadTile(GameObject tile, JToken jsonVertices, JToken jsonColors) + { + var jsonData = JObject.Parse(jsonColors.ToString()).Children(); + List colorTokens = jsonData.Children().ToList(); + jsonData = JObject.Parse(jsonVertices.ToString()).Children(); + List verticeTokens = jsonData.Children().ToList(); + Color32[] colors = new Color32[colorTokens.Count]; + Vector3[] vertices = new Vector3[verticeTokens.Count]; + JToken current; + string[] parts; + for(int i = 0; i < colorTokens.Count;i++) + { + current = colorTokens[i]; + parts = current.Value().Split('/'); + colors[i] = new Color32(byte.Parse(parts[0]), byte.Parse(parts[1]), byte.Parse(parts[2]), byte.Parse(parts[3])); + } + for (int i = 0; i < verticeTokens.Count; i++) + { + current = verticeTokens[i]; + parts = current.Value().Split('/'); + vertices[i] = new Vector3(float.Parse(parts[0]), float.Parse(parts[1]), float.Parse(parts[2])); + } + applyMesh(tile, vertices, tile.GetComponent().mesh, colors); } } diff --git a/Assets/Scripts/Player.cs b/Assets/Scripts/Player.cs index dd917eb..ad4ba16 100644 --- a/Assets/Scripts/Player.cs +++ b/Assets/Scripts/Player.cs @@ -601,6 +601,7 @@ namespace Assets.Scripts isDodging = bool.Parse(json["isDodging"].ToString()); killcount = (int)json["killcount"]; difficulty = (int)json["difficulty"]; + generateSkills(); } private void loadRole(string name) diff --git a/Assets/Scripts/Slimes/BasicSlime.cs b/Assets/Scripts/Slimes/BasicSlime.cs index 7a65e0a..6228e47 100644 --- a/Assets/Scripts/Slimes/BasicSlime.cs +++ b/Assets/Scripts/Slimes/BasicSlime.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json.Linq; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -33,6 +34,19 @@ namespace Assets.Scripts.Slimes level = playerStats[7]; } + public BasicSlime(JToken json) + { + maxHealth = (int)json["maxHealth"]; + maxSecondary = (int)json["maxSecondary"]; + secondary = (int)json["secondary"]; + health = (int)json["health"]; + strength = (int)json["strength"]; + dexterity = (int)json["dexterity"]; + intelligence = (int)json["intelligence"]; + level = (int)json["level"]; + experience = (int)json["experience"]; + } + public int[] getStats() { int[] result = { health, maxHealth, secondary, maxSecondary, strength, dexterity, intelligence }; diff --git a/Assets/Scripts/Tile.cs b/Assets/Scripts/Tile.cs index 4bee480..8d6777f 100644 --- a/Assets/Scripts/Tile.cs +++ b/Assets/Scripts/Tile.cs @@ -1,6 +1,8 @@ using Assets.Scripts; +using Newtonsoft.Json.Linq; using System.Collections; using System.Collections.Generic; +using System.Linq; using UnityEngine; public class Tile : MonoBehaviour @@ -215,9 +217,9 @@ public class Tile : MonoBehaviour return tiletype; } - public string saveTile() + public void saveTile(string path) { - string result = ""; + string result = "{\r\n"; GameObject obj; result = result + FileHandler.generateJSON("tiletype", "\"" + tiletype + "\"") + ",\r\n"; result = result + FileHandler.generateJSON("position", "\"" + position.x + "/" + position.y + "/" + position.z + "\"") + ",\r\n"; @@ -240,8 +242,8 @@ public class Tile : MonoBehaviour result = result + ",\r\n"; } } - result = result + "\r\n}"; - return result; + result = result + "\r\n},"; + FileHandler.saveTile(result, path); } public string saveCurrent() @@ -250,4 +252,48 @@ public class Tile : MonoBehaviour result = result + "\"" + position.x + "/" + position.y + "/" + position.z + "\""; return result; } + + public void loadTile(JToken json, Vector3 pos) + { + var jsonData = JObject.Parse(json["objects"].ToString()).Children(); + List tokens = jsonData.Children().ToList(); + contentGenerator = GameObject.Find("ContentGenerator"); + GameObject spawnedObject; + Vector3 position; + foreach (JToken obj in tokens) + { + if (obj["objectname"] != null) + { + if (obj["objectname"].ToString() != "pnlWater") + { + spawnedObject = contentGenerator.GetComponent().loadObject(obj); + } + else + { + spawnedObject = null; + } + } + else + { + spawnedObject = contentGenerator.GetComponent().loadEnemy(obj); + } + if (spawnedObject != null) + { + position = new Vector3(float.Parse(obj["position"].ToString().Split('/')[0]), float.Parse(obj["position"].ToString().Split('/')[1]), float.Parse(obj["position"].ToString().Split('/')[2])); + spawnedObject = Instantiate(spawnedObject, position, Quaternion.identity); + spawnedObject.transform.parent = gameObject.transform; + if (spawnedObject.tag.Contains("Enemy")) + { + aliveEnemies.Add(spawnedObject); + if (obj["health"] != null) + { + spawnedObject.GetComponent().loadEnemy(obj); + } + } + } + } + tiletype = json["tiletype"].ToString(); + setPosition(pos); + setBorders(); + } } diff --git a/Assets/Scripts/WorldGenerator.cs b/Assets/Scripts/WorldGenerator.cs index b7fda2b..6872381 100644 --- a/Assets/Scripts/WorldGenerator.cs +++ b/Assets/Scripts/WorldGenerator.cs @@ -1,7 +1,10 @@ using Assets.Scripts; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using UnityEngine; using UnityEngine.UI; @@ -21,9 +24,14 @@ public class WorldGenerator : MonoBehaviour // Start is called before the first frame update void Start() + { + + } + + private void OnEnable() { tiles = new Dictionary(); - tiles.Add(new Vector3(0,0,0), GameObject.Find("Spawn")); + tiles.Add(new Vector3(0, 0, 0), GameObject.Find("Spawn")); renderedTiles = new List(); currentTile = GameObject.Find("Spawn"); currentTile.GetComponent().setPosition(new Vector3(0, 0, 0)); @@ -53,7 +61,7 @@ public class WorldGenerator : MonoBehaviour } player.transform.position = new Vector3(0,1.5f,0); player.transform.rotation = Quaternion.identity; - Start(); + OnEnable(); currentTile.GetComponent().resetSpawn(); this.cityAmount = cityAmount; maxCityAmount = cityAmount; @@ -184,6 +192,7 @@ public class WorldGenerator : MonoBehaviour { string result = ""; int counter = 0; + string savePath = ""; result = result + FileHandler.generateJSON("cityAmount", cityAmount) + ",\r\n"; result = result + FileHandler.generateJSON("maxCityAmount", maxCityAmount) + ",\r\n"; result = result + "\"currentTile\": " + currentTile.GetComponent().saveCurrent() + ",\r\n"; @@ -192,10 +201,18 @@ public class WorldGenerator : MonoBehaviour { if (tile.name != "Spawn") { - result = result + "\"tile" + counter + "\": {\r\n"; - result = result + tile.GetComponent().saveTile() + ",\r\n"; - result = result + noise.saveTile(tile) + "\r\n}"; - if (counter < tiles.Count - 1) + savePath = "./save/tile" + counter + ".json"; + result = result + "\"tile" + counter + "\": \"" + savePath + "\""; + tile.GetComponent().saveTile(savePath); + if (tile.GetComponent().getTileType() == "CityTile") + { + FileHandler.saveNoise("\r\n}", savePath); + } + else + { + noise.saveTile(tile, savePath); + } + if (counter < tiles.Count - 2) { result = result + ",\r\n"; } @@ -205,4 +222,39 @@ public class WorldGenerator : MonoBehaviour result = result + "\r\n}"; return result; } + + public void loadWorld(JToken json) + { + resetGame(0); + cityAmount = (int)json["cityAmount"]; + maxCityAmount = (int)json["maxCityAmount"]; + string[] vectorParts = json["currentTile"].ToString().Split('/'); + Vector3 current = new Vector3(float.Parse(vectorParts[0]), float.Parse(vectorParts[1]), float.Parse(vectorParts[2])); + GameObject loadedTile; + Vector3 mapPos; + Vector3 pos; + foreach (JProperty tilePath in json["map"]) + { + JToken jsonData = JObject.Parse(FileHandler.loadTile(tilePath.Value.ToString())); + vectorParts = jsonData["position"].ToString().Split('/'); + pos = new Vector3(float.Parse(vectorParts[0]), float.Parse(vectorParts[1]), float.Parse(vectorParts[2])); + mapPos = new Vector3(pos.x * 100, 0, pos.z * 100); + if (jsonData["tiletype"].ToString() == "CityTile") + { + loadedTile = Instantiate(city, mapPos, Quaternion.identity); + } + else + { + loadedTile = Instantiate(tile, mapPos, Quaternion.identity); + loadedTile.GetComponent().loadTile(jsonData, pos); + noise.loadTile(loadedTile, jsonData["vertices"], jsonData["colors"]); + } + tiles.Add(pos, loadedTile); + renderedTiles.Add(loadedTile); + } + currentTile = tiles[current]; + updateRenderedTiles(); + Vector3 position = new Vector3(currentTile.transform.position.x, 5, currentTile.transform.position.z); + player.transform.SetPositionAndRotation(position, player.transform.rotation); + } } diff --git a/save.json b/save.json index 70e31f1..07bb1b2 100644 --- a/save.json +++ b/save.json @@ -1,352 +1,30 @@ { - "player": { - "playername": "", - "maxHealth": 110, - "maxSecondary": 10, - "secondary": 10, - "health": 110, - "strength": 7, - "dexterity": 5, - "intelligence": 3, - "level": 0, - "experience": 0, - "maxExperience": 10, - "race": "Human", - "role": "Warrior", - "points": 0, - "isDodging": "False", - "killcount": 0, - "difficulty": 0 - }, - "world": { - "cityAmount": 10, - "maxCityAmount": 10, - "currentTile": "-1/0/0", - "map": { - "tile0": { - "tiletype": "Plane", - "position": "-1/0/0", - "objects": { - "object0": { - "position": "-100/-0.5/0", - "objectname": "pnlWater" - }, - "object1": { - "position": "-100/3.901497/36", - "objectname": "PineTree(Clone)" - }, - "object2": { - "position": "-78/4.525089/40", - "objectname": "PineTree(Clone)" - }, - "object3": { - "position": "-62/1.825109/40", - "enemyname": "Slime" - }, - "object4": { - "position": "-134/5.226842/29", - "objectname": "OakTree(Clone)" - }, - "object5": { - "position": "-111/4.363989/33", - "objectname": "PineTree(Clone)" - }, - "object6": { - "position": "-98/4.430823/27", - "objectname": "OakTree(Clone)" - }, - "object7": { - "position": "-129/2.661985/22", - "objectname": "StoneBasic(Clone)" - }, - "object8": { - "position": "-111/1.722374/21", - "objectname": "StoneBasic(Clone)" - }, - "object9": { - "position": "-93/1.801105/18", - "objectname": "StoneBasic(Clone)" - }, - "object10": { - "position": "-64/5.297513/19", - "objectname": "OakTree(Clone)" - }, - "object11": { - "position": "-138/2.517758/9", - "objectname": "StoneBasic2(Clone)" - }, - "object12": { - "position": "-120/1.416847/7", - "enemyname": "Slime (Water)" - }, - "object13": { - "position": "-68/5.504285/12", - "objectname": "OakTree(Clone)" - }, - "object14": { - "position": "-58/5.000051/10", - "objectname": "OakTree(Clone)" - }, - "object15": { - "position": "-142/4.742146/-21", - "objectname": "OakTree(Clone)" - }, - "object16": { - "position": "-144/1.74514/-44", - "objectname": "StoneBasic2(Clone)" - }, - "object17": { - "position": "-111/1.408948/-39", - "enemyname": "Slime (Water)" - } - }, - "vertices": { - "vertice0": "5/0/5", - "vertice1": "4/0/5", - "vertice2": "3/0/5", - "vertice3": "2/0/5", - "vertice4": "0.9999999/0/5", - "vertice5": "0/0/5", - "vertice6": "-1/0/5", - "vertice7": "-2/0/5", - "vertice8": "-3/0/5", - "vertice9": "-4/0/5", - "vertice10": "-5/0/5", - "vertice11": "5/0/4", - "vertice12": "4/0.76252/4", - "vertice13": "3/1.109103/4", - "vertice14": "2/0.478129/4", - "vertice15": "0.9999999/0.371061/4", - "vertice16": "0/-0.08722392/4", - "vertice17": "-1/-0.228939/4", - "vertice18": "-2/1.378129/4", - "vertice19": "-3/0.8091032/4", - "vertice20": "-4/1.06252/4", - "vertice21": "-5/0/4", - "vertice22": "5/0/3", - "vertice23": "4/-0.01149016/3", - "vertice24": "3/0.935093/3", - "vertice25": "2/0.3041188/3", - "vertice26": "0.9999999/0.4970509/3", - "vertice27": "0/0.03876588/3", - "vertice28": "-1/0.797051/3", - "vertice29": "-2/0.9041188/3", - "vertice30": "-3/1.535093/3", - "vertice31": "-4/0.5885098/3", - "vertice32": "-5/0/3", - "vertice33": "5/0/2", - "vertice34": "4/1.585729/2", - "vertice35": "3/0.7323117/2", - "vertice36": "2/0.7013376/2", - "vertice37": "0.9999999/-0.005730294/2", - "vertice38": "0/1.335985/2", - "vertice39": "-1/0.2942697/2", - "vertice40": "-2/0.7013376/2", - "vertice41": "-3/1.332312/2", - "vertice42": "-4/1.585729/2", - "vertice43": "-5/0/2", - "vertice44": "5/0/0.9999999", - "vertice45": "4/1.636129/0.9999999", - "vertice46": "3/1.682712/0.9999999", - "vertice47": "2/0.4517377/0.9999999", - "vertice48": "0.9999999/0.6446697/0.9999999", - "vertice49": "0/1.086385/0.9999999", - "vertice50": "-1/0.04466984/0.9999999", - "vertice51": "-2/0.4517377/0.9999999", - "vertice52": "-3/1.082712/0.9999999", - "vertice53": "-4/1.336129/0.9999999", - "vertice54": "-5/0/0.9999999", - "vertice55": "5/0/0", - "vertice56": "4/0.1455633/0", - "vertice57": "3/1.092146/0", - "vertice58": "2/0.1611723/0", - "vertice59": "0.9999999/0.05410425/0", - "vertice60": "0/-0.1041808/0", - "vertice61": "-1/1.554104/0", - "vertice62": "-2/0.1611723/0", - "vertice63": "-3/1.092146/0", - "vertice64": "-4/0.4455633/0", - "vertice65": "-5/0/0", - "vertice66": "5/0/-1", - "vertice67": "4/1.036129/-1", - "vertice68": "3/0.1827119/-1", - "vertice69": "2/0.1517377/-1", - "vertice70": "0.9999999/1.24467/-1", - "vertice71": "0/1.386385/-1", - "vertice72": "-1/1.24467/-1", - "vertice73": "-2/0.4517377/-1", - "vertice74": "-3/1.682712/-1", - "vertice75": "-4/0.4361287/-1", - "vertice76": "-5/0/-1", - "vertice77": "5/0/-2", - "vertice78": "4/0.6857287/-2", - "vertice79": "3/0.7323117/-2", - "vertice80": "2/1.601338/-2", - "vertice81": "0.9999999/-0.005730294/-2", - "vertice82": "0/1.335985/-2", - "vertice83": "-1/0.5942697/-2", - "vertice84": "-2/0.1013376/-2", - "vertice85": "-3/1.632312/-2", - "vertice86": "-4/0.9857288/-2", - "vertice87": "-5/0/-2", - "vertice88": "5/0/-3", - "vertice89": "4/0.8885098/-3", - "vertice90": "3/0.935093/-3", - "vertice91": "2/1.504119/-3", - "vertice92": "0.9999999/0.1970509/-3", - "vertice93": "0/-0.2612341/-3", - "vertice94": "-1/1.097051/-3", - "vertice95": "-2/1.204119/-3", - "vertice96": "-3/0.6350929/-3", - "vertice97": "-4/0.2885098/-3", - "vertice98": "-5/0/-3", - "vertice99": "5/0/-4", - "vertice100": "4/0.4625199/-4", - "vertice101": "3/1.109103/-4", - "vertice102": "2/0.178129/-4", - "vertice103": "0.9999999/0.671061/-4", - "vertice104": "0/1.112776/-4", - "vertice105": "-1/0.371061/-4", - "vertice106": "-2/-0.121871/-4", - "vertice107": "-3/1.409103/-4", - "vertice108": "-4/0.76252/-4", - "vertice109": "-5/0/-4", - "vertice110": "5/0/-5", - "vertice111": "4/0/-5", - "vertice112": "3/0/-5", - "vertice113": "2/0/-5", - "vertice114": "0.9999999/0/-5", - "vertice115": "0/0/-5", - "vertice116": "-1/0/-5", - "vertice117": "-2/0/-5", - "vertice118": "-3/0/-5", - "vertice119": "-4/0/-5", - "vertice120": "-5/0/-5" - }, - "colors": { - "color0": "0/154/0", - "color1": "0/154/0", - "color2": "0/154/0", - "color3": "0/154/0", - "color4": "0/154/0", - "color5": "0/154/0", - "color6": "0/154/0", - "color7": "0/154/0", - "color8": "0/154/0", - "color9": "0/154/0", - "color10": "0/154/0", - "color11": "0/154/0", - "color12": "0/168/0", - "color13": "0/174/0", - "color14": "0/163/0", - "color15": "0/161/0", - "color16": "0/153/0", - "color17": "0/150/0", - "color18": "0/179/0", - "color19": "0/169/0", - "color20": "0/173/0", - "color21": "0/154/0", - "color22": "0/154/0", - "color23": "0/154/0", - "color24": "0/171/0", - "color25": "0/160/0", - "color26": "0/163/0", - "color27": "0/155/0", - "color28": "0/169/0", - "color29": "0/170/0", - "color30": "0/182/0", - "color31": "0/165/0", - "color32": "0/154/0", - "color33": "0/154/0", - "color34": "0/183/0", - "color35": "0/167/0", - "color36": "0/167/0", - "color37": "0/154/0", - "color38": "0/178/0", - "color39": "0/160/0", - "color40": "0/167/0", - "color41": "0/178/0", - "color42": "0/183/0", - "color43": "0/154/0", - "color44": "0/154/0", - "color45": "0/184/0", - "color46": "0/185/0", - "color47": "0/162/0", - "color48": "0/166/0", - "color49": "0/174/0", - "color50": "0/155/0", - "color51": "0/162/0", - "color52": "0/174/0", - "color53": "0/178/0", - "color54": "0/154/0", - "color55": "0/154/0", - "color56": "0/157/0", - "color57": "0/174/0", - "color58": "0/157/0", - "color59": "0/155/0", - "color60": "0/152/0", - "color61": "0/182/0", - "color62": "0/157/0", - "color63": "0/174/0", - "color64": "0/162/0", - "color65": "0/154/0", - "color66": "0/154/0", - "color67": "0/173/0", - "color68": "0/157/0", - "color69": "0/157/0", - "color70": "0/177/0", - "color71": "0/179/0", - "color72": "0/177/0", - "color73": "0/162/0", - "color74": "0/185/0", - "color75": "0/162/0", - "color76": "0/154/0", - "color77": "0/154/0", - "color78": "0/167/0", - "color79": "0/167/0", - "color80": "0/183/0", - "color81": "0/154/0", - "color82": "0/178/0", - "color83": "0/165/0", - "color84": "0/156/0", - "color85": "0/184/0", - "color86": "0/172/0", - "color87": "0/154/0", - "color88": "0/154/0", - "color89": "0/170/0", - "color90": "0/171/0", - "color91": "0/181/0", - "color92": "0/158/0", - "color93": "0/150/0", - "color94": "0/174/0", - "color95": "0/176/0", - "color96": "0/166/0", - "color97": "0/159/0", - "color98": "0/154/0", - "color99": "0/154/0", - "color100": "0/163/0", - "color101": "0/174/0", - "color102": "0/157/0", - "color103": "0/166/0", - "color104": "0/174/0", - "color105": "0/161/0", - "color106": "0/152/0", - "color107": "0/180/0", - "color108": "0/168/0", - "color109": "0/154/0", - "color110": "0/154/0", - "color111": "0/154/0", - "color112": "0/154/0", - "color113": "0/154/0", - "color114": "0/154/0", - "color115": "0/154/0", - "color116": "0/154/0", - "color117": "0/154/0", - "color118": "0/154/0", - "color119": "0/154/0", - "color120": "0/154/0" - } - } - } - } +"player": { +"playername": "", +"maxHealth": 110, +"maxSecondary": 10, +"secondary": 10, +"health": 110, +"strength": 7, +"dexterity": 5, +"intelligence": 3, +"level": 0, +"experience": 0, +"maxExperience": 10, +"race": "Human", +"role": "Warrior", +"points": 0, +"isDodging": "False", +"killcount": 0, +"difficulty": 0 +}, +"world": { +"cityAmount": 5, +"maxCityAmount": 5, +"currentTile": "0/0/-1", +"map": { +"tile0": "./save/tile0.json", +"tile1": "./save/tile1.json" +} +} } \ No newline at end of file