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; public class WorldGenerator : MonoBehaviour { public GameObject player; public GameObject city; public GameObject tile; Dictionary tiles; GameObject currentTile; List renderedTiles; List toRemove; NoiseGenerator noise; int cityAmount = 0; int maxCityAmount = 0; System.Random rand = new System.Random(); // 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")); renderedTiles = new List(); currentTile = GameObject.Find("Spawn"); currentTile.GetComponent().setPosition(new Vector3(0, 0, 0)); currentTile.GetComponent().setBorders(); renderedTiles.Add(currentTile); noise = new NoiseGenerator(); cityAmount = 10; maxCityAmount = 10; } public bool gameWon() { return cityAmount <= 0; } public void resetGame(int cityAmount) { if (tiles != null) { foreach (GameObject tile in tiles.Values) { if (tile.name != "Spawn") { Destroy(tile); } } } player.transform.position = new Vector3(0,1.5f,0); player.transform.rotation = Quaternion.identity; OnEnable(); currentTile.GetComponent().resetSpawn(); this.cityAmount = cityAmount; maxCityAmount = cityAmount; } // Update is called once per frame void Update() { createTile(player.transform.position.x, player.transform.position.z); hideTile(player.transform.position.x, player.transform.position.z); resetPlayer(); } void resetPlayer() { if (player.transform.position.y <= -10) { Vector3 position = new Vector3(currentTile.transform.position.x, 5, currentTile.transform.position.z); player.transform.SetPositionAndRotation(position, player.transform.rotation); } } public void createTile(float playerX, float playerZ) { Vector3 pos = currentTile.GetComponent().needConnectedTile(playerX, playerZ); if (!tiles.ContainsKey(pos) && pos.y == 0) { GameObject newTile; string name; int chance = rand.Next(1,11); Vector3 mapPos = new Vector3(pos.x * 100, 0, pos.z * 100); if (chance == 1) { if (cityAmount > 0) { newTile = Instantiate(city, mapPos, Quaternion.identity); name = city.name; cityAmount--; SteamWorksHandler.getStandardAchievement("CityAchievement"); } else { newTile = Instantiate(tile, mapPos, Quaternion.identity); name = tile.name; noise.applyNoise(newTile); } } else { newTile = Instantiate(tile, mapPos, Quaternion.identity); name = tile.name; noise.applyNoise(newTile); } if (name.Contains("_")) { name = name.Split('_')[0]; } newTile.name = name + "_" + tiles.Count; newTile.GetComponent().generateTile(pos, name); tiles.Add(pos, newTile); renderedTiles.Add(newTile); GameObject.Find("QuestLog").GetComponent().updateQuests("find", newTile, 1); } else { if (tiles.ContainsKey(pos) && pos.y == 0) { if (!tiles[pos].GetComponent().enabled) { tiles[pos].GetComponent().changeRenderer(); renderedTiles.Add(tiles[pos]); } } } } public void hideTile(float playerX, float playerZ) { if (currentTile.GetComponent().leftTile(playerX, playerZ)) { renderedTiles.Remove(currentTile); foreach (GameObject tile in renderedTiles) { if (tile.GetComponent().enteredTile(playerX, playerZ)) { currentTile = tile; break; } } updateRenderedTiles(); } if (currentTile.GetComponent().removeConnectedTiles(playerX, playerZ)) { updateRenderedTiles(); } } private void updateRenderedTiles() { toRemove = new List(); foreach (GameObject tile in renderedTiles) { if (!tile.Equals(currentTile)) { tile.GetComponent().changeRenderer(); toRemove.Add(tile); } } foreach (GameObject tile in toRemove) { renderedTiles.Remove(tile); } } public GameObject getCurrentTile() { return currentTile; } public string saveGame() { 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"; result = result + "\"map\": {\r\n"; foreach (GameObject tile in tiles.Values) { if (tile.name != "Spawn") { 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"; } counter++; } } 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); } public int getCityAmount() { return maxCityAmount; } }