summaryrefslogtreecommitdiff
path: root/GameCode/TileManager.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-03-21 10:28:46 +0800
committerchai <215380520@qq.com>2024-03-21 10:28:46 +0800
commit3fb2121cc0d00cbd42b2ca10b5dfb399a4df1a04 (patch)
treec1f4683fb021522b459408ab1ad61c40be77ee47 /GameCode/TileManager.cs
parent9ee2cfa385ed77c39003f524f5f03079124fc476 (diff)
*misc
Diffstat (limited to 'GameCode/TileManager.cs')
-rw-r--r--GameCode/TileManager.cs236
1 files changed, 236 insertions, 0 deletions
diff --git a/GameCode/TileManager.cs b/GameCode/TileManager.cs
new file mode 100644
index 0000000..592d861
--- /dev/null
+++ b/GameCode/TileManager.cs
@@ -0,0 +1,236 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class TileManager : MonoBehaviour
+{
+ public static TileManager instance;
+
+ [SerializeField]
+ private GameObject tilePlacementFXObject;
+
+ [SerializeField]
+ private GameObject[] deadEndTiles;
+
+ [SerializeField]
+ private GameObject[] Ltiles;
+
+ [SerializeField]
+ private GameObject[] Ttiles;
+
+ [SerializeField]
+ private GameObject[] Rtiles;
+
+ [SerializeField]
+ private GameObject[] LTtiles;
+
+ [SerializeField]
+ private GameObject[] LRtiles;
+
+ [SerializeField]
+ private GameObject[] TRtiles;
+
+ [SerializeField]
+ private GameObject[] LTRtiles;
+
+ public TerrainTile startTile;
+
+ [SerializeField]
+ private GameObject tileSpawnLocation;
+
+ private int[,] intArray = new int[99, 99];
+
+ private TerrainTile[,] tileArray = new TerrainTile[99, 99];
+
+ private void Awake()
+ {
+ instance = this;
+ }
+
+ private void Start()
+ {
+ intArray[50, 50] = 1;
+ tileArray[50, 50] = startTile;
+ for (int i = 0; i < 99; i++)
+ {
+ intArray[0, i] = 1;
+ intArray[i, 0] = 1;
+ intArray[98, i] = 1;
+ intArray[i, 98] = 1;
+ }
+ UpdateIntArrayFromTile(startTile, 50, 50);
+ }
+
+ private void UpdateIntArrayFromTile(TerrainTile tile, int posX, int posY)
+ {
+ if (tile.south != null && tile.south != tile.last && intArray[posX, posY - 1] == 0)
+ {
+ intArray[posX, posY - 1] = 2;
+ TileSpawnLocation component = Object.Instantiate(tileSpawnLocation, new Vector3(posX - 50, 0f, posY - 1 - 50) * 7f, Quaternion.identity).GetComponent<TileSpawnLocation>();
+ component.eulerAngle = 180;
+ component.posX = posX;
+ component.posY = posY - 1;
+ }
+ if (tile.west != null && tile.west != tile.last && intArray[posX - 1, posY] == 0)
+ {
+ intArray[posX - 1, posY] = 2;
+ TileSpawnLocation component2 = Object.Instantiate(tileSpawnLocation, new Vector3(posX - 1 - 50, 0f, posY - 50) * 7f, Quaternion.identity).GetComponent<TileSpawnLocation>();
+ component2.eulerAngle = 270;
+ component2.posX = posX - 1;
+ component2.posY = posY;
+ }
+ if (tile.north != null && tile.north != tile.last && intArray[posX, posY + 1] == 0)
+ {
+ intArray[posX, posY + 1] = 2;
+ TileSpawnLocation component3 = Object.Instantiate(tileSpawnLocation, new Vector3(posX - 50, 0f, posY + 1 - 50) * 7f, Quaternion.identity).GetComponent<TileSpawnLocation>();
+ component3.eulerAngle = 0;
+ component3.posX = posX;
+ component3.posY = posY + 1;
+ }
+ if (tile.east != null && tile.east != tile.last && intArray[posX + 1, posY] == 0)
+ {
+ intArray[posX + 1, posY] = 2;
+ TileSpawnLocation component4 = Object.Instantiate(tileSpawnLocation, new Vector3(posX + 1 - 50, 0f, posY - 50) * 7f, Quaternion.identity).GetComponent<TileSpawnLocation>();
+ component4.eulerAngle = 90;
+ component4.posX = posX + 1;
+ component4.posY = posY;
+ }
+ }
+
+ public void SpawnNewTile(int posX, int posY, int eulerAngle)
+ {
+ bool flag = false;
+ bool flag2 = false;
+ bool flag3 = false;
+ bool flag4 = false;
+ if (intArray[posX, posY - 1] == 0)
+ {
+ flag = true;
+ }
+ if (intArray[posX - 1, posY] == 0)
+ {
+ flag2 = true;
+ }
+ if (intArray[posX, posY + 1] == 0)
+ {
+ flag3 = true;
+ }
+ if (intArray[posX + 1, posY] == 0)
+ {
+ flag4 = true;
+ }
+ bool flag5 = false;
+ bool flag6 = false;
+ bool flag7 = false;
+ switch (eulerAngle)
+ {
+ case 0:
+ flag5 = flag2;
+ flag6 = flag3;
+ flag7 = flag4;
+ break;
+ case 90:
+ flag5 = flag3;
+ flag6 = flag4;
+ flag7 = flag;
+ break;
+ case 180:
+ flag5 = flag4;
+ flag6 = flag;
+ flag7 = flag2;
+ break;
+ case 270:
+ flag5 = flag;
+ flag6 = flag2;
+ flag7 = flag3;
+ break;
+ default:
+ Debug.LogError("Trying to spawn a tile at an invalid eulerAngle" + eulerAngle);
+ break;
+ }
+ List<GameObject> list = new List<GameObject>();
+ int num = SpawnManager.instance.lastLevel - SpawnManager.instance.level;
+ int count = SpawnManager.instance.tileSpawnUis.Count;
+ bool flag8 = false;
+ bool flag9 = false;
+ if (count + 3 >= num || SpawnManager.instance.level < 3)
+ {
+ flag8 = true;
+ }
+ if (count == num)
+ {
+ flag9 = true;
+ }
+ if (!flag9)
+ {
+ if (flag5)
+ {
+ list.AddRange(Ltiles);
+ }
+ if (flag6)
+ {
+ list.AddRange(Ttiles);
+ }
+ if (flag7)
+ {
+ list.AddRange(Rtiles);
+ }
+ if (flag5 && flag6 && !flag8)
+ {
+ list.AddRange(LTtiles);
+ }
+ if (flag5 && flag7 && !flag8)
+ {
+ list.AddRange(LRtiles);
+ }
+ if (flag6 && flag7 && !flag8)
+ {
+ list.AddRange(TRtiles);
+ }
+ if (flag5 && flag6 && flag7 && !flag8)
+ {
+ list.AddRange(LTRtiles);
+ }
+ }
+ if (list.Count == 0)
+ {
+ list.AddRange(deadEndTiles);
+ }
+ GameObject original = list[Random.Range(0, list.Count)];
+ Vector3 vector = new Vector3(posX - 50, 0f, posY - 50) * 7f;
+ GameObject obj = Object.Instantiate(original, vector, Quaternion.identity);
+ obj.transform.eulerAngles = new Vector3(0f, eulerAngle, 0f);
+ intArray[posX, posY] = 1;
+ TerrainTile component = obj.GetComponent<TerrainTile>();
+ tileArray[posX, posY] = component;
+ component.SetCardinalDirections();
+ UpdateIntArrayFromTile(component, posX, posY);
+ TerrainTile terrainTile = null;
+ switch (eulerAngle)
+ {
+ case 0:
+ terrainTile = tileArray[posX, posY - 1];
+ break;
+ case 90:
+ terrainTile = tileArray[posX - 1, posY];
+ break;
+ case 180:
+ terrainTile = tileArray[posX, posY + 1];
+ break;
+ case 270:
+ terrainTile = tileArray[posX + 1, posY];
+ break;
+ default:
+ Debug.LogError("Trying to spawn a tile at an invalid eulerAngle" + eulerAngle);
+ break;
+ }
+ if (terrainTile == null)
+ {
+ Debug.LogError("Unable to find previous tile");
+ }
+ component.ConnectToTile(terrainTile);
+ if (tilePlacementFXObject != null)
+ {
+ Object.Instantiate(tilePlacementFXObject, vector + Vector3.up, Quaternion.identity).transform.localScale = Vector3.one * 7f;
+ }
+ }
+}