Doom Wiki
Advertisement
Doom Wiki
Formato de mapa Doom
Extensiones


El Mapa de bloques (BLOCKMAP) es una estructura pre-calculada que el motor del juego utiliza para simplificar la detección de colisiones entre las cosas en movimiento y las paredes, o entre ellas. 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 entre sí.

El BLOCKMAP es simplemente una cuadrícula de "bloques" de 128 × 128 unidades de mapa (o el doble del tamaño de la rejilla de piso). Puede visualizarse activando el modo rejilla en el Automapa, con la tecla "G".

De manera similar a cómo se utiliza NODES 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). Entonces, para detectar colisiones de una cosa en movimiento, el motor de Doom solo necesita ejecutar cálculos en las linedefs del mismo bloque donde está esa cosa en movimiento (en lugar de todas las linedefs en todo el mapa).

Internamente, el mapa de bloques también se usa para colisiones cosa / cosa, y cada bloque mantiene una lista dinámica de todas las cosas que contiene. Utilizando el mismo principio que las colisiones entre objetos y paredes, el motor solo necesita comprobar si hay posibles colisiones con todos los que comparten el mismo bloque que el objeto en movimiento.

Problemas[]

La eliminación del mapa de bloques de un nivel no afectará la representación del nivel ni los cálculos de la línea de visión, pero todo el mundo caminará a través de las paredes, y nadie podrá herir a nadie tampoco. Cabe señalar que las portaciones (source ports) modernas 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 sometida 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 que el ejecutable original (y muchas portaciones actuales) solo usaran el centro de una cosa para determinar si estaba en un bloque y no tomaran en cuenta todo su 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 del lump[]

Los mapas de bloques se componen de tres partes: la cabecera, el desplazamiento (offset) y la lista de bloques. Todos los campos numéricos del mapa de bloques se tratan como números enteros cortos con signo en Vanilla Doom.

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 agrega un encabezado adicional de 2 bytes cero 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 que pueden colisionar y un marcador con bytes FFFF para indicar el final de la lista. Debido a que la mayoría de las herramientas imitan el formato de herramientas de Id, la mayoría de los WADs tienen listas de bloques con cabeceras cero.

Formato del ejecutable
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 Primera linedef dentro del bloque
2 Segunda linedef 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.

Referencias[]

Véase también[]

Advertisement