domingo, 15 de marzo de 2009

Scripts: Teoría básica

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-puntero] 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, añádelo al principio de tu script

nop – ¿absolutamente nada? ¡Un nop me ha salvado de estar toda mi vida peleando con un script! No lo compiles directamente, es mucho mejor escribir #raw 00 o #raw 01 o #raw C6, para saber qué estás escribiendo.

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:

#autobank on

#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í que pongo esto para que luego siga 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 ‘San se acabó!

Ten en cuenta que las flags tienen cuatro dígitos, y los punteros (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 si sí o si no e ir a un diferente offset en cada caso.

#org 0xGGGGGG

#include std.rbh ‘se incluye por defecto, pero…

message 0xHHHHHH ‘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 0xIIIIII ‘si se responde que no, ir a IIIIII

goto 0xJJJJJJ ‘si se responde que sí, ir a JJJJJJ. Puedes escribirlo aquí directamente, pero personalmente prefiero mandarlo a otro script.

BATALLA CON UN Pokémon. ¡Vamos a cazar un jirachi!

#org 0xGGGGGG

#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 0xFLAG

if 0x1 goto 0xHHHHHH

cry PKMN_JIRACHI

message 0xIIIIII ‘Ej: JIRACHI: ¡raaaaaaashi!

boxset 0x6 ‘cerrarse la ventana al pulsar A

wildbattle PKMN_JIRACHI 70 3

End

#org 0xHHHHHH ‘Yo aquí opto por el método “Sansacabó”, pero si lo vas a hacer con un evento de “people”, busca otros eventos del juego para ver cómo lo hicieron los de Nintendo, para que desaparezca el sprite. Comprobando a Rayquaza, me di cuenta de que lo hicieron mediante el script del nivel. Quizás puedas poner el flag del evento en 2 mediante la trampa: setvar 0xFLAG 0x2, que inhabilita las cosas. Me pillas desprevenido y sin ganas de comprobarlo, te toca a ti trabajar, que a mi no me enseñó nadie.

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.

No hay comentarios: