Los niveles en Vanilla Doom están limitados en tamaño por la lista de bloques, que esencialmente enumera qué linedefs cruzan qué bloques en el mapa de bloques BLOCKMAP. Esta lista solo puede contener 65.535 entradas, incluidas las entradas "comienzo" y "final" para cada bloque.
En principio, por lo tanto, un nivel podría contener hasta 32.407 bloques (ver figura), pero para los mapas reales, el límite empírico parece estar en algún valor entre 10.000 y 14.400 bloques; cuanto más complejo es el mapa, más pequeña debe ser su área.
Este mapa tiene un solo sector y una lista de bloques de tamaño 65.536.
Detalles[]
Las limitaciones de tamaño en el offset de la estructura de datos del mapa de bloques establecen algunos límites superiores en el tamaño máximo de un nivel. Se han inventado varias técnicas para empaquetar más datos en la entrada del BLOCKMAP sin romper la compatibilidad. Una técnica muy común es combinar referencias a listas de bloques idénticas, haciendo que todas apunten a la misma lista de bloques en lugar de varias listas de bloques idénticas. La cadena de herramientas original de Id Software no tenía tales optimizaciones y producía mapas de bloques muy grandes.
El tamaño máximo de un mapa de bloques que es completamente funcional en Vanilla Doom es de 65534 bytes + los bytes después de esta marca de 65534 bytes que pertenecen a las listas de bloques que comienzan en o antes de esta marca de 65534 bytes. Esto se debe a que un desplazamiento, que es un entero corto con signo, puede contener como máximo el valor 32767, que se duplica para ser un desplazamiento de bytes de 65534, y el análisis dentro de una lista de bloques determinada puede continuar más allá de este desplazamiento de bytes.
Al combinar los datos de varias listas de bloques en una gran lista de bloques que es muy larga, es posible producir mapas de bloques que están muy por encima de este límite. Esto conducirá a una disminución del rendimiento y posiblemente a una mayor probabilidad de detección de colisiones con errores debido a errores en otras partes de la base de código.
Muchas portaciones (source ports) han corregido estos errores, pero algunos los conservan para la compatibilidad en la reproducción de demos.
Tamaño del mapa de bloques frente al área y la complejidad del mapa[]
El tamaño de un mapa de bloques es una función tanto del área total de un mapa (es decir, el número de bloques de 128x128 que cubre) como de la complejidad del mapa en términos del número de definiciones de línea.
Cuanto más complejo es un mapa en términos de número de líneas, menor es la cantidad de espacio que puede ocupar sin exceder las limitaciones del formato estándar, y viceversa: menos líneas en una cantidad de espacio comparativamente mayor. Este último caso está particularmente sujeto a mejoras a través de técnicas de compresión, ya que varias listas de bloques se pueden fusionar en una sola.
Notas de portaciones[]
La portación Boom y muchas que se derivan de ella realizan los siguientes cambios en la forma en que se manejan los mapas de bloques:
- Hay una corrección de errores problemática y excesiva que hace que la entrada cero se omita incondicionalmente. Esto se hace saltando ciegamente la primera entrada de cada lista de bloquea, incluso si no es una entrada cero. Algunas portaciones han corregido este error cuando las herramientas para construir mapas de bloques sin la entrada cero estuvieron disponibles.
- Las referencias a la lista de bloquea no están firmadas, lo que aumenta el límite de espacio de direcciones de la lista de bloqueo de 65.534 a 131.070.
- Las dimensiones del mapa de bloques no tienen signo, aunque es muy poco probable que esto cause diferencias en el comportamiento a menos que el mapa de bloques esté cuidadosamente diseñado para provocar tales diferencias.
- El mapa de bloques puede reconstruirse, lo que posiblemente conduzca a cambios en el juego si se implementan ciertos efectos especiales del mapa de bloques. Boom decide hacer esto cuando el tamaño del mapa de bloques es mayor que 131.071 bytes.
En abril de 2018 se lanzó un conjunto de pruebas para mapas de bloques llamado Block Rocking Bytes. Contiene varios mapas de bloques inusuales que son compatibles con el ejecutable original y Chocolate Doom, pero pueden fallar con portaciones que no son totalmente compatibles con el comportamiento Vanilla.
Referencias[]
- Especificaciones no oficiales de Doom, section 4-11