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); }
public CAConnection(Tile a, Tile b, CARoom ra, CARoom rb, Int32 d) { connectionTileA = a; connectionTileB = b; roomA = ra; roomB = rb; distance = d; }
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); }
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); }