using System; using System.Collections; using System.Collections.Generic; 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() { 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; Start(); 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--; } 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); } 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 void updateCityCount(GameObject gameObject) { gameObject.GetComponent().text = "Cities: " + (maxCityAmount - cityAmount) + "/" + maxCityAmount; } }