Cuando se «guarda el juego» en cualquier juego que utiliza el motor de Doom, los objetivos de ataque de los monstruos y proyectiles no quedan registrados en el archivo que se almacena. Por lo que cualquier monstruo que estuviera activo en el momento de guardar el juego aparecerá inactivo al cargar el juego nuevamente. Sin embargo, se conserva la ubicación y ángulo que tenía cuando se guardó el juego.
Demostrando el efecto[]
Aquí hay una manera de verificar este comportamiento anómalo:
- Comienza un nuevo juego de Doom II (MAP01) en el nivel de dificultad ITYTD.
- Cuando el programa se cargue, estarás mirando a dos Zombis que te dan la espalda. Ignóralos por el momento y en cambio, camina hacia el oeste por el corto pasillo posterior hasta llegar al balcón.
- Dispara una bala allí. Dos sonidos de gruñidos indicarán que has atraído la atención de los Zombis.
- Guarda el juego.
- Carga el juego guardado.
- (Opcional) Permanece inmóvil por un minuto o dos y escucha. Uno esperaría oír el ruido de la respiración hecho por los Zombis mientras caminan alrededor, pero todo está tranquilo.
- Recorre cuidadosamente el pasillo hacia el punto de inicio, manteniendo el ojo en la abertura del norte. A medida que te mueves en la línea de visión de cada soldado, una de dos cosas sucederá:
- Si está de frente a ti, se volverá activo y comenzará a moverse de nuevo.
- Si no te enfrenta, se mantendrá inmóvil.
Así que, aunque los Zombis se despertaron por los disparos en el paso 3, "se durmieron" durante el paso 5.
Efectos específicos[]
Algunos efectos distinguibles se hacen evidentes a causa del error.
El objetivo de un ataque incompleto del Archi-vil, por ejemplo, no se conserva en un juego guardado debido a este error. Esto significa que cargar un juego guardado que incluya tal situación hará que el ataque del Archi-vil resulte inofensivo, descontando la animación de la llama en el lugar del objetivo original del Archi-vil, que se muestra durante el trayecto (ya que la cosa que representa la llama correspondiente se había generado allí como un efecto del ataque).
Del mismo modo, el objetivo del misil de un Revenant no se almacena en los datos del juego guardado. Por lo tanto, los misiles rastreadores ya no seguirán nada después de ser restaurado.
Aspectos técnicos[]
La causa de este efecto se puede encontrar en el código fuente de Doom en p_saveg.c, en las funciones P_ArchiveThinkers y P_UnarchiveThinkers.
En el código fuente de Doom, la estructura mobj_t se utiliza para representar algunos objetos del juego como los monstruos. Los objetivos de ataque de los monstruos se almacenan en estas estructuras como un campo denominado target, que es un puntero a otro mobj_t al que el monstruo está apuntando actualmente.
El motor Doom guarda los juegos escribiendo directamente las estructuras en bruto utilizadas en la memoria en el disco. Al volver a cargar juegos guardados, punteros como el campo de destino ya no son válidos (porque el diseño de estructuras dentro de la memoria es diferente). Al cargar un juego, la función P_UnarchiveThinkers establece deliberadamente el objetivo de todos los objetos de mapa en NULL para evitar bloqueos debido al acceso a áreas no válidas de memoria. Un objetivo nulo indica que un monstruo no tiene un objetivo de ataque actual, haciendo que los monstruos que estaban activos vuelvan a "dormirse".
Una serie de source ports han solucionado el problema de guardar el juego, produciendo archivos de juego guardados con monstruos que seguirán persiguiendo a su objetivo anterior al recargar el juego. También es posible reconstruir objetivos de lucha interna desde partidas Doom estándar guardadas, tratando los punteros mobj_t almacenados como identificadores únicos y analizando sus relaciones mutuas para determinar qué monstruo solía ser qué pensador.
Strife[]
Strife incluye una solución al problema de Doom de que los monstruos se queden dormidos cuando se recargan las partidas guardadas. Evita la incapacidad de guardar referencias mutuas entre estructuras mobj_t haciendo que cualquier monstruo que tuviera un objetivo no nulo en el momento de guardar el juego comience a apuntar al jugador cuando se carga. Esto tiene aproximadamente el mismo efecto que el movimiento completo del puntero, ya que las luchas internas entre monstruos generalmente no están permitidas en Strife.
Sin embargo, al aplicar este cambio, los programadores de Strife olvidaron que el cuerpo del jugador podría no cargarse desde el juego guardado y aparecer en el mapa hasta que muchos o incluso todos los monstruos hayan sido restaurados. Esto hace que cualquier monstruo cargado antes que el jugador tenga su campo de destino configurado en un objeto de jugador ficticio que se generó cuando el mapa se recargó desde el caché del archivo WAD justo antes de que se procesara el archivo guardado. Si bien este objeto de jugador ha sido eliminado del nivel, no se libera de la memoria debido a otro fallo sutil en el motor de Doom.
Los monstruos afectados se quedarán dormidos o parecerán ignorar al jugador hasta que sus atenciones sean atraídas deliberadamente de nuevo, ya que tienen la intención de perseguir un objeto diferente al cuerpo real del jugador. Los monstruos afectados por este problema aparecerán efectivamente aleatorios y están determinados por el orden de la lista de pensadores internos de Doom.