private void GenerateOptionnalPaths() { foreach (Vector2i mainPos in mainPath) { MapChunk mainChunk = Grid[mainPos.x, mainPos.y]; List <Side> openUnusedSides = mainChunk.GetAllOpenUnusedSides(); if (openUnusedSides.Count == 0) { continue; } foreach (Side unusedSide in openUnusedSides) { List <Orientation> adjOpen = null; if (unusedSide.adjacentChunk != null) { adjOpen = unusedSide.adjacentChunk.GetAllOpenSidesOrientations(); } else { adjOpen = new List <Orientation>(); } adjOpen.Add(unusedSide.Orient.GetOposite()); Grid.SetChunk(unusedSide.GetAdjacentPos(), MapChunk.CreateMapChunk(GetPrefabMatchingExactly(adjOpen)), "Side"); } } }
private void GenerateMainPath(int mainPathLength) { mainPath = new List <Vector2i>(); MapChunk curChunk = MapChunk.CreateMapChunk(startingRoom); Grid.SetChunk(new Vector2i(0, 0), curChunk, "Start"); mainPath.Add(curChunk.FakePos); Side nextSide = null; bool stuck = false; for (int i = 0; i < mainPathLength; i++) { List <Side> possibleSides = curChunk.GetAllOpenUnusedSides(); // Get All the possible sides (i.e: open and unused) nextSide = possibleSides[Random.Range(0, possibleSides.Count)]; // Pick a new possible side possibleSides.Remove(nextSide); Orientation requiredOri = nextSide.Orient.GetOposite(); MapChunkPrefab prefab = null; while (Grid.GetAdjacentSidesLeadingToTile(nextSide.GetAdjacentPos(), requiredOri).Length > 2) { if (possibleSides.Count == 0) { stuck = true; break; } nextSide = possibleSides[Random.Range(0, possibleSides.Count)]; // Pick a new possible side possibleSides.Remove(nextSide); requiredOri = nextSide.Orient.GetOposite(); } List <MapChunkPrefab> possiblePrefabs = GetAllRoomPrefabs(requiredOri, nextSide.Type, Grid.GetAdjacentSidesOccupied(nextSide.GetAdjacentPos(), requiredOri)); prefab = possiblePrefabs[Random.Range(0, possiblePrefabs.Count)]; // Pick a new possible side possiblePrefabs.Remove(prefab); while (prefab.OpenCount < 2) { if (possiblePrefabs.Count == 0) { stuck = true; break; } prefab = possiblePrefabs[Random.Range(0, possiblePrefabs.Count)]; // Pick a new possible side possiblePrefabs.Remove(prefab); } if (stuck) { Debug.Log("Path Stuck!"); break; } curChunk = MapChunk.CreateMapChunk(prefab); Grid.SetChunk(nextSide.GetAdjacentPos(), curChunk, "Main"); mainPath.Add(curChunk.FakePos); } nextSide = curChunk.GetRandomOpenUnusedSide(); curChunk = MapChunk.CreateMapChunk(endingRoom); Grid.SetChunk(nextSide.GetAdjacentPos(), curChunk, "End"); mainPath.Add(curChunk.FakePos); }