Doom Wiki
Advertisement
Doom Wiki


La característica de "choque" de la Gárgola cuando muere en Heretic, mediante la cual entra en un estado especial de caída hasta que golpea el suelo y luego explota en pedazos tras el impacto, está sujeta a varios errores que pueden causar comportamientos interesantes.

Mecánica[]

Raven Software agregó el "crashstate" a la estructura mobjinfo_t para permitir ese comportamiento especial de caída de la Gárgola. El código de caso especial en la función P_ZMovement la colocará en este estado cuando se detecte que golpeó el suelo. El cuadro normal de muerte de una Gárgola siempre la representa en una pose de caída por el aire. Es el estado de choque el que lo transforma en una pila de gibs y genera objetos gibs adicionales.

Sin gibs[]

Si la Gárgola ya está tocando el suelo antes de que el juego haga la primera comprobación de impacto, pero después de que haya entrado en su estado de muerte, entonces el choque nunca ocurrirá porque la función P_ZMovement nunca será invocada para el objeto en absoluto. Esto hará que la Gárgola permanezca sólida y afectada por la gravedad mientras mantiene su postura de caída. Esto ocurre más comúnmente si el monstruo está perfectamente nivelado con el piso detrás de ella y es empujada hacia el piso por el daño que la mata, lo que resulta en que no haya impulso Z. Un lugar común para observar esto es en E1M7: The Crypts, justo más allá de la puerta de la llave amarilla.

Múltiples gibs[]

Si la Gárgola cruza varios sectores mientras muere, como por ejemplo deslizándose por unas escaleras, puede entrar en estado de choque repetidamente, convirtiéndose en una fuente de gibs en el proceso. Esto sucede debido a la interacción entre las funciones P_ZMovement y A_ImpExplode. Ninguna de las funciones verifica si una Gárgola ya está en estado de choque, por lo que cuando golpea cada piso, satisface las condiciones para que se produzca la animación de choque.

Gárgola muerta flotante[]

Si la gárgola sufre una muerte "extrema" (gibbing según los estándares normales), ingresa a un marco diferente (el xdeathstate) de la misma manera que otros monstruos, pero aún utiliza la misma lógica de choque. Sin embargo, Raven quería que la gárgola pareciera volar mucho más lejos del jugador cuando esto ocurre, para reflejar el poder del ataque que la mató, por lo que asignan temporalmente a la Gárgola la bandera de bits MF_NOGRAVITY para hacer que flote temporalmente en el aire. Esta bandera es asignada por la función de acción A_ImpXDeath1 y eliminada varios fotogramas más tarde en la función de acción A_ImpXDeath2, a través de la siguiente secuencia de estado:

   {SPR_IMPX, 18, 5, A_ImpXDeath1, S_IMP_XDIE2, 0, 0}, // S_IMP_XDIE1
   {SPR_IMPX, 19, 5, NULL, S_IMP_XDIE3, 0, 0}, // S_IMP_XDIE2
   {SPR_IMPX, 20, 5, NULL, S_IMP_XDIE4, 0, 0}, // S_IMP_XDIE3
   {SPR_IMPX, 21, 5, A_ImpXDeath2, S_IMP_XDIE5, 0, 0}, // S_IMP_XDIE4
   {SPR_IMPX, 22, 5, NULL, S_IMP_XDIE5, 0, 0}, // S_IMP_XDIE5

Cuando se invoca A_ImpXDeath2, comprobará si el monstruo ha tocado el suelo y, de ser así, lo pondrá en estado de choque. Sin embargo, hay un error lógico en esta configuración: es posible que la lógica en P_ZMovement establezca la Gárgola en su estado de choque como de costumbre entre estos dos cuadros, y cuando esto ocurre, el monstruo nunca ingresa al cuadro S_IMP_XDIE4. Esto da como resultado que la Gárgola destripada mantenga la bandera de bit sin gravedad; en consecuencia, permanecerá flotando en el aire para siempre. Esto ocurre si la Gárgola muere en el aire pero cruza una repisa elevada a su altura exacta durante los 15 tics entre las dos llamadas a la función de acción. Esto significa que morder una destripar cerca del marco de una ventana es la forma más fácil de provocarlo.

Soluciones[]

Estos errores son corregidos por algunas portaciones (source ports) de Heretic:

El problema de la falta de gibs se soluciona añadiendo una comprobación de caso especial para los objetos con animaciones de bloqueo que ya están en contacto con un suelo cuando mueren; se mantendrán en ese estado inmediatamente en lugar de asumir que necesariamente adquirirán un momento Z en algún momento posterior de la ejecución.

El problema de múltiples gibs debe abordarse agregando algún tipo de seguimiento al actor. Tanto en Eternity como en ZDoom esto se logra con un indicador de bits interno que registra el estado "se ha bloqueado" para ese objeto. Un objeto que intente bloquearse de nuevo no repetirá la animación si se estableció este bit.

El problema de una gárgola flotante se soluciona simplemente eliminando siempre la bandera de bits sin gravedad en la rutina de A_ImpExplode también, de modo que se eliminará independientemente de cómo una gárgola entre en la animación de bloqueo.

Advertisement