Esempio n. 1
0
    bool CreateDirectCorridor(CARoom roomA, CARoom roomB, Tile tileA, Tile tileB, bool dontCross = false)
    {
        List <Tile> line = TileTools.GetLine(tileA, tileB);

        if (dontCross)
        {
            for (int i = 2; i < line.Count - 2; i++)
            {
                if (map[line[i].tileX, line[i].tileY] == 0)
                {
                    return(false);
                }
            }
        }



        foreach (Tile c in line)
        {
            for (int x = c.tileX - 1; x <= c.tileX + 1; x++)
            {
                for (int y = c.tileY - 1; y <= c.tileY + 1; y++)
                {
                    map[x, y] = 0;
                    InstantiateFromArray(floorTiles, x, y);
                    //InstantiateFromArray(rubbleTiles, x, y);
                }
            }
        }

        CARoom.ConnectRooms(roomA, roomB);
        return(true);
    }
Esempio n. 2
0
 public CAConnection(Tile a, Tile b, CARoom ra, CARoom rb, Int32 d)
 {
     connectionTileA = a;
     connectionTileB = b;
     roomA           = ra;
     roomB           = rb;
     distance        = d;
 }
Esempio n. 3
0
    private CAConnection GetBestConnection(CARoom room1, CARoom room2, bool forceAccessibilityFromMainRoom, out int bestDistance)
    {
        List <CAConnection> connectionsBetweenRooms = new List <CAConnection>();

        bestDistance = -1;

        foreach (Tile c1 in room1.edgeTiles)
        {
            foreach (Tile c2 in room2.edgeTiles)
            {
                if (!forceAccessibilityFromMainRoom && (Math.Abs(c1.tileX - c2.tileX) > maxCorridorLengthX || Math.Abs(c1.tileY - c2.tileY) > maxCorridorLengthY))
                {
                    continue;
                }

                int distanceBetweenRooms = (int)(Mathf.Pow(c1.tileX - c2.tileX, 2) + Mathf.Pow(c1.tileY - c2.tileY, 2));

                if (bestDistance > distanceBetweenRooms || bestDistance == -1)
                {
                    bestDistance = distanceBetweenRooms;
                    connectionsBetweenRooms.Clear();
                    connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms));
                }
                else if (bestDistance == distanceBetweenRooms)
                {
                    connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms));
                }
            }
        }

        if (bestDistance != -1)
        {
            int          index      = pseudoRandom.Next(0, connectionsBetweenRooms.Count);
            CAConnection connection = connectionsBetweenRooms[index];
            return(connection);
        }

        return(null);
    }
Esempio n. 4
0
    bool CreateStraightCorridor(CARoom roomA, CARoom roomB, Tile tileA, Tile tileB, bool dontCross = false)
    {
        List <Tile> passage = new List <Tile>();
        int         check = 0;
        int         sx, ex;
        int         sy, ey;

        if (tileA.tileX > tileB.tileX)
        {
            sx = tileB.tileX;
            ex = tileA.tileX;
        }
        else
        {
            sx = tileA.tileX;
            ex = tileB.tileX;
        }

        if (tileA.tileY > tileB.tileY)
        {
            sy = tileB.tileY;
            ey = tileA.tileY;
        }
        else
        {
            sy = tileA.tileY;
            ey = tileB.tileY;
        }

        for (int i = sx + 1; i < ex; i++)
        {
            if (map[i, tileA.tileY] == 0)
            {
                check = 1;
                passage.Clear();
                break;
            }
            passage.Add(new Tile(i, tileA.tileY));
        }
        if (check != 1)
        {
            for (int i = sy + 1; i < ey; i++)
            {
                if (map[tileB.tileX, i] == 0)
                {
                    return(false);
                }
                passage.Add(new Tile(tileB.tileX, i));
            }
            passage.Add(new Tile(tileB.tileX, tileA.tileY));
        }
        else
        {
            for (int i = sx + 1; i < ex; i++)
            {
                if (map[i, tileB.tileY] == 0)
                {
                    return(false);
                }
                passage.Add(new Tile(i, tileB.tileY));
            }
            for (int i = sy + 1; i < ey; i++)
            {
                if (map[tileA.tileX, i] == 0)
                {
                    return(false);
                }
                passage.Add(new Tile(tileA.tileX, i));
            }
            passage.Add(new Tile(tileA.tileX, tileB.tileY));
        }

        foreach (Tile c in passage)
        {
            map[c.tileX, c.tileY] = 0;
            InstantiateFromArray(floorTiles, c.tileX, c.tileY);
            //InstantiateFromArray(rubbleTiles, c.tileX, c.tileY);
        }
        CARoom.ConnectRooms(roomA, roomB);
        return(true);
    }