Registrarse

[Scripting] Tutorial sobre Script : Movimientos de Npc

Gold

Porrero a tiempo parcial
Miembro insignia
Primero que nada, hola a todos (?), bueno, muchos de ustedes se preguntarán ¿Otro tutorial sobre scripts? pues si, es otro tutorial sobre scripts, todos conocen el tutorial de scripts de Ciro, esta bien hecho y ha ayudado a muchisimos novatos. El motivo de hacer este tutorial es debido a que Wah carece de un tutorial completísimo sobre scripts, al tuto de Ciro le faltan varios comandos esenciales, y los demás tutoriales no explican otros comandos no usados.

Asi que señoras y señores, con ustedes el tutorial de scripts de Ruki, espero que a los novatos les sea útil c:

Primero que nada...
¿Que es un script?

Según la enciclopedia de WAH, tenemos que los scripts son códigos escritos en numeración hexadecimal, estos permiten formar diversos eventos, un script se forma con el entrelazo de varios comandos, para compilar un script sin tener que usar un editor hexadecimal se usa un software especifico para esta tarea, el cual conocemos como eXtreme Script Editor (XSE).

XSE nos permite compilar de manera muy practica, limpia e intuitiva los scripts, teniendo funciones muy útiles para hackear, como una calculadora hexadecimal, un mini bloc de notas, un mini visor hexadecimal, una miniguía de comandos y scripts sencillos, y la posibilidad de guardar scripts en formato .rbk, asi pudiendolos guardar sin necesidad de compilarlos directamente al ROM. La versión recomendada para scriptear es la 1.1.1, ¿No tienes XSE? Pincha aquí para descargarla

Antes de empezar de lleno, es bueno que aprendas como enlazar XSE a Advance Map, asi que toma nota.

Esto es muy sencillo, solo abre tu rom con Advance Map y ya cuando esté abierto ve a la barra de herramientas, ubica Options > Choose
Script Editor. Te abrirá el explorador de windows, luego ve a la carpeta donde tengas el XSE y haz doble click en "XSE.exe". Te aparecerá un cuadro de texto en inglés, clickea en "Yes" (o "Sí"), y listo, ya has enlazado Advance map a XSE.

Para abrir un evento en XSE solo debes de dirigirte en Amap al minisprite, poste, script de gatillo o de nivel y buscar la opción "Open Script" al hacer eso XSE debería de descompilar el script por completo.

Truco: Para los npc's, postes o scripts de gatillo solo basta con darle doble click al evento para descompilarlo.

Ahora que sabes lo escencial, es hora que empecemos el verdadero tutorial, ¡A scriptear!

Todo script que vayas a hacer debe empezar de la siguiente manera:
Código:
#dynamic 0x800000
#org @inicio
Esto se traduce a:
#dynamic 0x800000: Indicar que usaremos etiquetas dinámicas y que XSE va asignar las offsets de cada comando a partir de 0x800000 a modo que no se sobrepongan una con otra, podemos poner cualquier offset unicamente si esta tiene suficiente espacio libre, de lo contrario XSE no compilará nada.
#org @inicio: esta etiqueta indica el comienzo del subscript principal, el @inicio es la etiqueta dinámica, cuya offset la asignará automáticamente XSE cuando hayamos compilado correctamente el script.

Ahora voy a empezar con el script de habla más básico de todos, osea este:

Código:
#dynamic 0x800000
#org @inicio
lock
faceplayer
msgbox @ola 0x6
release
end

#org @ola
= Ola ke ase tio?/nscripteando el sprite o ke ase?
Ese script es de los más fáciles de hacer y comprender, pero te haré el favor de explicarte cada comando que he usado en el script:
lock: Este comando nos permitirá bloquear cualquier acción del resto de npc's del mapa actual, es importante que pongamos este comando en los scripts de habla.
Faceplayer: Este comando hace que el npc al que le hemos hablado nos voltee a ver, este comando es importante para darle estética y realismo al script
Nota: El comando faceplayer debe utilizarse únicamente antes de iniciar un diálogo con un npc, no debe usar en scripts donde no hay npc's de por medio, como algunos scripts de gatillo y nivel.
msgbox 0x6: Comando que abre la caja de texto, los parámetros los explicaré más abajo.
release: Este comando se encarga de liberar los npc's que fueron bloqueados por el comando lock, por lo cual está totalmente ligado a este comando, si al inicio hay un lock es obligatorio que al final haya un release.
end: Comando corto pero importantísimo, sirve para terminar con un script y/o subscript, si este comando no está al final nuestro script simplemente va a crashear el juego cuando este llegue al final.

Bueno, ya he explicado los comandos más sencillos, ahora voy a explicar los tipos de msgbox que hay y sus diferentes aplicaciones.

Msgbox 0x2
Esta es una textbox sencilla, esta sirve para ahorrar comandos ya que incluye los comandos lock, faceplayer y release, solo nos sirve para npc's normales ya que no podemos usar más comandos en esta msgbox.

Ejemplo de script:
Código:
#dynamic 0x800000
#org @inicio
msgbox @texto 0x2
end

#org @texto
= Soy solo un npc triste/nen este tonto tutorial
Msgbox 0x3
Este msgbox sirve únicamente para los carteles, ya que está destinada para los tiles con comportamiento 0x84, Nunca deben usarse los comandos lock, faceplayer y release en esta msgbox

Ejemplo de aplicación:
Código:
#dynamic 0x800000
#org @inicio
msgbox @poste 0x3
end

#org @poste
= Bienvenidos a Villa Pingüino/nPoblación: 666
Msgbox 0x4
Esta msgbox es una caja de texto normal, mas esta no se cierra nunca, para cerrarla debe ponrse el comando closeonkeypress, de lo contrario seguirá abierta aunque el script haya terminado.

Ejemplo de aplicación:
Código:
#dynamic 0x800000
#org @inicio
lock
faceplayer
msgbox @texto 0x4
closeonkeypress
release
end

#org @texto
= Soy solo un npc triste/nen este tonto tutorial
Msgbox 0x5
Esta es una msgbox muy importante ya que sirve para que al terminar el texto se muestre una caja de pregunta si/no, dependiendo de la opción que eligamos esta nos llevará a distintos subscripts, se explicará a fondo este comando más adelante.

Ejemplo de aplicación:
Código:
#dynamic 0x800000
#org @inicio
lock
faceplayer
msgbox @pregunta 0x5
compare LASTRESULT 0x1
if 0x1 go to @oc
compare LASTRESULT 0x0
if 0x0 go to @nojoven
release
end

#org @oc
msgbox @sipi 0x6
release
end

#org @nojoven
msgbox @nop 0x6
release
end

#org @pregunta
= ¿Desea hablar sobre la/npalabra de Arceus?

#org @sip
= Usted será salvo, joven :v

#org @nop
= Joven, usted debe ser/nhijo de Giratina
Msgbox 0x6
Esta es la msgbox más común y usada en scripts, ya que abre una caja de texto totalmente normal y no tiene ningún tipo de comando resteingido.

Ejemplo de aplicación:
Código:
#dynamic 0x800000
#org @inicio
lock
faceplayer
msgbox @ola 0x6
release
end

#org @ola
= Ola ke ase tio?/nscripteando el sprite o ke ase?
Msgbox 0xA (Solo Emerald)
Nos servirá unicamente para abrir cajas de texto que simulan las llamadas del Pokenav, mostrandonos el gráfico del Pokenav girando a la izquierda de la caja de texto.

Ejemplo de aplicación:
Código:
#dynamic 0x800000
#org @inicio
lock
faceplayer
msgbox @llaman 0xA
release
end

#org @llaman
= Hola, esta es una puta/nllamada por cobrar
Bonus: Preparemsg
Es un extraño comando el cual es como la msgbox 0x4, pero esta no requiere de psrámetros, unicamente el puntero del texto, ah, y después de esta es obligatorio poner los comandos waitmsg y closeonkeypress, usualmente se usa cuando un npc no visible en la pantalla habla. Ejemplo
Código:
#dynamic 0x800000
#org @start
lock
preparemsg @text1
waitmsg
closeonkeypress
release
end

#org @text1
= ¡Quien anda ahi!
La textbox de los juegos de GBA se limitan únicamente a mostrar 35 carácteres por linea, es por eso que existen carácteres especiales para los distintos cambios de lineas, además de eso estos carácteres pueden ser usados para otras cosas. Dichos carácteres son:

\p: Sirve para hacer saltos de página. Ejemplo:

Código:
#org @texto1
= Dejame pensarlo bien\p...\pEn definitiva, eres idiota
El resultado sería
Código:
Dejame pensarlo bien

...

En definitiva, eres idiota
\n: Sirve para hacer saltos de línea, esta debe usarse únicamente si está precedida de un salto de página (\p). Tambien suele usarse al inicio de una textbox. Ejemplo:

Código:
#org @texto
= Les ha hablado tio Ruki\ny les desea buenas noches.
El resultado sería:
Código:
Les ha hablado tio Ruki
y les desea buenas noches.
Nota: Este comando nunca puede ir junto dos veces a el mismo, ya que provocará un feo y poco profesional efecto al leer el texto, por ejemplo:

Código:
= Hola a todos\nMe llaman Saitama\nY voy a golpear a Kokú\npor sobrevalorado
\l: Sirve para hacer cambios de línea sin abrir una nueva página, estos siempre van precedidos de un salto de linea (\n). Aunque nunca pueden ir después de un salto de página (\p), si pueden ir muchos de estos juntos. Ejemplo:

Código:
#org @texto
= Oigan tios, ¿Saben que hora es?\n¿No, no lo saben?\lpero si es muy obvio\lEs ¡Hora de Aventuras!
El resultado sería:
Código:
Oigan tios, ¿Saben que hora es?
¿No, no lo saben?
pero si es muy obvio
Es ¡Hora de Aventuras!
\h: Este comando sirve para señalar un carácter por su pocisión hexadecimal en el ROM, es útil para esos caracteres los cuales no poseen nuestros teclados. Ejemplo:

Código:
#org @texto
= Pokémon Ragnar\h24k es vida\nPokémon Ragnar\h24k es hamor
Como podrán ver, he puesto un \h24, lo cual será interpretado como el caracter en la pocisión 0x24 de la tabla de carácteres, lo cual in game se verá asi:
Código:
Pokémon Ragnarök es vida
Pokémon Ragnarök es hamor
Nota: Pueden consultar la tabla thingy de valores para más información.

\c: Sirve para indicar un cambio de color en el texto, hay un total de 15 colores para usar, la estructura es muy complicada, mas o menos así:

Código:
 #org @texto
\c\h01\h04Pancho:\c\h01\h02Creo que tengo una\nserpiente en mi bota
Lo cual aparecerá así:

Pancho:Creo que tengo una
serpiente en mi bota.

Pero como ese proceso es muy dificil de aplicar usaremos el método de los corchetes, los cuales son:

Fire Red/Leaf Green
Blanco - [white_fr]
Negro - [black_fr]
Gris - [grey_fr]
Rojo - [red_fr]
Naranja - [orange_fr]
Verde - [green_fr]
Verde Claro - [lightgreen_fr]
Azul - [blue_fr]
Celeste - [lightblue_fr]
Celeste 2 - [lightblue2_fr]
Cyan - [cyan_fr]
Celeste 3 - [lightblue3_fr]
Azul Mar - [navyblue_fr]
Azul Mar Oscuro - [darknavyblue_fr]

Emerald
Blanco - [white_em]
Gris oscuro - [darkgrey_em]
Gris - [grey_em]
Rojo - [red_em]
Naranja - [orange_em]
Verde - [green_em]
Verde claro - [lightgreen_em]
Azul - [blue_em]
Celeste - [lightblue_em]
Blanco 2 - [white4_em]
Verde lima- [limegreen_em]
Aqua - [aqua_em]
Azul Mar - [navy_em]

Nota: Los colores de la fuente dependen de los colores de la textbox, si la cambiaste obviamente los colores van a ser distintos

Ahora sí, un ejemplo de uso simplificado con corchetes:

Código:
#org @texto
= [red_fr]Taichi:[black_fr] Soy el mejor digielegido\ndel mundo mundial
Lo cual in-game quedará asi:

Taichi: Soy el mejor digielegido
del digimundo digimundial.

\v: Sirve para mostrar textos guardados en los distintos búfers del juego, en total hay 6 búfers capaces de almacenar textos de hasta 10 caracteres, mas solo 4 están libres ya que dos de ellos siempre están siendo usados por el nombre del jugador y el nombre del rival, son los búfers 01 y 06. Ejemplo de uso:

Si mi jugador se llama Hugo y mi rival Paco:

Código:
#org @holis
= \v\h06: Buenos días\nmi estimado \v\h01.
El resultado in-game sería:
Código:
Paco: Buenos días
mi estimado Hugo.
Nota: Los búfers 01 y 06 tambien pueden mostrarse usando los corchetes [Player] y [Rival] respectivamente, ejemplo:
Código:
#org @holis
= [Rival]: Buenos días\nmi estimado [Player].
Bien, nos hemos dado cuenta que en los ejemplos anteriores al compilarlos pasa que los eventos al interactuar con dichos npc estos se repiten cada vez que les hablamos, imagina que vas a poner que un npc te dé un item raro, cada vez que hables con el, este te dirá el mismo item, ¿Como podemos hacer que no nos dé el item cada vez que le hablemos no nos dé el item? pues fácil, usamos flags y variables.

Flag

Una flag es una especie de "interruptor" que usa el engine para comprobar diversos eventos basados en su estado, las flags son relativamente pequeñas, siendo representadas por bits, por lo que cads flag pesa 1 bit, por lo que 8 flags equivalen a 1 byte.

Las Flags al ser "interruptores" solo poseen dos estados, encendidas (0x1) y apagadas (0x0), por lo tanto podemos hacer que el juego compruebe el estado de uns flag y a partir de esto ejecutar diferentes acciones basadas en esto.

Hay tres comandos relacionados a las flags y su estado, estos son setflag, clearflag y checkflag, ahora explicaré la definición de estos:

Setflag:
Este comando sirve para encender o fijar a 0x1 una flag.

Clearflag:
Comando que sirve para apagar o fijar a 0x0 una flag.

Checkflag:
Es el más complejo de los tres, sirve para comprobar el estado de una flag, dependiendo de su estado puede hacernos llevar a otro script o continuar el mismo script.

¿Que Flags debería usar?
No hay flags ilimitadas, ni todas las flags del juego son usables, solo un número reducido son aptas para usarse, y según DavidJJcob, las flags usables son las que van desde 0x200 hasta 0x2FF, en resumen, puedes usar FF flags (Osea, 256 flags). Aqui un ejemplo.
Código:
#Dynamic 0xC14900
#org @start
lock
faceplayer
checkflag 0x207
if 0x1 goto @snippet1
msgbox @text1
giveitem 0x10C 0x1 MSG_OBTAINED
msgbox @text2 0x6
setflag 0x207
release
end

#org @snippet1
msgbox @text3 0x6
release
end

#org @text1
= Hola Cola Cola, tengo algo para ti

#org @text2
= Dale buen uso, yo nunca lo usé

@org @text3
= La vida es una lenteja...
Vamos a explicar unicamente los comandos que vamos a necesitar, los otros los explico después.

Checkflag 0x207: Checkea el estado de la flag número 207
If 0x1 goto @snippet1: Basado en el estado de la flag decide que acción tomar, en este caso el 0x1 se traduce como encendido, if significa en español si[/b], goto significa ir, entonces ese comando se traduce "si está encendido ir a @snippet1" ¿Queda claro? bueno, por si las dudas recuerda, 0x1 significa encendido, 0x0 significa apagado

Como puedes notar en la estructura, si la flag no está encendida el script continúa de manera normal, al final de este la flag 0x207 se enciende, si volvemos a hablar con este npc, el script comprobará que la flag está encendida, al ya estarlo, el script "saltará" al puntero @snippet1, en el cual solo hay una caja de texto, evitando así que nos vuelva a dar el mismo item.

Bueno, ahi está la explicación de las flags, ahora nos iremos a algo más hardcore, pues como sabrás las flags no almacenan ningun dato, solo pueden cambiar su estado. Te has preguntado alguna vez, ¿Como hace el script de Oak para saber cuantos Pokémon llevamos capturados? pues es con eso llamado...

Variables
Las variables, a diferencia de las flags, son como las X de los problemas de álgebra, como tambien una especie de "bodegas" (Alcancías como diría Cheve), en las cuales se pueden añadir, quitar o fijar valores especificos, por lo tanto estas no pueden comprobarse, solo puedes comparar su valor con cierto número, una variable puede almacenar hasta 0xFFFF bytes (65,536) la nomenclatura de estas es similar a la de las flags, siendo el comando para compararlas llamado

Compare, este va seguido del número de variable a comparar y al final el valor a comparar, las acciones tras comparar son las siguientes:

if 0x0= Menor a
if 0x1= Igual a
if 0x2= Mayor a
if 0x3= igual o menor a
if 0x4= igual o mayor a
if 0x5= No exactamente igual a

¿Que variables debo usar?
A diferencia de las flags, las variables son más limitadas aún, pero aún así, podemos usar las variables entre 0x4011 hasta 0x40FF, osea hay EE flags usables (238 para ser especifico) aunque hay algunas de este rango que tienen uso especifico.

Hay varios comandos relacionados a las variables, pero los comandos de scripts más comunes a usar son:

Addvar: Suma una determinada cantidad a una variable, si esta ya poseía algún valor se le sumará al valor existente.

subvar: Resta una determinada cantidad a una variable, si esta ya poseía algún valor se le restará al valor existente.

Setvar: Es el comando más común sobre variables, pues fija una determinada cantidad a una variable, si esta ya poseía algún valor este se ignorará y se le reemplazará por el valor fijado.

Vamos a dar un ejemplo, hice un script de un minijuego, para ganar cierto item en ese minijuego debemos haberlo superado 15 veces, pero ¿Como hago para que cuente cuantas veces hemos ganado? sencillo, en el script del minijuego puse que cada vez que gane se agregará una unidad a una variable, osea un addvar 0x1. Entonces en el script de quien me dará el premio pondré esto. Para explicarme mejor mira este ejemplo.
Código:
#Dynamic 0xFC9020
#org @start
lock
faceplayer
msgbox @text1 0x5
compare LASTRESULT 0x1
if 0x1 goto @snippet1
compare LASTRESULT 0x0
if 0x1 goto @snippet2
release
end

#org @snippet1
compare 0x40F2 0xF
if 0x4 goto @snippet3
msgbox @text2 0x6
release
end

#org @snippet2
msgbox @text3 0x6
release
end

#org @snippet3
msgbox @text4 0x6
giveitem 0x20 0x1 MSG_OBTAIN
msgbox @text5 0x6
release
end

#org @text1
= Hola tio, ¿Ya has ganado 15 veces\nel juego?

#org @text2
= No mientas, aún no lo haces

#org @text3
= Sigue intentandolo, quizás ganes\nalgún día.

#org @text4
= ¡Eres maravilloso! nunca pensé\nque alguien ganaría a\lmi juego, toma esto.

#org @text5
= No te des por vencido, sé que\npuedes seguir ganando
Quedó un poco largo, ¿No? pero en si no es complicado, explicaré los comandos que usé:

compare 0x40F2 0xF: Comparará que la variable 0x40F2 tenga F unidades (osea 15 unidades)
if 0x4 goto @snippet3: comprueba que si el valor de 0x40F2 es igual o mayor a F (15) salte a @snippet3

Este script comprueba perfectamente la cantidad de veces ganadas en el minijuego, en caso de no haberlo hecho nos dirigirá a otra parte del script.

Ahora daré otro ejemplo más sencillo, un script simple que se ejecutará según el valor de la variable.
Código:
#Dynamic 0x79207C
#org @start
lock
faceplayer
compare 0x4077 0x1
if 0x1 goto @snippet
msgbox @text1 0x6
setvar 0x4077 0x1
release
end

#org @snippet1
msgbox @text2
release
end


#org @text1
= Hola, bienvenido a Tepito

#org @text2
= En tepito todos somos amigables
Como pudiste notar, hay un enorme parecido con un script hecho con flags, pero hay diferencias, aunque ese script bien podía hacerse con flags, yo lo hice con variables, aunque para scripts de gatillo y nivel es obligatorio usar variables.

Nota: Si quieres saber más sobre las flags y variables seguras de usar puedes consultar esta guía sobre las flags y variables.

Si 256 flags y 238 variables te parecen pocas puedes consultar este manual para extender las flags y variables seguras de usar

Muchos requerimos de un script que tras terminar dichos eventos, nos mande a otro mapa, pues para ello usaremos las diversas variaciones del comando warp.

Warp
Comando que, como indica su nombre, nos manda a otro mapa, al hacer el cambio de mapa se puede apreciar la fanfare de cuando usamos una salida.

Warpmuted:
Su estructura es idéntica a la del comando warp, mas este es diferente debido a que al ser transportado a otro mapa no se reproduce la fanfare del warp.

Warpwalk:
Tambien es idéntico al comando warp, pero este contiene el efecto de caminar (Como cuando subes o bajas las escaleras de la casa del prota en Pueblo Paleta.

Warpteleport:
Idéntico al comando warp, se diferencia porque este contiene el efecto de teletransportación (Dar vueltas sobre ti mismo mientras sales volando)

Puse estos comandos juntos debido a que comparten la misma estructura todos, la cual es la siguiente:

Código:
warp***** 0x(Banco de mapa) 0x(Número de mapa) 0x(Número de warp) 0x(Pos. X) 0x(Pos Y)
Para llenar esto solo nos apoyaremos en Advance Map, en donde dice Banco de mapa ponemos el número de banco del mapa a donde nos vamos a transportar, donde dice número de mapa ponemos el número de mapa en el banco, donde pone número de warp ponemos el número de warp a donde seremos transportados, los Pos. X y Pos. Y se refieren a las coordenadas donde seremos transportados, dichas coordenadas puedes verlas al fondo de a-map, dicho programa te las convierte a hex.

Por ejemplo, si quiero transportarme a pueblo paleta, para ser preciso, justo en la puerta de la casa del prota, solo debemos abrir el mapa de pueblo paleta en A-map, si nos damos cuenta juento al nombre del mapa hay unos números entre corchetes, en mi caso dice "Pueblo Paleta[3.0]", el número antes del punto equivale al banco del mapa, osea en el banco 3, el número después del punto es el número del mapa, en este caso es el número 1, el número de warp lo conseguimos al irnos a la pestaña de eventos, damos click sobre el warp donde nos vamos a teletransportar, ahi en la derecha donde dice "Warp No." conseguiremos el número de warp, en mi caso es 0. Como estamos indicando la pocisión exacta al poner el número de warp, las pocisiones X e Y son innecesarias, asi que en ambas pondremos 0x0. Mira el script de ejemplo:
Código:
#dynamic 0xC60070
#org @start
lockall
faceplayer
msgbox @text1 0x6
pause 0xF
warpwalk 0x3 0x0 0x1 0x0 0x0
releaseall
end

#org @text1
= Te vas a ir a Pueblo Paleta\npor baka, papu :v
No creo que sea necesario explicar nada, usé el comando "warpwalk" debido a que el warp destino es una puerta, y si ponía un warp normal este quedaría sobre la puerta, para dar un efecto profesional y estético lo mejor es que de un paso adelante. como si fuera una puerta común, por cierto, hay dos comandos nuevos que si debo explicar:

lockall: A diferencia del comando lock, este bloquea todos los minis del mapa, si, el comando lock solo bloquea al prota.
releaseall: sirve para liberar los minis bloqueados por el lockall, el relase normal no funcions con lockall, y si se pone el juego de congela.

Ahora te preguntarás una cosa, ¿Que hago si a donde me quiero transportar no hay warps? (Por ejemplo, en medio de Pueblo Paleta), pues sencillo, usaremos los últimos dos argumentos de los comandos warp, ahora te preguntaras ¿Como si esos argumentos son inútiles?. Pues si, en la mayoría de casos son inútiles, incluso el tutorial de Ciro y otros ponem que esos argumentos no sirven de nada, lo cual es Totalmente falso. Deja te explico, la rutina de este comando dice que si se usa un número válido de warp entonces se deben ignorar los últimos dos argumentos, pero si se pone un número inválido (Que provoque Overflow) entonces se tomará como destino los últimos dos argumentos del comando. Por si no le has pillado, debes poner en "número de warp" un número inválido para que los últimos dos argumentos funcionen, pero ¿Que números son inválidos? pues solo uno, 0xFF (Si pones un warp con número 0xFF el juego se crashea)

Ahora, si quiero aparecer en medio de pueblo paleta, en A-map debo poner el cursor del mouse sobre el punto donde quiero aparecer, sin mover el cursor debemos ver la barra inferior de a-map, en dicha barra debemos anotar las coordenadas X e Y donde tenemos el cursor, en mi caso es 0x9 la pocisión X y 0x4 la pocisión Y, entonces com esos datos procederé a hacer el siguiente script de ejemplo:
Código:
#dynamic 0xC60070
#org @start
lockall
faceplayer
msgbox @text1 0x6
pause 0xF
warp 0x3 0x0 0xFF 0x9 0x4
spriteface 0xFF 0x2
releaseall
end

#org @text1
= Te vas a ir a Pueblo Paleta\npor baka, papu :v
¿Te das cuenta como quedó el script? pues usando ese script aparecerá justo en medio de pueblo paleta, pero ¿Y ese nuevo comando? pues a explicarlo:

spriteface 0xFF 0x2 este comando sirve para que un mini en el rango de visión voltee s ver a otro lado, No funciona si el mini no está en el rango visible. 0xFF hará que el prota voltee a ver. La estructura es:
Código:
spriteface 0x(Número de mini en amap) 0x(dirección donde mirará)
La lista de lugares a donde puede voltear a ver un mini son:
0x1= Abajo
0x2= Arriba
0x3= Izquierda
0x4= Derecha

Warphole
Este comando lo dejé de último debido a que tiene una estructura distinta a la de los demás comandos de warp, pues este comando sirve para hacer warps con efecto agujero, esos que al pisarlos hacen un efecto caída (Como el piso quebrado del Pilar Celeste), la estructura de este comando es:

Código:
warphole 0x(Banco de Mapa) 0x(Número de mapa
Como habrás notado, tiene menos argumentos que los demás, esto es porque al ejecutar este comando el sitio donde caeremos serán las mismas coordenadas del lugar donde activamos el script, si dichas coordenadas no existen en el mapa destino el juego se congelará. Solo funciona en scripts de gatillo y de nivel
Bueno, creo que ya que ha quedado zanjando el tema de las variables, asi que ya podemos andar con este tema sin problemas, pues como ya lo habrás notado, este inciso recopila todo acerca de los movimientos de los npc en el mapa.

Applymovement
Comando que sirve para que un npc ejecute un movimiento definido, su estructura es un poco parecida al msgbox, pero con leves diferencias.

Waitmovement
Comando que nos sirve para indicar que el script debe esperar a que un npc termine de moverse para continuar ejecutandose, el valor 0x0 indicará que deben esperarse a que terminen todos los npc que se están moviendo.

Ahora un ejemplo:

Código:
#Dynamic 0x860000
#org @start
lock
faceplayer
checkflag 0x26C
if 0x1 goto @start1
msgbox @text1 0x6
applymovement 0x4 @move1
waitmovement 0x0
hidesprite 0x4
setvar 0x4055 0x1
release
end

#org @start1
msgbox @text2 0x6
release
end

#org @text1
= Hey tio, ya que has derrotado a\nLuffy yo debo irme, hadios :3

#org @text2
= Primero derrota a Luffy, noob :v

#org @move1
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0xFE 'End of Movements
Bueno, pasemos a analizar la estructura de los comandos nuevos en el script anterior.

applymovement 0x4 @move1: indica que el npc número 0x4 en el mapa va a ejecutar los movimientos del puntero @move1.

waitmovement 0x0: esperará que todos los npc que van a moverse terminen de ejecutarse antes de seguir.

hidesprite 0x4: no tiene mucho misterio, oculta el npc 0x4 del mapa, su contraparte obviamente es el comando showsprite, cuyos parámetros son idénticos. Ojo, el protagonista NO puede ocultarse con este comando.

Para conseguir el número de npc en el mapa usa advance map, ve a la pestaña eventos, haz click sobre el npc que quieres que se mueva, y copia su número de evento.

Para mover al protagonista usa el parámetro 0xFF, o MOVE_PLAYER en su defecto.

La lista de movimientos para Fire Red los puedes encontrar Aqui
La lista de movimientos para Ruby/Emerald los puedes encontrar Aqui
Tambien puedes usar la útil herramienta Move it! de Gut_Bro para generar movimientos, puedes descargarla Aqui

Ahora pasemos a ver otros comandos.

Applymoventpos
Comando que es idéntico al applymovement, solo que este comando usa una variable en vez de número de npc, es bastante útil en minijuegos o scripts elaborados

waitmovemetpos
Al igual que waitmovement, sirve para pausar el script hasta que todos los npc moviendose por el comando applymoventpos terminen de ejecutarse.

Usaré el script anterior como ejemplo.

Código:
#Dynamic 0x860000
#org @start
lock
faceplayer
checkflag 0x26C
if 0x1 goto @start1
msgbox @text1 0x6
applymovementpos 0x8004 @move1
waitmovementpos 0x0
hidesprite 0x8004
setvar 0x4055 0x1
release
end

#org @start1
msgbox @text2 0x6
release
end

#org @text1
= Hey tio, ya que has derrotado a\nLuffy yo debo irme, hadios :3

#org @text2
= Primero derrota a Luffy, noob :v

#org @move1
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0x12 'Step Left
#raw 0xFE 'End of Movements
Como pudiste ver, usé la variable temporal 0x8004 para el script, dicha variable tenía previamente en su valor 0x4, asi que el script tomará el valor de 0x8004 como la id de npc del mapa. Hidesprite tambien acepta variables, asi que puedes usar el valor de una variable para ocultar minis.

Movesprite
Comando que sirve para cambiar de pocisión un npc en el mapa, aunque puede usarse en cualquier tipo de script, suele ser más usado en scripts de nivel.

Un ejemplo:

Código:
#Dynamic 0x930000
#org @start
lock
compare 0x403C 0x1
if 0x1 goto @start2
showsprite 0x4
movesprite 0x4 0xC 0x4
release
end

#org @start2
msgbox @text 0x6
applymovement @move MOVE_PLAYER
waitmovement
release
end

#org @text
= Debo ir primero por mi\npatito de hule

#org @move
#raw 0x08 'Step Down
#raw 0xFE 'End Of Movements
Vamos a analizar.
movesprite 0x4 0xC 0x4: hará que el npc 0x4 se mueva a las coordenadas 0xC 0x4, la estructura es: el primer byte es la id del npc en el mapa, tambien sirve poner una variable, y los siguientes son las coordenadas X e Y a donde vamos a mover el sprite, dichas coordenadas, como dije en capítulos anteriores, puedes conseguirlas en advance map.

Showspritepos y Hidespritepos
Comando idéntico a showsprite y hidesprite, pero estos a diferencia de sus homólogos, ocultan y mueven a determinadas coordenadas el npc, su estructura es:

Código:
showspritepos 0x(Id de mini o variable) 0x(Pos. X) 0x(Pos. Y)

Getplayerpos
Comando super útil, pues sirve para tomar las coordenadas del protagonista y guardarla en variables, este comando es de utilidad en scripts de gatillo que tienen diferentes movimientos dependiendo de la pocisión del protagonista (ejemplo, cuando vas a pisar la ruta 1 y Oak te detiene, los movimientos de cada npc son difetentes en la izquierda y la derecha, respectivamente). Mira un ejemplo.

Código:
#Dynamic 0xF0400C
#org @start
lock
getplayerpos 0x8004 0x8005
compare 0x8004 0xF
if 0x1 call @move1
compare 0x8004 0x10
if 0x1 call @move2
compare 0x8004 0x11
if 0x1 call @move3
msgbox @text 0x6
release
end

#org @move1
applymovement MOVE_PLAYER @step1
waitmovement 0x0
return

#org @move2
applymovement MOVE_PLAYER @step2
waitmovement 0x0
return

#org @move3
applymovement MOVE_PLAYER @step3
waitmovement 0x0
return

#org @text
= Hola gominola, esta es una prueba c:

#org @step1
#raw 0xA 'Step Left (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0xFE 'End Of Movements

#org @step2
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0xFE 'End Of Movements

#org @step3
#raw 0xB 'Step Right (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0x9 'Step Up (Normal)
#raw 0xFE 'End Of Movements
Ahora analizemos.

getplayerpos 0x8004 0x8005: guardará la coordenada X en la variable temporal 0x8004, y la coordenada Y en la variable 0x8005, yo recomiendo siempre usar variables temporales.

En ese mapa hay tres scripts de gatillo puestos juntos horizontalmente a modo que no permitan el paso al protagonista sin que se ejecute el script, para usar el getplayerpos debo saber la coordenada X de cada script d gatillo, en mi caso fueron las pocisiones 0xF, 0x10 y 0x11, asi que en los compare pondré las pocisiones posibles en las que el prota puede pasar, eso servirá para poner a los tres scripts de gatillo el mismo offset en vez de hacer uno para cada script de gatillo.

Recuerda, cada vez que hagas una llamada (call) el subscript llamado debe regresar a la pocisión original en la que fue llamado, asi que no pongas end, pon "return'

Este tutorial se irá actualizando poco a poco, si ves algún dato erróneo hazmelo saber y lo repararé de inmediato.

Agradecimientos a...

Diegoisawesome, ya que todo lo que sé sobre scripteo lo aprendí de su super tutorial.

Hackmew por su espléndido XSE y su mini guia incluída que ha servido para este tutorial.

Tajaros porque cierta documentación la he sacado de su tutorial.

DavidJJcobb por algunos comandos sacados de su investigación de comandos.
 
Última edición:
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

exelente , esperare con ansias que subas pasos mas avanzados que es lo que me falta xD
 

fonix

Avanzando cada día mas!
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

El mejor tutorial que eh visto en de script esta todo puesto por orden bien explicado por partes cada cosa puesta eres el puto amo ruky!
 
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

Me gusta, me gusta y me gusta.

El tuto de Ciro esta bien, aunque este esta mas explicado, me gustan mucho tus scripts @~Ruki! ya los he visto antes en vídeos, y pues nada, este tuto ayudara a bastantes novatos que no tienen ni la idea de como hacer que los NPC o minis hablen, sigue así y espero llegues a explicarnos scripts de nivel avanzado.

Sigue así hombre, seguiré fiel estos tutos y espero la próxima actualización. ^_^
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

Muchisimas gracias por semejante pedazo de tutorial tan bien explicado <3
Me vino de perlas que hayas resaltado el closeonkeypress y el msgbox 0x4 ya que gracias a eso me acordé de usarlo ahora para ayudar a @Flabox con su duda xD
 

Dani_SR_17

¡Pokémon LionHeart!
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

Solo he echado una mirada por encima, y creo que deberías cambiar la parte de los colores.
Es decir, explicar que los que has puesto son si no cambias la paleta de la textbox.
 

Kiritopoweh

21/11/2013 - 26/06/2018
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

en cuanto pueda lo usaré gran tuto!!
 

Aguiar

Colega de los colegas
Miembro del equipo
Staff
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

¿Y qué importa que ya haya tutoriales de scripts? Cuanta más masa mejor se pasa y si hay más variedad en las explicaciones mejor. Hubiera preferido ver todo ya hecho, pero bueno, ir por partes también está bien supongo.
 
M

Miembro eliminado 28262

Invitado
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 1: Habla básica)

Antes que nada déjame felicitarte. ¡Excelente guía! No habia leído una guía tan bien explicada desde el tutorial de Tajaros, eso sí, todavía te falta especificar los comandos especiales, sé que está dirigido a los usuarios más novatos pero... estaría guay y sería muchísimo más completo :)

Me has ayudado, siempre me líaba con la diferencia entre la textbox 0x2; 0x3 y 0x4 Ahora sé bien cual es la dierencia :p
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 2: Flags y Variables)

Añadido el segundo tomo del tutorial, se ha agregado documentación sobre las flags y variables, además se ha agregado el comando preparemsg y aclarado el punto del color de los textos c:
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 3: Warps)

Añadido el tercer tomo del tutorial, todo lo que necesitas saber sobre el comando warp y sus variantes
 

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 3: Warps)

Ya era hora de que pusierás en marcha alguno de tus proyectos.

No he estado desde hace mucho en WaH, pero en lo que veo en tus temas siempre has querido hacer un mega aporte, con Rom bases, tutoriales y muchas cosas mas...

Pero te quedabas en el post, hasta ahora veo una guia muy completa sobre los temas que estas manejando, espero que no quede aquí jajaja y que continues con otros temas...

Saludos Ruki!
 

inmortal

Aprendo aprendo aprendo!!
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 3: Warps)

Buenos tutoriales una vez mas los pondré en practica
 

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 3: Warps)

Grandísimo tutorial Ruki, muy bien organizado y muy bien detallado. Con él he podido repasar y aprender cosas que no sabía. Por ejemplo, me siento un poco tonto por no haber aprovechado el msgbox tipo 2 (risas).

En cuanto al preparemsg es un comando bastante útil. Por lo que he entendido - ya sea para minis no visibles en la pantalla como, si he entendió bien, también se podría usar en una intro explicativa.

Una cosa que no acabo de entender es el spriteface. Entiendo cómo funciona; ya que te ahorras los applymovement. Pero de cara al susodicho warp ¿Es obligatorio o puramente estético?

En cuanto a la última entrega, lo que más me ha molado es lo del Warphole ya que me irá de perlas para las cuevas y otras trampillas.

¡Muchas gracias Ruki!
 
Respuesta: GBA | Scripting | Ruki Presenta: Tutorial sobre Scripts (Tomo 3: Warps)

Ya sabia el uso de esos comandos, pero si me sorprendió ver que se puede hacer un warp sin un warp. Lo que no entiendo es si solo basta poner un número que no aparezca de banco de mapa por ej: 50 o tiene que ser un numero hexadecimal como en el tutorial.

Aun así gracias por este tercer tomo, me aclaro algunas dudas.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: GBA | Scripting | Gold Presenta: Tutorial sobre Scripts (Tomo 4: Movimientos de Npc)

¿Creyeron que me había olvidado de este tutorial? claro que no, pues he actualizado el tutorial con el tomo 4, sobre los distintos comandos de movimiento de npc.
 

Pacodelopio

Entrenador Pkmn
Respuesta: GBA | Scripting | Gold Presenta: Tutorial sobre Scripts (Tomo 4: Movimientos de Npc)

Me alegra que vuelvas a traer cosas y me mola ver tutoriales así que te refresquen la memoria y seguro que nos traes cosas mas avanzadas que a todos nos gustará aprender hasta el momento me reservaré a comentar mas... :p
 

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Respuesta: GBA | Scripting | Gold Presenta: Tutorial sobre Scripts (Tomo 4: Movimientos de Npc)

¡Buen tuto Gold!

Éste 4to tema irá de perlas tanto a los novatos como a los que no. Lo que más me ha fascinado han sido los comandos “applymovementpos” y “waitmovementpos”. No tenía conocimiento algunos de ellos; que dependan de variables los hace muy interesantes. Por ahora, lo veo muy útil de cara a acortar scripts largos con varios NPC’s.

También gracias a éste aporte he descubierto los comandos “showspritepos” y “hidespritepos”; ambos muy útiles. ¿Por qué? De cara a utilizar el mismo minisprite en otro evento del mapa. Ahorro de bytes, quieras o no y algo menos chapucero. Me encanta, de veras.

En cuanto al tuto en sí, está muy bien explicado tanto la descripción de los comandos como la de los ejemplos. Eso sí, hay errores al escribir fácilmente corregibles como que en lugar de “pocisión” y “tambien” pongas “posición” y “también” (aparecen varias veces). Por otra parte te sugiero que al explicar un comando incluyas en el mismo su orden de parámetros ya que siempre es algo que ayuda mucho a entenderlo rápidamente. Sería de ésta forma:

Estructuras​
Código:
applymovement 0x(Número de minisprite) @(Pointer del movimiento)
waitmovement 0x(Número de minisprite)

hidesprite 0x(Número de minisprite)
showsprite 0x(Número de minisprite)

applymovementpos 0x(variable) @(Pointer del movimiento)
waitmovementpos 0x(variable)

movesprite 0x(Número de minisprite) 0x(coordenada X) 0x(coordenada Y)

hidespritepos 0x(variable) 0x(coordenada X) 0x(coordenada Y)
showspritepos 0x(variable) 0x(coordenada X) 0x(coordenada Y)

getlayerpos 0x(variable que guarda la coordenada X) 0x(variable que guarda la coordenada Y)
Un abrazo @~G0LD![/MENTION], me encantan tus aportes, ya lo sabes. No me lo tuve que pensar dos veces para votarte a mejor colaborador del año. Espero que sigas como el año pasado, se agradece mucho tu esfuerzo. :)
 

CrisMaster

Usuario de platino
Respuesta: GBA | Scripting | Gold Presenta: Tutorial sobre Scripts (Tomo 4: Movimientos de Npc)

Era exactamente lo que buscaba para ver los scrips de los npc, para poder tomarlos como base para mis scrips, thanks uwu
 

L30N4RD0

Profesional de WaH
Gracias a esto he aprendido más sobre scripting, los guardé en un Block de Notas en una carpeta para futuros eventos que planifique para mi Hack. ¡Muchisimas Gracias por el tutorial/aporte! :)
 
Arriba