Esempio n. 1
0
    //~TODO: Remove unnecessary line segments at start and end.
    private void GenerateCorridorLine(Graph <int> roomGraph)
    {
        corridorLineList.Clear();
        foreach (var node in roomGraph.NodeList)
        {
            foreach (var nextNode in node.GetNeighbors())
            {
                if (MathUtils.NearlyEqual(node.GetWeight(nextNode), 1f)) // Weight 1f is the original default weight in roomGraph.
                {
                    DungeonRoomData room1 = initialRoomList[node.Context];
                    DungeonRoomData room2 = initialRoomList[nextNode.Context];
                    Vector2         start = new Vector2();
                    Vector2         end   = new Vector2();

                    if (Mathf.Abs(room1.center.x - room2.center.x) < ((room1.width + room2.width) / 2 - 5 * Constants.MapInfo.GridSize)) // Construct vertical line.
                    {
                        float lineX = (room1.center.x + room2.center.x) / 2;
                        start = new Vector2(lineX, room1.center.y);
                        end   = new Vector2(lineX, room2.center.y);
                        AddCorridorLine(start, end);
                    }
                    else if (Mathf.Abs(room1.center.y - room2.center.y) < ((room1.height + room2.height) / 2 - 5 * Constants.MapInfo.GridSize)) // Construct horizontal line.
                    {
                        float lineY = (room1.center.y + room2.center.y) / 2;
                        start = new Vector2(room1.center.x, lineY);
                        end   = new Vector2(room2.center.x, lineY);
                        AddCorridorLine(start, end);
                    }
                    else // Construct L shape line.
                    {
                        float centerX = room1.center.x + MathUtils.rnd.Next(-1, 2);
                        float centerY = room2.center.y + MathUtils.rnd.Next(-1, 2);
                        // Vertical
                        start = new Vector2(centerX, room1.center.y);
                        end   = new Vector2(centerX, centerY);
                        AddCorridorLine(start, end);
                        // Horizontal
                        start = new Vector2(room2.center.x, centerY);
                        AddCorridorLine(start, end);
                    }

                    node.SetWeight(nextNode, 2f); // Weight 2f indicates that this edge is dealt with.
                    nextNode.SetWeight(node, 2f);
                }
            }
        }
    }
Esempio n. 2
0
    private void ChangeDoorTileGO(int index, DungeonRoomData.Tile doorTile, DungeonRoomData room, int id)
    {
        if (index == 12)
        {
            index = 0;
        }
        else
        {
            index = 1;
        }

        GameObject doorTileGO = Instantiate(doorTileSO.tilePrefabList[index], doorTile.go.transform.position, Quaternion.identity, doorTile.go.transform.parent);

        doorTileGO.GetComponent <DungeonDoor>().roomId = room.doorTileList[id].go.GetComponent <DungeonDoor>().roomId;
        Destroy(room.doorTileList[id].go);
        room.doorTileList[id].go             = doorTileGO;
        room.doorTileList[id].spriteRenderer = null;
        room.doorTileList[id].collider2d     = doorTileGO.GetComponent <Collider2D>();
    }
Esempio n. 3
0
    private void SpawnCorridorTile(Vector2 position, bool isWall, ref GameObject root, DungeonRoomData corridorRoom)
    {
        GameObject tileGO;
        Collider2D collider2d;

        if (isWall)
        {
            tileGO = Instantiate(wallTileHolder, position, Quaternion.identity, root.transform);
            tileGO.GetComponent <DungeonTile>().roomId = corridorRoom.id;
            DungeonRoomData.Tile tile = new DungeonRoomData.Tile(tileGO);
            collider2d      = tileGO.AddComponent <BoxCollider2D>();
            tile.collider2d = collider2d;
            corridorRoom.wallTileList.Add(tile);
        }
        else
        {
            tileGO = Instantiate(floorTileHolder, position, Quaternion.identity, root.transform);
            tileGO.GetComponent <DungeonTile>().roomId = corridorRoom.id;
            DungeonRoomData.Tile tile = new DungeonRoomData.Tile(tileGO);
            collider2d      = tileGO.AddComponent <BoxCollider2D>();
            tile.collider2d = collider2d;
            corridorRoom.floorTileList.Add(tile);
        }
    }
Esempio n. 4
0
    private void BuildCorridor()
    {
        const int corridorWidth = 5;

        RaycastHit2D[]   hit    = new RaycastHit2D[1];
        RaycastHit2D[][] hit2Ds = new RaycastHit2D[corridorWidth][];
        for (int i = 0; i < corridorWidth; i++)
        {
            hit2Ds[i] = new RaycastHit2D[1];
        }
        int[]     hitNums      = new int[corridorWidth];
        Vector2[] positions    = new Vector2[corridorWidth];
        Vector2   hitDirection = Vector2.zero; // Raycast to current position.
        bool      isWall;

        for (int k = 0; k < corridorLineList.Count; k++)
        {
            var        line         = corridorLineList[k];
            GameObject corridorRoot = new GameObject("corridorRoot");
            corridorRoot.transform.position = line.Center;
            corridorRoot.transform.SetParent(corridorHolder.transform);
            DungeonRoomData corridorRoom = new DungeonRoomData
            {
                id     = initialRoomList.Count,
                center = line.Center,
                width  = (int)(line.EndUnified.x - line.StartUnified.x),
                height = (int)(line.EndUnified.y - line.StartUnified.y),
                root   = corridorRoot
            };

            if (line.IsHorizontal())
            {
                for (float x = line.StartUnified.x - 2f * Constants.MapInfo.GridSize;
                     x < line.EndUnified.x + 2.5f * Constants.MapInfo.GridSize;
                     x += Constants.MapInfo.GridSize)
                {
                    float[] y = new float[corridorWidth];
                    y[0] = line.StartUnified.y - 2f * Constants.MapInfo.GridSize; // Wall
                    y[1] = line.StartUnified.y - Constants.MapInfo.GridSize;      // Floor
                    y[2] = line.StartUnified.y;                                   // Floor
                    y[3] = line.StartUnified.y + Constants.MapInfo.GridSize;      // Floor
                    y[4] = line.StartUnified.y + 2f * Constants.MapInfo.GridSize; // Wall

                    for (int i = 0; i < y.Length; i++)
                    {
                        Vector2 position = new Vector2(x, y[i]);
                        positions[i] = position;
                        int hitNum = Physics2D.RaycastNonAlloc(position, hitDirection, hit);
                        hitNums[i]   = hitNum;
                        hit2Ds[i][0] = hit[0];
                    }

                    if (((x > line.StartUnified.x) || (x < line.EndUnified.x)) &&
                        !CheckDoorCondition(ref hitNums, hit2Ds, ref positions, true))
                    {
                        for (int i = 0; i < y.Length; i++)
                        {
                            bool isXStart = MathUtils.NearlyEqual(x, line.StartUnified.x - 2f * Constants.MapInfo.GridSize);
                            bool isXEnd   = MathUtils.NearlyEqual(x, line.EndUnified.x + 2f * Constants.MapInfo.GridSize);

                            if (i == 0 || i == 4 || isXStart || isXEnd)
                            {
                                // If corners.
                                if ((i == 0 && isXStart) || (i == 0 && isXEnd) || (i == 4 && isXStart) || (i == 4 && isXEnd))
                                {
                                    continue;
                                }
                                isWall = true;
                            }
                            else
                            {
                                isWall = false;
                            }

                            if (hitNums[i] == 0)
                            {
                                SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom);
                            }
                            else if (!isWall)
                            {
                                DungeonWall wall = hit2Ds[i][0].collider.GetComponent <DungeonWall>();
                                if (wall)
                                {
                                    initialRoomList[wall.roomId].isClose = false;
                                    initialRoomList[wall.roomId].wallTileList.Remove(
                                        initialRoomList[wall.roomId].wallTileList.Find(obj => obj.collider2d == hit2Ds[i][0].collider));
                                    Destroy(hit2Ds[i][0].collider.gameObject);
                                    SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom);
                                }
                            }
                        }
                    }
                }
            }
            else if (line.IsVertical())
            {
                for (float y = line.StartUnified.y - 2f * Constants.MapInfo.GridSize;
                     y < line.EndUnified.y + 2.5f * Constants.MapInfo.GridSize;
                     y += Constants.MapInfo.GridSize)
                {
                    float[] x = new float[5];
                    x[0] = line.StartUnified.x - 2f * Constants.MapInfo.GridSize; // Wall
                    x[1] = line.StartUnified.x - Constants.MapInfo.GridSize;      // Floor
                    x[2] = line.StartUnified.x;                                   // Floor
                    x[3] = line.StartUnified.x + Constants.MapInfo.GridSize;      // Floor
                    x[4] = line.StartUnified.x + 2f * Constants.MapInfo.GridSize; // Wall

                    for (int i = 0; i < x.Length; i++)
                    {
                        Vector2 position = new Vector2(x[i], y);
                        positions[i] = position;
                        int hitNum = Physics2D.RaycastNonAlloc(position, hitDirection, hit);
                        hitNums[i]   = hitNum;
                        hit2Ds[i][0] = hit[0];
                    }

                    if (((y > line.StartUnified.y) || (y < line.EndUnified.y)) &&
                        !CheckDoorCondition(ref hitNums, hit2Ds, ref positions, false))
                    {
                        for (int i = 0; i < x.Length; i++)
                        {
                            bool isYStart = MathUtils.NearlyEqual(y, line.StartUnified.y - 2f * Constants.MapInfo.GridSize);
                            bool isYEnd   = MathUtils.NearlyEqual(y, line.EndUnified.y + 2f * Constants.MapInfo.GridSize);

                            if (i == 0 || i == 4 || isYStart || isYEnd)
                            {
                                // If corners.
                                if ((i == 0 && isYStart) || (i == 0 && isYEnd) || (i == 4 && isYStart) || (i == 4 && isYEnd))
                                {
                                    continue;
                                }
                                isWall = true;
                            }
                            else
                            {
                                isWall = false;
                            }

                            if (hitNums[i] == 0)
                            {
                                SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom);
                            }
                            else if (!isWall)
                            {
                                DungeonWall wall = hit2Ds[i][0].collider.GetComponent <DungeonWall>();
                                if (wall)
                                {
                                    initialRoomList[wall.roomId].isClose = false;
                                    initialRoomList[wall.roomId].wallTileList.Remove(
                                        initialRoomList[wall.roomId].wallTileList.Find(obj => obj.collider2d == hit2Ds[i][0].collider));
                                    Destroy(hit2Ds[i][0].collider.gameObject);
                                    SpawnCorridorTile(positions[i], isWall, ref corridorRoot, corridorRoom);
                                }
                            }
                        }
                    }
                }
            }
            corridorRoomList.Add(corridorRoom);
            initialRoomList.Add(corridorRoom);
        }
        allRoomList.AddRange(corridorRoomList);
    }