27933-GBA_|_Scripting_|_Un_script_con_guión_para_rookies_con_experiencia
#0
DragonBourne 28696
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://wahackforo.com/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


Dividiremos la situación en tres scripts:
[LIST=1]
  • El encuentro con la chica
  • La advertencia y ayuda del muchacho
  • La batalla contra Duskull
  • [/LIST]

    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:

    Los comandos "especiales" a utilizar son:



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

    El script completo se vería así:

    #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:

    Las funciones:

    Script time
    #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.
    #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:

    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:
    #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:
    #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:


    Y usaremos los comandos:

    Este es relativamente el script más simple.
    #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:
    #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?
    #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