I am trying to design the algorithm for my level generation which is a rule driven system. I have created all the rules for the system. I have taken care to insure that all rooms make sense in a grid type setup. for example: these rooms could make this configuration
The logic flow code that I have so far
Door{
Vector3 position;
POD orient; // 5 possible values (up is not an option)
bool Open;
}
Room{
String roomRule;
Vector3 roomPos;
Vector3 dimensions;
POD roomOrient; // 4 possible values
List doors<Door>;
}
LevelManager{
float scale = 18f;
List usedRooms<Room>;
List openDoors<Door>
bool Grid[][][];
Room CreateRoom(String rule, Vector3 position, POD Orient){
place recieved values
based on rule fill in other data
}
Vector3 getDimenstions(String rule){
return dimensions of the room
}
RotateRoom(POD rotateAmount){
rotate all items in the room
}
MoveRoom(Room toBeMoved, POD orientataion, float distance){
move the position of the room based on inputs
}
GenerateMap(Vector3 size, Vector3 start, Vector3 end){
Grid = array[size.y][size.x][size.z];
Room floatingRoom;
floatingRoom = Room.CreateRoom(S01, start, rand(4));
usedRooms.Add(floatingRoom);
for each Door in floatingRoom.doors{
openDoors.Add(door);
}
// fill used grid spaces
floatingRoom = Room.CreateRoom(S02, end, rand(4);
usedRooms.Add(floatingRoom);
for each Door in floatingRoom.doors{
openDoors.Add(door);
}
Vector3 nRoomLocation;
Door workingDoor;
string workingRoom;
// fill used grid spaces
// pick random door on the openDoors list
workingDoor = /*randomDoor*/
// get a random rule
nRoomLocation = workingDoor.position;
// then I'm lost
}
}
I know that I have to make sure for convergence (namely the end is reachable), and to do this until there are no more doors on the openDoors list. right now I am simply trying to get this to work in 2D (there are rules that introduce 3D), but I am working on a presumption that a rigorous algorithm can be trivially extended to 3D.
EDIT: my thought pattern so far is to
take an existing open door
and then pick a random room (restrictions can be put in later)
place that room's center at the doors location
move the room in the direction of the doors orientation half the rooms dimension w/respect to that axis
then test against the 3D array to see if all the grid points are open, or have been used, or if there is even space to put the room (caseEdge)
if caseEdge (which can also occur in between rooms) then put the door on a toBeClosed list, and remove it from the open list (placing a wall or something there).
then to do some kind of test that both the start, and the goal are connected, and reachable from each other (each room has nodes for AI, but I don't want to "have" to pull those out to accomplish this).
but this logic has the problem for say the U, or L shaped rooms in my example, and then I also have a problem conceptually if the room needs to be rotated.