Пример #1
0
 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");
         }
     }
 }
Пример #2
0
        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);
        }