コード例 #1
0
        public MapChunkPrefab GetRandomRoomPrefab(Orientation requiredOri, SideType requiredType, Orientation[] blockedSides)
        {
            MapChunkPrefab[] validChunkPrefabs = new MapChunkPrefab[roomPrefabs.Length];
            int count = 0;

            foreach (MapChunkPrefab chunkPrefab in roomPrefabs)
            {
                if (chunkPrefab.GetSideType(requiredOri) == requiredType)
                {
                    bool leadsToBlocked = false;
                    foreach (Orientation blocked in blockedSides)
                    {
                        if (chunkPrefab.GetSideType(blocked) != SideType.CLOSED)
                        {
                            leadsToBlocked = true;
                            break;
                        }
                    }
                    if (!leadsToBlocked)
                    {
                        validChunkPrefabs[count++] = chunkPrefab;
                    }
                }
            }
            return(validChunkPrefabs[Random.Range(0, count)]);
        }
コード例 #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);
        }
コード例 #3
0
ファイル: MapChunk.cs プロジェクト: MaevaL/ChromaWarp
        public static MapChunk CreateMapChunk(MapChunkPrefab prefab)
        {
            GameObject go       = Instantiate <GameObject>(prefab.prefab, MapManager.I.mapRoot);
            MapChunk   mapChunk = go.AddComponent <MapChunk>();

            mapChunk.Top    = new Side(mapChunk, Orientation.TOP, prefab.top);
            mapChunk.Left   = new Side(mapChunk, Orientation.LEFT, prefab.left);
            mapChunk.Bottom = new Side(mapChunk, Orientation.BOTTOM, prefab.bottom);
            mapChunk.Right  = new Side(mapChunk, Orientation.RIGHT, prefab.right);
            return(mapChunk);
        }
コード例 #4
0
        public MapChunkPrefab GetRandomRoomPrefab(Orientation requiredOri, SideType requiredType)
        {
            MapChunkPrefab[] validChunkPrefabs = new MapChunkPrefab[roomPrefabs.Length];
            int count = 0;

            foreach (MapChunkPrefab chunkPrefab in roomPrefabs)
            {
                if (chunkPrefab.GetSideType(requiredOri) == requiredType)
                {
                    validChunkPrefabs[count++] = chunkPrefab;
                }
            }
            return(validChunkPrefabs[Random.Range(0, count)]);
        }
コード例 #5
0
        public static MapChunkPrefab Get90ClockwiseRotatedVersion(MapChunkPrefab prefab)
        {
            GameObject go       = GameObject.Instantiate(prefab.prefab);
            Vector3    eulerRot = go.transform.rotation.eulerAngles + new Vector3(0, 90, 0);

            go.transform.rotation = Quaternion.Euler(eulerRot);
            go.transform.SetParent(MapManager.I.rotatedRoot);
            MapChunkPrefab p = new MapChunkPrefab();

            p.prefab = go;
            foreach (Orientation ori in prefab.sides.Keys)
            {
                p.sides[ori.GetNextClockwise()] = prefab.sides[ori];
            }
            p.initTop    = p.sides[Orientation.TOP];
            p.initRight  = p.sides[Orientation.RIGHT];
            p.initBottom = p.sides[Orientation.BOTTOM];
            p.initLeft   = p.sides[Orientation.LEFT];
            p.type       = prefab.type;
            return(p);
        }
コード例 #6
0
        public List <MapChunkPrefab> GenerateRotatedVersions()
        {
            List <MapChunkPrefab> rotatedPrefabs = new List <MapChunkPrefab>();

            switch (type)
            {
            case MapChunkPrefabType.DEAD_END:
                if (top != SideType.CLOSED)
                {
                    MapChunkPrefab pr = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pr);
                    MapChunkPrefab pb = Get90ClockwiseRotatedVersion(pr);
                    rotatedPrefabs.Add(pb);
                    MapChunkPrefab pl = Get90ClockwiseRotatedVersion(pb);
                    rotatedPrefabs.Add(pl);
                }
                else if (right != SideType.CLOSED)
                {
                    MapChunkPrefab pb = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pb);
                    MapChunkPrefab pl = Get90ClockwiseRotatedVersion(pb);
                    rotatedPrefabs.Add(pl);
                    MapChunkPrefab pt = Get90ClockwiseRotatedVersion(pl);
                    rotatedPrefabs.Add(pt);
                }
                else if (bottom != SideType.CLOSED)
                {
                    MapChunkPrefab pl = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pl);
                    MapChunkPrefab pt = Get90ClockwiseRotatedVersion(pl);
                    rotatedPrefabs.Add(pt);
                    MapChunkPrefab pr = Get90ClockwiseRotatedVersion(pt);
                    rotatedPrefabs.Add(pr);
                }
                else if (left != SideType.CLOSED)
                {
                    MapChunkPrefab pt = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pt);
                    MapChunkPrefab pr = Get90ClockwiseRotatedVersion(pt);
                    rotatedPrefabs.Add(pr);
                    MapChunkPrefab pb = Get90ClockwiseRotatedVersion(pr);
                    rotatedPrefabs.Add(pb);
                }
                break;

            case MapChunkPrefabType.CORNER:
                if (top != SideType.CLOSED && right != SideType.CLOSED)
                {
                    MapChunkPrefab prb = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(prb);
                    MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(prb);
                    rotatedPrefabs.Add(pbl);
                    MapChunkPrefab plt = Get90ClockwiseRotatedVersion(pbl);
                    rotatedPrefabs.Add(plt);
                }
                else if (right != SideType.CLOSED && bottom != SideType.CLOSED)
                {
                    MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pbl);
                    MapChunkPrefab plt = Get90ClockwiseRotatedVersion(pbl);
                    rotatedPrefabs.Add(plt);
                    MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(plt);
                    rotatedPrefabs.Add(ptr);
                }
                else if (bottom != SideType.CLOSED && left != SideType.CLOSED)
                {
                    MapChunkPrefab plt = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(plt);
                    MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(plt);
                    rotatedPrefabs.Add(ptr);
                    MapChunkPrefab prb = Get90ClockwiseRotatedVersion(ptr);
                    rotatedPrefabs.Add(prb);
                }
                else if (left != SideType.CLOSED && top != SideType.CLOSED)
                {
                    MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(ptr);
                    MapChunkPrefab prb = Get90ClockwiseRotatedVersion(ptr);
                    rotatedPrefabs.Add(prb);
                    MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(prb);
                    rotatedPrefabs.Add(pbl);
                }
                break;

            case MapChunkPrefabType.LINE:
                if (top != SideType.CLOSED && bottom != SideType.CLOSED)
                {
                    MapChunkPrefab prl = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(prl);
                }
                else if (right != SideType.CLOSED && left != SideType.CLOSED)
                {
                    MapChunkPrefab ptb = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(ptb);
                }
                break;

            case MapChunkPrefabType.TJUNCTION:
                if (top == SideType.CLOSED)
                {
                    MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pblt);
                    MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt);
                    rotatedPrefabs.Add(pltr);
                    MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr);
                    rotatedPrefabs.Add(ptrb);
                }
                else if (right == SideType.CLOSED)
                {
                    MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pltr);
                    MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr);
                    rotatedPrefabs.Add(ptrb);
                    MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(ptrb);
                    rotatedPrefabs.Add(pblt);
                }
                else if (bottom == SideType.CLOSED)
                {
                    MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(ptrb);
                    MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(ptrb);
                    rotatedPrefabs.Add(pblt);
                    MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt);
                    rotatedPrefabs.Add(pltr);
                }
                else if (left == SideType.CLOSED)
                {
                    MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(this);
                    rotatedPrefabs.Add(pblt);
                    MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt);
                    rotatedPrefabs.Add(pltr);
                    MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr);
                    rotatedPrefabs.Add(ptrb);
                }
                break;

            case MapChunkPrefabType.CROSSROADS:
                break;
            }
            return(rotatedPrefabs);
        }