How to place rooms proceduraly (rule based) on in a game word
Posted
by
gardian06
on Game Development
See other posts from Game Development
or by gardian06
Published on 2012-05-29T21:08:54Z
Indexed on
2012/05/30
17:01 UTC
Read the original article
Hit count: 223
algorithm
|procedural-generation
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.
© Game Development or respective owner