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;
        }
    }