2022-06-05 14:28:01 +02:00

251 lines
7.1 KiB
C#

using Assets.Scripts;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tile : MonoBehaviour
{
Vector3 position;
float borderNorth;
float borderEast;
float borderSouth;
float borderWest;
System.Random rand = new System.Random();
string tiletype;
GameObject contentGenerator;
List<GameObject> aliveEnemies = new List<GameObject>();
List<GameObject> deadEnemies = new List<GameObject>();
public void generateTile(Vector3 pos, string type)
{
if (tiletype == null)
{
tiletype = type;
}
contentGenerator = GameObject.Find("ContentGenerator");
setPosition(pos);
setBorders();
generateContent();
}
public void setBorders()
{
borderNorth = position.z * 100 + 50;
borderEast = position.x * 100 + 50;
borderSouth = position.z * 100 - 50;
borderWest = position.x * 100 - 50;
}
public void generateContent()
{
if (!tiletype.ToLower().Equals("City"))
{
foreach (Vector3 position in getSpawnLocations())
{
spawnObject(position);
}
}
}
public List<Vector3> getSpawnLocations()
{
List<Vector3> list = new List<Vector3>();
int xChange = 0;
int zChange = 0;
for (float i = borderNorth - 10; i >= borderSouth + 10; i = i - 10)
{
for (float j = borderWest + 10; j <= borderEast - 10; j = j + 10)
{
xChange = rand.Next(-4, +4);
zChange = rand.Next(-4, +4);
list.Add(new Vector3(j + xChange, 5, i + zChange));
}
}
return list;
}
public void spawnObject(Vector3 position)
{
int chance = rand.Next(1, 101);
if (chance >= 50)
{
GameObject content = contentGenerator.GetComponent<ContentGenerator>().generateContent(tiletype);
if (content != null)
{
GameObject obj = Instantiate(content, position, Quaternion.identity);
obj.transform.parent = gameObject.transform;
if (obj.tag.Contains("Enemy"))
{
aliveEnemies.Add(obj);
}
}
}
}
public void setPosition(Vector3 position)
{
this.position = position;
}
public Vector3 getPosition()
{
return position;
}
public void setType(string tiletype)
{
this.tiletype = tiletype;
}
public bool leftTile(float playerX, float playerZ)
{
bool result = false;
if (playerX >= borderEast + 10 || playerX <= borderWest - 10 || playerZ >= borderNorth + 10 || playerZ <= borderSouth - 10)
{
changeRenderer();
result = true;
}
return result;
}
public void changeRenderer()
{
foreach (Rigidbody rigid in gameObject.GetComponentsInChildren<Rigidbody>())
{
if (!deadEnemies.Contains(rigid.gameObject))
{
rigid.useGravity = !rigid.useGravity;
}
}
foreach (Renderer rend in gameObject.GetComponentsInChildren<Renderer>())
{
if (!deadEnemies.Contains(rend.gameObject))
{
rend.enabled = !rend.enabled;
}
}
foreach (Collider col in gameObject.GetComponentsInChildren<Collider>())
{
if (!deadEnemies.Contains(col.gameObject))
{
col.enabled = !col.enabled;
}
}
}
public void resetSpawn()
{
foreach (Rigidbody rigid in gameObject.GetComponentsInChildren<Rigidbody>())
{
rigid.useGravity = true;
}
foreach (Renderer rend in gameObject.GetComponentsInChildren<Renderer>())
{
rend.enabled = true;
}
foreach (Collider col in gameObject.GetComponentsInChildren<Collider>())
{
col.enabled = true;
}
}
public bool enteredTile(float playerX, float playerZ)
{
bool result = false;
if (playerX <= borderEast && playerX >= borderWest && playerZ <= borderNorth && playerZ >= borderSouth)
{
result = true;
}
return result;
}
public Vector3 needConnectedTile(float playerX, float playerZ)
{
Vector3 result = new Vector3(position.x, 1, position.z);
if (playerX >= borderEast - 10)
{
result.x = result.x + 1;
result.y = 0;
}
else if(playerX <= borderWest + 10)
{
result.x = result.x - 1;
result.y = 0;
}
if (playerZ >= borderNorth - 10)
{
result.z = result.z + 1;
result.y = 0;
}
else if(playerZ <= borderSouth + 10)
{
result.z = result.z - 1;
result.y = 0;
}
return result;
}
public bool removeConnectedTiles(float playerX, float playerZ)
{
bool result = false;
if (playerX <= borderEast - 10 && playerX >= borderWest + 10 && playerZ <= borderNorth - 10 && playerZ >= borderSouth + 10)
{
result = true;
}
return result;
}
public void enemyKilled(GameObject enemy)
{
deadEnemies.Add(enemy);
enemy.GetComponent<Rigidbody>().useGravity = false;
enemy.GetComponent<Renderer>().enabled = false;
enemy.GetComponent<Collider>().enabled = false;
aliveEnemies.Remove(enemy);
}
public string getTileType()
{
return tiletype;
}
public string saveTile()
{
string result = "";
GameObject obj;
result = result + FileHandler.generateJSON("tiletype", "\"" + tiletype + "\"") + ",\r\n";
result = result + FileHandler.generateJSON("positionX", position.x) + ",\r\n";
result = result + FileHandler.generateJSON("positionY", position.y) + ",\r\n";
result = result + FileHandler.generateJSON("positionZ", position.z) + ",\r\n";
result = result + "\"Objects\": {\r\n";
for (int i = 0; i < gameObject.transform.childCount; i++)
{
obj = gameObject.transform.GetChild(i).gameObject;
result = result + "\"Object" + i + "\": {\r\n";
result = result + FileHandler.generateJSON("positionX", obj.transform.position.x) + ",\r\n";
result = result + FileHandler.generateJSON("positionY", obj.transform.position.y) + ",\r\n";
result = result + FileHandler.generateJSON("positionZ", obj.transform.position.z) + ",\r\n";
if (obj.tag.Contains("Enemy"))
{
result = result + obj.GetComponent<Enemy>().saveEnemy() + "\r\n}";
}
else
{
result = result + FileHandler.generateJSON("objectname", "\"" + obj.name + "\"") + "\r\n}";
}
if (i < gameObject.transform.childCount - 1)
{
result = result + ",\r\n";
}
}
result = result + "\r\n}";
return result;
}
}