Scripts: Teoría básica

Comandos obligatorios y ejemplos más o menos sencillos.
Scripts: Teoría básica Usa scripts para crear códigos

Cualquier videojuego actual es como una película interactiva, y por lo tanto tiene un guión. Pero al referirnos a la interactividad, el guión de cada evento cobra más importancia, porque dependerá de las demás acciones, si ya se han ejecutado para, sobretodo, conseguir coherencia en la historia. Además muchas de esas acciones deberán ser ejecutadas una sola vez, por lo que la cosa se complica. En esta guía se muestra solamente un punto de partida para crear scripts más o menos decentes, puesto que es una materia muy difícil de aprender y muy difícil de enseñar. Así, mostraré scripts desarrollados de las cosas más solicitadas por la gente, y daré nociones básicas para que puedas crear scripts buenos. Ten en cuenta que esto se trata de lógica, de leer las opciones que tienes y encadenarlas coherentemente. Ah, por cierto: estaré usando Rubikon Scripted y Elitemap, de Kyofu Kawa. Ambos están incluidos en  Elitemap 3.6.

Empezamos a crear un script

La creación de scripts se basa en consultar fuentes de información. Con Elitemap 3.6, estas son las fuentes de información que podemos aplicar a los guiones:

  • Los archivos *.rbh: std, stditems, stdpoke. Son archivos que pueden compilarse a la par que nuestro guión (El archivo std suele incluirse por defecto). Se basan en el comando de rubikon #define, que le da un nombre específico a ciertos valores. Abrelos con el bloq de notas para echarle un vistazo, y encontrarás cosas como que hay flags (banderas) para habilitar el POKéNAV o la POKéDEX. Además stditems y stdpoke contienen una lista de los objetos y los Pokémon, que puedes aplicar en otras cosas. Inclúyelos en tu script con el comando #include [nombre del arhivo (que esté en la misma carpeta)]
  • Algunos archivos rbc que ya vienen incluidos, como es el richboy.rbc. Pueden servirte de ejemplo.
  • El más importante: commands.html. Aquí tienes la lista de casi todos los comandos que hay en rubikon (queda, por ejemplo, killscript, que es absurdo, como deducirán los que sepan inglés) además de su equivalente hexadecimal (rubikon lo que hace es transformar el texto que tu escribes a hexadecimal). Consúltalo siempre que vayas a hacer un script, para ver ejemplos y demás. No está actualizado del todo, así que hay ejemplos que quizás no sean correctos, etc. Pero es la base más importante a la hora de escribir guiones, no lo olvides
  • ROM. Sí, comprueba los eventos del rom con EM para buscar cómo lo hicieron los de Nintendo.

Bien. Ahora es la hora de empezar a escribir. Actúa con lógica y piensa siempre qué estás haciendo, y cuando acabes un guión leelo e intenta seguirlo. Hay algunos comandos que no están bien programados, y por ello a veces debes escribir #raw [hexa del comando] si ves que aunque coincide con el ejemplo de commands.html el programa te da error (por ejemplo, una vez no me funcionaba el comando waitfanfare y escribí #raw 32. Aquí va lo básico:

  • ' - incluye un apóstrofe antes de cualquier cosa que no quieras que sea compilada, como es una nota.
  • #org 0x[6dígitos-dirección] - indica donde empiezas a escribir ¡No te olvides de incluirlo o te empezará a escribir en el principio del rom, con lo cual te lo destrozará!
  • #auntobank on –no es necesario incluirlo puesto que el archivo std.rbh se incluye por defecto y este incluye este comando, pero por motivos de seguridad, puedes añadirlo al principio de tu script si usas Scripted.
  • nop – ¿absolutamente nada? ¡Un nop me ha salvado de estar toda mi vida peleando con un script! Equivale a escribir #raw 00. Cumplen similar función #raw 01 o #raw C6.
  • End – acaba el script
  • Goto, call, jump – saltan a otra posición

Además, mientras compilas te darás cuentas que necesitarás usar flags o variables, básicamente las primeras. Las flags son valores asignados a cada evento que puede estar activada (1) o desactivada (0). Cualquier otro valor inhabilitará el evento. Actívalas o desactívalas con clearflag o setflag (yo necesité escribir a continuación #raw 0x01 para un setflag, ¡aviso!) El estado de un flag no afecta al evento, pero sí puedes utilizarlo con checkflag para mirar este valor y hacer cosas dependiendo si está activada o no. Además puedes cambiar el valor por defecto del evento o el número del flag en ELITEMAP. Observa este ejemplo:

#org 0x[offset script principal]
jingle ‘básicamente esto no hace ná, pero queda bonito que haya algo antes de todo.
checkflag 0x[flag del evento] ‘comprobar el estado del flag.
if 0x1 call 0x[Sansacabó] ‘si está activada, ir a Sansacabó
goto 0x[offset núcleo] ‘si no, ir al núcleo
end

#org 0x[offset núcleo]
release ‘muchas veces el personaje se bloquea, así sigue caminando
‘[núcleo del evento, incluye aquí la acción que quieras que se ejecute]
setflag 0x[flag del evento] ‘activa la flag
#raw 0x1 ‘lo que decía antes]
end ‘se acabó

#org 0x[Sansacabó]
release
end 

Ten en cuenta que las flags tienen cuatro dígitos y las direcciones (offsets), seis.

Entonces, este evento lo que hace es que la primera vez que se ejecute el script, ocurra lo que escribas en núcleo, y al activarse la bandera, cuando se vuelva a ejecutar, como el evento comprueba el estado de la bandera, las siguientes veces no ocurrirá nada.

Principales eventos que puedes compilar, con explicación.

MOSTRAR UN TEXTO, preguntar sí o no e ir a una dirección diferente en cada caso.
#org 0x[offset script principal]
message 0x[offset texto] ‘se puede escribir con el commando “=”, pero conviene 
   mucho más hacerlo manualmente con editor hexadecimal
boxset BOXSET_YESNO ‘o 0x05, ambas formas están aceptadas. Hace que se pregunte SI/NO
if B_NO goto 0x[offset script no] ‘si se responde que no, ir al script de "no"
goto 0x[offset script sí] ‘si se responde que sí, ir al script sí. Puedes escribirlo aquí 
directamente, pero personalmente prefiero mandarlo a otro script.
BATALLA CON UN Pokémon. ¡Vamos a cazar un jirachi!
#org 0x[offset script principal]
#include stdpoke.rbh ‘si no lo includes, en vez de PKMN_JIRACHI debes escribir 409,
   y personalmente no estoy muy seguro de esto. También puedes escribir
   antes “#define PKMN_JIRACHI 409”, al fin y al cabo esto es lo que necesitamos del stdpoke.rbh.
checkflag 0x[FLAG]
if 0x1 goto 0x[offset ya activada]
cry PKMN_JIRACHI
message 0x[offset texto] ‘Ej: JIRACHI: ¡raaaaaaashi!
boxset 0x6 ‘cerrarse la ventana al pulsar A
wildbattle PKMN_JIRACHI 70 3 
End

#org 0x[offset ya activada]
release ‘si ya ocurrió el evento solo release
end

Como puedes comprobar, los guiones son complicados de explicar. Se aprende mucho más probándolo tú mismo, así que actua con sapiencia y paciencia... y todo lo que acabe en –encia y no te preocupes si no te sale.