FANDOM


Formato de niveles Doom

El Mapa de bloques (BLOCKMAP) es una estructura pre-calculada que el motor del juego utiliza para simplificar la detección de colisiones entre cosas en movimiento y paredes. Es decir que se utiliza para determinar el momento en que algo que se mueve golpea contra una pared o cuando dos cosas (una o ambas en movimiento) chocan.

El BLOCKMAP es simplemente una red de "bloques" cada 128 × 128 unidades (o el doble del tamaño de la rejilla de piso). Puede visualizarse activando el modo "red" en el automapa.

De manera similar a cómo se utilizan los nodos para determinar cuando una línea debe o no debe ser dibujada, el lump BLOCKMAP se utiliza para el cálculo de una colisión cosa / pared. Cada bloque contiene cero o más linedefs, aunque normalmente no son muchas (y ciertamente no tantas como en la totalidad del mapa) y así en la detección de colisiones por una cosa en movimiento el motor de Doom sólo tiene que ejecutar cálculos en cada linedef en el mismo bloque que la cosa en movimiento (en lugar de hacerlo en todo el mapa).

Internamente, la BLOCKMAP se utiliza para las colisiones cosa / cosa con cada bloque de mantener una lista dinámica de todas las cosas que contiene. Usando el mismo principio que las colisiones cosa / pared, el motor necesita sólo comprobar posibles colisiones por cada par de cosas que comparten el mismo bloque.

Problemas

Si un nivel no tiene un BLOCKMAP se mostrará muy bien, pero todo el mundo caminará a través de las paredes, y nadie podrá herir a nadie más tampoco. Cabe señalar que los source ports modernos suelen construir un nuevo mapa de bloques desde cero si no existe uno; es una operación rápida y fácil ya que no tiene que ser sometido a las mismas restricciones de tamaño que un lump WAD.

También vale la pena señalar que, debido a la forma en que el motor original hacía los cálculos, si el centro de una cosa estaba en el mismo borde de un bloque y el centro de otra estaba en el borde del bloque adyacente no habría detección de colisiones ya que ambas cosas se consideraban en diferentes bloques. Este error, con el que sin duda muchos jugadores están familiarizados, es el resultado de la exe original (y de muchos source ports actuales) por usar sólo el centro de una cosa para determinar si estaba en un bloque y no tomar en cuenta el radio. Colin Phipps proporciona una explicación del fenómeno. Lo arreglaron en ZDoom, sin embargo esto altera la jugabilidad haciendo actores más fáciles de golpear.

Estructura

Los mapas de bloques se componen de tres partes: la cabecera, el desplazamiento y la lista de bloques.

Cabecera

La cabecera de 8 bytes contiene 4 enteros cortos:

Offset Tamaño (bytes) Descripción
0 2 Coordenada x del origen de cuadrícula
2 2 Coordenada y del origen de la cuadrícula
4 2 Número de columnas (bloques en la dirección x)
6 2 Número de filas (bloques en la dirección y)

El origen de la red de bloques está ubicada en la esquina inferior izquierda del bloque de abajo a la izquierda (sudoeste). El constructor de mapas de bloque de Id Software este punto de origen en 8 menos que los valores mínimos de x e y obtenidos en cualquier vértice en el nivel.

El número de columnas y filas tiene que ser suficiente para contener todos los linedef en el nivel. Si hay linedefs fuera del BLOCKMAP, el juego no será capaz de evitar que los monstruos o jugadores crucen esos linedefs, lo que puede causar problemas, incluyendo el efecto sala de espejos.

Desplazamiento

Offset Tamaño (bytes) Descripción
8 2 Desplazamiento al bloque 0
10 2 Desplazamiento al bloque 1
. . .
8 + 2 * (N - 1) 2 Desplazamiento al bloque  N - 1

Observe que hay N bloques, que es igual a las columnas × filas (de la cabecera). Todos los desplazamientos son en relación con el inicio del lump BLOCKMAP y sin signo, lo que significa que pueden llegar hasta los 65.535 en lugar de 32.767 (como la mayoría de las otras estructuras WAD). Además, los desplazamientos no son en bytes, sino en cortos, por lo que el tamaño máximo de un BLOCKMAP en Vanilla Doom es de aproximadamente 128 KB, y no 64 KB.

Lista de bloques

Las listas de bloques para el ejecutable original generalmente tienen dos formatos aceptados, que a veces se los conoce como el formato del ejecutable y el formato de herramientas. La cadena de herramientas de Id agregó un encabezado cero adicional de 2 bytes al comienzo de cada lista de bloques. Esta entrada es manejada por el motor como linedef 0. El motor espera listas de todos los lindefs y un marcador FFFF para indicar que no hay más lindefs en la lista. Debido a que la mayoría de las herramientas imitan la cadena de herramientas de identificación, la mayoría de los WADs tienen listas de bloques con cabeceras cero.

Formato del motor

Tamaño (bytes) Descripción
2 Primera linedef dentro del bloque
2 Segunda linedef dentro del bloque
. . .
2 0xFFFF


Formato de herramientas

Tamaño (bytes) Descripción
2 0x0000
2 Linedef 0 dentro del bloque
2 Linedef 1 dentro del bloque
. . .
2 0xFFFF

La lista de bloques siempre comienza con 0 y termina con -1. En el medio hay un listado de todos los linedefs de cuales existe alguna parte dentro del bloque. Cualquier linedef en la frontera de dos bloques se colocará sólo en el bloque del lado derecho de la línea de las líneas verticales y el bloque en la parte superior de la línea de las líneas horizontales.

Compresión

Es posible utilizar diversas técnicas para comprimir el tamaño de un mapa de bloques en comparación con la implementación utilizada por Id software. El uso de compresión es la única forma de crear algunos mapas grandes, de una manera que no generen bloqueos en tiempo de ejecución en Doom y muchos source ports.

Se conocen multitud de técnicas, pero la mayoría de los programas de creación de mapas han implementado algoritmos de compresión relativamente poco sofisticados. También hay un tipo de algoritmo similar a la compresión que permite grandes mapas de bloques, mayores que 65.536 bytes, pero tienen un conjunto de limitaciones estrictas y en algunos casos pueden desencadenar errores en el código de colisión del motor de Doom.


Fuente

Véase también

El contenido de la comunidad está disponible bajo CC-BY-SA a menos que se indique lo contrario.