public static void PackRoom(Room room, int floor, Dungeon building) { room.xSize = (int)Mathf.Sqrt(room.size); room.ySize = (int)(room.size / (float)room.xSize); int swapRoll = Random.Range(0, 2); if (swapRoll == 0) { var temp = room.xSize; room.xSize = room.ySize; room.ySize = temp; } for (int x = 0; x < building.maxDimensions - room.xSize; x++) { for (int y = 0; y < building.maxDimensions - room.ySize; y++) { if (LevelGenValidationUtils.RoomFits(room, floor, x, y, building.grid)) { room.x = x; room.y = y; room.floor = floor; LevelGenGridUtils.FillRoom(room, floor, x, y, building.grid); return; } } } building.maxDimensions = (int)(building.maxDimensions * 1.2); PackRoom(room, floor, building); }
private static bool AddStraightConnectingLine(Room room, Room room2, Dungeon building) { var right = LevelGenValidationUtils.IsStraightConnectingLineRight(room, room2, building.grid); var bottom = LevelGenValidationUtils.IsStraightConnectingLineBottom(room, room2, building.grid); var top = LevelGenValidationUtils.IsStraightConnectingLineTop(room, room2, building.grid); var left = LevelGenValidationUtils.IsStraightConnectingLineLeft(room, room2, building.grid); bool success = false; if (right) { success = DrawHorizontalCorridor(room.floor, room.x + room.xSize, room2.x, room, room2, building); } else if (left) { success = DrawHorizontalCorridor(room.floor, room2.x + room2.xSize, room.x, room, room2, building); } else if (bottom) { success = DrawVerticalCorridor(room.floor, room.y + room.ySize, room2.y, room, room2, building); } else if (top) { success = DrawVerticalCorridor(room.floor, room2.y + room2.ySize, room.y, room, room2, building); } return(success); }
private static void ConnectRoomToOtherRooms(int floor, Room room, Dungeon building, List <Room> floorRooms) { var room2 = LevelGenRoomUtils.FindClosestRoom(room, floorRooms); if (LevelGenValidationUtils.IsStraightConnectingLine(room, room2, building.grid)) { AddStraightConnectingLine(room, room2, building); } }
private static void ConnectRoom(int floor, Room room, Dungeon building) { var corridors = LevelGenRoomUtils.FetchCorridorsForFloor(floor, building.rooms); var corridor = LevelGenRoomUtils.FindClosestCorridor(room, corridors); if (LevelGenValidationUtils.IsStraightConnectingLine(room, corridor, building.grid)) { AddStraightConnectingLine(room, corridor, building); } }
private static bool DrawVerticalCorridor(int floor, int start, int finish, Room room1, Room room2, Dungeon building) { bool reversed = false; if (start > finish) { var temp = start; start = finish; finish = temp; reversed = true; } int xMin = Mathf.Max(room1.x, room2.x); int xMax = Mathf.Min(room1.x + room1.xSize, room2.x + room2.xSize); int x = Random.Range(xMin, xMax); if (!LevelGenValidationUtils.ValidVerticalCorridor(floor, start, finish, x, building.grid)) { return(false); } int count = 0; while (!LevelGenValidationUtils.CanTraceVerticalLine(x, room1, room2, building.grid) && count < 10000) { x = Random.Range(xMin, xMax); count++; } if (count >= 10000) { return(false); } var corridor = new Corridor { x = x, xSize = 1, y = start, ySize = finish - start, floor = floor }; corridor.connectedRooms.Add(room1); corridor.connectedRooms.Add(room2); int entranceDirection; int entranceX = room1.ClampEntranceX(x); int entranceY = room1.ClampEntranceY(finish); if (!reversed) { entranceDirection = 2; } else { entranceDirection = 0; } room1.SetEntrance(entranceX, entranceY, entranceDirection); if (corridor.xSize > 0) { building.rooms.Add(corridor); } building.rooms.Add(corridor); for (int y = start; y < finish; y++) { building.grid[floor, x, y] = "x"; } return(true); }
private static bool DrawHorizontalCorridor(int floor, int start, int finish, Room room1, Room room2, Dungeon building) { bool reversed = false; if (start > finish) { var temp = start; start = finish; finish = temp; reversed = true; } int yMin = Mathf.Max(room1.y, room2.y); int yMax = Mathf.Min(room1.y + room1.ySize, room2.y + room2.ySize); int y = Random.Range(yMin, yMax); if (!LevelGenValidationUtils.ValidHorizontalCorridor(floor, start, finish, y, building)) { return(false); } int count = 0; while (!LevelGenValidationUtils.CanTraceHorizontalLine(y, room1, room2, building.grid) && count < 10000) { y = Random.Range(yMin, yMax); count++; } if (count >= 10000) { return(false); } var corridor = new Corridor { x = start, xSize = finish - start, y = y, ySize = 1, floor = floor }; corridor.connectedRooms.Add(room1); corridor.connectedRooms.Add(room2); int entranceDirection; int entranceX = room1.ClampEntranceX(finish); int entranceY = room1.ClampEntranceY(y); if (!reversed) { entranceDirection = 1; } else { entranceDirection = 3; } room1.SetEntrance(entranceX, entranceY, entranceDirection); if (corridor.xSize > 0) { building.rooms.Add(corridor); } for (int x = start; x < finish; x++) { building.grid[floor, x, y] = "x"; } return(true); }