262 lines
8.3 KiB
C#
262 lines
8.3 KiB
C#
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<Vector3, GameObject> tiles;
|
|
GameObject currentTile;
|
|
List<GameObject> renderedTiles;
|
|
List<GameObject> 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<Vector3, GameObject>();
|
|
tiles.Add(new Vector3(0, 0, 0), GameObject.Find("Spawn"));
|
|
renderedTiles = new List<GameObject>();
|
|
currentTile = GameObject.Find("Spawn");
|
|
currentTile.GetComponent<Tile>().setPosition(new Vector3(0, 0, 0));
|
|
currentTile.GetComponent<Tile>().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<Tile>().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<Tile>().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<Tile>().generateTile(pos, name);
|
|
tiles.Add(pos, newTile);
|
|
renderedTiles.Add(newTile);
|
|
}
|
|
else
|
|
{
|
|
if (tiles.ContainsKey(pos) && pos.y == 0)
|
|
{
|
|
if (!tiles[pos].GetComponent<Renderer>().enabled)
|
|
{
|
|
tiles[pos].GetComponent<Tile>().changeRenderer();
|
|
renderedTiles.Add(tiles[pos]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void hideTile(float playerX, float playerZ)
|
|
{
|
|
if (currentTile.GetComponent<Tile>().leftTile(playerX, playerZ))
|
|
{
|
|
renderedTiles.Remove(currentTile);
|
|
foreach (GameObject tile in renderedTiles)
|
|
{
|
|
if (tile.GetComponent<Tile>().enteredTile(playerX, playerZ))
|
|
{
|
|
currentTile = tile;
|
|
break;
|
|
}
|
|
}
|
|
updateRenderedTiles();
|
|
}
|
|
|
|
if (currentTile.GetComponent<Tile>().removeConnectedTiles(playerX, playerZ))
|
|
{
|
|
updateRenderedTiles();
|
|
}
|
|
}
|
|
|
|
private void updateRenderedTiles()
|
|
{
|
|
toRemove = new List<GameObject>();
|
|
foreach (GameObject tile in renderedTiles)
|
|
{
|
|
if (!tile.Equals(currentTile))
|
|
{
|
|
tile.GetComponent<Tile>().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>().text = "Cities: " + (maxCityAmount - cityAmount) + "/" + maxCityAmount;
|
|
}
|
|
|
|
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<Tile>().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<Tile>().saveTile(savePath);
|
|
if (tile.GetComponent<Tile>().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<Tile>().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);
|
|
}
|
|
}
|