From Graph to Map: Procedural Room Design in Action


Rooms

This week, we developed basic rooms that can appear randomly on the map from the available list of options. The rooms implemented include a trap room and a healing room. Below are some images of the rooms created:

image.png

image.png

image.png

While these rooms may not be the most creative, they effectively demonstrate the structure of the generated level.

Walls and Doors

When the graph indicates that an edge contains a door, the door must appear on the map, along with a key to unlock it. In the level structure shown below, the key is located near the entrance but behind a door. Therefore, the last node before reconnecting the cycle must contain two keys: one to unlock the door leading out of the cycle and another to unlock the door upon returning.

image.png

To implement this logic, walls were added to all rooms, which are removed dynamically based on the graph’s instructions:

private void removeWalls() {
    foreach (Edge edge in m_graph.edges) {
        if (edge.EdgeType != EdgeType.OpenConnection) {
            continue;
        }
        Node nodeFrom = edge.From;
        Node nodeTo = edge.To;
        Vector2 distance = nodeTo.Position - nodeFrom.Position;
        GameObject fromRoom = m_grid[nodeFrom.Position.x, nodeFrom.Position.y];
        GameObject toRoom = m_grid[nodeTo.Position.x, nodeTo.Position.y];
        RoomDirection direction = RoomDirection.East;
        if (distance.x != 0) {
            direction = distance.x < 0 ? RoomDirection.West : RoomDirection.East;
        } else if (distance.y != 0) {
            direction = distance.y < 0 ? RoomDirection.South : RoomDirection.North;
        }
        toggleWall(fromRoom, direction, false);
        toggleWall(toRoom, oppositeDirection(direction), false);
    }
}

Here are the results:

image.png

Cuartos

Esta semana se desarrollaron cuartos básicos que pueden aparecer aleatoriamente en el mapa a partir de la lista de opciones disponibles. Los cuartos implementados incluyen uno de trampas y otro de curación. A continuación, se presentan algunas imágenes de los cuartos creados:

image.png

image.png

image.png

Aunque estos cuartos no destacan por ser los más creativos, cumplen con su propósito al ejemplificar la estructura del nivel generado.

Paredes y Puertas

Cuando el grafo indica que una arista tiene una puerta, esta debe aparecer en el mapa junto con una llave que permita abrirla. Tomando como referencia la estructura del nivel que se muestra a continuación, podemos observar que la llave está cerca de la entrada, pero al otro lado de una puerta. Por lo tanto, el último nodo antes de cerrar el ciclo necesita tener dos llaves: una para abrir la puerta que permite salir del ciclo y otra para abrir la puerta de regreso.

image.png

Para lograr esto, se añadieron paredes a todos los cuartos. Dependiendo de lo que indique el grafo, las paredes se eliminan dinámicamente:

private void removeWalls() {
    foreach (Edge edge in m_graph.edges) {
        if (edge.EdgeType != EdgeType.OpenConnection) {
            continue;
        }
        Node nodeFrom = edge.From;
        Node nodeTo = edge.To;
        Vector2 distance = nodeTo.Position - nodeFrom.Position;
        GameObject fromRoom = m_grid[nodeFrom.Position.x, nodeFrom.Position.y];
        GameObject toRoom = m_grid[nodeTo.Position.x, nodeTo.Position.y];
        RoomDirection direction = RoomDirection.East;
        if (distance.x != 0) {
            direction = distance.x < 0 ? RoomDirection.West : RoomDirection.East;
        } else if (distance.y != 0) {
            direction = distance.y < 0 ? RoomDirection.South : RoomDirection.North;
        }
        toggleWall(fromRoom, direction, false);
        toggleWall(toRoom, oppositeDirection(direction), false);
    }
}

A continuación, se muestran los resultados obtenidos: image.png

Leave a comment

Log in with itch.io to leave a comment.