Registrarse

[Script] GBA | Scripting | Un script con guión para rookies con experiencia

DragonBourne

Estado:Aprendiendo
Hola a todos!

Vengo en son de paz a hacer público un tuto de scripts basado en un script, con un guión básico, pero guión al fín, en el cual plasmaré muchos comandos, y enseñaré como usarlos, todo en torno al guión :D

Este tuto esta destinado a hackers de cualquier nivel de aprendizaje, entonces, al abarcar a novatos, habrá funciones explicadas ;)

Antes que nada, quiero acreditar y agradecer a Ciro por su genial tutorial, mi diccionario, manual de instrucciones, etc., etc., etc.,...
http://whackahack.com/foro/t-12807/tutorial-sobre-scripts

(no puedo bajar el video al foro, asi que explicaré el guión :awesome:)

Un muchacho entra feliz a su casa, y se dirige a su cuarto para poner su reloj nuevecito en hora, pero... ¡OH!¡SORPRESA! Una piedra enorme bloquea el camino hacia su recámara.

Al lado de la piedra, hay una joven muchacha, que le pregunta si quiere que lo teletransporte a su cuarto. El joven, extrañado, se niega, pero la chica le responde que no tiene elección, y hace su voluntad.

Ya en su pieza, el pobrecillo se encuentra con un hombrecito que le advierte sobre la presencia de un maligno Duskull en su propiedad, y menciona sus escalofriantes antecedentes como fantasma.

Debe derrotarlo, y ambos lo saben, entonces el bienintencionado intruso le otorga un Murkrow y cinco Super Pociones para la batalla contra el vil ente, la cual el joven gana, y libera su cuarto de su molesta presencia.

Con su reloj en hora y el muchacho agradeciendole, baja al comedor, y con la piedra y la muchacha desaparecidas, se plantea si ella era el fantasma...


Buuuu.... Escalofriante, no? fufufufufufufu :s

Bueno, ahora vamos al tema de interes... ¿Como concretamos este evento?

Para hacerlo necesitamos
  • XSE (si es 1.1.1, mejor)
  • Advance Map
  • Tener conocimientos básicos de scripting, como por ejemplo como hacer un script básico de diálogo, y como ordenar los comandos del XSE

Dividiremos la situación en tres scripts:
  1. El encuentro con la chica
  2. La advertencia y ayuda del muchacho
  3. La batalla contra Duskull

Estos tres, a pesar de estar separados, NO son independientes, ya veremos por qué...

1:EL ENCUENTRO CON LA CHICA

Para este script haremos uso de:
  • Diálogos
  • Caja de Si/No (Pregunta;respuesta)
  • Flags (Variables, es decir, simplemente datos (escritos en sistema de numeración hexagesimal) con información que varía segun su valor, en su caso 0x0:False o desactivada y 0x1:True o activada)
  • Otros mapas ajenos al del escenario

Los comandos "especiales" a utilizar son:

  • checkflag (controlar estado de la flag)
  • if (si pasa tal cosa, pasará tal otra)
  • message (un dialogo, que puede tener varias alternativas, algunas explicadas más adelante)
  • compare (revisar, comprobar si una variable tiene tal valor)
  • warp (transportar de un lugar a otro)
  • hidesprite (esconder un sprite, hacerlo desaparecer)

Este script es un script común, uno de "diálogo".

El script completo se vería así:

Código:
#dynamic 0x800000

#org @start
checkflag 0x500
if 0x1 goto @st2
lock
faceplayer
message @tyn 0x5
compare LASTRESULT 0x1
if 0x1 goto @sty
if 0x0 goto @stn
release
end

#org @sty
message @ty 0x2
warp 0x1 0x1 0x1 0x05 0x02
end

#org @stn
message @tn 0x2
warp 0x1 0x1 0x1 0x05 0x02
end

#org @st2
hidesprite 0x7
hidesprite 0x6
release
end

#org @tyn
= I see you've noticed about the\nstone that blocks your room.\pDo you want me to teleport you to\nyour clock?

#org @ty
= Fine, here i go!

#org @tn
= Ok...\pBut you have no choice.\p\v\h01:!!!
Y ahora, hora de las explicaciones!
(si no entienden que significan los punteros, son abreviaciones de las situaciones en ingles xD)

Antes que nada, tenemos que añadir los scripts a precisar en el mapa, en AdvanceMap: añadiremos dos personas más (una debajo de la escalera al 1º piso, y otra debajo de la anterior) en la planta baja de nuestra casa, y dos personas, un warp debajo del reloj y un script de gatillo debajo del warp en el primer piso, y a las personas añadidas, darles el sprite correspondiente. Una vez hecho, darle el libreto a la piedra, es decir, le pondremos el offset o dirección de toda piedra movible por fuerza (o destructible por golpe roca, si así lo desean), la cual extraeremos (Ctrl+C;Ctrl+V) de un mapa que tenga por lo menos un ejemplar de la especie deseada. Yo extraje la dirección de una piedra de la Cueva Cardumen.

Es sabido que #dynamic 0x800000 es algo imprescindible en un script, comparable con la fecha y el nombre del alumno en un examen.

Luego del offset, daremos inicio al script en el puntero @start Ahora, el juego controlará el estado de la flag 0x500 (checkflag 0x500), y si (if) esta está activada (0x1, como expliqué antes), el juego dirigirá la ejecución del script (goto) hacia el puntero @st2, para que se realicen las acciones alli escritas, las cuales revisaremos luego, siguiendo el guión (todo a su tiempo se ha de hacer). "Lock" se encargará de bloquear el movimiento del entorno, para que nuestro script se desarrolle con normalidad. "Faceplayer" hara que la persona a la que le estamos dirigiendo la palabra nos mire a la cara. Ahora se abrirá el diálogo, el mensaje, la parla, en que ella nos dirá (traducción, para los que no entienden english xD):

-Veo que te diste cuenta de la piedra que bloquea la entrada a tu cuarto
¿quieres que te teletransporte a tu reloj?

Este mensaje, ha de ser de tipo 0x5, tipo de mensaje que abrirá la caja de "Si/No". Abierta la caja, y respondida la pregunta de la joven paranormal, el comando compare controlará cual ha sido nuestra respuesta(LASTRESULT 0x1, o sea, revisa si decimos que si), y habrán dos dialogos disponibles:

(si le decimos que sí:0x1)-De acuerdo,¡Aquí voy!
(pero si le decimos que no(*CHAN CHAN):0x0...)-Bueno...
pero no tienes elección.
\v\h01(código que en el juego nombra al jugador):!!! (que vendria a ser como un "Ohhh! Noooooooooo! :( " xDDDD)

Ambos diálogos (del tipo 0x2, un dialogo normal como el 0x6, pero con el faceplayer incorporado. Lo uso por una simple precaución :blush:) nos llevaran a que la chica nos teletransporte al reloj: warp 0x1(banco en que se ubica el mapa al que nos llevará) 0x1(número de mapa al que nos llevará) 0x1(número de evento del warp) 0x05(coordenadas en el eje X) 0x02(coordenadas en el eje Y)

Ya tenemos cubierta una sección, pasemos a la segunda:

2:LA ADVERTENCIA Y AYUDA DEL MUCHACHO

En este script de gatillo/baldosa(los que se abren cuando pisas una baldosa específica), en los que cabe destacar que no se utilizan los comandos lock, faceplayer y release(salvo en una ocasión explicada luego), por ser innecesarios. Utilizaremos:
  • Diálogos
  • Variables
  • Movimientos (de aquí para allá)
  • Movimiento de Cámara
  • Dar POKéMON
  • Dar Objeto
  • Flags
Las funciones:
  • compare
  • if
  • pause (que detiene el script por un rato)
  • applymovement (hacer que una persona se mueva)
  • waitmovement (esperar a que una persona se termine de mover.Es fundamental, porque si no ponemos este comando, lo más posible es que el movimiento no se realice y se pase al siguiente comando, dado a que la máquina no puede hacer muchas cosas a la vez)
  • special (abre el telón a una ocasión especial, en este caso, encabeza el movimiento de la cámara)
  • givepokemon (la persona a la que estamos hablando nos da un pokemon)
  • giveitem (la persona a la que estamos hablando nos da un objeto)
  • setflag (instala una flag)
  • addvar (añade cierta cifra al valor de la variable)
  • #raw (precede al código de un movimiento, el cual puedo saber con el programa Move It, o algún otro)
Script time
Código:
#dynamic 0x800000

#org @start
compare 0x5000 0x1
if 0x1 goto @inicio2
applymovement 0xF @mv1
waitmovement 0xF
pause 0x25
applymovement 0xF @mv2
waitmovement 0xF
message @tlk1 0x2
special 0x113
applymovement MOVE_CAMERA @movcam
waitmovement 0x0
applymovement 0xFF @mvlookup
waitmovement 0xFF
message @tlk2 0x2
applymovement MOVE_CAMERA @movcam2
waitmovement 0x0
special 0x114
applymovement 0xFF @mvlookbien
waitmovement 0xFF
message @tlkgvpk 0x2
givepokemon 0xC6 0xF 0x0 0x0 0x0 0x0
setflag 0x800
message @tlkprebtl 0x2
giveitem 0x16 0x5 0x0
message @tlkfin 0x2
addvar 0x5000 0x1
end

#org @inicio2
release
end

#org @mv1
#raw 0x1
#raw 0x56
#raw 0xFE

#org @mv2
#raw 0x9
#raw 0x9
#raw 0xFE

#org @movcam
#raw 0xB
#raw 0xB
#raw 0x9
#raw 0x9
#raw 0xFE

#org @mvlookup
#raw 0x3
#raw 0xFE

#org @movcam2
#raw 0x8
#raw 0x8
#raw 0xA
#raw 0xA
#raw 0xFE

#org @mvlookbien
#raw 0x0
#raw 0xFE

#org @tlk1
= ...:Hey! Notice that there is a\nghost in your room!

#org @tlk2
= This ghost is very powerful, and\nit's very known for putting stones\lin kids rooms' doors, teleport them to their rooms, with no help, and taking\lthem to an unknown place.

#org @tlkgvpk
= You must defeat him.\pHere, take this POKéMON, it's not\nas powerful as the ghost, but it's\lnot weak.

#org @tlkprebtl
= You will need these potions too

#org @tlkfin
= Go for it!
Lo primero que vamos a hacer es preparar el script de gatillo ubicado abajo del warp (en AMap) de forma que si en el punto en que nos transportamos damos un paso hacia abajo, comenzará el script. Para que esto suceda con éxito, tenemos que poner en la casilla "desconocido" en la parte de arriba de la lista de datos del script de gatillo, pondremos "0003". ¿Por qué? No lo se, simplemente es necesario; en la casilla "Var number", escribiremos una variable, de la cual haremos uso en este script: usaremos la variable "5000"; y la casilla "Var value", el valor de la variable, la podemos dejar en blanco.

Bueno, vamos a los comandos.

En primer lugar, lo primero que el juego va a hacer es verificar (compare) si la variable 0x5000 tiene el valor de 0x1, y si es así (if), irá(goto) al puntero @inicio2, que al solo tener los comandos release y end, hará que al pisar nuevamente esa baldosa, nada suceda*.

Ahora, applymovement moverá a la persona 0xF(15 en hexagesimal), y los datos de su movimiento estarán separados, en el puntero @mv1.
Código:
#org @mv1
#raw 0x1
#raw 0x56
#raw 0xFE
¿Qué significa todo esto?
Son códigos que representan la ejecución de un movimiento, que en este caso son:
  • #raw 0x1 (que hace que el individuo ajeno mire hacia arriba)
  • #raw 0x56 (que hace que le brote un signo de exclamación en la cabeza)
  • #raw 0xFE (En todo puntero de movimientos, este es el que siempre para el carro... o sea, finaliza los movimientos)
Luego esperaremos (waitmovement) a que el movimiento se termine de realizar para pasar al siguiente comando: pause, que hara que el chico no se mueva hasta pasado el tiempo 0x25 (1 1/4 de segundo, dado a que 20 representa 1 segundo).

Ahora el muchacho se volverá a mover:
Código:
#org @mv2
#raw 0x9 (paso hacia arriba)
#raw 0x9 (otro paso hacia arriba)
#raw 0xFE
y nos dirá:

-¡Oye! ¡Hay un fantasma en tu cuarto!

A lo que sucederá el apunte de la cámara hacia el vil fantasma (buuuuuuu...).
En primer lugar, lo que abre este acontecimiento es el comando special 0x113 (en RUBY, en ESMERALDA es 0x116). Luego haremos que la cámara se mueva (applymovement MOVE_CAMERA) como si fuera un personaje invisible que sale desde el nuestro. En este caso, le haremos dar dos pasos hacia la derecha (#raw 0xB dos veces) y dos hacia arriba (#raw 0x9 dos veces), y ahí se terminará de mover. Esperaremos, (waitmovement 0x0) y luego el personaje mirará hacia el fantasma (0xFF es el código a usar para mover al personaje principal, y #raw 0x3 es mirar hacia la derecha), y el chico nos hablará:

-Este fantasma es muy poderoso, y conocido por poner rocas en cuartos de niños, teletransportarlos a sus cuartos, sin salida, y luego llevarselos a un lugar desconocido...

!Brrrrr!¡Se me hiela la sangre!(¡maldita niña fantasma!). Pero dejando los temores de lado, volvamos a lo serio. Luego de este mensaje, la camará volverá sobre sus pasos hacia el personaje:
Código:
#org    [MENTION=13564]mvc[/MENTION]am2
#raw 0x8 (paso abajo)
#raw 0x8
#raw 0xA (paso izquierda)
#raw 0xA
#raw 0xFE
Y el protagonista(0xFF) volverá a mirar hacia abajo(0x0), hacia el otro joven, que nos dirá que debemos detener al fantasma, y que nos dará un pokemon no tan poderoso como el fantasma, pero que podrá derrotarlo: un Murkrow al nivel 15: givepokemon 0xC6(El número de murky en la pokedex nacional en hexagesimal) 0xF(De nivel 15, en hexagesimal) 0x0(Dado a que no llevará ningun objeto. Si quiero añadirle un objeto, abriré la lista "stditems", y extraeré los códigos de allí) 0x0 0x0 0x0(estos tres parámetros solo rellenan el resto del givepokemon).

También nos dará cinco superpociones, diciendo que las necesitaremos: giveitem 0x16(número hexagesimal de la superpoción, que se puede encontrar en la lista "stditems") 0x5 (cantidad a recibir en hex) 0x0(tipo de mensaje en que se nos avisará de la recepción del/los objeto/s. OJO, no significa que debamos quitar el 0x2/0x6 del diálogo anterior, sino que añadiremos ese diálogo en el giveitem, que es el que nos dirá "El jugador recibió una SUPERPOCIÓN". 0x0 es el tipo de mensaje a usar cuando alguien te da el objeto, y 0x1 es el mensaje de la pokebola tirada en el piso).

El chico nos dirá que vayamos a por ello, y luego, se añadirá (addvar) a la variable 0x5000 el valor de 0x1.
*No es necesario hacer el if que envía al @inicio2 ¿por qué? porque la variable predeterminada del script de gatillo es 0; si esa variable tiene otro valor, el script de gatillo no se ejecutará.

Y ahora...
LA FRUTILLA DEL POSTRE!

3:LA BATALLA CONTRA DUSKULL

Este script también es "de diálogo". En el precisaremos:

  • Diálogos
  • Batalla contra un pokemon salvaje
  • Flags
Y usaremos los comandos:
  • wildbattle
  • hidesprite
  • setflag (que instala/activa una flag)
Este es relativamente el script más simple.
Código:
#dynamic 0x800000

#org @start
lock
message @tkdusk 0x6
wildbattle 0x197 0x14 0x0
hidesprite 0x10
setflag 0x500
release
end

#org @tkdusk
= Dussssskk\p(Hahahaha... you won't defeat me)
Ya todo lo inicial es conocido: message, puntero, tipo 0x6(normal), bla, bla...
Lo que realmente nos importa es el WILDBATTLE.
Los parametros son: wildbattle 0x197(número de Duskull en la pokedex nacional, y les dejo la duda sobre en qué sistema de numeración está escrito ;)) 0x14(nivel 18) 0x0(sin ningún objeto).

Luego de esta batalla, lo inmediato es esconder el sprite (hidesprite 0x10). Pero... ¡VUELVEN A APARECER!¡Fantasma tramposo! ¡Pero no se amargue! todo tiene solución :)
En la "lista de datos" del evento (AMap), hay una casilla que dice "People ID". En esa casilla copiaremos la flag que usaremos en este script (0x500, enseguida la revisaremos). U mad Duskull?
Ahora, el vínculo que une a este script con el primero (recordemos que no son independientes, este es el porque): setflag 0x500. La flag 0x500 se activa, dando lugar a que se concreten todas las condiciones que a ella se atan. Si volvemos un poco en el tiempo, al principio del 1º script:
Código:
#org @start
checkflag 0x500
if 0x1 goto @st2
Repasemos...

Aquí, checkflag controla el estado de la flag 0x500; si(if) esta está activada(0x1), el script ejecutará los comandos(goto) del puntero @st2.

¿Y que había en @st2?
Código:
#org @st2
hidesprite 0x7
hidesprite 0x6
release
end
Lo mismo que le pasó a Duskull, pero con la niña (persona nº 6 en el mapa) y la piedra (persona nº 7 en el mapa): Desaparecen de la faz de nuestro rom (siempre y cuando recordemos poner la flag 0500 en su People ID).

También pueden añadir otro script de diálogo al muchacho de la planta alta, para que no le coman la lengua los ratones luego de que nos hable: Un checkflag 0x500, un if 0x1 goto @inicio2, un message "Ve a por ello" antes de la flag, y un "¡Lo lograste!¡Gracias!" en el puntero @inicio2, o sea despues de activada la flag.

Y así termina este tutorial, espero que les haya gustado, entretenido, y que hayan aprendido algo interesante. :D

Saludos, gente! :D
 

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
Respuesta: Un script con guión para rookies con experiencia

Hombre, pues me gusta la idea. Es una forma original y práctica de mejorar o aprender a scriotear, así que enhorabuena, me gusta mucho ;)
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Un script con guión para rookies con experiencia

Creo que despues de pensar y analizar bien, concluyo que aqui no va, asi que muevo a galeria de scripts.
 

Sayer301!

UnityLord!
Miembro de honor
Respuesta: Un script con guión para rookies con experiencia

¿Que version de XSE has usado tu para este tuto?
A mi el comando "message" no me sale como disponible en XSE 1.1.1

Fuera de eso, buen tuto, espero que sirva a aprender a scriptear a muchos.
 

DragonBourne

Estado:Aprendiendo
Respuesta: Un script con guión para rookies con experiencia

Yo usé el XSE 1.1.1, que te busca los comandos por palabras precisas, asi que si pones solamente "message", no te va a aparecer, porque en la lista en que aparece, ese comando aparece como "msgbox,message", (message y msgbox son sinónimos),asi que si pones msgbox en la lista de comandos, te va a aparecer :)
Gracias por opinar y comentar a todos! :D un abrazo grande!
 
Arriba