LECCIÓN 4:
La Pajillera

Nuestra primera arma creada con Decorate

En lecciones anteriores hemos visto cómo hacer una lámpara que brille sin depender de la iluminación del sector en el que está colocada. Luego hemos hecho nuestro primer monstruo, un zombi que lanza tres cargas de plasma. Ahora lo que vamos a aprender a hacer es un arma con la que nuestro marine acribille a sus víctimas.

Lo que vamos a hacer hoy será la escopeta del Doom 3. Recordad que las armas personalizadas necesitan el Community Build de Zdoom, o bien el puerto GZdoom.

Aviso que algo podría fallar en este código, pues creo que han borrado la sección de nuevas armas del wiki de Zdoom. Y además, con la memoria de pez que tengo, vamos... (Pues no, no lo han borrado. Al menos lo he encontrado).

Muy bien, al grano. Lo primero de todo:

ACTOR EscopetaDoom3 : Shotgun 20024
{

Los dos puntos y la palabra "shotgun" indican que nos vamos a basar en el ítem de la escopeta; esto se llama en inglés inheritance. Es necesario que nos basemos en un arma de las ya existentes si queremos crear otra.

Ahora escribimos lo siguiente:

  Weapon.SelectionOrder 350
  Inventory.PickupSound "misc/w_pkup"
  Weapon.AmmoGive 8
  Weapon.AmmoUse 1
  AttackSound "weapons/dsshtgnf"

Weapon.SelectionOrder sirve para ordenar las armas según la munición que tengamos. Por ejemplo, si no tenemos cartuchos no querremos usar esta escopeta del Doom 3. Inventory.PickupSound sirve para definir el sonido que sonará cada vez que cojamos este arma del escenario. Weapon.AmmoGive es la munición que dará cuando la encontremos, y Weapon.AmmoUse la que usa en cada disparo. AttackSound será su sonido cuando dispare —esta propiedad también suele ser utilizada con monstruos—.

Ahora añadiremos el siguiente texto:

  States
  {
    Spawn:
      D3SH A -1
      Loop

Hemos llegado a los estados, y éste —Spawn— hace referencia a cuando el arma está en el suelo, disponible para que alguien la coja.

Y ahora:

    Ready:
      D3SG A 1 A_WeaponReady
      Loop

Ready es cuando tenemos el arma en nuestras manos lista para disparar. Nótese que se debe poner la propiedad A_WeaponReady para definir la acción de poder disparar en cualquier momento.

Escribimos a continuación:

    Deselect:
      D3SG A 1 A_Lower
      Loop
    Select:
      D3SG A 1 A_Raise
      Loop

Deselect y Select indican, respectivamente, cuando bajamos la escopeta para usar otro arma, y cuando la seleccionamos. Fíjate en A_Lower y A_Raise, pues son importantes para que funcionen estos estados correctamente; se refieren al movimiento de bajar y levantar el arma.

RECORDAD: Hay que poner Loop siempre hasta aquí.

Ahora viene la parte interesante, la acción de disparar. Escribimos lo siguiente:

    Fire:
      D3SG A 0 A_JumpIfNoAmmo (1)
      D3SG A 6 A_GunFlash
      D3SG B 4
      D3SG C 4
      D3SG D 34
      D3SG E 2
      D3SG F 2
      D3SG G 8
      D3SG F 2
      D3SG E 2
      Goto Ready
    Flash:
      D3SF A 6 A_FireBullets (10,10,15,30,0,1)
      Stop

Fire es el estado de disparo del arma, y Flash simplemente el efecto del disparo; lo que hace es disparar las balas. En el primer frame de Fire, tenemos el Code Pointer de A_JumpIfNoAmmo; esto determina si el arma tiene munición, y si no es así, cambia de arma.

Luego, en el frame siguiente tenemos A_GunFlash, cuya función es que el arma dispare.

Hay un Code Pointer en el estado Flash que creo que es específico de GZdoom, A_FireBullets. Según parece, este arma usa comandos —los números entre paréntesis—. El primero es el espacio que ocupa el disparo horizontalmente, y el segundo el que ocupa en vertical. El tercero es el número total de balas a disparar —no tiene que ver con la munición que gastemos—, y el cuarto el daño de cada una. El quinto número indica el tipo de "ricochet" —rebote— que hace; he puesto el cero, que es el normal de Doom. El sexto es un valor de control —puede ser 0 o 1— que dice si usamos munición al disparar (1) o no (0). Luego podría haber un séptimo número, opcional, que será el rango que alcanzan los disparos.

Y al final, cerramos corchetes:

  }
}

El script completo debería ser algo así:

ACTOR EscopetaDoom3 : Shotgun 20024
{
  Weapon.SelectionOrder 350
  Inventory.PickupSound "misc/w_pkup"
  Weapon.AmmoGive 8
  Weapon.AmmoUse 1
  AttackSound "weapons/dsshtgnf"
  States
  {
    Spawn:
      D3SH A -1
      Loop
    Ready:
      D3SG A 1 A_WeaponReady
      Loop
    Deselect:
      D3SG A 1 A_Lower
      Loop
    Select:
      D3SG A 1 A_Raise
      Loop
    Fire:
      D3SG A 0 A_JumpIfNoAmmo (1)
      D3SG A 6 A_GunFlash
      D3SG B 4
      D3SG C 4
      D3SG D 34
      D3SG E 2
      D3SG F 2
      D3SG G 8
      D3SG F 2
      D3SG E 2
      Goto Ready
    Flash:
      D3SF A 6 A_FireBullets (10,10,15,30,0,1)
      Stop
  }
}

Lo probamos, y si todo va bien, aparecerá el arma en el suelo, y cuando la cojamos podremos disparar con ella...

¡Bien! ¡La Fuerza es intensa en ti! En un poderoso Sith del Decorate te convertirás... Ahora pasamos a la lección más interesante del tutorial: Cosas chulas y avanzadas.

...Creo que he visto demasiado Star Wars :risa:.


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)...