LECCIÓN 3:
Would you love a monsterman?

Creamos nuestro primer monstruo y su proyectil

Bien, ya hemos aprendido las reglas básicas del Decorate. Ahora vamos a crear nuestro primer monstruo, que aterrorizará a los marines en cuanto le vean... Por lo demás, deberíamos recordar que ciertos Code Pointers solamente funcionarán en el Community Build de Zdoom, o incluso en GZdoom.

Entonces, ¿empezamos?

Lo que vamos a crear aquí será un zombi que disparará unas cargas de plasma personalizadas. ¿A que mola? Bueno, pues vamos a ello; cuanto antes, mejor.

Lo primero de todo y más importante, escribiremos ACTOR, el nombre del nuevo monstruo y su número de identificación —por si queremos ponerlo en un mapa desde un editor como DoomBuilder o Wadauthor—. A nuestro pequeño amigo zombi le llamaremos "Plasmozombie" y le asignaremos el número 20002.

ACTOR PlasmoZombie 20002
{

Después ponemos las propiedades del monstruo en cuestión. Lo que especificaremos en el lump será "haz que mi zombi mida 56 píxeles de alto, ocupe 32 píxeles de radio, tenga 30 puntos de vida, corra a 10 de velocidad, y que sea fácil hacerle chillar COMO UNA CERDILLA, EHEHEHEHEHEH"..., perdón. En fin, lo que deberemos escribir será lo siguiente:

  Health 30
  PainChance 100
  Speed 10
  Radius 32
  Height 56

Bueno, ya le hemos puesto la vida que tendrá —Health—, la velocidad a la que se moverá —Speed—, sus medidas —Height y Radius— y la probabilidad de que chille y se lamente al ser herido —PainChance—. Pero lo tenemos que completar con más cosas, para que sea un monstruo totalmente funcional. Añadimos pues lo siguiente:

  SeeSound "grunt/sight"
  PainSound "grunt/pain"
  DeathSound "grunt/death"
  ActiveSound "grunt/active"
  Obituary "%o ha sido derretido por un zombi"
  MissileType PersoPlasma
  Solid
  DropItem PlasmaCell

SeeSound es el sonido que emitirá el monstruo al ver al jugador; o sea, el rugido del zombi, el "bisbiseo" del cacodemonio... PainSound indica su quejido al recibir daño, y DeathSound el sonido que hará al morir. ActiveSound, por último, corresponde a esos sonidos ambientales que escuchamos cuando hay un monstruo activo en las cercanías; en este caso, el zombi hará raar...

Luego tenemos Obituary, que indica qué mensaje aparecerá cuando este bicho nos mate. Ahí ponemos %o para definir el nombre del jugador.

Y finalmente tenemos MissileType, que define el misil o proyectil que va a lanzar el monstruo en sus ataques; en este caso, la "PersoPlasma". Por lo demás, le ponemos la característica Solid para que nos bloquee el paso, y DropItem PlasmaCell para que deje una célula de plasma al morir.

Ahora lo que NO DEBEMOS OLVIDAR es escribir esto:

  MONSTER

Esto define al actor como un monstruo, por lo que durante el juego contará como monstruo y se comportará como tal.

Ya estamos en la parte interesante. Añadiremos ahora esto:

  States
  {
    Spawn:
      PPOS AB 10 A_Look
      Loop

Estamos en los estados, señores. Empezamos con el estado Spawn, donde le diremos a nuestro zombi que vigile si ve algún jugador.

*Zombi se aproxima*
*escopetazo*

No interrumpas.

Además, le decimos que repita indefinidamente este estado hasta que vea a su víctima —la orden Loop—. También le ponemos la propiedad A_Look para que pueda funcionar esto de detectar al enemigo...

Bueno, y ahora lo siguiente:

    See:
      PPOS ABCD 4 A_Chase
      Loop

Tenemos ante nuestros ojos el estado See, que es cuando el monstruo nos persigue una vez nos ha visto. Le ponemos el Code Pointer A_Chase para que nos persiga y se mueva. En la siguiente línea escribimos Loop para que se repita indefinidamente la animación.

Y ahora:

    Missile:
      PPOS E 10 A_FaceTarget
      PPOS F 4 A_MissileAttack
      PPOS E 4
      PPOS F 4 A_MissileAttack
      PPOS E 4
      PPOS F 4 A_MissileAttack
      PPOS E 10
      Goto See

Lo que hemos hecho aquí es el estado de arranque del proyectil. Le decimos al zombi que mire al objetivo (PPOS E 10 A_FaceTarget) y dispare tres cargas de plasma. A_MissileAttack hará que nuestro personaje dispare la carga de plasma personalizada que acabamos de definir antes en las propiedades (MissileType PersoPlasma). Por último, con la línea Goto See le decimos que vuelva al estado See una vez terminado el estado Missile.

A continuación ponemos:

    Pain:
      PPOS G 10 A_Pain
      Goto See
    Death:
      PPOS H 3 A_Scream
      PPOS I 3
      PPOS J 3 A_Fall
      PPOS K 3
      PPOS L 3
      PPOS M 3
      PPOS N 3
      PPOS N -1
      Stop

Pain es el estado de nuestro amigo zombi al quejarse por haber recibido daño —de un disparo que le haya hecho el marine de Doom, por ejemplo—; Death, el estado cuando muere. Ahora explicaré los Code Pointers usados:

  • A_Pain: hace el sonido PainSound que hemos definido antes.
  • A_Scream: emite el sonido DeathSound.
  • A_Fall: hace que el bicho caiga al suelo, quitándole tres cuartas partes de su altura normal.

Al final del estado Pain hemos puesto Goto See, porque no queremos que el monstruo se quede parado con la mueca de dolor al recibir un disparo, ¿no? Y al final del estado Death hemos escrito PPOS N -1, y en la siguiente línea Stop. Esto hace que nuestro zombi se quede quieto en el suelo una vez muerto.

Para terminar, cerramos los corchetes:

  }
}

Bueno, creo que ha sido divertido eso, ¿verdad? Ahora lo que necesitamos es el proyectil que disparará el zombi —PersoPlasma—. Pues bien, su código es el siguiente:

ACTOR PersoPlasma
{
  Radius 13
  Height 8
  Speed 35
  Damage 5
  PROJECTILE
  SpawnSound "weapons/plasmaf"
  DeathSound "weapons/rocklx"
  DontHurtShooter
  States
  {
    Spawn:
      PPFA AB 5 Bright
    Death:
      PPFX A 3 Bright A_Scream
      PPFX BCDEFG 3 Bright
      PPFX G 3 Bright
      Stop
  }
}

Bueno, en resumen, el script completo nos quedaría así:1

ACTOR PlasmoZombie 20002
{
  Health 30
  PainChance 100
  Speed 10
  Radius 32
  Height 56
  SeeSound "grunt/sight"
  PainSound "grunt/pain"
  DeathSound "grunt/death"
  ActiveSound "grunt/active"
  Obituary "%o ha sido derretido por un zombi."
  MissileType PersoPlasma
  DropItem PlasmaCell
  MONSTER
  States
  {
    Spawn:
      PPOS AB 10 A_Look
      Loop
    See:
      PPOS ABCD 4 A_Chase
      Loop
    Missile:
      PPOS E 10 A_FaceTarget
      PPOS F 4 A_MissileAttack
      PPOS E 4
      PPOS F 4 A_MissileAttack
      PPOS E 4
      PPOS F 4 A_MissileAttack
      PPOS E 10
      Goto See
    Pain:
      PPOS G 10 A_Pain
      Goto See
    Death:
      PPOS H 3 A_Scream
      PPOS I 3
      PPOS J 3 A_Fall
      PPOS K 3
      PPOS L 3
      PPOS M 3
      PPOS N 3
      PPOS N -1
      Stop
  }
}

ACTOR PersoPlasma
{
  Radius 13
  Height 8
  Speed 35
  Damage 5
  PROJECTILE
  SpawnSound "weapons/plasmaf"
  DeathSound "weapons/rocklx"
  DontHurtShooter
  States
  {
    Spawn:
      PPFA AB 5 Bright
    Death:
      PPFX A 3 Bright A_Scream
      PPFX BCDEFG 3 Bright
      PPFX G 3 Bright
      Stop
  }
}

Bueno, creo que hemos terminado. Creamos los sprites necesarios —PPOS, PPFX, PPFA—, al menos si queremos que nuestro zombi tenga un nuevo aspecto, y lo probamos en el juego. Si lo hemos hecho bien, tendremos un zombi que disparará tres proyectiles de plasma.

Quién tenga dudas puede ver este "plasmozombi" en acción en el mapa de ejemplo; simplemente cargadlo en Doom 2 usando Zdoom o GZdoom, y empezad a jugar una partida del modo acostumbrado... Un puñado de "plasmozombis" os esperan:

Combatiendo contra los plasmozombis

¡Bien hecho! Has completado la lección 3. Ahora pasa a la siguiente lección; nos complicaremos mucho esta vez...


NOTAS...

1 La propiedad SpawnSound que aparece en el script de ejemplo —en la parte donde se especifican las características de los disparos del "plasmozombi"— puede resultar problemática en Zdoom. Al menos yo lo he intentado corriendo la versión 2.1.1 de Zdoom en Linux, para encontrarme con el siguiente error:

Script error, "DECORATE" line 56:
"spawnsound" is an unknown actor property

La solución más obvia que se me ocurre —al menos hasta que Jack the Ripper explique este detalle— sería simplemente no usar esta propiedad. De todas formas sospecho que podría sustituirse por SeeSound, como se muestra en el script de ejemplo que aparece en el prólogo de este tutorial.


Cumple con el estándar HTMLCumple con el estándar CSSApta para cualquier navegador

Podéis copiar libremente cualquier contenido de esta página. Si se trata del texto o las imágenes, mencionad la fuente (www.arcades3d.net)...