protected virtual IEnumerator GenerateLevel(int expansiveness) { //Generation Setup GameManager.Self.runTimers = false; GameManager.Self.player.letControlPawn = false; GameManager.Self.levelTransitioner.TransitionScreen(false); if (_showGenerationDebug) { Debug.Log("Starting " + expansiveness + " expense generation..."); _debugTimeToGen = 0.0f; } _isGenerating = true; //Generation Proper Vector3 spawnCoord = new Vector3(Mathf.Lerp(spawnBoundaries.x, spawnBoundaries.z, 0.5f), Mathf.Lerp(spawnBoundaries.y, spawnBoundaries.w, 0.5f), 0.0f); _seedRoom = Instantiate(TileSet[Random.Range(0, TileSet.Length)], spawnCoord, Quaternion.Euler(Vector3.zero)); ProcRoom pr = _seedRoom.GetComponent <ProcRoom>(); List <POISpawn> POISpawns = new List <POISpawn>(); yield return(pr.GenerateRoom(TileSet, spawnBoundaries, expansiveness, POISpawns)); foreach (Pizza p in GameManager.Self.ActiveDeliveries) { if (p.DestinationPlanet == gameObject) { POISpawn selectedPOI = POISpawns[Random.Range(0, POISpawns.Count)]; activeDeliveryPOIs.Add(selectedPOI.GenerateAsDelivery((int)p.NumericID)); POISpawns.Remove(selectedPOI); } } foreach (POISpawn poi in POISpawns) { poi.GenerateAsDangerousObject(); } //Post-Generation Actions; if (_showGenerationDebug) { Debug.Log("... generation done.\nThis took " + _debugTimeToGen + " seconds."); } GameManager.Self.DoWorldLooping = false; StartCoroutine(WaitToTeleportPlayerTo(spawnCoord)); StartCoroutine(WaitForPlayerToFinishLevel()); }
public virtual IEnumerator GenerateNewRoom(GameObject[] TileSet, Vector4 spawnBoundaries, List <POISpawn> poiStorage) { if (!_hasGenerated) { //Debug.Log("Hi I'm at " + transform.position + " and I'm doing stuff with a potency of " + potency); //Debug.DrawLine(transform.position, RoomSpawnLocation.position, Color.magenta, 1.0f); //UnityEditor.EditorApplication.isPaused = true; Vector2 worldPos = transform.position; if (worldPos.x > spawnBoundaries.x && worldPos.y > spawnBoundaries.y && worldPos.x < spawnBoundaries.z && worldPos.y < spawnBoundaries.w) { RoomSpawnNodes closestRoomNode = null; float closestRoomDistance = 1000; ProcRoom pr = null; Collider2D[] foundCols = Physics2D.OverlapCircleAll(RoomSpawnLocation.position, roomCheckRadius); //Debug.Log("OverlapCircleAll: " + foundCols.Length); //Debug.DrawLine((Vector2)RoomSpawnLocation.position + Vector2.left * roomCheckRadius, (Vector2)RoomSpawnLocation.position + Vector2.right * roomCheckRadius, Color.green); //Debug.DrawLine((Vector2)RoomSpawnLocation.position + Vector2.up * roomCheckRadius, (Vector2)RoomSpawnLocation.position + Vector2.down * roomCheckRadius, Color.green); //UnityEditor.EditorApplication.isPaused = true; //yield return null; if (foundCols.Length > 0) { foreach (Collider2D col in foundCols) { //Debug.DrawLine((Vector2)RoomSpawnLocation.position + Vector2.one, (Vector2)RoomSpawnLocation.position + Vector2.one * -1f, Color.red, 1.0f); //Debug.DrawLine((Vector2)RoomSpawnLocation.position + new Vector2(1, -1), (Vector2)RoomSpawnLocation.position + new Vector2(-1, 1), Color.red, 1.0f); ProcRoom existingPR = col.GetComponentInParent <ProcRoom>(); if (existingPR) { pr = existingPR; } } } else { _thisRoom = Instantiate(TileSet[Random.Range(0, TileSet.Length)], RoomSpawnLocation.position, RoomSpawnLocation.rotation); pr = _thisRoom.GetComponent <ProcRoom>(); } foreach (RoomSpawnNodes rsn in pr.MyRoomSpawnNodes) { float thisRoomDistance = Vector2.Distance(rsn.transform.position, transform.position); if (thisRoomDistance < closestRoomDistance) { closestRoomNode = rsn; closestRoomDistance = thisRoomDistance; } } NodeUsedForRoom(); if (closestRoomNode) { closestRoomNode.NodeUsedForRoom(); } if (_thisRoom) { yield return(pr.GenerateRoom(TileSet, spawnBoundaries, potency - 1, poiStorage)); } } _hasGenerated = true; } }