Motor fatalidad

Identificación de tecnología 1
Tipo de Motor de juego ( Lista )
Desarrollador Software de identificación
programador clave Juan Carmack
Parte de una serie de motores Identificación de tecnología
Motor anterior de la serie Motor Wolfenstein 3D
El siguiente motor de la serie. motor sísmico
Fecha de lanzamiento 10 de diciembre de 1993
Plataformas de hardware PC , Macintosh , Amiga , SNES , Sega 32X , Sega Saturn , 3DO , PlayStation , Game Boy Advance , Atari Jaguar y más
SO compatible DOS , Linux , FreeBSD , otros similares a UNIX
Escrito en lenguaje C , lenguaje ensamblador
Licencia antes de 1997 - Software comercial
después de 1997 - Software libre : licencia GNU GPL
Primer juego en el motor Muerte / 10 de diciembre de 1993
Último juego en el motor Conflictos / 31 de mayo de 1996

El motor Doom (" Doom engine "), también conocido como id Tech 1  , es un motor de juego pseudo- 3D desarrollado por la compañía estadounidense id Software y utilizado en juegos de computadora Doom , Heretic , HeXen , Strife , HacX y otros juegos creados bajo licencia. . Creado por John Carmack , los ayudantes fueron escritos por Michael Abrash , John Romero , Dave Taylor y Paul Radek._ _ _ Originalmente escrito en computadoras NeXT , luego, para el primer lanzamiento, Doom fue portado a DOS , y luego a varias consolas de juegos y sistemas operativos .     

Diferencias con el motor Wolfenstein 3D

Restricciones

Características técnicas

El motor fue escrito en C en estaciones de trabajo NeXT en el sistema operativo NEXTSTEP . Inicialmente se utilizó el compilador Intel C , pero posteriormente se utilizó Watcom C. Las utilidades se escribieron bajo NeXT en Objective-C . El motor Doom fue progresivo para su época. A pesar de que C es un lenguaje de programación procedimental, el motor de Doom está escrito en un estilo de objeto explícito .

Dispositivo de nivel [1]

Todos los niveles en Doom son en realidad 2D, lo que indica una de las limitaciones del motor: es imposible tener una habitación (sector) encima de otra habitación. Sin embargo, por otro lado, te permite dibujar un mapa de nivel con todas las paredes y objetos mostrados sin ningún problema, a diferencia de otros juegos de este género.

El nivel consta de diez bloques .WAD-archivo; cinco de ellos ( VERTEXES, LINEDEFS, SIDEDEFSy ) son editados directamente por el usuario, cinco más ( , , y ) SECTORSson calculados por el constructor BSP. THINGSSEGSSSECTORSNODESREJECTBLOCKMAP

Los niveles se construyen de acuerdo con el principio sustractivo: todo el espacio está lleno de materia impenetrable, y el autor del nivel "corta" túneles en esta materia. La base del nivel son los vértices ( vértices en inglés  ) - puntos en el espacio bidimensional. Los segmentos se dibujan entre los vértices ( eng. linedefs ). Un segmento puede tener uno o dos lados ( sidedefs en inglés ). Las texturas no se establecen para los segmentos, sino para los lados, de modo que un segmento se puede cubrir desde diferentes lados con diferentes texturas.   

Los vértices y los segmentos de línea forman un gráfico plano ; cada una de sus caras puede ser un espacio impenetrable (por ejemplo, una columna), o un sector ( sector inglés  ). A veces, la estructura de los sectores se viola deliberadamente: los efectos especiales como los puentes invisibles se basan en esto. Cada sector tiene una forma arbitraria en planta (no necesariamente convexa o simplemente conectada ). El sector siempre tiene un piso horizontal con techo e iluminación constante. Las secciones de un solo lado son paredes en blanco, las de dos lados forman transiciones entre sectores.

Para garantizar la mayor interactividad en ese momento , se utilizaron las llamadas etiquetas . El segmento y el sector tienen un campo entero especial: "etiqueta". Para hacer un interruptor que baje el elevador, el segmento del interruptor recibe un código de acción de "interruptor que baja el elevador" y alguna etiqueta (por ejemplo, 5). La misma etiqueta se asigna al sector-ascensor. Cuando está activado, el segmento realizará la acción especificada en todos los sectores con esta etiqueta.

Finalmente, los objetos ( cosas ) se colocan en el nivel. Al mismo tiempo, el conjunto de características de los objetos en Doom resultó ser bastante pobre: ​​por ejemplo, no había una coordenada Z , un objeto terrestre siempre estaba en el suelo al comienzo del juego y un objeto aéreo colgaba de él. el techo. Es imposible hacer que el objeto sea solo en un jugador , o solo en deathmatch , o solo en cooperativo (solo había una bandera "solo en juegos en línea").

Juego

Todos los cálculos se realizan a una frecuencia de 35 ciclos por segundo, en un punto fijo de 16,16, con una unidad de máquina igual a un texel (la altura del jugador es de 56 texels [2] [3]  , por lo que 1 texel es aproximadamente igual a 4 cm) . Para valores angulares se utiliza un punto fijo, en el que 2 32 = 360° [2] . Sin embargo, la mayoría de los cálculos angulares eran más toscos; por ejemplo, los giros del jugador se calculan con una precisión de 360° = 2 16 = 65536, y la tabla trigonométrica constaba de solo 8192 (2 13 ) valores [2] .

La grabación de demostraciones y el juego en línea se basan en el hecho de que en una computadora digital el mismo código con los mismos datos conduce al mismo resultado, y el comportamiento de la aritmética de enteros está estrictamente especificado y no depende del modelo de procesador. El juego graba en la demo (y transmite a través de la red) comandos de control [2] [4] [5] ; si no hay errores graves en el juego, diferentes máquinas, interpretando los mismos comandos de control, obtienen el mismo resultado. Sin embargo, todavía hay errores en el juego que conducen a la desincronización: en particular, si ingresa al menú en un juego de un solo jugador, el juego se detiene, pero el video continúa escribiéndose [6] . La desventaja de este enfoque es la incapacidad de rebobinar el video; solo se puede jugar desde el principio.

En el modo de grabación de demostración, la precisión de rotación se redujo a 256 por 360 grados [2] [7] ; Un jugador atento puede notar que en el modo de demostración, la pastilla se vuelve más áspera. Esto sirve únicamente para ahorrar memoria en las demos y se ha arreglado en numerosos ports a costa de perder compatibilidad con el juego original.

Cada ciclo de juego (1/35 de segundo) el juego pasa por el control de cada monstruo. Para ahorrar ciclos de procesador, hay una matriz de bits REJECT[8] : para dos sectores cualquiera, si ningún punto del sector B es visible desde cualquier punto del sector A, uno se establece en este lugar en la matriz. Si la intersección de la fila correspondiente al sector del jugador y la columna correspondiente al sector del monstruo es 0, se verifica si el monstruo ve al jugador; si es 1, se garantiza que el monstruo no verá al jugador. La matriz REJECTes muy difícil de construir, y la mayoría de los editores personalizados la llenaron con ceros (hubo muy pocas utilidades que la construyeron; las principales son RMBy ZENNODE).

El motor de física aplica la estructura BLOCKMAPpara acelerar la verificación de colisiones de objetos con segmentos.

Construcción de imágenes

Para acelerar la visualización, se usa un árbol BSP [9] (a diferencia de los portales en Duke Nukem 3D ). Los objetos se dibujan como sprites , a diferencia de Quake .

El motor atraviesa el árbol BSP recursivamente, dibujando paredes desde el más cercano al más lejano [10] :

función treewalk (nodo) si EnclosingRectangle(node) no está en el cono de vista luego salir si el nodo es una bifurcación luego // el nodo es una bifurcación - atravesar recursivamente si la cámara está a la izquierda del plano de corte luego Tree Pass (nodo.izquierda); Tree Pass (nodo derecho) de lo contrario Tree Pass (node.right); Tree Pass (nodo a la izquierda) de lo contrario // el nodo es un subsector dibujar (nudo)

Los tres bloques restantes están involucrados aquí. Los sectores se dividen por secantes en elementos convexos llamados subsectores ( SSECTORS), los segmentos se dividen en segmentos ( SEGS). La estructura de árbol en sí (que abarca rectángulos, secantes, punteros a "hijos") se almacena en un bloque NODES. Este ciclo dibuja solo paredes sólidas (es decir, texturas medias para paredes de un solo lado y texturas superior e inferior para paredes de dos lados). Los objetos, pisos y cuadrículas se escriben en arreglos separados y se dibujan en una etapa posterior. La matriz que sostiene los pisos es bastante pequeña, y es bastante común que los constructores aficionados se desborden y salgan con el mensaje "¡ No más visplanos!" ".

Después de dibujar las paredes, los pisos se dibujan línea por línea, escritos en visplanos .

Cada sector contiene una lista enlazada de objetos que se encuentran en él. En la etapa de dibujar las paredes, los objetos visibles, junto con los puntos de corte, se agregan a una matriz. Una vez que el motor ha dibujado los pisos y los techos, la matriz se ordena y los 128 objetos más cercanos se dibujan de más lejano a más cercano usando los mismos procedimientos que se usan para dibujar paredes. En la misma etapa, también se dibujan rejillas (texturas "medianas" en paredes de dos caras).

Las texturas de pared y los sprites se almacenan en un archivo .WAD por columnas, las texturas de piso y techo son una matriz simple de 64x64.

Doom para DOS se ejecutó en modo VGA 320 × 200 [11] con triple búfer , para Linux  usó el modo normal VGA 13h. En este caso, el valor de resolución se codificó en procedimientos de ensamblador en dos lugares; las versiones del juego que usaban resolución variable tenían múltiples funciones para diferentes resoluciones [12] o modificaban dinámicamente el código para que coincidiera con la resolución requerida [13] . Sin embargo, en partes del juego que no pertenecen al motor, había muchos números mágicos asociados con la resolución de pantalla y las coordenadas de pantalla de varios objetos, por lo que los primeros puertos de Doom sufrieron de gráficos de menú que se estaban "difundiendo" en SVGA. modos [14] .

Carga larga

Doom es conocido por sus largos tiempos de carga (más de un minuto en las computadoras de su época). La mayor parte del tiempo se dedicó a inicializar el " daemon de actualización de Doom " ( ing . Init Doom refresh daemon ) .  

Doom se distribuía en disquetes ya través de BBS , cada byte era importante. Para reducir el tamaño, hicieron tal mecanismo. Cada una de las texturas de las paredes constaba de fragmentos ( parches ingleses  ): por ejemplo, una pared con un interruptor puede consistir en una imagen de una pared y una imagen de un interruptor, o una pared de mosaicos, de tres o cuatro mosaicos distribuidos al azar. sobre una gran textura. Las texturas, como se mencionó anteriormente, se dibujan en columnas. Doom revisó todas las columnas de todas las texturas y verificó qué fragmentos cubrían una columna en particular; se construyó la estructura de datos correspondiente. Esta estructura podría almacenarse en caché o construirse cuando se cargó el nivel, construyéndose dinámicamente según sea necesario; en este caso, Doom se cargaría mucho más rápido [15] .

Además, Doom tenía un método de almacenamiento en caché de datos especializado llamado "memoria dividida en zonas". La instrucción recomendaba deshabilitar cachés de disco como SmartDrive  : Doom tiene un caché más eficiente.

código de red

Doom se basa en el modelo peer-to-peer . Como se mencionó anteriormente, el sincronismo del juego en todas las máquinas está asegurado por el hecho de que el mismo código con los mismos datos arroja el mismo resultado. Con cada paquete, se transmite una "convolución de sincronización", generalmente la coordenada de uno de los jugadores; si la convolución recibida con el paquete no coincide con la calculada localmente, el juego se detiene con un mensaje de falta de sincronización. No hay forma de contrarrestar los retrasos en la transmisión; si el ping promedio supera 1/35 de segundo, la respuesta del juego a los controles se ralentiza. El juego puede solicitar paquetes perdidos y duplicarlos para que las solicitudes de retransmisión sean lo menos frecuentes posible. No hay entrada al juego iniciado.

El soporte para un protocolo de red en particular no está incluido en Doom . Para ejecutar el juego a través de una red, los jugadores llaman a un programa externo, un controlador de red que establece la comunicación entre las máquinas y llama al archivo Doom .EXE . Este diseño le permite escribir controladores externos para otros protocolos de red, o lanzadores de red Doom que son más convenientes que los disponibles.

Cada uno de los jugadores tiene un color diferente: el primero es verde, el segundo es gris, el tercero es marrón, el cuarto es rojo. Los números de jugador (y por lo tanto los colores) son distribuidos por el controlador de red, no por el juego. En el juego sobre IPX a través del programa, IPXSETUPlos colores dados a los jugadores dependen de las direcciones MAC de las tarjetas de red , en el juego sobre un módem o cable a través SERSETUP de factores aleatorios.

Una característica interesante no documentada en las versiones 1.0 y 1.1 era un juego para un solo jugador en un sistema de tres monitores: uno muestra lo que está frente al jugador, el segundo es lo que está a la izquierda, el tercero es lo que está a la derecha. Como en ese momento no existían tarjetas de video con tantos monitores, para tal juego se necesitaban tres computadoras conectadas por una red. Sin embargo, esta característica existió solo en su infancia: para cargar desde un guardado, se requería reiniciar el juego en las tres computadoras.

Lista de juegos que usan el motor Doom

El motor Doom se vendió a otras empresas. Se han hecho varios juegos en él. Entre ellos:

Nombre del juego fecha de lanzamiento Desarrollador/es Plataformas
condenar 1993 Software de identificación MS-DOS , Windows , Mac OS , Linux , Acorn Archimedes , SNES , Sega 32X , Sega Saturn , 3DO , PlayStation , Game Boy Advance , Atari Jaguar , Xbox , Xbox 360 , PlayStation 3 , iOS , Android
Doom II: Infierno en la Tierra 1994 Software de identificación MS-DOS , Windows , Mac OS , Game Boy Advance , Sega Saturn , Tapwave Zodiac , PlayStation , Xbox 360 , PlayStation 3 , Android
Hereje 1994 software de cuervo PC , PSX , Mac OS , Amiga , GNU/Linux
Hexagonal 1995 software de cuervo MS-DOS , Mac OS , Linux , PlayStation , Nintendo 64 , Sega Saturn
Destino final 1996 software de identificación ,

Equipo TNT, hermanos Casali

MS-DOS , PlayStation , PlayStation 3 , MacOS
Lucha 1996 Entretenimiento pícaro MS-DOS , Microsoft Windows , Linux , mac OS
Búsqueda Chex 1996 café digital MS-DOS , Microsoft Windows
Chex Quest 2: Flemoids tomar Chextropolis 1997 café digital MS-DOS , Microsoft Windows
fatalidad 64 1997 juegos intermedios nintendo 64
Hacx: Contracción y muerte 1997 software de banjo MS-DOS , Microsoft Windows
Velocidad de crucero 2001 Estado gráfico Game Boy Advance
arena oscura 2002 Estado gráfico Game Boy Advance

Además, los fanáticos del juego crearon modificaciones personalizadas , que transformaron completamente el juego. El primero de ellos, Alien Doom  , se hizo en base a la película " Alien ". Posteriormente, aparecieron modificaciones en otras películas: " Ghostbusters ", " Batman " y " The X-Files ". Ver Modding Doom .

Código abierto

En 1994, abrieron los textos fuente de los controladores de red. Los entusiastas comenzaron a desarrollar sus propios controladores: por ejemplo, para cable LPT ( PARSETUP) e incluso para cadena de cable COM ( HX8).

En diciembre de 1997, el código fuente completo de Doom para Linux se publicó bajo una licencia gratuita no libre (la versión para DOS no se publicó debido a la biblioteca de sonido DMX de pago). Ya en enero de 1998, apareció el primer puerto de este código para DOS  : DosDoom . En lugar de DMX, se utilizó un Allegro abierto .

Los pioneros de la expansión Doom fueron Lee Killow ( Boom  es una versión extendida de Doom que corrigió muchos de los errores del juego original), Denis Fabrice y Boris Pereira ( Doom Legacy de alta resolución ) y Bruce Lewis ( glDoom , el primer puerto OpenGL de la fatalidad ).

Tras medio año de desarrollo, el fallo del disco duro del ordenador de Lewis acabó con glDoom : no había copia de seguridad . Debido a esto, Carmack volvió a obtener la licencia del código fuente bajo la Licencia Pública General GNU : si la licencia no fuera tan restrictiva, alguien habría encontrado el código fuente [16] . El resto de los recursos quedan pagados. Después de 12 años, se encontró el código fuente, de un amigo al que Lewis acudió con un disco.

Se ha encontrado una gran cantidad de errores en Doom [17] . El motor de física y el renderizador determinaron de manera diferente si el avión era "celestial" o no: un cohete podría golpear el cielo y explotar [18] y viceversa, podría "volar lejos" sin explotar a través de una pared en blanco [19] . Los monstruos se quedaban atascados en las puertas [20] , y Arch-Vile , al resucitar un cadáver aplastado, simultáneamente lo hacía invulnerable y capaz de atravesar paredes [21] . Los puertos generalmente verificaban la versión de la demostración : los errores se activaban si el corte fue registrado por la versión original del juego y se desactivaban si el puerto. Dichos errores en algunos niveles de usuario eran críticos para aprobar; por lo tanto, en los puertos de Boom y derivados, se podían habilitar a través del menú.

Ahora hay varias docenas de versiones avanzadas de Doom  , desde las más simples hasta las más poderosas. Te permiten jugar a una resolución más alta que el Doom original , tienen características adicionales (vista arriba-abajo, punto de mira), así como un juego en línea mejorado . Las más famosas de estas versiones son:

Doom Legacy , ZDoom y SkullTag tienen la capacidad de jugar con bots .

Las modificaciones menos significativas se enumeran brevemente en la lista de puertos de los juegos de Doom.

Los archivos de datos de Doom permanecen pagados hasta el día de hoy. Para crear un archivo IWAD completamente gratuito, se inició el proyecto FreeDoom .

Notas

  1. Mateo cayó. The Unofficial Doom Specs v1.666…  (Inglés) ( HTML ) (15 de diciembre de 1994). - Especificaciones no oficiales de Doom . Consultado el 25 de agosto de 2011. Archivado desde el original el 2 de abril de 2019.
  2. 1 2 3 4 5 Código fuente de Doom o versiones anteriores (por ejemplo , Doom Legacy 1.11, 1.12)
  3. Jugador  ._ _ DoomWiki.org. Consultado el 8 de abril de 2019. Archivado desde el original el 19 de agosto de 2019.
  4. Demostración._  _ _ DoomWiki.org. Consultado el 8 de abril de 2019. Archivado desde el original el 19 de agosto de 2019.
  5. Componente  de red de Doom . DoomWiki.org. Consultado el 8 de abril de 2019. Archivado desde el original el 19 de agosto de 2019.
  6. Desincronización de la demostración causada por el acceso al menú - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 8 de abril de 2019.
  7. ↑ La resolución de giro se reduce al grabar demostraciones  . DoomWiki.org. Consultado el 8 de abril de 2019. Archivado desde el original el 8 de abril de 2019.
  8. Reject - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 24 de agosto de 2019.
  9. Motor de renderizado de Doom - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 19 de agosto de 2019.
  10. Motor de renderizado de Doom - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 19 de agosto de 2019.
  11. Doom Wiki: Relación de aspecto . Consultado el 17 de diciembre de 2018. Archivado desde el original el 15 de julio de 2019.
  12. Código fuente de Smack My Marine Up
  13. Fuente para cualquier versión DOS de Doom Legacy , función ASM_PatchRowBytes.
  14. Por ejemplo, Doom Legacy 1.11, 1.12
  15. Muchas versiones de Doom hacen esto  , notablemente Doom Legacy y Smack My Marine Up ; el código fuente de ambos está disponible gratuitamente.
  16. Doom Wiki - Licencias Archivado el 18 de diciembre de 2018 en Wayback Machine . 
  17. ↑ Error del motor - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 19 de agosto de 2019.
  18. Los proyectiles explotan al impactar con "cielo" - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Fecha de acceso: 17 de diciembre de 2018. Archivado desde el original el 6 de abril de 2016.
  19. Las bocanadas de bala no aparecen en áreas al aire libre - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 3 de abril de 2019.
  20. Monstruos atascados en los marcos de puertas, paredes o colgando de ascensores - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 13 de julio de 2019.
  21. Monstruo fantasma - The Doom Wiki - Doom, Doom 2, Doom 3 y más . Consultado el 17 de diciembre de 2018. Archivado desde el original el 29 de octubre de 2019.