Registrarse

Aprendiendo sobre Scripting

Saisar

Hago lo que puedo para ayudar a los demás ;)
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Y como puedo hacer para que el script siga despues de haber utilizado warp?
 

Rubire4

Usuario mítico
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Y como puedo hacer para que el script siga despues de haber utilizado warp?
No puedes hacer que un script siga después de un warp, en cuento este ocurre el juego deja de leer el script.
Si quieres hacer que parezca que continúa debes utilizar un Script de nivel. Este se ejecuta en cuento cambias de mapa, a si que se iniciaría en cuanto haces el warp. Puede parece complicado, pero con práctica verás como es sencillo ;)
 
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Guau! Increible esta muybien especificado heaprendidomucho enscripting
 

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

genial!!!! muchas cosas me ayudaran! tiene mis gracias y una calificacion positiva :XD:
 

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Respuesta: Mega-tutorial: Scripting desde cero - Actu 1-1 FINALIZADO!

Os traigo unas lecciones de la escuela de scripts a la que estaba a cargo. No están aún todos los tutoriales, pero poco a poco iré actualizando con un tutorial nuevo hasta completar el indice que voy a mostrar a continuación:

ÍNDICE DE TEMARIO:
Compilación / Evitar errores / msgbox
Variables (1) / Condiciones
Género / Yes-No
Posters / Flags
Meteorología / GiveItem / Sonidos
Applymovement / MOVE_CAMERA
Especials / Efectos de pantalla
Warps / Moves
Pokemart / Dinero
GivePokémon / Motes
Scripts de gatillo / Variables (2)
Trainers / WildBattle
Scripts de nivel
SetMapTile / Buffer
Otros comandos de interés





Primero, os daré un pack de herramientas completo posteado en su momento por Ángel Asakura que os servirá para esta escuela: Pack de herramientas

En él, vamos a necesitar concretamente:
-Advanced Map 1.95 (Editor de mapas y eventos entre otras cosas)
-XSE 1.1 (Editor de scripts)

*Si utilizáis Esmeralda es recomendable usar Advanced Map 1.92. Aunque nuestras explicaciones y gráficos se basarán en la versión 1.95

También necesitaremos nuestra Rom base limpia. Esta la deberíais tener vosotros ya. Yo trabajaré en Fire red, os la pongo por si acaso:
Fire Red

¡Empecemos!




¿Cómo enlazo XSE a Advance Map?

Al enlazar nuestro XSE con nuestro Advanced map podremos abrir scripts directamente en nuestro XSE desde Advanced map. De esta forma nos será más fácil editar y acceder al XSE.

Para enlazar nuestro XSE al AM (Advanced Map) nos vamos a Settings, luego seleccionamos Choose script editor, y entonces vamos a la carpeta donde tenemos nuestro XSE y seleccionamos la aplicación para cargarla.


Estructura de los Scripts

Un script es un conjunto de código que se ejecuta en cascada. Esto quiero decir que el juego leerá el primer comando de nuestro código y lo ejecutará, cuando acabe ejecutará el que está por debajo y así de forma continua.

Lógicamente si un comando ordena ir a otro comando/dirección, el juego irá a la dirección mandada en vez de seguir con el comando siguiente.

Los comandos de los scripts se guardan en offsets. Un offset es como una caja de datos, puesto que un comando también está compuesto por datos, se podría decir que un offset es una caja que almacena datos.

El offset está representado por números en hexadecimal. Por ejemplo "800000" sería un offset, pero en XSE nuestros números hexadecimales tienen que ir precedidos por un "0x". Por lo tanto un offset sería "0x800000".

En un offset guardaremos nuestros datos de texto de minisprites, movimientos de minisprites, otras direcciones para que se ejecuten otras partes del código, etc.


Estructura del XSE


1-Indica la ruta de lo que hemos abierto. Cuando queramos hacer un script tendremos que abrir nuestro Rom en la opción Archivo

2-Botón de compilar. Compilar significa guardar nuestro script/(código que forma el script) en los datos del nuestra Rom. Como ya hemos dicho antes, estos datos se almacenan en offsets, entonces al compilar, lo que estamos haciendo es asignar los datos de nuestro código a offsets. A este botón le tendremos que dar cuando escribamos todo el código de un script.

3-Botón de descompilar. Si escribimos nuestro offset (teniendo cargada la rom) en el hueco de la izquierda y le damos al botón de descompilar, aparecerá el código almacenado en dicho offset. Luego nosotros podremos modificar ese código y volverlo a compilar. Aun que esto puede tener inconvenientes que ya veremos más adelante.

4-Calculadora. Si queremos pasar por ejemplo de numeros normales (decimal) a hexadecimal, escribimos nuestro número con el botón en dec. Luego pulsamos el botón "Hex" y nuestro número pasará a hexadecimal automáticamente. Esto nos será de utilidad más adelante.

5-Código de nuestro script.


Estructura del AM


1-Offset de nuestro script. Aquí pondremos el offset principal de nuestro script. IMPORTANTE: SE TIENEN QUE DEJAR LOS DOS PRIMEROS CEROS COMO ESTÁN Y PONER NUESTRO OFFSET DESPUÉS. Por ejemplo si nosotros tenemos el offset "0x8B0000", el script offsets quedaría así: "$008B0000". Cuando hablemos con un minisprite se ejecutará el script que pongamos en esta casilla.

2-Aquí se ponen flags, las cuales daremos más adelante. Solo recordar que en esta casilla se ponen flags y al poner flags podemos hacer desaparecer el mini, por ejemplo. Pero esto lo daremos en otra clase.

3-Normalmente cuando es un entrenador Pokémon se pune el numero 11. Puede estar a cero perfectamente, tampoco tengo mucha conciencia de para que sirve, no es de mucha utilidad.

4-Será 01 si es un entrenador estándar y 00 si no lo es.

5-Si es un entrenador marca la distancia a la cual te ve para retarte.

6-Cuando ponemos un offset en nuestro Script offset, y tenemos enlazado nuestro XSE al AM, podremos darle a Open script para abrir nuestro script directamente en el XSE.

7-Marca las coordenadas del evento.

8-Marca las coordenadas de donde se ponga el ratón

9-Nos lleva al cabezal del mapa. Lo utilizaremos para ver como se hacen los Scripts de nivel dentro de bastantes lecciones.


Empezando nuestro script

Bien. Carguemos nuestra Rom con el XSE y empezamos a escribir comandos.(Escribiré los comando la estructura "CODE" que proporciona el foro. Pero lo que escriba es como si lo escribiéramos en el XSE)

Código:
#dynamic 0x800000
Con este comando empezaremos todos nuestros scripts. Lo que hace es buscar offsets libres de datos para que se guarden los nuestros. Esos offsets los buscará a partir del numero 800000 porque así lo hemos puesto en dynamic. En Fire Red podéis poner 0x700000 ya que desde este offset hay muchos que están libres y podemos usar.

Cuando ponemos #dynamic 0x800000 sustituirá las palabras que empiecen por "@" por un offset libre. Por ejemplo:

Código:
#dynamic 0x800000

#org @inicio
Cuando compilemos nuestro script gracias al #dynamic se sustituirá el "@inicio" por un offset libre. Cuando cuando abramos nuestro script desde el AM veremos que se ha convertido en esto:

Código:
#org 0x800000
El #dynamic 0x800000 desaparecerá y el @inicio se ha sustituido por 0x800000 porque este offset está libre. IMPORTANTE: DESPUÉS DEL @ PONER UNA PALABRA COMPLETA. NO SE PUEDEN PONER DOS PALABRAS SEPARADAS POR UN ESPACIO PORQUE DARÁ ERROR.

¿Qué es el #org?

El #org indica una dirección de un offset. Siempre que queramos escribir una dirección offset pondremos un #org antes. El funcionamiento de este #org se entenderá mejor cuando veas en esta lección como funciona, pero básicamente para entendernos diremos que es el inicio del script, la "puerta para acceder al scripts y a los comandos que se escriban después de un #org."

Bueno, ahora ya sabemos como encontrar offset libres y como tiene que empezar nuestro script. Todos los comandos que se pongan después del #org (offset) son aquellos que nuestro juego ejecutará.

Podemos entender el #org como la dirección de nuestra casa, y que esa dirección estará asociada al offset que viene después. El primer #org con offset que se genere es la dirección principal (offset principal), y es el que tendremos que poner en el script offset de nuestro mini para que ejecute el código.



Comando Faceplayer

Este comando sirve para que cuando interactuemos con el mini del script, este, mira al jugador.

¿Cuándo no lo utilizaremos?

Pues por ejemplo si queremos simular que el minisprite está hablando solo y no se entera de que el jugador está cerca de él.

Vamos a implementarlo en nuestro código.

Código:
#dynamic 0x800000

#org @inicio
faceplayer

Comandos Lock y lockall

Con el comando lock se consigue que nuestro player no se mueva mientras se ejecuta el script.

El lockall tiene la misma función pero en vez de hacer efecto solo sobre nosotros, también afectará a todos los minis del mapa. De esta forma ninguno se moverá aunque tengan algún movimiento configurado por el AM.

Entonces nuestro código quedaría tal que así:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock


msgbox

Con el comando msgbox abriremos nuestra caja de texto y podremos escribir frases para que se reproduzcan al ejecutase el comando.

El comando msgbox se compone así:

msgbox (offset) (tipo de mensaje)

Lo explico:

msgbox indica que se va abrir la caja de texto para un mensaje.

offset en el número offset el cual contendrá el texto de nuestro mensaje. Como tenemos el #dynamic, para buscar un offset libre ya dijimos que utilizaríamos un @ seguido de una palabra cualquiera. Entonces nuestro comando de momento quedaría así:

msgbox @texto (tipo de mensaje)


El tipo de mensaje es lo que su nombre indica. Es un número el cual le dice al juego el tipo de mensaje que se va a ejecutar. Estos son los tipos:

0x2 Se utiliza para textos normales. Si ponemos 0x2 no nos hará falta poner el faceplayer y el lock, puesto que este tipo de mensaje digamos que lo tiene incorporado.

0x3 Se utiliza para postes. Lo veremos en profundidad en la siguiente lección.

0x4 Es un mensaje normal pero este no se cerrará hasta que no pongamos el comando "closeonkeypress"

0x5 Este después de escribir el texto correspondiente abre la caja de texto del si/no. Entraremos en profundidad con esto en la siguiente lección.

0x6 Mensaje normal


Bueno nosotros queremos un mensaje normal, así que utilizaremos el 0x6, y entonces nos quedará de esta forma.

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
msgbox @texto 0x6
¿Y nuestro mensaje?

Nuestro mensaje estará en el offset que se creará en @texto. Entonces ahora tendremos que crear la dirección en nuestro script y poner el texto que queramos. Como ya he dicho, lo que marca el comienzo de en un offset para que se ejecute es el #org. En el msgbox hacemos referencia a un offset que es donde estará nuestro texto. Entonces tenemos que poner un #org, nuestro offset y a continuación nuestro texto.

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
msgbox @texto 0x6

#org @texto
= Hola
Vamos a explicar lo que acabo de escribir.
El #org lo pongo porque es una dirección offset, entonces cada vez que en uno de nuestros comandos pongamos un @ que haga referencia a un offset. Tenemos que crear aparte otro #org junto con el offset referenciado y luego escribir la información que se va a guardar. En este caso, texto.

¿Por qué ponemos @texto? Para que cuando se generen nuestros offsets el @texto se sustituirá por el mismo offset. Si no no tendría ningñun sentido llamar a un offset que está vacío. Si ponemos @ con palabras igual generará el mismo offset sino serán distintos offset.

Luego de crear la dirección offset, en la siguiente línea ponemos un = y con un espacio de margen el texto que queramos que se muestre.

El XSE tiene parámetros especiales para el texto, pero si pulsamos ctr+T abriremos una caja donde podremos introducir nuestro texto y lo convertirá e insertará automáticamente. Por ejemplo vamos a convertir esta frase y la vamos a insertar:

"Hola a todos. En un principio parece difícil pero con práctica todo es fácil"

Quedaría así:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
msgbox @texto 0x6

#org @texto
= Hola a todos. En un principio\nparece difícil pero con práctica\ltodo es fácil
Pese a los /n y /l que nos encontremos, en el juego se verá bien.
También hay comandos especiales que puedes introducir manualmente:

[player] Dirá tu nombre
[rival] dirá el nombre de tu rival

Colores: (Los pones antes del texto)

White - [white_fr]
Black - [black_fr]
Gray - [grey_fr]
Red - [red_fr]
Orange - [orange_fr]
Green - [green_fr]
Light Green - [lightgreen_fr]
Blue - [blue_fr]
Light Blue - [lightblue_fr]
Light Blue 2 - [lightblue2_fr]
Cyan - [cyan_fr]
Light Blue 3 - [lightblue3_fr]
Navy Blue - [navyblue_fr]
Dark Navy Blue - [darknavyblue_fr]

White - [white_fr]
Black - [black_fr]
Gray - [grey_fr]
Red - [red_fr]
Orange - [orange_fr]
Green - [green_fr]
Light Green - [lightgreen_fr]
Blue - [blue_fr]
Light Blue - [lightblue_fr]
Light Blue 2 - [lightblue2_fr]
Cyan - [cyan_fr]
Light Blue 3 - [lightblue3_fr]
Navy Blue - [navyblue_fr]
Dark Navy Blue - [darknavyblue_fr]

Entonces si queremos que nos pregunten por nuestro nombre, y el texto queremos que sea rojo, tendríamos que hacer esto:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
msgbox @texto 0x6

#org @texto
= [red_fr]¿Eres [player]?
Una vez que tenemos nuestro texto listo, ya nos podemos olvidar de nuestro #org de texto y volver a nuestro #org del offset principal.


waitmsg

waitmsg es un comando que hará que no se ejcuten las siguientes lineas de código hasta que no cierren el texbox de nuestro msg.

Este comando no tiene utilizar para textos simples, pero si por ejemplo alguien dice un texto y luego hay comandos para que ese mini se mueva, el mini se moverá mientras dice el texto. Para que primero diga el texto y luego se mueva, ponemos después del comando del mensaje un waitmsg.


Release y end

release es un comando que se debe de poner para que el mini deje de estar en "lock" y vuelva a su movimiento natural. Este comando lo pondremos justo antes de finalizar el script. Si ponemos un lock y no ponemos un release, el jugador se quedará bloqueada y no se podrá continuar el juego.

¿Y si he puesto lockall? Entonces tendrás que poner releaseall en vez de release.

Y en comando end es el que indica que nuestro código a terminado y que el jugador vuelve a ser libre.

Sabiendo esto nuestro codigo tiene que quedar así:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
msgbox @texto 0x6
release
end

#org @texto
= [red_fr]¿Eres [player]?
Aunque si utilizamos el tipo de mensaje 0x2, el código puede quedar así:

Código:
#dynamic 0x800000

#org @inicio
msgbox @texto 0x2
end

#org @texto
= [red_fr]¿Eres [player]?

Compilar

Hemos finalizado nuestro script. Ahora le daremos al botón de compilar y nos saldrá un cuadro como este:



El cuadro nos indica que offset libre fué asignado a cada @.
Nos vendrá marcado el offset principal (El del primer #org), y le tendremos que dar a copiar. Ahora pegamos nuestro offset en el cuadro "Script offset"
de nuestro mini en AM y ya lo tendremos.

A mí me ha quedado tal que así:



Preguntas frecuentes

¿Por qué mi jugador se queda bloqueado?

Posiblemente te falte el comando release o no has puesto el comando end

He compilado bien el script pero no me funciona

Asegúrate que dejas los dos primeros ceros como ceros en la casilla "script offset" del AM.

El mini me dice cosas que no le he puesto

Posiblemente se hayan asignado offset erróneos o tu mini está bugeado.
Asegúrate de que tienes #dynamic 0x800000 bien puesto. En caso de que persista el bug, borra el mini y crea otro, poniéndole el mismo offset principal.

He compilado, he abierto el script, lo he modificado y vuelto a compilar y ahora tengo bugs

Cuando abres un script compilado, le añades comandos y lo vuelves a compilar estás provocando que el offset almacene más datos de los que en un principio le fueron asignados, y esto causa bugs no solo en tu script sino en otros scripts con offsets de números cercanos.

Cuando se modifica y es para sustituir comando del miso tamaño o para cambiar un número o una letra no importa que compilemos tal cual. Pero si lo que quieres es añadir nuevos comandos, lo que tienes que hacer es asignar nuevos offsets. Para esto volverás a escribir arriba del todo #dynamic 0x800000 y sustituirás los offsets por nombre con @, (como si estuvieras haciendo un script desde el principio). De esta forma generarás nuevos offsets para el script y no bugearás el script ni otros scripts.

Algunos mensajes me salen de un color que no he puesto

Al menos en Fire Red, algunos minis con los que interaccionamos tienen un color de texto predeterminado. Si quieres poner otro color simplemente pon el comando especial correspondiente al color que quieras antes del texto.

Mi advanced map 1.95 en español tiene bugs

El AM 1.95 es español suele tener algunos bugs de texto, lo mejor instalarlo en lenguaje inglés, de esta forma no te dará ningún problema.

________________________________________________________________






¿Qué es una variable?

Es como una caja que almacena datos. ¿Qué datos? En este caso, almacena números, del 0 al FFFF

¿FFFF? Sí. Porque recordad que en XSE trabajamos con hexadecimal

Las variables se representan por números, y cuando las pongamos en nuestro XSE, como todo número, será precedido por un "0x".
Por ejemplo, tenemos la variables 0x4000 (La cuatromil). Pues esta variable
podrá guardar números que nosotros le pongamos.


¿Para qué sirve una variable?

Podemos usar una variable para hacer condiciones y que dependiendo de estas se ejecute un evento o no. Por ejemplo, en nuestro pueblo inicial ponemos un script de una persona que no nos deje pasar hasta que no consigamos nuestro primer Pokémon. Entonces cuando consigamos nuestro primer Pokémon a la variable 0x4000 le damos el valor "1", y resulta que nuestro script que impedía que pasáramos tenía como condición que no nos dejara pasar a no se que la variable 0x4000 tuviera el valor "1". De esta forma sabremos cuando hemos conseguido nuestro primer pokémon, cuando la variable 0x4000 sea "1". Y así en nuestro script que nos impide el paso podemos controlar cuando sí nos tiene que dejar el paso.

Las variables tienen muchos usos, como en scripts de gatillo y nivel que veremos en otras lecciones.


¿Cómo le damos valor a nuestra variable?

Con el comando setvar podemos darle un valor a nuestra variable de esta forma:

Código:
setvar 0x4000 0x1
setvar es el comando para dar un valor fijo a la variable

0x(número de la variable, en este caso 4000)

0x(El valor que le queremos dar, en este caso 1)

Entonces si nosotros al hacer un script ponemos setvar 0x4000 0x1 le estaremos dando valor 1 a la variable 4000.

Por ejemplo, vamos a darle a la variable 4050 el valor "C", después de que un mini nos diga "hola". Quedaría tal que así:

Código:
#dynamic 0x800000

#org @inicio
msgbox @texto 0x2
setvar 0x4050 0xC
end

#org @texto
= ¡Hola!
Simplemente le hemos dado un valor a la variable 4050. En este caso es un poco inútil porque no hemos aprovechado la variable para ninguna condición.


¿Cómo pongo una condición?

Las condiciones se pondrán con el comando "if".
Los tipos de condiciones que hay son:

  • Menor a (<)
  • Igual a (=)
  • Mayor a (>)
  • menor o igual a (<=)
  • mayor o igual a (>=)
  • Distinto de (No = a)

Pero, ¿igual, mayor, distinto a qué? Fácil, a un número de nuestra variable.
Cada una de estas condiciones se representa por un número que pondremos después del "if", y como todo número, antes tendrá un "0x".

Esta es la lista pero representado en números:

[*]Menor a 0x0
[*]Igual a 0x1
[*]Mayor a 0x2
[*]menor o igual a 0x3
[*]mayor o igual a 0x4
[*]Distinto de 0x5

Entonces si queremos poner la condición de que un número sea mayor o igual a, tendremos que poner:

Código:
if 0x4

Comparar una variable con un número

Vamos a poner en práctica lo que sabemos de los if. Si queremos poner un if de que la variable 0x4000 sea un "2", como haremos esa comparación?

Bueno, tenemos un comando que se llama "compare" el cual compara una variable con un número que nosotros pongamos. Esta es su estructura:

Código:
compare 0x(variable) 0x(número a comparar)
Entonces, si queremos comparar la variable 0x4000 con el número 2, pondremos:

Código:
compare 0x4000 0x2
Ahora que hemos comparado la variable con dos, pondremos nuestro if. en este caso, queremos poner como condición a comprobar si el número comparado es el número que se le tiene asignado a la variable.

Código:
compare 0x4000 0x2
if 0x1
Lo que quiere decir estos comandos, es que si la variable 4000 es igual a 2......

Si tuvieramos esto:

Código:
compare 0x4000 0x2
if 0x0
El comando estaría diciendo: si la variable 4000 es menor que 2.....




¿Y sí se cumple la condición?

En caso de que se cumpla la condición tendremos que decirle al programa que lea otra parte del script. Esto quiere decir que si se cumple la condición mandaremos al juego a otro script/parte del script para que se ejecute.
Lo mandaremos a otra dirección con el comando "goto", y luego la dirección offset a donde tiene que ir.

En este caso, estos dos elementos se ponen después del if, quedando así:

Código:
if 0x1 goto @otraparte
Ahora, vamos a ponerlo entero:

Código:
#dynamic 0x800000

#org @inicio
setvar 0x4000 0x3
compare 0x4000 0x2
if 0x1 goto @inicio2
end
Primero le damos el valor 3 a la variable 4000, luego comparamos el número 2 en la variable 4000. Y luego, ponemos la condición de si es igual a 2, ir (goto) a @inicio2.

¿Iría a @inicio2?

No, porque la condición no se cumple. La variable 4000 es 3 no 2, entonces el script continuaría, se ejecutaría el "end", y se terminaría el script.

Para que se cumpla la condición tendría que ser así:

Código:
#dynamic 0x800000

#org @inicio
setvar 0x4000 0x2
compare 0x4000 0x2
if 0x1 goto @inicio2
end
Ahora sí se cumple la condición, pero ¿Y @inicio2?. @inicio2 no existe es nuestro script, así que daría error. Vamos a crear una dirección offset que se llame @inicio2:

Código:
#dynamic 0x800000

#org @inicio
compare 0x4000 0x0
if 0x1 goto @inicio2
end

#org @inicio2
msgbox @texto 0x2
waitmsg
setvar 0x4000 0x1
end

#org @texto
= hola
Cuando compilamos el script y copiamos el offset de @inicio y se lo ponemos a un mini, la primera vez que hablemos con el mini, como la variable 4000 es igual a 0 (si no le damos valor a una variable es cero, todas las variables empiezan en cero y después con setvar fijamos su valor para siempre, a no ser de que se vuelva a cambiar con setvar), entonces se cumple la condición e irá (goto) a @inicio2, entonces se mostrará el texto "hola" por pantalla. Con el "waitmsg" el juego esperará a que se cierra el texto para ejecutar el siguiente comando, aunque en este ejemplo no sirve para nada y se puede omitir, y luego le pondremos el valor "1" a la variable
0x4000

¿Que pasa si volvemos a hablar con el minisprite?

Pues que no dirá ni hará nada, porque cuando llegue a la condición, como ahora la variable 0x4000 es "1", el juego no irá (goto) a @inicio2, y por lo tanto se ejecutará el comando end y se acabará el script sin que pase absolutamente nada.

Si tuviéramos este script:

Código:
#dynamic 0x800000

#org @inicio
compare 0x4000 0x0
if 0x1 goto @inicio2
msgbox @despedirse 0x2
end

#org @inicio2
msgbox @texto 0x2
setvar 0x4000 0x1
end

#org @texto
= hola

#org @despedirse
= adiós
Entonces al hablar con el mini por primera vez nos diría "hola". Y cambiamos el valor de la variable, después solo y siempre que hables con él dirá "adiós".

Si tuviéramos esto:

Código:
#dynamic 0x800000

#org @inicio
compare 0x4000 0x0
if 0x1 goto @inicio2
msgbox @despedirse 0x2
setvar 0x4000 0x0
end

#org @inicio2
msgbox @texto 0x2
setvar 0x4000 0x1
end

#org @texto
= hola

#org @despedirse
= adiós
En este caso cuando dice hola, luego dirá adiós, y cuando diga adiós, luego dirá hola, porque estaremos cambiando la variables continuamente según lo que diga, y las condiciones se cumplirán si y no, según hablemos con el mini.



PREGUNTAS FRECUENTES

¿Por qué si tengo dos #org se ejecuta el primero?

Porque es el #org del offset que copiamos y ponemos en el cuadro "script offset" de un minisprite.

¿Qué variables puedo usar?

Las variables libres que puedes usar y que no darán en ningún caso error si trabajas con ellas son las que están en el rango:

4011-40FF

Pero realmente la mayoría de la gente utiliza hasta 4FFF, e incluso también
las que comprender entre 5000-5FFF.

Al compilar mi variable a cambiado a otra

A veces al compilar puede surgir el bug de que después de compilar tu variable haya cambiado a otra, por ejemplo teníamos setvar 0x4000 y de repente pone setvar 0x8345. En este caso vuelve a cambiar el número de tu variable, y vuelve a compilar, si el problema persiste, tendrás que repuntear el script.

________________________________________________________________





Comando CHECKGENDER

Gracias al comando checkgender podemos verificar si nuestro personaje es un chico o una chica. Se suele utilizar por ejemplo para que dependiendo del género se diga un diálogo u otro y también para hacer aparecer al minisprite de tú género contrario al estilo Ruby.

Es simple. Solo tendremos que poner "checkgender", y lo que hará el juego será asignar a la variable 0x800D un "0" si somos un chico, y un "1" si somos una chica.

Código:
#dynamic 0x800000

#org @inicio
checkgender
end


Comparando el checkgender

Una vez que sabemos que si después de utilizar el checkgender la variable 0x800D es "0" quiere decir que somos un chico, ahora solo nos queda comparar la variable y en función de hacer una cosa u otra. Aquí un ejemplo:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
checkgender
compare 0x800D 0x0
if 0x1 goto @eschico
if 0x5 goto @eschica
end

#org @eschico
msgbox @textochico 0x6
release
end

#org @eschica
msgbox @textochica 0x6
release
end

#org @textochico
= Eres un tío

#org @textochica
= Eres una tía
En este código utilizamos checkgender. Si somos un chico la variable 0x800D tendrá el valor "0". Entonces comparamos la variable 0x800D con "0". En caso de que sea igual a cero (if 0x1) entonces irá a @eschico y se ejecutará un texto que no dice que somos un tío. En caso de que no sea "0" (if 0x5) entonces irá a @eschica y se ejecutará el texto que nos dirá que somo una tía.

El código anterior se puede poner de esta otra forma para ahorrar líneas:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
checkgender
compare 0x800D 0x0
if 0x1 goto @eschico
goto @eschica
end

#org @eschico
msgbox @textochico 0x6
release
end

#org @eschica
msgbox @textochica 0x6
release
end

#org @textochico
= Eres un tío

#org @textochica
= Eres una tía
Como veis, el comando goto no hace falta que vaya después de un if para ejecutarse. Ahora hemos simplificado el código. En caso de que no sea un chico, el código no irá a @eschico y se seguirá ejecutando por abajo, entonces simplemente ponemos el texto de si es chica debajo de la condición.


lastresult

Son varios los comandos que al ejecutarse, guardan valores en variables dependiendo de las condiciones, para que de esta forma después nosotros podamos trabajar con dicha variables y hacer nuestras propias condiciones. Pero si en vez de poner la variable ponemos "lastresult" nos funcionará igual.

lastresult que viene de last (último) result (resultado), lo que hace es sustituir a la variable 800D. Con esto no hace falta que nos sepamos en que la variable 800D guarda los valores, con poner lastresult en vez de la variable, nos hará la misma función.

Vamos a poner el anterior código con lastresult:

Código:
#dynamic 0x800000

#org @inicio
faceplayer
lock
checkgender
compare lastresult 0x0
if 0x1 goto @eschico
goto @eschica
end

#org @eschico
msgbox @textochico 0x6
release
end

#org @eschica
msgbox @textochica 0x6
release
end

#org @textochico
= Eres un tío

#org @textochica
= Eres una tía
Hemos sustituido la variable 0x800D por lastresult y el resultado es el mismo.


MSGBOX 0x5 / Yes-No

Ahora vamos entrar en profundidad sobre el "tipo de mensaje 0x5" el cual habíamos dicho en la primera lección que se utilizaba para abrir al box del yes/no.

Código:
#dynamic 0x80000

#org @inicio
faceplayer
lock
msgbox @texto 0x5
release
end

#org @texto
= ¿Quieres leche?
Acabamos de hacer un script en el cual se nos preguntará si queremos leche y se nos dará las opciones de sí y no.

¿Qué pasará si escogemos una opción?

Pues nada, porque solo hemos hecho la pregunta.

En función de si contestamos sí o no tendremos una variable a la cual se le asignará el valor "1" si contestamos sí, y el valor "0" si contestamos no.

Vamos a aprovechar el elemento lastresult para nuestra condición de si a contestado sí o no. Es como el checkgender.

Código:
#dynamic 0x80000

#org @inicio
faceplayer
lock
msgbox @texto 0x5
compare lastresult 0x1
if 0x1 goto @si
msgbox @textono 0x6
release
end

#org @si
msgbox @textosi 0x6
release
end

#org @textosi
= Has dicho sí

#org @textono
= Has dicho no

#org @texto
= ¿Quieres leche?
Primero hacemos la pregunta con el msgbox tipo "0x5", si contestamos sí nuestra variable será "1", entonces comparamos la variable (compare lastresult) con "1" y en caso de que sí sea uno (if 0x1) irá a @si. En caso de que contestemos no, y por tanto la condición no se cumpla, pues se ejecutará el codigo de abajo, entonces ponemos que texto que queremos que nos diga si decimos no abajo de la condición, y hecho.


Preguntas frecuentes

¿Cómo hago para que aparezca un mini u otro dependiendo del checkgender?

Esto lo sabremos hacer cuando aprendamos a usar Flags, en otra lección.

¿En qué variable se guarda en el caso del yes/no?

Yo siempre utilizo el "lastresult" para no equivocarme nunca. Pero como bien he dicho arriba, LASTRESULT = 800D

¿Cómo hago para que en vez del si/no muestre otras opciones?

Hacer es más complicado de lo que parece, al menos, si lo que queremos son opciones personalizadas. De todas formas también hablaremos de esto más adelante.

Si quiero hacer dos if para comprobar el género tengo que hacer dos compare?

Puedes hacerlo pero no es necesario. Se podría hacer así:

Código:
checkgender
compare lastresult 0x1
if 0x1 goto @chica
if 0x0 goto @chico

________________________________________________________________




Crear un póster

Primero, creamos el evento en AM. Para eso en el apartado eventos aumentados el número de "singposts". Le damos a "change events" y nos aparecerá una "S" de color anaranjado.

En las opciones de este eventos debemos ponerlo como tipo "script", para que podamos poner nuestro offset en él. Aparte de esto, también podemos ponerlo como script pero si el jugador está mirando para cierto lado, eso ya depende de cada uno.

Para crear el script de un póster es muy sencillo, solo hay que usar el tipo msgbox 0x3. De esta forma:

Código:
#dynamic 0x800000

#org @inicio
msgbox @texto 0x3
end

#org @texto
= ¡Bienvenido a Pueblo Sol!
Ya está. Demasiado fácil, ¿Verdad?


¿Qué es una Flag?

Las flags son elementos como las variables, solo que estas no almacenan números, sino que almacenan dos estados, activada o desactivada.

Una Flag por defecto siempre estará desactivada.


¿Para qué sirven?

Se pueden utilizar como las variables, para controlar condiciones. Por ejemplo, tenemos un mini que te da un objeto. Pues primeros miramos si la flag está activada. En caso de que no lo esté, le damos el pokémon, y en caso de que esté activada pues preguntará como está el pokémon entregado. Cuando se ejecuten los comandos de entregar el pokémon, ponemos un comando para activar la flag, de esta forma el evento de entregar el pokémon solo se hará una vez y no se repetirá constantemente. Luego nos preguntará siempre por el pokémon, porque la flag estará activada.

Podemos asignarle una flag a un minisprite en el campo "person_id". De esta forma, si activamos la flag del minisprite conseguiremos que el mini sea completamente invisible, como el profesor oak en Pueblo Paleta, que si os fijáis aparece su minisprite en medio del mapa sin embargo no lo podéis ver en el juego y lo traspasáis. Esto es porque cuando ocurre el evento de que te vas a la hierba alta, se desactiva su flag asignada.


Activando y desactivando Flags

Normalmente, se pueden usar flags desde la 100 hasta la 2FF. Muchas son utilizadas en el juego por objetos ocultos y minisprites. Estas son las más seguras de utilizar pero muchas gente utilizada flags de la 500 para arriba.

Para activar una Flag, utilizamos el comando setflag (número de flag), de esta forma:

Código:
setflag 0x200
Ahí estamos activando la flag número 200


Desactivando una flag

Una flag que esté activada se puede desactivar con el comando clearflag (número de flag). Tal que así:

Código:
clearflag 0x200
Ahora la flag 200 estará desactivada


Hacer desaparecer a un mini

Un mini en AM tiene una casilla que se llama person_id (depende de la versión). En esta casilla podemos poner una flag, y si se activa la flag que hemos puesto en dicha casilla, el mini desaparecerá, pero no hasta que refresques la pantalla. Para hacer que un mini por ejemplo desaparezca en un script, tenemos que primero activar la flag de la id con un setflag, y luego hacer un hidesprite 0x?, donde "?" es el número de persona del mini. Tiene que ser en este orden porque si no no funcionará.


Condiciones con Flags

Se pueden hacer condiciones con las flags. Si utilizamos el comando checkflag (número de flag), el juego comprobará si una flag está activada.
Entonces es cuando nosotros podremos poner la condición if 0x1, la cual se cumplirá si la flag está activada.(La condición de estar activada se representa con if 0x1)

Vamos a comprobar si una flag está activada, y dependiendo de si lo está, que se diga un texto u otro.

Código:
#dynamic 0x800000

#org @inicio
checkflag 0x200
if 0x1 goto @activada
msgbox @texto1 0x6
end

#org @activada
msgbox @texto2 0x6
end

#org @texto1
= Está desactivada

#org @texto2
= Está activada
Primeros comprobamos si la flag 200 está activada (checkflag 0x200)
En caso de que esté activada iremos a @activada (if 0x1 goto @activada)
Si hemos ido a @activada nos dirán el @texto2
Si no se cumple la condición el script seguirá y se ejecutará el msgbox @texto1.


Flags vs Variables

¿Es mejor trabajar con variables o con flags para las condiciones dentro de un script?

Sin duda alguna es mejor utilizar variables, y las flags utilizarlas para hacer desaparecer objetos ocultos y minisprites.

¿Por qué?

Aparte de que creo que las flags son más valiosas, una variable da más posibilidades de hacer un script más complejo.

Por ejemplo, vamos a utilizar el script de decir un texto u otro que utilizamos arriba y lo vamos hacer con flags y con variables. Y esta vez cuando diga el @texto1 activaremos la flag o le daremos un valor a nuestra variable para que después solo nos diga el @texto2.

Con flags:

Código:
#dynamic 0x800000

#org @inicio
checkflag 0x200
if 0x1 goto @activada
msgbox @texto1 0x6
setflag 0x200
end

#org @activada
msgbox @texto2 0x6
end

#org @texto1
= Está desactivada

#org @texto2
= Está activada

Con variables: (Toda var empieza teniendo el valor 0)

Código:
#dynamic 0x800000

#org @inicio
compare 0x4000 0x1
if 0x1 goto @activada
msgbox @texto1 0x6
setvar 0x4000 0x1
end

#org @activada
msgbox @texto2 0x6
end

#org @texto1
= Está desactivada

#org @texto2
= Está activada

Como veis, podemos utilizar una variable y una flag para condiciones en scripts. Ahora bien, y si queremos que después de pasarnos la liga pokémon
el minisprite nos diga algo distinto (es un poco absurdo pero es para poner un ejemplo).

Pues en el caso de la flag tendríamos que utilizar otra flag. Activaríamos por ejemplo la flag 201 cuando nos pasemos la liga, y así en nuestro script comprobando la flag 201 sabremos si nos hemos pasado la liga y dirá el tercer texto que queremos.

Quedaría así:

Código:
#dynamic 0x800000

#org @inicio
checkflag 0x201
if 0x1 goto @ligapasada
checkflag 0x200
if 0x1 goto @activada
msgbox @texto1 0x6
setflag 0x200
end

#org @activada
msgbox @texto2 0x6
end

#org @ligapasada
msgbox @texto3 0x6

#org @texto1
= Está desactivada

#org @texto2
= Está activada

#org @texto3
= ¡Te has pasado la liga!

Gastaremos un flag más.

Si utilizamos variables, no hace falta gastar otra variable, simplemente cuando nos pasemos la liga, le daremos el valor 2 a nuestra variable, y solo tendremos que comprobar si dicha variable es mayor que uno.

Código:
#dynamic 0x800000

#org @inicio
compare 0x4000 0x1
if 0x1 goto @activada
if 0x2 goto @ligapasada
msgbox @texto1 0x6
setvar 0x4000 0x1
end

#org @activada
msgbox @texto2 0x6
end

#org @ligapasada
msgbox @texto3 0x6

#org @texto1
= Está desactivada

#org @texto2
= Está activada

#org @texto3
= ¡Te has pasado la liga!

Hemos utilizado solo una variable de forma más práctica. Y en caso de que quisiéramos poner más condiciones, podríamos estar jugando con el valor de la misma variable infinitamente (hasta el valor FFFF).

Mi consejo es que las flags las aprovechéis para objetos ocultos, no ocultos, minisprites, entrenadores ect.

Para saber como hacer desaparecer un minisprite mediante una flag que vea el apartado Efectos de pantalla la sección "hidesprite"


Crear un objeto oculto

Primero tenemos que crear un evento como el de un póster.
En singpost type pondremos la opción 7 hidden item (objeto oculto). En la opción de abajo donde pone ID, tendremos que poner una flag que no hayamos utilizado, y en la opción de abajo es el número de objetos que te va a dar (normalmente solo se pone 1).

Cuando encontremos dicho objeto en nuestro juego, la flag que habremos puesto como id se actiará, de esta forma no podremos volver a coger el objeto oculto, por eso es importante que esa flag ya no la utilicemos para otras cosas.


Flags especiales

Los juegos de pokémon tienen unas flags especiales las cuales cuando se activan provocan que se activen un evento del juego, como las zapatillas.
Por ejemplo, en Fire Red si activamos la flag 0x82F, podremos correr con las zapatillas. También hay flags especiales para activar el menú pokémon, la pokédex y las medallas. Estas son las que hay en los tres juegos:

0x820 – Activa la primera medalla
0x821 - Activa la segunda medalla
0x822 - Activa la tercera medalla
0x823 - Activa la cuarta medalla
0x824 - Activa la quinta medalla
0x825 - Activa la sexta medalla
0x826 - Activa la septima medalla
0x827 - Activa la octava medalla
0x828 - Activa el menú Pokemon
0x829 - Activa la Pokedex
0x82F - Activa las zapatillas

0x800 - Activa el menu pokemon
0x801 - Activa la pokedex
0x802 - activa el pokenav
0x807 - Activa la primera medalla
0x808 - Activa la segunda medalla
0x809 - Activa la tercera medalla
0x80A - Activa la cuarta medalla
0x80B - Activa la quinta medalla
0x80C - Activa la sexta medalla
0x80D - Activa la septima medalla
0x80E - Activa la octava medalla
0x860 - Activa las zapatillas

0x860 - Activa el menu pokemon
0x861 - Activa la pokedex
0x862 - activa el pokenav
0x867 - Activa la primera medalla
0x868 - Activa la segunda medalla
0x869 - Activa la tercera medalla
0x86A - Activa la cuarta medalla
0x86B - Activa la quinta medalla
0x86C - Activa la sexta medalla
0x86D - Activa la septima medalla
0x86E - Activa la octava medalla
0x8C0 - Activa las zapatillas

Cuando hagáis un setflag en alguna de estas flags, hará lo que indica al lado.


Preguntas frecuentes

Activo una flag que está en el person_id de un mini, pero el mini no desaparece

El mini no desaparecerá hasta que cambiéis de mapa o refresquéis la pantalla, eso es así. Pero si utilizáis el comando hidesprite 0x(numero del mini en AM), justo antes del comando setflag, hará el efecto de desaparecer instantáneamente.

Utilizo el comando clearflag pero el mini no vuelve a aparecer en mi evento

Un mini que no está visible debido a un setflag no hace falta que hagáis un clearflag para que se visualice en vuestro script. Simplemente con el comando showsprite 0x(numero del mini en AM) podéis que hacer que aparezca en vuestro evento. Si después utilizáis un hidesprite lo haréis desaparecer y ni tendréis que utilizar ni el clearflag ni el setflag.

He perdido la cuenta de las flags o variables que estaba utilizando

Todo buen rom-hacker tiene una archivo de texto donde apunta las variables y flags que va utilizando y para qué las utilizó.

________________________________________________________________




Asginar Weather

Esto es sencillo y corto. Se trata de mediante un comando en un script cambiar el tiempo de dicha zona del mapa. Para dar un determinado tiempo a la zona del mapa donde está el script utilizaremos el comando setweather 0x(número de weather)

Cada tipo de tiempo tiene un número asignado, y este es el que pondremos en nuestro comando para asignar nuestro tipo de tiempo al mapa. Por ejemplo, el número de lluvia es el "3", entonces, el comando quedaría así:

Código:
setweather 0x3
¿Qué números están asignados a qué tiempo?

Fácil de saber, ya que esto lo podemos saber gracias al advanced map, el cual en el cabezal de nuestro mapa en la opción weather, nos desplegará una lista con los tipos de tiempo disponibles y su número al lado.




Ejecutar Weather

Si solo pusiéramos el comando de arriba, no cambiaríamos el tiempo de nuestro mapa, pues el comando setweather solo sirve para asignar un tipo de tiempo a nuestro mapa (hasta que se refresque la pantalla).

Para ejecutar definitivamente nuestro tiempo tendremos que poner el comando

Código:
doweather
De tal forma que nuestro tiempo no se activará en el mapa hasta que no utilizamos nuestro doweather. Por ejemplo:

Código:
#dynamic 0x800000

#org @inicio
setweather 0x3
msgbox @texto 0x2
waitmsg
doweather
end

#org @texto
= ¡Ahora lloverá!
En este script no empezará a llover hasta que no acabemos de hablar con el mini, ya que el doweather lo hemos puesto después del waitmsg.


Dar un objeto

Para dar un objeto a nuestro jugador, necesitamos el comando giveitem, el cual funciona de esta manera:

giveitem 0x(número del objeto) 0x(cantidad) (tipo de mensaje)

¿Qué número de objeto tiene cada objeto?
Aquí una lista de los números asignados a cada objeto:

Master Ball 1
Ultra Ball 2
Great Ball 3
Poké Ball 4
Safari Ball 5
Net Ball 6
Dive Ball 7
Nest Ball 8
Repeat Ball 9
Timer Ball 10
Luxury Ball 11
Premier Ball 12
Potion 13
Antidote 14
Burn Heal 15
Ice Heal 16
Awakening 17
Parlyz Heal 18
Full Restore 19
Max Potion 20
Hyper Potion 21
Super Potion 22
Full Heal 23
Revive 24
Max Revive 25
Fresh Water 26
Soda Pop 27
Lemonade 28
Moomoo Milk 29
Energypowder 30
Energy Root 31
Heal Powder 32
Revival Herb 33
Ether 34
Max Ether 35
Elixir 36
Max Elixir 37
Lava Cookie 38
Blue Flute 39
Yellow Flute 40
Red Flute 41
Black Flute 42
White Flute 43
Berry Juice 44
Sacred Ash 45
Shoal Salt 46
Shoal Shell 47
Red Shard 48
Blue Shard 49
Yellow Shard 50
Green Shard 51
HP Up 63
Protein 64
Iron 65
Carbos 66
Calcium 67
Rare Candy 68
PP Up 69
Zinc 70
PP Max 71
Guard Spec. 73
Dire Hit 74
X Attack 75
X Defend 76
X Speed 77
X Accuracy 78
X Special 79
Poké Doll 80
Fluffy Tail 81
Super Repel 83
Max Repel 84
Escape Rope 85
Repel 86
Sun Stone 93
Moon Stone 94
Fire Stone 95
Thunderstone 96
Water Stone 97
Leaf Stone 98
Tinymushroom 103
Big Mushroom 104
Pearl 106
Big Pearl 107
Stardust 108
Star Piece 109
Nugget 110
Heart Scale 111
Orange Mail 121
Harbor Mail 122
Glitter Mail 123
Mech Mail 124
Wood Mail 125
Wave Mail 126
Bead Mail 127
Shadow Mail 128
Tropic Mail 129
Dream Mail 130
Fab Mail 131
Retro Mail 132
Cheri Berry 133
Chesto Berry 134
Pecha Berry 135
Rawst Berry 136
Aspear Berry 137
Leppa Berry 138
Oran Berry 139
Persim Berry 140
Lum Berry 141
Sitrus Berry 142
Figy Berry 143
Wiki Berry 144
Mago Berry 145
Aguav Berry 146
Iapapa Berry 147
Razz Berry 148
Bluk Berry 149
Nanab Berry 150
Wepear Berry 151
Pinap Berry 152
Pomeg Berry 153
Kelpsy Berry 154
Qualot Berry 155
Hondew Berry 156
Grepa Berry 157
Tamato Berry 158
Cornn Berry 159
Magost Berry 160
Rabuta Berry 161
Nomel Berry 162
Spelon Berry 163
Pamtre Berry 164
Watmel Berry 165
Durin Berry 166
Belue Berry 167
Liechi Berry 168
Ganlon Berry 169
Salac Berry 170
Petaya Berry 171
Apicot Berry 172
Lansat Berry 173
Starf Berry 174
Enigma Berry 175
Brightpowder 179
White Herb 180
Macho Brace 181
Exp. Share 182
Quick Claw 183
Soothe Bell 184
Mental Herb 185
Choice Band 186
King's Rock 187
Silverpowder 188
Amulet Coin 189
Cleanse Tag 190
Soul Dew 191
Deepseatooth 192
Deepseascale 193
Smoke Ball 194
Everstone 195
Focus Band 196
Lucky Egg 197
Scope Lens 198
Metal Coat 199
Leftovers 200
Dragon Scale 201
Light Ball 202
Soft Sand 203
Hard Stone 204
Miracle Seed 205
Blackglasses 206
Black Belt 207
Magnet 208
Mystic Water 209
Sharp Beak 210
Poison Barb 211
Nevermeltice 212
Spell Tag 213
Twistedspoon 214
Charcoal 215
Dragon Fang 216
Silk Scarf 217
Up-grade 218
Shell Bell 219
Sea Incense 220
Lax Incense 221
Lucky Punch 222
Metal Powder 223
Thick Club 224
Stick 225
Red Scarf 254
Blue Scarf 255
Pink Scarf 256
Green Scarf 257
Yellow Scarf 258
Mach Bike 259
Coin Case 260
Itemfinder 261
Old Rod 262
Good Rod 263
Super Rod 264
S.S. Ticket 265
Contest Pass 266
Wailmer Pail 268
Devon Goods 269
Soot Sack 270
Basement Key 271
Acro Bike 272
PokéBlock Case 273
Letter 274
Eon Ticket 275
Red Orb 276
Blue Orb 277
Scanner 278
Go-goggles 279
Meteorite 280
Rm. 1 Key 281
Rm. 2 Key 282
Rm. 4 Key 283
Rm. 6 Key 284
Storage Key 285
Root Fossil 286
Claw Fossil 287
Devon Scope 288
TM01 289
TM02 290
TM03 291
TM04 292
TM05 293
TM06 294
TM07 295
TM08 296
TM09 297
TM10 298
TM11 299
TM12 300
TM13 301
TM14 302
TM15 303
TM16 304
TM17 305
TM18 306
TM19 307
TM20 308
TM21 309
TM22 310
TM23 311
TM24 312
TM25 313
TM26 314
TM27 315
TM28 316
TM29 317
TM30 318
TM31 319
TM32 320
TM33 321
TM34 322
TM35 323
TM36 324
TM37 325
TM38 326
TM39 327
TM40 328
TM41 329
TM42 330
TM43 331
TM44 332
TM45 333
TM46 334
TM47 335
TM48 336
TM49 337
TM50 338
HM01 339
HM02 340
HM03 341
HM04 342
HM05 343
HM06 344
HM07 345
HM08 346
Oak's Parcel 349
Poké Flute 350
Secret Key 351
Bike Voucher 352
Gold Teeth 353
Old Amber 354
Card Key 355
Lift Key 356
Helix Fossil 357
Dome Fossil 358
Silph Scope 359
Bicycle 360
Town Map 361
VS Seeker 362
Fame Checker 363
TM Case 364
Berry Pouch 365
Teachy TV 366
Tri-pass 367
Rainbow Pass 368
Tea 369
Mysticticket 370
Auroraticket 371
Powder Jar 372
Ruby 373
Sapphire 374

Entonces, si queremos que nos den 5 master balls una persona, pondremos este comando:

Código:
giveitem 0x1 0x5 MSG_OBTAIN.

Recibir objetos de una persona

Si utilizamos el comando giveitem al hablar con una persona, en tipo de mensaje tendremos que poner "MSG_OBTAIN", el otro tipo de mensaje que es el que se utiliza para objetos encontrados en pokeballs es "MSG_FIND".

¿Qué pasa si utilizo MSG_FIND en vez de MSG_OBTAIN al recibirlo de una persona?

Pues que mientras recibes el objeto de bugeará el mini con el que estás hablando.

Tanto los tipos de mensajes MSG_FIND y MSG_OBTAIN, lo que hacen es mostrarte un cuadro de texto diciendo que player ha obtenido el objeto que le habéis asignado al giveitem, y también sonará la música de cuando recibes un objeto, por lo que no nos tendremos que preocupar de poner ninguna música ni de escribir ningún texto diciendo que has recibido dicho objeto.

En definitiva, un script de ejemplo sería así:

Código:
#dynamic 0x800000

#org @inicio
msgbox @texto 0x2
waitmsg
giveitem 0x1 0x1 MSG_OBTAIN
end

#org @texto
= ¡Toma una Master Ball!

Recibir objetos de una pokéball

En vez de MSG_OBTAIN, pondremos MSG_FIND. Y al mini de la pokéball tendremos que asignarle una flag, porque al activarse la flag nuestra pokéball desaparecerá.

¿No tengo que poner el comando setflag?

No, porque al usar el comando giveitem, automáticamente se activará la flag asignada al mini con el que has hablado (En este caso un pokéball), y desaparecerá sin dejar rastro.

Aquí un ejemplo de una pokéball de la ruta 2:

Código:
'---------------
#org 0x1BE59B
giveitem 0x12 0x1 MSG_FIND
end
Simple


Sounds

Para ejecutar sonidos en nuestro script, simplemente pondremos el comando sound 0x(número de sonido). Aquí la lista de los sonidos disponibles junto con su número asignado:

sound 0x1 - Recuperando vida
sound 0x2 - Entrando en caja del PC
sound 0x3 - Cerrando PC
sound 0x4 - Abriendo PC
sound 0x5 - Seleccionando / Cerrando el menú
sound 0x6 - Abriendo el menú
sound 0x7 - Chocanco con la pared
sound 0x8 - Abriendo puerta
sound 0x9 - Warp
sound 0xA - Salto
sound 0xB - Usando la bici
sound 0xC - Golpe debil
sound 0xD - Golpe normal
sound 0xE - Golpe crítico
sound 0xF - Pokémon regresando a la pokeball en combate
sound 0x10 - Pokémon derrotado
sound 0x11 - Huida
sound 0x12 - Puerta centro pokémon
sound 0x13 - SS aqua
sound 0x14 - Abriendo puerta con golpe
sound 0x15 - Pitido suave (signo de exclamacion)
sound 0x16 - Pitido grave (Error)
sound 0x17 - Colocando pokéball en el CP para curar
sound 0x18 - Decidiendo los puestos en concurso (R/Z/E)
sound 0x19 - Captando la atención en concursos (R/Z/E)
sound 0x1A - Error
sound 0x1B - Barra de nivel aumentando
sound 0x1C - Bote bici acrobacias (R/Z/E)
sound 0x1D - Apretando botón
sound 0x1E - Apretando botón 2
sound 0x1F - Puerta atascada
sound 0x20 - Puerta atascada 2
sound 0x21 - Cuando entras en agujero de arena (4º gimnasio R/Z/E)
sound 0x22 - Blindado
sound 0x23 - Rompiendo hielo
sound 0x24 - Quebrando hielo
sound 0x25 - Cayendo
sound 0x26 - Abriendo puerta pesada
sound 0x27 - Teletransportacion ida
sound 0x28 - Teletransportacion regreso
sound 0x29 - Parecido al sound 2D
sound 0x2A - Sonido barras 6º gimnasio R/Z/E
sound 0x2B - Camión en marcha (infinito)
sound 0x2C - Camión deteniéndose
sound 0x2D - Antes de abrir la puerta del camión (R/Z/E)
sound 0x2E - Abriendo puerta (Camión R/Z/E)
sound 0x2F - Como un avión (infinito)
sound 0x30 -Partida guardada
sound 0x31-0x34 - Botes pokeball
sound 0x35 - Metiendo pokémon salvaje en pokeball
sound 0x36 - Lanzar pokeball
sound 0x37-0x3E - Pitidos (cada vez mas agudos)
sound 0x3F - Pisando agua
sound 0x40 - Al andar por puente
sound 0x41 - Pagando
sound 0x42 - Ding Dong
sound 0x43 - Al pisar un globo de agua
sound 0x44 - Al pisar un globo de agua 2
sound 0x45 - Rompiendo globo de agua
sound 0x46 - Golpe (parece un disparo)
sound 0x47 - Presionando palanca
sound 0x48 - Veneno
sound 0x49 - Bola de fuego
sound 0x4A - Lluvia (infinito)
sound 0x4B - Lluvia (1 segundo)
sound 0x4C - Lluvia fuerte (infinito)
sound 0x4D - Lluvia fuerte (1 segundo)
sound 0x4E - Lluvia ligera (infinito)
sound 0x4F - Lluvia ligera (1 segundo)
sound 0x50 - Trueno
sound 0x51 - Trueno (mas leve)
sound 0x52 - Maquinilla
sound 0x53 - Pokemon con poca vida (infinito)
sound 0x54 - Al llenar la barra de Exp al máximo
sound 0x55 - Furgoneta (dura un rato)
sound 0x56 - Parando furgoneta
sound 0x57 - Aleteos (infinito)
sound 0x58 - Comprando
sound 0x59 - Sonido al conseguir un corazon en concursos (R/Z/E)
sound 0x5A - Abriendo puerta corredera
sound 0x5B - Cerrando puerta corredera
sound 0x5C - Pulsar botón grande
sound 0x5D - Prendiendo cerrila?
sound 0x5E - Siguiente turno (concursos) (R/Z/E)
sound 0x5F - Brillo / PKMN Shiny
sound 0x60 - Sonido final intro ruby (como honda expansiva)
sound 0x61 - Parecido al anterior (más leve)
sound 0x62 - Gente gritando
sound 0x63 - Andando por puente metálico
sound 0x64 - Cuando brilla la esfera roja/azul (R/Z/E)
sound 0x65 - Pitido leve (Pokenav)
sound 0x66 - Al moverte por Pokenav
sound 0x67 - Abrir Pokenav
sound 0x68 - Cerrar pokenav
sound 0x69 - Te llaman al pokenav!
sound 0x6A - Sonido al abrirse el huevo
sound 0x6B - Papel de lija?
sound 0x6C - Cuando te mueves por PC
sound 0x6D - Picotazo muy leve
sound 0x6E - Al usar Flauta

sound 0xF1 -Abriendo puerta 2
sound 0xF2 -Apretando botón 3
sound 0xF3 -Parecido al 2D
sound 0xF4 -Al abrir T-card
sound 0xF5 -Sonido al moverte entre los objetos de la mochila
sound 0xF6 -Sonido al cambiar el bolsillo de la mochila
sound 0xF7 -Como un paso (muy leve)
sound 0xF8 -Sonido al comprar
sound 0xF9 -Sirena del barco al zarpar
sound 0xFA -Sonido al entrar al menú ayuda (L R)
sound 0xFB -Sonido al salir del menú ayuda (L R)
sound 0xFC -Igual que el FA pero con sonido de error al final
sound 0xFD -Sonido triángulo Deoxys
sound 0xFE -Curando (Exactamente igual que el AC)
sound 0xFF -Error (exactamente igual que el 1A)

(Sonidos de ataques):

sound 0x6F -Rayo (1º descarga)
sound 0x70 -Electricidad
sound 0x71 -Blindado 2
sound 0x72 -PKMN Maldito
sound 0x73 -1º golpe demolición
sound 0x74 -Patada baja
sound 0x75 -Burbuja
sound 0x76 -Chapoteolodo (cuando cae)
sound 0x77 -Burbuja antes de hidropulso
sound 0x78 -Lluvia corta
sound 0x79 -Corte
sound 0x7A -Viento cortante
sound 0x7B -Rayo confuso (2º sonido)
sound 0x7C -ROCAS
sound 0x7D -Tornado (infinito)
sound 0x7E -Medio tornado
sound 0x7F -Destructor
sound 0x80 -Doble equipo
sound 0x81 -Corte 2
sound 0x82 -Hielo
sound 0x83 -Onda trueno (solo descarga)
sound 0x84 -Golpe menor
sound 0x85 -Recargando rayo solar
sound 0x86 -Golpe mayor
sound 0x87 -Mini burbuja
sound 0x88 -Lanzando Pin misil
sound 0x89 -Quemadura
sound 0x8A -Quemadura 2
sound 0x8B -Lanzallamas
sound 0x8C -Puño fuego
sound 0x8D -veneno
sound 0x8E -Fuego (mas corto)
sound 0x8F -Lanzallamas 2
sound 0x90 -Fuego (mucho mas corto)
sound 0x91 -Desarrollo
sound 0x92 -Viento (infinito)
sound 0x93 -Viento (muy leve)
sound 0x94 -Arañazo
sound 0x95 -Golpe (sonido raro)
sound 0x96 -Aleteo
sound 0x97 -Vuelo
sound 0x98 -Ataque arena
sound 0x99 -Picotazo ven (sin el veneno)
sound 0x9A -Mordisco
sound 0x9B -Salpicar 1
sound 0x9C -Salpicar 2
sound 0x9D -Salpicar 3
sound 0x9E -Hidrobomba
sound 0x9F -Picotazo
sound 0xA0 -Salpicadura
sound 0xA1 -(Parece una escoba)
sound 0xA2 -Hoja afilada (cuando salen las hojas)
sound 0xA3 -Atadura
sound 0xA4 -Foco energía
sound 0xA5 -Canto
sound 0xA6 -Canto mortal
sound 0xA7 -Campanilla
sound 0xA8 -Excavar
sound 0xA9 -Confuso
sound 0xAA -Autodestrucción (solo 1 explosión)
sound 0xAB -Explosión (solo 1 explosión)
sound 0xAC -Curando
sound 0xAD -Picotazo (absorver/chupavidas)
sound 0xAE -Chirrido
sound 0xAF -Rayo aurora
sound 0xB0 -Rayo hielo
sound 0xB1 -Confusión
sound 0xB2 -Tambor
sound 0xB3 -Amnesia
sound 0xB4 -Hueslo palo
sound 0xB5 -Lengüetazo
sound 0xB6 -Rencor
sound 0xB7 -Finta
sound 0xB8 -Danza espada
sound 0xB9 -Destello/Malicioso
sound 0xBA -Contoneo
sound 0xBB -Frustración
sound 0xBC -Deseo (brillo)
sound 0xBD -Rayo confuso (1º sonido)
sound 0xBE -Ronquido/Descanso
sound 0xBF -Bola hielo
sound 0xC0 -Burbujas
sound 0xC1 -Más Psique
sound 0xC2 -Rayo solar (disparo)
sound 0xC3 -Día soleado
sound 0xC4 -Danza dragón
sound 0xC5 -Danza dragón (al reves)
sound 0xC6 -Impresionar
sound 0xC7 -Doble filo (sin golpe)
sound 0xC8 -Deseo (estrella fugaz)
sound 0xC9 -Parecido al anterior
sound 0xCA -Inversión (brillo)
sound 0xCB -Como un botón
sound 0xCC -Deseo (cuando te cura)
sound 0xCD -Encanto
sound 0xCE -Carga
sound 0xCF -Temblor (special 136)
sound 0xD0 -Parecido a malicioso
sound 0xD1 -Disparo lodo
sound 0xD2 -Inversión (cuando salen las bolitas)
sound 0xD3 -Lodo
sound 0xD4 -Tormenta arena
sound 0xD5 -Rizo defensa
sound 0xD6 -Trueno
sound 0xD7 -Impresionar (1º sonido)
sound 0xD8 -Gente gritando (dura menos que el 62)
sound 0xD9 -Relevo
sound 0xDA -Parecido al C8 pero mas corto
sound 0xDB -Atracción (al impactar)
sound 0xDC -Atracción (despúes de impactar)
sound 0xDD -Día soleado 2
sound 0xDE -Golpe seco
sound 0xDF -Ciclón
sound 0xE0 -Silbato (diferente)
sound 0xE1 -???????
sound 0xE2 -Buceo (al sumergirte)
sound 0xE3 -Terremoto
sound 0xE4 -Viento
sound 0xE5 -Dulce aroma
sound 0xE6 -Bostezo
sound 0xE7 -Mov. sísmico
sound 0xE8 -Sonido al subir stats en batalla
sound 0xE9 -Giro fuego
sound 0xEA -Gente gritando (1 segundo)
sound 0xEB -Congelado
sound 0xEC -Masa cósmica
sound 0xED -Danza caos
sound 0xEE -Sonido al bajar stats en batalla
sound 0xEF -Rabia
sound 0xF0 -Parecido al anterior

Entonces, si queremos ejecutar el sonido de cuando abrimos una puerta pondremos esto:

Código:
sound 0x8

Fanfare

El fanfare es un tipo de sonido más largo, como el de cuando te curas. El comando es como el del sound, y aquí la lista de fanfares disponibles:

0105 = Healing (Ruby y záfiro)
0106 = Level Up
0107 = Evolution Start
0108 = Evolution/Safari
0109 = Battle 1
010A = Battle 2
010B = Unknown/Not listed in Sappy
010C = Fanfare 1
010D = Fanfare 2
010E = You Fail It!
010F = You Fail It Again!
0110 = Follow Me
0111 = Game Corner
0112 = Evil Lurks
0113 = Gym
0114 = Jigglypuff's Song
0115 = Introduction
0116 = Pokemon Theme
0117 = Cinnabar Island
0118 = Lavender Town
0119 = Healing
011A = Bicycle
011B = Encounter 1
011C = Encounter 2
011D = Encounter 3
011E = You're In The Hall of Fame!
011F = Viridian Forest
0120 = Mount Moon
0121 = Abandoned Place
0122 = End Credits
0123 = Route Theme 1
0124 = Route Theme 2/Intro
0125 = Route Theme 3
0126 = Route Theme 4
0127 = Indigo Plateau
0128 = Battle 3
0129 = Battle 4
012A = Battle 5
012B = Battle 6
012C = Pallet Town
012D = Oak's Lab
012E = Oak's Theme
012F = Pokemon Center
0130 = SS Anne
0131 = Surf's Up
0132 = Pokemon Tower
0133 = Silph Co.
0134 = Cerulean City
0135 = Celadon City
0136 = Victory 1
0137 = Victory 2
0138 = Victory 3
0139 = Vermillion City
013A = Viridian City and Pewter City
013B = Gary's Theme
013C = Gary's Theme (bis)
013D = Fanfare 3
013E = Fanfare 4
013F = You caught a Pokemon!
0140 = Trainer Card Photo
0141 = Gamefreak
0142 = Victory 2 (bis)
0143 = Intro Message 1
0144 = Intro Message 2
0145 = Intro Message 3
0146 = Game Corner (+1)
0147 = Game Corner (+2)
0148 = Net Corner
0149 = Mystery Connection
014A = Game Corner (+3)
014B = Mount Ember
014C = Follow Me (alt)
014D = Water Labyrinth
014E = Tanoby Ruins
014F = Islands 1-3
0150 = Islands 4-5
0151 = Islands 6-7(AKA Violet City Theme from GSC)
0152 = PokeFlute
0153 = Battle - Deoxys
0154 = Battle 5 (+1)
0155 = Battle 5 (+2)
0156 = Encounter 4
0157 = Deoxys Encounter
0158 = Trainer Tower
0159 = Pallet Town (fame mix)
015A = Teachy TV

Entonces, si queremos ejecutar el fanfare de curación en Fire red, pondremos:

Código:
fanfare 0x119
Normalmente querremos que nuestro fanfare acabe antes de seguir con el script. Si ponemos el comando "waitfanfare", antes de ejecutar las siguientes líneas de script nuestro fanfare terminará de escucharse.

¡OJO!, para ejecutar midis, no podemos utilizar el comando fanfare porque no funcionará, sino que tendremos que utilizar el comando que veremos a continuación. Darse cuenta de que la lista de fanfares y midis es la misma.


Ejecutar midis

Para ejecutar las midis de nuestra última lista de fanfares, tendremos que utilizar este comando:

playsong 0x(número de midi) 0x0

El número de midi lo encontraremos en la última lista, y el comando extra 0x0, tiene que ponerse así por defecto para que funcione.

Si queremos ejecutar la midi de oak, pondremos:

Código:
playsong 0x12F 0x0

Preguntas Frecuentes

El tiempo que he puesto se cambia cuando salgo del mapa

Los comandos del weather están hechos para que cuando cambies de mapa vuelva todo a la normalidad. Para que se mantuviera habría que utilizar un script de nivel, lo cual veremos más adelante.

¿Existe el comando waitsound?

No. Si lo que quieres es que transcurra un cierto tiempo entre tu sound y el siguiente comando, utiliza "pause 0x25", lo cual parará sobre un segundo el script.

________________________________________________________________




Applymovement

Con este comando conseguiremos que en nuestros scripts podamos mover minis por el mapa, incluyendo al propio personaje. La síntesis del comando es la siguiente:

Código:
applymovement 0x(Person event nº) @(dirección offset)
El person event nº corresponderá al número del mini al cual queremos mover. Es importante no confundir el número de evento con el número de evento de la persona. El número en el cual nos fijamos nosotros es este:



La diferencia de este número con el de arriba, es que el número de person event se lo podemos poner a varios minis a la vez, de esta forma podemos mover dos minis con el mismo movimiento. Para ser más claros, pensad que todos los minis que tengo el número que nosotros hayamos puestos van a ejecutar el movimiento que nosotros le asignemos en nuestro applymovement.

La dirección offset que debemos poner, es un @ con una palabra, como en un msgbox, esto nos indicará el #org de nuestro offset en el cual pondremos nuestros movimientos. Entonces un ejemplo sería:

Código:
applymovement 0x2 @mover

Tipos de movimientos

Como en un msgbox, tendremos que crear un #org con la palabra que generará nuestro offset (la palabra que hemos puesto en el @ del applymovement).

En esta firección offset pondremos los comandos que corresponden a un movimeinto, y los cuales se ejecutarán cuando se ejecute el correspondiente applymovement.

Un movimiento se pondrá como:
Código:
#raw 0x(numero de movimeinto)
Y los números de los movimientos son estos:

#raw 0x00 = Face Down
#raw 0x01 = Face Up
#raw 0x02 = Face Left
#raw 0x03 = Face Right
#raw 0x04 = Step Down (Slow)
#raw 0x05 = Step Up (Slow)
#raw 0x06 = Step Left (Slow)
#raw 0x07 = Step Right (Slow)
#raw 0x08 = Step Down (Normal)
#raw 0x09 = Step Up (Normal)
#raw 0x0A = Step Left (Normal)
#raw 0x0B = Step Right (Normal)
#raw 0x0C = Jump2 Down
#raw 0x0D = Jump2 Up
#raw 0x0E = Jump2 Left
#raw 0x0F = Jump2 Right
#raw 0x10 = Delay1
#raw 0x11 = Delay2
#raw 0x12 = Delay3
#raw 0x13 = Delay4
#raw 0x14 = Delay5
#raw 0x15 = Step Down (Fast)
#raw 0x16 = Step Up (Fast)
#raw 0x17 = Step Left (Fast)
#raw 0x18 = Step Right (Fast)
#raw 0x19 = Step on the Spot Down (Slow)
#raw 0x1A = Step on the Spot Up (Slow)
#raw 0x1B = Step on the Spot Left (Slow)
#raw 0x1C = Step on the Spot Right (Slow)
#raw 0x1D = Step on the Spot Down (Normal)
#raw 0x1E = Step on the Spot Up (Normal)
#raw 0x1F = Step on the Spot Left (Normal)
#raw 0x20 = Step on the Spot Right (Normal)
#raw 0x21 = Step on the Spot Down (Faster)
#raw 0x22 = Step on the Spot Up (Faster)
#raw 0x23 = Step on the Spot Left (Faster)
#raw 0x24 = Step on the Spot Right (Faster)
#raw 0x25 = Step on the Spot Down (Fastest)
#raw 0x26 = Step on the Spot Up (Fastest)
#raw 0x27 = Step on the Spot Left (Fastest)
#raw 0x28 = Step on the Spot Right (Fastest)
#raw 0x29 = Slide Down
#raw 0x2A = Slide Up
#raw 0x2B = Slide Left
#raw 0x2C = Slide Right
#raw 0x2D = Slide Down
#raw 0x2E = Slide Up
#raw 0x2F = Slide Left
#raw 0x30 = Slide Right
#raw 0x31 = Slide Down
#raw 0x32 = Slide Up
#raw 0x33 = Slide Left
#raw 0x34 = Slide Right
#raw 0x35 = Slide Running Down
#raw 0x36 = Slide Running Up
#raw 0x37 = Slide Running Left
#raw 0x38 = Slide Running Right
#raw 0x3A = Jump Facing Left (Down)
#raw 0x3B = Jump Facing Down (Up)
#raw 0x3C = Jump Facing Up (Left)
#raw 0x3D = Jump Facing Left (Right)
#raw 0x3E = Face Player
#raw 0x3F = Face Against Player
#raw 0x40 = Lock Sprite Facing
#raw 0x41 = Release Sprite Facing
#raw 0x42 = Jump Down
#raw 0x43 = Jump Up
#raw 0x44 = Jump Left
#raw 0x45 = Jump Right
#raw 0x46 = Jump in Place (Facing Down)
#raw 0x47 = Jump in Place (Facing Up)
#raw 0x48 = Jump in Place (Facing Left)
#raw 0x49 = Jump in Place (Facing Right)
#raw 0x4A = Jump in Place (Facing Down/Up)
#raw 0x4B = Jump in Place (Facing Up/Down)
#raw 0x4C = Jump in Place (Facing Left/Right)
#raw 0x4D = Jump in Place (Facing Right/Left)
#raw 0x4E = Face Left
#raw 0x54 = Hide Sprite
#raw 0x55 = Show Sprite
#raw 0x56 = Exclamation Mark (!)
#raw 0x57 = Question Mark (?)
#raw 0x58 = Love (<3)
#raw 0x62 = Walk Down
#raw 0x63 = Walk Down
#raw 0x64 = Face Down (Delayed)
#raw 0x65 = Face Up (Delayed)
#raw 0x66 = Face Left (Delayed)
#raw 0x67 = Face Right (Delayed)
#raw 0x70 = Jump in Place (Facing Down)
#raw 0x71 = Jump in Place (Facing Up)
#raw 0x72 = Jump in Place (Facing Left)
#raw 0x73 = Jump in Place (Facing Right)
#raw 0x74 = Jump Down Running
#raw 0x75 = Jump Up Running
#raw 0x76 = Jump Left Running
#raw 0x77 = Jump Right Running
#raw 0x78 = Jump2 Down Running
#raw 0x79 = Jump2 Up Running
#raw 0x7A = Jump2 Left Running
#raw 0x7B = Jump2 Right Running
#raw 0x7C = Walk on the Spot (Down)
#raw 0x7D = Walk on the Spot (Up)
#raw 0x7E = Walk on the Spot (Left)
#raw 0x7F = Walk on the Spot (Right)
#raw 0x80 = Slide Down Running
#raw 0x81 = Slide Up Running
#raw 0x82 = Slide Left Running
#raw 0x83 = Slide Right Running
#raw 0x84 = Slide Down
#raw 0x85 = Slide Up
#raw 0x86 = Slide Left
#raw 0x87 = Slide Right
#raw 0x88 = Slide Down on Left Foot
#raw 0x89 = Slide Up on Left Foot
#raw 0x8A = Slide Left on Left Foot
#raw 0x8B = Slide Right on Left Foot
#raw 0x8C = Slide Left diagonally (Facing Up)
#raw 0x8D = Slide Right diagonally (Facing Up)
#raw 0x8E = Slide Left diagonally (Facing Down)
#raw 0x8F = Slide Right diagonally (Facing Down)
#raw 0x90 = Slide2 Left diagonally (Facing Up)
#raw 0x91 = Slide2 Right diagonally (Facing Up)
#raw 0x92 = Slide2 Left diagonally (Facing Down)
#raw 0x93 = Slide2 Right diagonally (Facing Down)
#raw 0x96 = Walk Left
#raw 0x97 = Walk Right
#raw 0x98 = Levitate
#raw 0x99 = Stop Levitating
#raw 0x9C = Fly Up Vertically
#raw 0x9D = Land
#raw 0xFE = End of Movements

#raw 0x0 = Face Down
#raw 0x1 = Face Up
#raw 0x2 = Face Left
#raw 0x3 = Face Right
#raw 0x4 = Face Down (Faster)
#raw 0x5 = Face Up (Faster)
#raw 0x6 = Face Left (Faster)
#raw 0x7 = Face Right (Faster)
#raw 0x8 = Step Down (Very Slow)
#raw 0x9 = Step Up (Very Slow)
#raw 0xA = Step Left (Very Slow)
#raw 0xB = Step Right (Very Slow)
#raw 0xC = Step Down (Slow)
#raw 0xD = Step Up (Slow)
#raw 0xE = Step Left (Slow)
#raw 0xF = Step Right (Slow)
#raw 0x10 = Step Down (Normal)
#raw 0x11 = Step Up (Normal)
#raw 0x12 = Step Left (Normal)
#raw 0x13 = Step Right (Normal)
#raw 0x14 = Jump2 Down
#raw 0x15 = Jump2 Up
#raw 0x16 = Jump2 Left
#raw 0x17 = Jump2 Right
#raw 0x18 = Delay1
#raw 0x19 = Delay2
#raw 0x1A = Delay3
#raw 0x1B = Delay4
#raw 0x1C = Delay5
#raw 0x1D = Step Down (Fast)
#raw 0x1E = Step Up (Fast)
#raw 0x1F = Step Left (Fast)
#raw 0x20 = Step Right (Fast)
#raw 0x21 = Step on the Spot Down (Normal)
#raw 0x22 = Step on the Spot Up (Normal)
#raw 0x23 = Step on the Spot Left (Normal)
#raw 0x24 = Step on the Spot Right (Normal)
#raw 0x25 = Step on the Spot Down (Faster)
#raw 0x26 = Step on the Spot Up (Faster)
#raw 0x27 = Step on the Spot Left (Faster)
#raw 0x28 = Step on the Spot Right (Faster)
#raw 0x29 = Step on the Spot Down (Fastest)
#raw 0x2A = Step on the Spot Up (Fastest)
#raw 0x2B = Step on the Spot Left (Fastest)
#raw 0x2C = Step on the Spot Right (Fastest)
#raw 0x2D = Face Down (Delayed)
#raw 0x2E = Face Up (Delayed)
#raw 0x2F = Face Left (Delayed)
#raw 0x30 = Face Right (Delayed)
#raw 0x31 = Slide Down (Slow)
#raw 0x32 = Slide Up (Slow)
#raw 0x33 = Slide Left (Slow)
#raw 0x34 = Slide Right (Slow)
#raw 0x35 = Slide Down (Normal)
#raw 0x36 = Slide Up (Normal)
#raw 0x37 = Slide Left (Normal)
#raw 0x38 = Slide Right (Normal)
#raw 0x39 = Slide Down (Fast)
#raw 0x3A = Slide Up (Fast)
#raw 0x3B = Slide Left (Fast)
#raw 0x3C = Slide Right (Fast)
#raw 0x3D = Slide Running on Right Foot (Down)
#raw 0x3E = Slide Running on Right Foot (Up)
#raw 0x3F = Slide Running on Right Foot (Left)
#raw 0x40 = Slide Running on Right Foot (Right)
#raw 0x41 = Slide Running on Left Foot (Down)
#raw 0x42 = Slide Running on Left Foot (Up)
#raw 0x43 = Slide Running on Left Foot (Left)
#raw 0x44 = Slide Running on Left Foot (Right)
#raw 0x46 = Jump Facing Left (Down)
#raw 0x47 = Jump Facing Down (Up)
#raw 0x48 = Jump Facing Up (Left)
#raw 0x49 = Jump Facing Left (Right)
#raw 0x4A = Face Player
#raw 0x4B = Face Against Player
#raw 0x4C = Lock Sprite Facing
#raw 0x4D = Release Sprite Facing
#raw 0x4E = Jump Down
#raw 0x4F = Jump Up
#raw 0x50 = Jump Left
#raw 0x51 = Jump Right
#raw 0x52 = Jump in Place (Facing Down)
#raw 0x53 = Jump in Place (Facing Up)
#raw 0x54 = Jump in Place (Facing Left)
#raw 0x55 = Jump in Place (Facing Right)
#raw 0x56 = Jump in Place (Facing Down/Up)
#raw 0x57 = Jump in Place (Facing Up/Down)
#raw 0x58 = Jump in Place (Facing Left/Right)
#raw 0x59 = Jump in Place (Facing Right/Left)
#raw 0x60 = Hide Sprite
#raw 0x61 = Show Sprite
#raw 0x62 = Exclamation Mark (!)
#raw 0x63 = Question Mark (?)
#raw 0x64 = Cross (X)
#raw 0x65 = Double Exclamation Mark (!!)
#raw 0x66 = Happy (^_^)
#raw 0xFE = End of Movements

Entonces, si queremos que un mini camine tres pasos hacia arriba tendríamos que hacer esto:

Código:
#dynamic 0x800000

#org @inicio
applymovement 0x2 @mover
end

#org @mover
#raw 0x9
#raw 0x9
#raw 0x9
#raw 0xFE
9 es el número asignado a dar un paso arriba de forma normal.

¿Porqué ponemos #raw 0xFE?

Todos los movimientos que pongamos en un #org tienen que acabar obligatóriamente con #raw 0xFE, esto le indica al juego que los movimentos se acaban. Si no lo ponemos no funcionará y se trabará el juego.

Si descargasteis el pack de herramientas de la primera lección, dentro hay una herramienta llamada move it!, la cual sirve para generar los #raw de los movimientos de forma simple dándole a botones. De esta forma no tendréis que buscar en la lista los #raw de cada movimiento, lo que es un coñazo.


Waitmovement

Con waitmovement haremos que los comandos después de este no se ejecuten hasta que no se hayan producido todos los movimientos asignados a nuestro applymovement. De esta forma, si por ejemplo tenemos un mini que esta caminando hacia arriba y luego nos habla con un msgbox, si no ponemos waitmovement, se producirá el mensaje a la vez que camina.

La forma correcta de utilizarlo es esta:

Código:
waitmovement 0x(Person event nº)
Person event nº es el número de nuestra persona el cual hemos puesto anteriormente. De esta forma si tenemos varios applymovement ejecutándose a la vez, con el waitmovement podremos determinar a que movimiento queremos esperar exactamente.

En caso de que queramos esperar a todos los movimientos, deberemos poner: waitmovement 0x0. El 0x0 indica que se tienen que esperar a que se acaben todos los movimientos de todas las personas.

Aquí un ejemplo:

Código:
#dynamic 0x800000

#org @inicio
applymovement 0x2 @mover
waitmovement 0x2
msgbox @texto 0x6
end

#org @texto
= He dado 3 pasos.

#org @mover
#raw 0x9
#raw 0x9
#raw 0x9
#raw 0xFE

Bug cuando das pasos

Hay una especie de bug a tener en cuenta cuando utilizamos applymovement. Y es que si damos pasos y queremos luego que nuestro mini se quede fijo, tendremos que poner los #raw de los pasos y luego el #raw de mirar hacia donde ha dado los pasos. Si no hacemos esto el sprite del mini al que hemos aplicado el movimiento se quedará en la postura de caminar, en vez de quedar con los pies juntos mirando hacia el último paso caminado. Por ejemplo, en el movimiento de arriba en vez de esto:

Código:
#org @mover
#raw 0x9
#raw 0x9
#raw 0x9
#raw 0xFE
Tenemos que poner esto:

Código:
#org @mover
#raw 0x9
#raw 0x9
#raw 0x9
#raw 0x1
#raw 0xFE
Añadiendo el movimiento #raw 0x1 de mirar arriba, el mini no se quedará en una postura extraña.


Moviendo a player

Para movernos a nosotros mismos, donde ponemos el person event nº, tendremos que poner FF. Entonces un applymovement donde nos movemos a nosotros sería así:

Código:
applymovement 0xFF @mover
Y lógicamente su waitmovement sería así:

Código:
waitmovement 0xFF

MOVE_CAMERA

Si lo que queremos es mover la cámara del juego, no es muy distinto a como los hemos hecho anteriormente pero hay que cumplir ciertos requisitos:

1-En el applymovmement tenemos que poner 0x7F o MOVE_CAMERA
2-Antes del applymovement hay que poner el comando "special 0x113"
3-Después del applymovement hay que poner el comando "special 0x114"
4-El waitmovement es muy recomendable ponerlo con 0x0

Entonces, si queremos mover la cámara el applymovement quedará así:

Código:
special 0x113
applymovement 0x7F @mover
waitmovement 0x0
special 0x114
El special 0x113 hará que la cámara se desfije del jugador. El special 0x114 hará que la cámara se vuelva a fijar en el jugador.

En el #org @mover pondremos los #raw como si de un mini normal se tratara. Como veis, no tiene mayor complicación, solo que tienen que cumplirse unos requisitos. (Sobre los specials y sus funciones entraremos en detalle en la próxima clase).


Preguntas frecuentes

¿Puedo reutilizar un applymovement?

Sí. Cuando tenemos un #org con #raws de movimientos, esa dirección offset la podemos usar en otro applymovement si queremos ejecutar los mismos movimientos. De esta forma no hace falta escribir el código de los movimientos dos veces. Claro está, que en @ del applymovement tendrás que poner el mismo @ del #org de los movimientos.

¿Cómo vuelvo a fijar la cámara?

Tendrás que volver a ejecutar un MOVE_CAMERA y dar los movimientos a la inversa para que se vuelva a fijar en el player. Cuando digo que el special 0x114 vuelve a fijar la cámara en el juegador, no me refiero a que la cámara vuelve a su sitio, simplemente es obligatorio hacerlo así. Si refrescas el mapa, la cámara se debería colocar otra vez en su sitio.

No me funciona el move_camera en ruby

Tienes que sustituir el special 0x113 por 0x116 y el 0x114 por 0x117

________________________________________________________________




Special

Un special es un comando el cual ejecutará un evento pre-programado del juego. Esto quiere decir que el juego tiene diferentes "specials" los cuales harán diferentes eventos como curar tus pokémons o activar la dex nacional.

El comando a usar es simple:

Código:
special 0x(num del special)
Dependiendo del número de special que pongamos se ejecutará una función u otra. aquí tenéis la lista de los números del special y a que evento corresponde:

special 0x0 - Heal Pokemon
special 0x3C - Access Bill's PC (FR/LG)
special 0x98 - Going up to Mountain (R/S)
special 0x9C - Wally Catch (R/S)
special 0x9F - choose A Pokemon (R/S)
special 0xE0 - PokeBlock Case (R/S)
special 0x10F - Restart Game
special 0x110 - Hall of Fame and Credits
special 0x111 - Elevator Animation
special 0x119 - Groudon's Orb effect (R/S)
special 0x131 - Earthquake (R/S)
special 0x132 - Show Floors
special 0x133 - Long Earthquake (Emerald)
special 0x136 - Earthquake (FR/LG)
special 0x137 - Lava Battle
special 0x13D - Short Earthquake (Emerald)
special 0x156 - Battle with Ghost (FR/LG)
special 0x157 - Get on Bike (FR/LG)
special 0x161 - Start Surfing (FR/LG)
special 0x166 - Nickname
special 0x16F - Activate National Dex (FR/LG)
special 0x17B - Seagallop Animation
special 0x191 - SS. Anne Leaving
special 0x1F3 - Activate National Dex (Emerald)

Por ejemplo en Rojo Fuego si ejecutamos el special 0x3C, se nos abrirá el pc de bill.


Waitstate

Cuando utilizamos un special es recomendable poner después un waitstate para que se acabe de ejecutar el special antes de seguir leyendo código. Es imprescindible en eventos como al poner el mote a un pokemon.

Código:
special 0x9E
waitstate
Con el special 0x9E damos un mote al primer pokémon de nuestro equipo, y sin el waitstate el código que tuviéramos más adelante no funcionaría.


Terremotos

El efecto del terremoto se consigue mediante un special y modificar unas variables que tiene el juego para este evento.

Para explicaros el terremoto, me voy a dar el lujo de coger de ejemplo el script del señor @Gut_Bro, el cual lo explicó en su momento perfectamente y me gustaría entrar en detalle. El código del terremoto es este:

Código:
#dynamic 0x740000

'---------------
#org @start
sound 0x4B 'Efecto de sonido
setvar 0x8004 0x2 'Movimiento Y
setvar 0x8005 0x2 'Movimiento X
setvar 0x8006 0x16 'Repeticiones
setvar 0x8007 0x3 'Velocidad
special 0x136 'Ejecutar el temblor
waitstate
msgbox @mensaje MSG_NORMAL
end

'---------------
#org @mensaje
= [PLAYER]: ¡Waaaaah!\nEstúpidos temblores[.]
Como ya explica en el propio script, con el sound 0x4B haremos el sonido correspondiente al terremoto, luego habrá que darle valores a 4 variables que maneja el juego y que le dirán el movimiento, las repeticiones y la velocidad con la que ejecutará el movimiento del temblor. Entonces dependiendo del valor que les deis a esas variables tendremos un efecto u otro.

Cada terremoto es a gusto de la persona que lo quiera hacer. Lo normal es variar las repeticiones para hacerlo más largo o más corto, pero depende de vosotros.

Con el special 0x136 ejecutamos el terremoto y con el waitstate esperará a que se termine de ejecutar el terremoto para decir el msgbox. No es complicado.


Fadescreen

Con este comando podremos poner la pantalla de color negro o blanco. Los fadescreen disponibles son estos:

Código:
fadescreen 0x0 (De negro a normal)
fadescreen 0x1 (De normal a negro)
fadescreen 0x2 (De blanco a normal)
fadescreen 0x3 (De normal a blanco)
Entonces, si queremos que la pantalla se vuelva negra, utilizaremos fadescreen 0x1, cuando queramos que vuelva a la normalidad usaremos fadescreen 0x0.

Cabe destacar que los diálogos que tengamos aunque la pantalla esté en negro o blanco se verán igual.


Pantalla color blanco-negro

Esto no tiene nada que ver con un fadescreen, sino con un comando llamado writebytetooffset, el cual en esta escuela no vamos a entrar en su función ni en como manejarnos con él, pero os diré como se crea el efecto por si lo queréis hacer (como por ejemplo para representar un flashback).

Es simple, si queremos que la pantalla se ponga blanco-negro, pondremos este comando:

Código:
writebytetooffset 0x1 0x2036E28
Y cuando queramos que vuelva a la normalidad pondremos este:

Código:
writebytetooffset 0x0 0x2036E28
OJO para que se ejecute completamente el comando necesitaremos refrescar la pantalla, esto quiere decir que necesitamos poner un warp o cambiar de mapa.


Hidesprite

Como indica ese "hide", este comando sirve para ocultar un sprite. Normalmente se utiliza en eventos que tu quieres que un personaje desaparezca caminado, por ejemplo. Pero en realidad este comando solo sirve para hacer visible el sprite temporalmente. Funciona de esta forma:

Código:
hidesprite 0x(Person event no)
Como podéis intuir, tenemos que poner el person event no de la persona del Advance map que queremos que desaparezca. Como he comentado antes, esto solo tiene un efecto temporal, ¿Qué hace falta para que sea permanente? Pues activar la flag asignada a dicho sprite.

Por ejemplo, si a una persona en person id (en AM) le ponemos la flag 0x200, si nosotros en un script activamos dicha flag, desactivaremos el mini que tiene esa flag y no volverá aparecer, pero esto solo se hará cuando se refresque el mapa. Si queremos que el efecto sea inmediato tendremos que poner un hidesprite con el person event no de la persona que queremos que desaparezca, de tal forma que tendríamos que ponerlo así:

Código:
hidesprite 0x3
setflag 0x200
Si el sprite con person event no 3 tiene en person_id la flag 200, cuando se ejecuten estos dos comandos desaparecerá completamente.


Showsprite

Esto es igual al hidesprite, pero para minis que ya están desactivados. De tal forma que si queremos que un mini vuelva a aparecer, tendremos que poner:

Código:
showsprite 0x(person event no)
Al igual que el hidesprite, es temporal.

________________________________________________________________




Warp

Como sabréis por utilizar el AM, un warp es un evento que se representa con una "W" y que indica un punto donde el personaje puede transportarse, comunicando un mapa con otro. Mediante script, también podemos hacer "waprs" para que el personaje se mueva a otro warp o zona determinada, y estos son los pararemos de un warp en un script:

Código:
warp 0x(Banco) 0x(Numero) 0x(Nº warp) 0x0 0x0
Cada palabra es un número que en función al warp al que nos queremos transportar variará.

Banco hace referencia al número de banco del mapa, que es el primer número con el que identificamos un mapa. Vamos a poner de ejemplo que queremos transportarnos al laboratorio del profesor Oak, el cual está en la carpeta 4, lo que quiere decir que su número de banco es 4.

Con número nos referimos a el número de la división de dicho banco de mapa. Por ejemplo, es el 4 se guardan todas las casas de pueblo paleta, y la del lab es la 4.3, entonces nuestro número de mapa será el 3.

Con nº de warp nos referimos a que warp nos queremos transportar. Así como en AM al configurar los warps tenemos que poner a que warp nos transportamos, aquí también hay que poner un número de warp. En este caso el warp del centro del lab de Oak es el nº 0, por lo que pondremos un 0.

Entonces el warp quedaría así:

Código:
warp 0x4 0x3 0x0 0x0 0x0
Al utilizar este código en un script nuestro personaje se teletrasportará ahí.


Warp a unas coordenadas

Podemos en vez de transportarnos a un warp determinado, transportarnos a unas coordenadas determinadas que nosotros le demos al comando, y para eso utilizaremos los dos ultimos ceros.

Si nos fijamos en el AM, cuando ponemos el ratón sobre un tile, abajo a la izquierda nos aparecen las coordenadas de ese cuadrado, y son estas coordenadas "x" e "y" las que tenemos que coger para saber el punto al que nos queremos transportar. El warp quedaría así:

Código:
warp 0x(banco) 0x(numero) 0xFF 0x(X) 0x(Y)
El banco y el número quedan igual para saber a que mapa nos referimos, en vez de poner el nº de warp, ponemos FF, que le dice al juego que queremos transportarnos a una coordenada, y en X e Y ponemos la coordenada correspondiente.

Si el ejemplo del lab de Oak lo ponemos en coordenadas quedaría así:

Código:
warp 0x4 0x3 0xFF 0x6 0xC
De esta forma no necesitamos warp para transportarnos.


Movesprite

Con este comando podremos mover un sprite del mapa donde ejecutemos nuestro script a una determinada coordenada.

Como ya expliqué arriba como mirar la coordenada de algún sitio, este comando será muy fácil de explicar:

Código:
movesprite 0x(nº minisprite) 0x(X) 0x(Y)
Se intuye como funciona. Nº minisprite es el people number del AM, y X e Y son las coordenadas del punto al que queremos que se transporte dicho mini.


Abrir puertas

Y aprovechando que estamos trabajando con coordenadas, que mejor idea que explicar los comandos para abrir y cerrar puertas mediante un script, que por ejemplo, nos puede servir para simular que alguien sale de casa o entra.

Imaginemos que queremos abrir la puerta del lab de oak, entoncers utilizaremos este comando:

Código:
setdooropened 0x10 0x0D
La base es setdooropened 0xX 0xY. Como podéis intuir, hemos puesto las coordenadas de donde exactamente está la puerta en el mapa.

¿No se abre?

Bueno, esto es algo como los comando de setweather, tenemos que poner un segundo comando que ejecutará la orden de abrir la puerta, que es:

Código:
doorchange
Entonces si ponemos estos dos comandos seguidos en nuestro script la puerta del lab de oak se abrirá sin ningún problema.


Cerrar puertas

Si abrimos una puerta, esta después del doorchange siempre quedará abierta (hasta que cambiemos de mapa al menos), y visualmente queda mal. Entonces tendremos que utilizar el comando de cerrar una puerta para que esta haga la animación de cerrarse. Y el proceso es exactamente igual que el anterior.

Código:
setdoorclosed 0x10 0xD
doorchange
Volvemos a poner la coordenada de la puerta, y con setdoorclosed y luego el doorchange se cerrará.


Preguntas Frecuentes

Mi script no funciona luego de un warp

Cuando utilizas un warp, refrescas el mapa, y cuando refrescas la pantalla el script deja de funcionar, es así.

Las puertas no hacen sonido

No lo tiene que hacer. Pon junto a tu doorchnage el sound correspondiente a abrir/cerrar puerta que ya hemos visto en otra lección, de esta forma quea bien el efecto.

________________________________________________________________




Abrir un Pokemart

Con el comando pokemart podemos abrir una tienda fácilmente. Lo único que tendremos que hacer nosotros es indicar que objetos tendrá nuestro pokemart, lo cual indicaremos en un offset al utilizar el comando pokemart, de tal forma que se utiliza así:

Código:
lock
faceplayer
pokemart @objetos
release
end

Elegir objetos

Al igual que cuando utilizamos un msgbox o un applymovement, en el comando pokemart tenemos un offset (@objeto) extra en el cual indicaremos los objetos que tendrá nuestra tienda.

Y esto se hace con #raw word 0x(nº objeto)

Nº objeto es el número del objeto que utilizamos en giveitem por ejemplo. Es decir, tenéis que poner el número de acuerdo a la lista que os había dado cuando aprendimos el giveitem. Os pongo la lista para que os sea más cómodo:

Master Ball 1
Ultra Ball 2
Great Ball 3
Poké Ball 4
Safari Ball 5
Net Ball 6
Dive Ball 7
Nest Ball 8
Repeat Ball 9
Timer Ball 10
Luxury Ball 11
Premier Ball 12
Potion 13
Antidote 14
Burn Heal 15
Ice Heal 16
Awakening 17
Parlyz Heal 18
Full Restore 19
Max Potion 20
Hyper Potion 21
Super Potion 22
Full Heal 23
Revive 24
Max Revive 25
Fresh Water 26
Soda Pop 27
Lemonade 28
Moomoo Milk 29
Energypowder 30
Energy Root 31
Heal Powder 32
Revival Herb 33
Ether 34
Max Ether 35
Elixir 36
Max Elixir 37
Lava Cookie 38
Blue Flute 39
Yellow Flute 40
Red Flute 41
Black Flute 42
White Flute 43
Berry Juice 44
Sacred Ash 45
Shoal Salt 46
Shoal Shell 47
Red Shard 48
Blue Shard 49
Yellow Shard 50
Green Shard 51
HP Up 63
Protein 64
Iron 65
Carbos 66
Calcium 67
Rare Candy 68
PP Up 69
Zinc 70
PP Max 71
Guard Spec. 73
Dire Hit 74
X Attack 75
X Defend 76
X Speed 77
X Accuracy 78
X Special 79
Poké Doll 80
Fluffy Tail 81
Super Repel 83
Max Repel 84
Escape Rope 85
Repel 86
Sun Stone 93
Moon Stone 94
Fire Stone 95
Thunderstone 96
Water Stone 97
Leaf Stone 98
Tinymushroom 103
Big Mushroom 104
Pearl 106
Big Pearl 107
Stardust 108
Star Piece 109
Nugget 110
Heart Scale 111
Orange Mail 121
Harbor Mail 122
Glitter Mail 123
Mech Mail 124
Wood Mail 125
Wave Mail 126
Bead Mail 127
Shadow Mail 128
Tropic Mail 129
Dream Mail 130
Fab Mail 131
Retro Mail 132
Cheri Berry 133
Chesto Berry 134
Pecha Berry 135
Rawst Berry 136
Aspear Berry 137
Leppa Berry 138
Oran Berry 139
Persim Berry 140
Lum Berry 141
Sitrus Berry 142
Figy Berry 143
Wiki Berry 144
Mago Berry 145
Aguav Berry 146
Iapapa Berry 147
Razz Berry 148
Bluk Berry 149
Nanab Berry 150
Wepear Berry 151
Pinap Berry 152
Pomeg Berry 153
Kelpsy Berry 154
Qualot Berry 155
Hondew Berry 156
Grepa Berry 157
Tamato Berry 158
Cornn Berry 159
Magost Berry 160
Rabuta Berry 161
Nomel Berry 162
Spelon Berry 163
Pamtre Berry 164
Watmel Berry 165
Durin Berry 166
Belue Berry 167
Liechi Berry 168
Ganlon Berry 169
Salac Berry 170
Petaya Berry 171
Apicot Berry 172
Lansat Berry 173
Starf Berry 174
Enigma Berry 175
Brightpowder 179
White Herb 180
Macho Brace 181
Exp. Share 182
Quick Claw 183
Soothe Bell 184
Mental Herb 185
Choice Band 186
King's Rock 187
Silverpowder 188
Amulet Coin 189
Cleanse Tag 190
Soul Dew 191
Deepseatooth 192
Deepseascale 193
Smoke Ball 194
Everstone 195
Focus Band 196
Lucky Egg 197
Scope Lens 198
Metal Coat 199
Leftovers 200
Dragon Scale 201
Light Ball 202
Soft Sand 203
Hard Stone 204
Miracle Seed 205
Blackglasses 206
Black Belt 207
Magnet 208
Mystic Water 209
Sharp Beak 210
Poison Barb 211
Nevermeltice 212
Spell Tag 213
Twistedspoon 214
Charcoal 215
Dragon Fang 216
Silk Scarf 217
Up-grade 218
Shell Bell 219
Sea Incense 220
Lax Incense 221
Lucky Punch 222
Metal Powder 223
Thick Club 224
Stick 225
Red Scarf 254
Blue Scarf 255
Pink Scarf 256
Green Scarf 257
Yellow Scarf 258
Mach Bike 259
Coin Case 260
Itemfinder 261
Old Rod 262
Good Rod 263
Super Rod 264
S.S. Ticket 265
Contest Pass 266
Wailmer Pail 268
Devon Goods 269
Soot Sack 270
Basement Key 271
Acro Bike 272
PokéBlock Case 273
Letter 274
Eon Ticket 275
Red Orb 276
Blue Orb 277
Scanner 278
Go-goggles 279
Meteorite 280
Rm. 1 Key 281
Rm. 2 Key 282
Rm. 4 Key 283
Rm. 6 Key 284
Storage Key 285
Root Fossil 286
Claw Fossil 287
Devon Scope 288
TM01 289
TM02 290
TM03 291
TM04 292
TM05 293
TM06 294
TM07 295
TM08 296
TM09 297
TM10 298
TM11 299
TM12 300
TM13 301
TM14 302
TM15 303
TM16 304
TM17 305
TM18 306
TM19 307
TM20 308
TM21 309
TM22 310
TM23 311
TM24 312
TM25 313
TM26 314
TM27 315
TM28 316
TM29 317
TM30 318
TM31 319
TM32 320
TM33 321
TM34 322
TM35 323
TM36 324
TM37 325
TM38 326
TM39 327
TM40 328
TM41 329
TM42 330
TM43 331
TM44 332
TM45 333
TM46 334
TM47 335
TM48 336
TM49 337
TM50 338
HM01 339
HM02 340
HM03 341
HM04 342
HM05 343
HM06 344
HM07 345
HM08 346
Oak's Parcel 349
Poké Flute 350
Secret Key 351
Bike Voucher 352
Gold Teeth 353
Old Amber 354
Card Key 355
Lift Key 356
Helix Fossil 357
Dome Fossil 358
Silph Scope 359
Bicycle 360
Town Map 361
VS Seeker 362
Fame Checker 363
TM Case 364
Berry Pouch 365
Teachy TV 366
Tri-pass 367
Rainbow Pass 368
Tea 369
Mysticticket 370
Auroraticket 371
Powder Jar 372
Ruby 373
Sapphire 374

Imaginemos que queremos un pokemart que nos venda simplemente pokeballs y pociones. Pues quedaría así:

Código:
lock
faceplayer
pokemart @objetos
release
end

#org @objetos
#raw word 0x4
#raw word 0xD
¿Por qué 4 y D? Porque en la lista la pokeball es la numero 4, y la pocion en la numero 13. Si pasamos 4 y 13 a hexadecimal nos quedan 4 y D respectivamente.


Givemoney

Con este comando le podréis dar dinero a player:

Código:
givemoney 0x(cantidad a dar) 0x0
Es simple, solo hay que poner la cantidad de dinero a dar. El único "problema" que se os puede presentar es que la cantidad la tenéis que poner en hexadecimal, de tal forma que si queréis dar 1.000 de dinero tenéis que poner así:

Código:
givemoney 0x3E8 0x0

Paymoney

Este es igual que el anterior, solo que este en vez de dar dinero, quita al jugador dinero.

Código:
paymoney 0x(cantidad de dinero a quitar) 0x00

checkmoney

Vamos a ver el comando para comprobar si nuestro jugador tiene una cierta cantidad de dinero. Este comando es realmente el más importante, ya que si queremos hacer un script donde nuestro jugador tenga que pagar, tenemos que comprobar si tiene esa cantidad de dinero previamente.

Primero, tenemos que utilizar este comando:

Código:
checkmoney 0x(cantidad a comprobar) 0x00
En este comando fijamos la cantidad que queremos comprobar si se tiene.

¿Os acordáis de la variable 800D? La cual es una variable reservada para el juego donde se almacenan cierto valores dependiendo del comando que utilicemos. En este caso, cuando utilizamos el comando checkmoney, si tenemos el dinero o más, esta variable tendrá el valor 1, y en caso contrario tendrá el valor cero. Entonces, lo que tendremos que hacer es comprobar si la variable 800D tiene el valor 1 o mayor, y en ese caso continuar el script en otro offset. Así:

Código:
checkmoney 0x3E8 0x0
compare 0x800D 0x1
if 0x0 goto @notener
Aquí hemos puesto la siguiente condición: si la variable 800D tiene un valor inferior (if 0x0) a uno (compare 0x800D 0x1), iremos al offset en el cual nos dirán que no tenemos el dinero suficiente (goto @notener)

Recordad que también podéis utilizar el compare LAST_RESULT 0x1


Enseñar el dinero

Normalmente, cuando hacemos algún script relacionado con el dinero, ponemos el cuadrado que nos indica el dinero que tenemos actualmente. Pues esto lo podemos hacer con un comando. Hay uno para enseñar la caja del dinero y otro para volverla ocultar.

Si queremos enseñar la caja del dinero pondremos:

Código:
showmoney 0x(X) 0x(Y) 0x0
X e Y son las coordenadas donde queremos que aparezca nuestra caja (ya hemos dado como mirar las coordenadas en el mapa), y el 0x00 es por defecto.

Si queremos que nuestro caja salga en la esquina superior izquierda, pondremos esto:

Código:
showmoney 0x0 0x0 0x0
Para que desaparezca la caja del dinero, pondremos un comando muy parecido:

Código:
hidemoney 0x(X) 0x(Y)
Hay que volver a poner las coordenadas puestas previamente en el showmoney.

________________________________________________________________




Givepokemon

Con este comando, como su nombre indica, podemos dar un pokémon a nuestro player, los parámetros son los siguientes:

Código:
givepokemon 0x(Nº de pokémon) 0x(Nivel) 0x(Nº Item equipado) 0x0 0x0 0x0
Pues bien, procedo a explicar cada cosa aunque se intuye.

Nº de pokémon corresponde al número de la lista pokémon, el cual queremos entregar, recordad que siempre en hexadecimal. Siqueremos entregar un bulbasaur que es el primer pokémon de la lista si mal no recuerdo, pondríamos un 0x1.

Nivel es el nivel al que será entregado el pokémon

Nº item equipado, aquí ponemos el número de un item si queremos que lo tenga equipado el pokémon. Si no queremos que tenga nada equipado ponemos 0.

Los últimos tres 0x0 son buffers, es decir, no los toquéis y os irá bien, XD.

Vamos a entregar un caterpie nivel 99 sin objetos:

Código:
givepokemon 0xA 0x63 0x0 0x0 0x0 0x0
Os pondré la lista pokémon, recordar que los números decimales que damos en los comandos los tenéis que pasar a hexa. Y esto con cualquier número de cualquier comando.

BULBASAUR 1
IVYSAUR 2
VENUSAUR 3
CHARMANDER 4
CHARMELEON 5
CHARIZARD 6
SQUIRTLE 7
WARTORTLE 8
BLASTOISE 9
CATERPIE 10
METAPOD 11
BUTTERFREE 12
WEEDLE 13
KAKUNA 14
BEEDRILL 15
PIDGEY 16
PIDGEOTTO 17
PIDGEOT 18
RATTATA 19
RATICATE 20
SPEAROW 21
FEAROW 22
EKANS 23
ARBOK 24
PIKACHU 25
RAICHU 26
SANDSHREW 27
SANDSLASH 28
NIDORAN|f| 29
NIDORINA 30
NIDOQUEEN 31
NIDORAN|m| 32
NIDORINO 33
NIDOKING 34
CLEFAIRY 35
CLEFABLE 36
VULPIX 37
NINETALES 38
JIGGLYPUFF 39
WIGGLYTUFF 40
ZUBAT 41
GOLBAT 42
ODDISH 43
GLOOM 44
VILEPLUME 45
PARAS 46
PARASECT 47
VENONAT 48
VENOMOTH 49
DIGLETT 50
DUGTRIO 51
MEOWTH 52
PERSIAN 53
PSYDUCK 54
GOLDUCK 55
MANKEY 56
PRIMEAPE 57
GROWLITHE 58
ARCANINE 59
POLIWAG 60
POLIWHIRL 61
POLIWRATH 62
ABRA 63
KADABRA 64
ALAKAZAM 65
MACHOP 66
MACHOKE 67
MACHAMP 68
BELLSPROUT 69
WEEPINBELL 70
VICTREEBEL 71
TENTACOOL 72
TENTACRUEL 73
GEODUDE 74
GRAVELER 75
GOLEM 76
PONYTA 77
RAPIDASH 78
SLOWPOKE 79
SLOWBRO 80
MAGNEMITE 81
MAGNETON 82
FARFETCH'D 83
DODUO 84
DODRIO 85
SEEL 86
DEWGONG 87
GRIMER 88
MUK 89
SHELLDER 90
CLOYSTER 91
GASTLY 92
HAUNTER 93
GENGAR 94
ONIX 95
DROWZEE 96
HYPNO 97
KRABBY 98
KINGLER 99
VOLTORB 100
ELECTRODE 101
EXEGGCUTE 102
EXEGGUTOR 103
CUBONE 104
MAROWAK 105
HITMONLEE 106
HITMONCHAN 107
LICKITUNG 108
KOFFING 109
WEEZING 110
RHYHORN 111
RHYDON 112
CHANSEY 113
TANGELA 114
KANGASKHAN 115
HORSEA 116
SEADRA 117
GOLDEEN 118
SEAKING 119
STARYU 120
STARMIE 121
MR. MIME 122
SCYTHER 123
JYNX 124
ELECTABUZZ 125
MAGMAR 126
PINSIR 127
TAUROS 128
MAGIKARP 129
GYARADOS 130
LAPRAS 131
DITTO 132
EEVEE 133
VAPOREON 134
JOLTEON 135
FLAREON 136
PORYGON 137
OMANYTE 138
OMASTAR 139
KABUTO 140
KABUTOPS 141
AERODACTYL 142
SNORLAX 143
ARTICUNO 144
ZAPDOS 145
MOLTRES 146
DRATINI 147
DRAGONAIR 148
DRAGONITE 149
MEWTWO 150
MEW 151
CHIKORITA 152
BAYLEEF 153
MEGANIUM 154
CYNDAQUIL 155
QUILAVA 156
TYPHLOSION 157
TOTODILE 158
CROCONAW 159
FERALIGATR 160
SENTRET 161
FURRET 162
HOOTHOOT 163
NOCTOWL 164
LEDYBA 165
LEDIAN 166
SPINARAK 167
ARIADOS 168
CROBAT 169
CHINCHOU 170
LANTURN 171
PICHU 172
CLEFFA 173
IGGLYBUFF 174
TOGEPI 175
TOGETIC 176
NATU 177
XATU 178
MAREEP 179
FLAAFFY 180
AMPHAROS 181
BELLOSSOM 182
MARILL 183
AZUMARILL 184
SUDOWOODO 185
POLITOED 186
HOPPIP 187
SKIPLOOM 188
JUMPLUFF 189
AIPOM 190
SUNKERN 191
SUNFLORA 192
YANMA 193
WOOPER 194
QUAGSIRE 195
ESPEON 196
UMBREON 197
MURKROW 198
SLOWKING 199
MISDREAVUS 200
UNOWN 201
WOBBUFFET 202
GIRAFARIG 203
PINECO 204
FORRETRESS 205
DUNSPARCE 206
GLIGAR 207
STEELIX 208
SNUBBULL 209
GRANBULL 210
QWILFISH 211
SCIZOR 212
SHUCKLE 213
HERACROSS 214
SNEASEL 215
TEDDIURSA 216
URSARING 217
SLUGMA 218
MAGCARGO 219
SWINUB 220
PILOSWINE 221
CORSOLA 222
REMORAID 223
OCTILLERY 224
DELIBIRD 225
MANTINE 226
SKARMORY 227
HOUNDOUR 228
HOUNDOOM 229
KINGDRA 230
PHANPY 231
DONPHAN 232
PORYGON2 233
STANTLER 234
SMEARGLE 235
TYROGUE 236
HITMONTOP 237
SMOOCHUM 238
ELEKID 239
MAGBY 240
MILTANK 241
BLISSEY 242
RAIKOU 243
ENTEI 244
SUICUNE 245
LARVITAR 246
PUPITAR 247
TYRANITAR 248
LUGIA 249
HO-OH 250
CELEBI 251
TREECKO 277
GROVYLE 278
SCEPTILE 279
TORCHIC 280
COMBUSKEN 281
BLAZIKEN 282
MUDKIP 283
MARSHTOMP 284
SWAMPERT 285
POOCHYENA 286
MIGHTYENA 287
ZIGZAGOON 288
LINOONE 289
WURMPLE 290
SILCOON 291
BEAUTIFLY 292
CASCOON 293
DUSTOX 294
LOTAD 295
LOMBRE 296
LUDICOLO 297
SEEDOT 298
NUZLEAF 299
SHIFTRY 300
NINCADA 301
NINJASK 302
SHEDINJA 303
TAILLOW 304
SWELLOW 305
SHROOMISH 306
BRELOOM 307
SPINDA 308
WINGULL 309
PELIPPER 310
SURSKIT 311
MASQUERAIN 312
WAILMER 313
WAILORD 314
SKITTY 315
DELCATTY 316
KECLEON 317
BALTOY 318
CLAYDOL 319
NOSEPASS 320
TORKOAL 321
SABLEYE 322
BARBOACH 323
WHISCASH 324
LUVDISC 325
CORPHISH 326
CRAWDAUNT 327
FEEBAS 328
MILOTIC 329
CARVANHA 330
SHARPEDO 331
TRAPINCH 332
VIBRAVA 333
FLYGON 334
MAKUHITA 335
HARIYAMA 336
ELECTRIKE 337
MANECTRIC 338
NUMEL 339
CAMERUPT 340
SPHEAL 341
SEALEO 342
WALREIN 343
CACNEA 344
CACTURNE 345
SNORUNT 346
GLALIE 347
LUNATONE 348
SOLROCK 349
AZURILL 350
SPOINK 351
GRUMPIG 352
PLUSLE 353
MINUN 354
MAWILE 355
MEDITITE 356
MEDICHAM 357
SWABLU 358
ALTARIA 359
WYNAUT 360
DUSKULL 361
DUSCLOPS 362
ROSELIA 363
SLAKOTH 364
VIGOROTH 365
SLAKING 366
GULPIN 367
SWALOT 368
TROPIUS 369
WHISMUR 370
LOUDRED 371
EXPLOUD 372
CLAMPERL 373
HUNTAIL 374
GOREBYSS 375
ABSOL 376
SHUPPET 377
BANETTE 378
SEVIPER 379
ZANGOOSE 380
RELICANTH 381
ARON 382
LAIRON 383
AGGRON 384
CASTFORM 385
VOLBEAT 386
ILLUMISE 387
LILEEP 388
CRADILY 389
ANORITH 390
ARMALDO 391
RALTS 392
KIRLIA 393
GARDEVOIR 394
BAGON 395
SHELGON 396
SALAMENCE 397
BELDUM 398
METANG 399
METAGROSS 400
REGIROCK 401
REGICE 402
REGISTEEL 403
KYOGRE 404
GROUDON 405
RAYQUAZA 406
LATIAS 407
LATIOS 408
JIRACHI 409
DEOXYS 410
CHIMECHO 411



Giveegg

Este comando es mucho más fácil porque se trata simplemente de dar un huevo pokémon (no puede llevar objetos). Solo hay que poner Giveegg 0x(Nº pokémon). Un huevo de un mewtwo sería así:

Código:
Giveegg 0x96


Mote al primer pokémon

Cuando hablamos de poner motes se complica la cosa, porque es más difícil de lo que parece. Pero no en el caso de recibir tu primer pokémon.

Código:
special 0x9E
Este es el comando por el cual se le pone mote a tu primer pokémon. También lo utilizaremos para cualquier otro pokémon pero será más complicado.

Código:
special 0x9E
waitstate
Después de un special, sobretodo aquellos que os lleven a otras pantallas, tenéis que poner un waitstate para que el script espere a que se haya producido todo el special de forma correcta y no de bugs ni problemas.



Motes al recibir un pokémon

Tenemos que tener en cuenta varios factores, el principal es saber si tenemos o no hueco en el equipo para recibir el pokémon. También se puede dar el caso de que se pueda enviar el pokémon al pc pero eso depende de vosotros. De todas formas, para comprobar cuantos pokémons tenemos en el equipo utilizaremos este comando:

Código:
countpokemon
El funcionamiento es el siguiente: Al utilizar este comando, la variable 800D tendrá el valor igual al número de pokémons en nuestro equipo. Es decir, que si tenemos 6 la variable 800D pasará a tener el valor "6". De esta forma podemos poner una condición, si la variable 800D es igual a 6 pues no continuaremos el script por ejemplo.

Este script no funcionará si tenéis seis pokémon en vuestro equipo (Os eliminaría uno).

Os voy a poner el script para poner un mote:

Código:
countpokemon
subvar LASTRESULT 0x1
copyvar 0x8004 LASTRESULT
fadescreen 0x1
special 0x9E
Lo que hacemos es exactamente esto:

1-Contamos cuantos pokemon tenemos
2-A la variable 800D le restamos 1
3-Damos el valor de la variable 800D a la variable 8004
4-Un fadescreen normal
5-Ponemos mote al pokémon que nos acaban de dar.

¿Por qué hacemos esto? Porque el special 0x9E trabaja sobre la variable 8004 y dependiendo del valor de esta le podemos dar el mote al último pokemon obtenido, por eso restamos uno a la cantidad de pokémon que tengamos, para que al copiar el valor en la variable 8004 se le pueda dar al último pokémon un mote, sino se lo daría a otro o no se lo daría a ninguno.

Voy a explicarlo de otra forma:

El special 0x9E da mote al pokémon del equipo según la variable 8004. Si esta variable es 0 le dará mote al primer pokémon, si es 1 al segundo y así sucesivamente. Para saber a qué pokémon se lo tenemos que dar utilizamos el siguiente truco: Sabemos que el pokémon que nos den se pondrá en último lugar, entonces tenemos que hacer que la variable 8004 corresponda con la nueva cantidad de pokémon que tenemos, para eso hacemos un countpokemon, y el valor que tenga la variable 800D será el número de pokemon que tenemos ahora, entonces con copyvar el valor de 800D pasará a 8004. ¿Entonces porqué le restamos uno? Porque para el special 0x9E si le queremos poner un mote al primer pokémon sería 0 y no 1, y el countpokemon si tenemos un solo pokémon pondrá el valor 1 y no el cero. Entonces hay que restar uno para que se ajuste a lo que el special entiende por el primer pokémon y la posición de estos.

Largo de explicar, pero no muy difícil de entender. Aún no hemos dado subvar y copy var aunque os acabo de explicar para que sirven.

Si queréis hacer un inspector de motes simplemente copiarlo del que viene en el juego. Poner un mote y enviarlo luego al pc es bastante más difícil de lo que acabamos de hacer, y más que difícil complejo, de todas formas no descarto en explicarlo en un futuro.




¿Qué es un script de gatillo?

Un script de gatillo es aquel script que se ejecuta cuando se pisa una casilla en
el suelo que representa el script, es decir, que cuando pisas el script creado en AM, se ejecute el script guardado en su offset.

Estos scripts se representan con una casilla verde y una 'S' dentro. Par que funcionen necesitan como condición que una variable del juego tenga cierto valor.


Configuración de un script de gatillo



1-El tipo de evento, que tiene que ser script. Así se representa un script de gatillo en el AM.

2-Esta casilla es obligatoria para que el script funcione correctamente.

3-Normalmente aqui se pone el número 3, pero yo suelo poner 0 y no me da problemas

4-Aquí ponemos la variable que queremos comprobar su valor

5-Aquí ponemos el valor de la variable, y si la variable tiene el valor que se pone aquí el script se ejecutará.

6-Offset del script.



Los scripts de gatillo se repiten

Imaginemos que queremos poner un sitio donde el personaje no pueda pasar hasta que no le den un pokémon. Lo que tenemos que hacer es un script de gatillo. Un script de gatillo se ejecuta cuando la variable que se pone en la configuración tiene el valor que se pone en la configuración también, entonces si lo hemos configurado para que se ejecute cuando la variable 4050 tenga el valor 0, lo que tenemos que hacer es que en el código de cuando nos den un pokemon pongamos un setvar 0x4050 0x1, de esta forma ahora la variable 4050 ya no tiene el valor 0 sino el 1 y por lo tanto lo se ejecuta el script que no te deja pasar y ahora sí puedes pasar. ¿Captas el concepto? Recordad que todas las variables empiezan con el valor 0 por defecto y que a medida que transcurre el juego puede ser cambiado.


Addvar y Subvar

Con el comando setvar, podemos estar un poco limitados para hacer scripts y condiciones. Estos dos comandos al menos nos facilitan bastante las cosas si queremos hacer determinados tipos de eventos.

El comando Addvar suma el valor a una variable, suma. El setvar sustituye y fija el valor de la variable, pero el Addvar lo suma al valor que ya tenía la variable. Si queremos que un script se ejecuta cuando se hablen con 5 personas por ejemplo, en vez de hacer 5 condiciones por separado para comprobar que se habló con las 5 personas, podemos a una variable sumar el valor "1" cada vez que se hable con la persona que queremos, de forma que cuando se hablen con todas las personas el valor sumado total que habrá en la variable será "5". De esta forma ponemos la condición en nuestro script de gatillo que el var value sea 5, y así se ejecutará solo cuando sea 5 y se haya hablado con dichas personas.

En comando Addvar es tal que así:

Código:
addvar 0xVariable 0xValor
Si hacemos esto:
Código:
setvar 0x4000 0x2
addvar 0x4000 0x1
El valor de 4000 será de 3.

El comando subvar es igual solo que en vez de sumar resta

Código:
subvar 0xVariable 0xValor

Copyvar y Copyvarifnotzero

Copyvar hace que el valor de una variable pase a otra variable.

Código:
Copyvar 0xVariable1 0xVariable2
De esta forma, el valor de Variable1 ahora lo tendrá también Variable2.

Copyvarifnotzero es igual, solo que si Variable1 tiene el valor 0, este valor no se pasará a la Variable2, como si se ignorara el comando.

Código:
Copyvarifnotzero 0xVariable1 0xVariable2




Entrenador normal

Entendemos por entrenador normal aquel que nos reta cuando entramos en su campo de visión, es decir, un entrenador cualquiera de una ruta cualquiera que anda hacia ti y te reta.

Primero veamos como se configura en AM:



1-El evento en AM será de tipo "gente"

2-Esta casilla siempre activada

3-Todos ponen 03 aquí, aunque si dejas igual no suele pasar nada

4-Tipo de movimiento del minisprite

5-Lógicamente como nuestro minisprite es entrenador, esta casilla la activaremos

6-Distancia a la cual te ve. Si pones 1, te retará cuando estés a un paso de él. Si pones 2, cunado estés a dos pasos de él, y así sucesivamente.

7-Offset de nuestro script compilado.

Una vez tenemos a nuestro minisprite listo, vamos a explicar el código del script.

Durante este tutorial, me oiréis hablar sobre la id_entrenador. Esto es un número que tiene cada entrenador, y el cual es necesario saber para hacer cualquier comando de batalla contra un trainer. Este id se puede ver si abrimos nuestra rom con la herramienta PET.



Como podéis ver, si queremos hacer una batalla con el entrenador EARL, necesitaremos su id que será "2CA".

Bien, ahora veamos un script de un entrenador normal.

Código:
#org 0x160571
trainerbattle 0x0 0x66 0x0 0x81722C7 0x81722F9
msgbox 0x8172315 MSG_NORMAL '"Ssh! You'll scare the bugs away.\n..."
end


'---------
' Strings
'---------
#org 0x1722C7
= Hey! You have POKéMON!\nCome on!\lLet's battle 'em!

#org 0x1722F9
= No!\nCATERPIE can't hack it!

#org 0x172315
= Ssh! You'll scare the bugs away.\nAnother time, okay?
Lo primero, es poner el código que hará que luchemos, el trainerbattle, el cual tiene este formato:

Código:
trainerbattle 0x[tipo de lucha] 0x[id_entrenador] 0x0 0x[mensaje1] 0x[mensaje2]
Los entrenadores normales siempre tienen en tipo de lucha un 0. La is_entrenador es la que miramos en PET, lo siguiente en 0x0 por defecto, y vemos que hay dos mensajes. El primer mensaje es el que nos dirá cuando nos vea y nos rete, y el segundo es el que nos dirá justo después de ser derrotado.

Entonces un posible código de entrenador sería este:

Código:
#dynamic 0x800000

#org @inicio
trainerbattle 0x0 0x66 0x0 @msg1 @msg2
end

#org @msg1
= ¡Te he visto!

#org @msg2
= ¡Me has ganado!
Con este código lucharemos contra el primer cazabichos del bosque verde.

Pero nos falta algo para acabar, y es el mensaje que se tiene que mostrar cuando vuelves a hablar con él en otro momento. Y esto es simple, solo hay que poner un msgbox normal.

Código:
#dynamic 0x800000

#org @inicio
trainerbattle 0x0 0x66 0x0 @msg1 @msg2
msgbox @texto 0x6
end

#org @msg1
= ¡Te he visto!

#org @msg2
= ¡Me has ganado!

#org @texto
= No volveré a combatir contra ti\nnunca más.
Ahora sí que ya tenemos completo nuestro código listo para compilar.


Entrenadores de evento

Nos referimos con entrenadores de evento a aquellos contra los que se lucha mediante un script de la historia, o que no queremos que nos rete con la mirada. Estos son por ejemplo tu rival, donde primero se ejecuta una parte del código, luego luchamos, y por último se ejecuta la última parte del código. Con este tipo de entrenador nos aseguramos de que se ejecutará el código que se ponga después del comando trainerbattle, ya que con lo visto anteriormente después de la batalla no se ejecutaría más código.

La diferencia con lo anterior es mínima, solo cambia el tipo el tipo de lucha y la cantidad de mensajes.

Código:
*Código antes de luchar*
trainerbattle 0x3 0x66 0x0 @msg1
*Código después de luchar*
Como veis, el tipo de combate ahora es 0x3, y solo tenemos un mensaje. Esto es porque como no te retan con la mirada, no hace falta poner un mensaje de lo que te dicen cuando te retan, entonces solo hace falta el mensaje de justo después de que lo derrotes.


Seguir aunque pierdas

Para los trainers de evento, al menos en Fire Red, podemos hacer que no perdamos y continuemos el script aunque nos derroten.

Simplemente el tipo de lucha y el tercer número que poníamos por defecto hay que cambiarlo así:

Código:
trainerbattle 0x9 0x66 0x3 @msg1 @msg2
Pero, ¿Por qué ahora tenemos dos mensajes si sigue siendo un entrenador de evento? Fácil. Porque puedes ganar o perder. Si ganas, el mensaje que dirá tu rival al perder será el @msg1 y si pierdes dirá el @msg2.

OJO Este tipo de batalla está hecho para que el primer combate contra el rival, donde el profesor Oak te da instrucciones sobre combatir. Y siempre que utilicéis esto saltará Oak dándote consejos. Si quireis quitar esos mensajes, vuestro hilo es este: Quitar mensajes de Oak


Líder de GYM

Los líderes tienen su propio tipo de batalla, y aunque no me gusto mucho y no es estrictamente necesario utilizarlo (ya que haciendo un entrenador de evento y luego activando la medalla con setflag se puede hacer perfectamente), es mi deber explicároslo.

Código:
trainerbattle 0x1 0x66 0x0 @msg1 @msg2 @seguir
El tipo de lucha cambia a 0x1, y ahora tenemos tres punteros. El primero es un mensaje, el que se mostrará antes de luchar. El segundo es otro mensaje, este se mostrará justo después de ser derrotado. Y el tercero en una dirección offset, no un mensaje, y el la dirección a la cual irá en caso de que lo derrotemos. Pongo un ejemplo:

Código:
#dynamic 0x700000

#org @inicio
trainerbattle 0x1 0x66 0x0 @msg1 @msg2 @seguir
msgbox @texto 0x6
waitmsg
end

#org @seguir
msgbox @texto2 0x6
waitmsg
giveitem 0x121 0x1 MSG_OBTAIN
setflag 0x820
end

#org @msg1
= Hoy líder. Luchemos

#org @msg2
= He perdido...

#org @texto1
= ¿Te ha servido mi MT?

#org @texto2
= Ahora te daré la MT1 y también una\nmedalla
Cuando le derrotamos, irá al @seguir, y nos dará la MT1 y nos activará la primera medalla con el setflag. Una vez que volvamos a hablar con él, se ejecutará el texto de después del trainerbattle.


Otros comandos

Existen algunos comandos útiles en cuanto a luchar contra entrenadores se refiere, y os voy a explicar dos:

Código:
settrainerflag 0xID_Entrenador
Este comando hace que podamos volver a luchar contra el entrenador de cual tenga la id que hemos puesto en el código.

Código:
cleartrainerflag 0xID_Entrenador
Y este hará que el ya no nos pueda retar el entrenador que esta la id_entrenador que hayamos puesto.


Lucha contra pokémon salvajes

Esto es un código sencillo que no tiene mucha complicación:

Código:
wildbattle 0xNúmero de pokemon en pokédex 0xnivel 0xobjeto equipado
Recordad poner el número de vuestro pokémon en HEX, es decir que si queremos luchar contra un rattata (19 en pokédex), en el código ponemos 13, ya que 19 en HEX es 13.

Código:
wildbattle 0x1 0x5 0x0
En este caso lucharemos contra un bulbasaur nivel 5 sin ningún objeto equipado.

_____________________________________________________________________________________________________




¿Qué es un script de nivel?

Llamamos scripts de nivel a aquellos scripts que se ejecutan al entrar en un mapa. Los scripts de nivel se configuran en el cabezal del AM. Hay varios tipos de script de nivel y cada uno tiene una "especialidad" o función.

01 'setmaptile' script: Se utiliza para comandos setmaptile, que son aquellos que modifican tiles en el mapa. Por ejemplo, simular que una roca ya no bloquea el camino. Este script de nivel se dará con más detalle en el siguiente tutorial. Se ejecuta siempre.

02 Validates values [playback]: El más usado. Permite utilizar msgbox applymovement y todos los comandos practicamente, cosa que otros scripts de nivel no permiten y haría que la pantalla se quedara en negro. Es decir, que este lo usamos para scripts importantes o de historia.
Dependen de una condición para que se ejecuten.

03 On entering map/not on menu close: Este se utiliza para dar valores y comprobar datos, como variables y flags. Comandos que no interaccionan con el jugador, como el comando sethealingplace que se utiliza en centros pokemon e indica que el mapa es lugar de curación para cuando te derrotan. Se repite siempre.

04 Validates valus, loads handler: Este se utiliza hacer acciones en el mapa que se tienen que ejecutar antes de que el jugador lo pueda ver. Por ejemplo, cambiar de lugar un minisprite temporalmente. Si lo hacemos con el tipo 02, en los primeros frames veremos como se ejecuta el comando y se teletransporta el mini, pero con este comando no, ya que esto se ejecutará antes de que se cargue todo el mapa. Depende de una condición para ejecutarse.



Configurando nuestro script de nivel

La estructura del script en vuestro editor de scripts y su compilación es la misma que si fuera un script normal. Hacemos nuestro script y lo compilamos. En mi caso el script se guardó en el offset 0x800000.

Ahora vámonos al cabezal del mapa para configurar nuestro script, exactamente a esta parte:



Le damos a add para añadir scripts de nivel, o a remove si queréis eliminar los de nintendo y luego a add.

Entonces en script type elegimos el tipo de nuestro script de nivel y dependiendo del tipo ahoremos una cosa u otra.

Si es del tipo 02 o 04:

Estos dos tipos requieren de condiciones para que se ejecuten.

En script offset colocaremos nuestro offset principal del script ya compilado, en mi caso 0x800000. En flag pondremos una variable y en value el valor que tiene que tener dicha variable para que le script se ejecute. Recordad que dentro del script debéis de cambiar el valor de la variable para que no coincida con "value" y así no se repita el script.

Si es tipo 01 o 03

En este caso solo tenéis que poner el script compilado en script offset puesto que se ejecutan una vez siempre que se entra en un mapa. Si queréis poner condiciones las podéis poner dentro del propio script.



Dudas y problemas:

Se queda la pantalla en negro:

-Posiblemente has puesto comandos en el script que por el tipo de script de nivel que has puesto no lo puede ejecutar. Como poner un msgbox en un script de nivel tipo 03.

Mi player se queda congelado antes o después

-A veces puede ser por un release pero normalmente es un error de compilación que se soluciona siguiendo este tutorial: tutorial

Puedo poner más de un script de nivel?

-Por defecto no, pero hay un tutorial para hacerlo: tutorial




¿Qué es un setmaptile?

Lo indica su nombre en inglés: "poner tile al mapa". Básicamente cambia tiles al mapa. Cada comando setmaptile que pongamos cambiará solo un tile del mapa, y para que se note el cambio deberemos refrescar la pantalla. Entonces, si quiero Cambiar por ejemplo un árbol por otro del mismo tamaño, suponiendo que el árbol tengo un tamaño de 2x3 (6 tiles), tendría que hacer 6 setmaptile.


Ejecutando un setmaptile

La estructura de un comando setmaptile es la siguiente:

Código:
setmaptile 0x(X) 0x(Y) 0x(Nº tile) 0x(permisos)
X e Y son las coordenadas del tile que vamos a cambiar.

El número de tile es un número que tiene asignado cada tile en el tileset, es decir, es el número del tile al cual queremos que se cambie, y para saber qué número es solo tenemos que hacer clic en el tile y fijarnos abajo a la izquierda en el AM dónde aparecerá el número de ese tile



Y permisos se refiere a si podemos pasar o no por el tile. Si podemos pasar por encima de él ponemos un 0x0, y si no pues un 0x1.

Y ahora lo más importante. Para que los cambios de hagan visibles, después de poner todos nuestros setmaptile tenemos que poner el siguiente special:

Código:
special 0x8E
Este especial hará que se refresque la pantalla.

Por ejemplo, imaginaros que en ruby quiero poner al lado de la casa de player un arbusto de 1x2 tiles. Primero tendría que saber las coordenadas, las cuales serían (8,8) para la base, y (8,7) para la copa. El nº tile de la base es "16" y el de la copa es "E" (todos estos números ya están en hexa así no los tenemos que pasar). En la base no se puede pasar pero en la copa sí. Entonces nuestro setmaptile quedaría así:

Código:
setmaptile 0x8 0x8 0x16 0x1
setmaptile 0x8 0x7 0xE 0x0
special 0x8E

Setmaptile permanente

Para hacer los cambios permanentes, el offset del script compilado lo tenemos que poner en un script de nivel, concretamente en el 01 (scripts de nivel explicados en el tutorial anterior). Este script de nivel propiamente no tiene condiciones para que se ejcute, así que siempre se ejecutará, pero si queréis que los setmaptiles se produzcan con cierto condición, simplemente en el script al inicio ponéis un if, tan sencillo como eso. Este script de nivel hará los cambios de setmaptile antes de que se cargue todo el mapa lo que hará que no veamos como se cambian los tiles.


¿Qué es un buffer?

Dentro del código pokemon, un buffer es una variable, solo que almacena palabras y números y sólo temporalmente. Esto nos será útil para almacenar nombres de pokemon, objetos y números y ahorrar condiciones.

Hay bastantes buffers, no tengo la certeza de cuantos, pero no es que necesitemos muchos pues lo que almacenamos en los buffers es temporal. Las palabras o números que almacenemos en buffers se podrán mostrar por mensajes de texto. Por ejemplo en el buffer1 tenemos almacenada la palabra "pikachu". Pues en un msgbox cuando pongas [buffer1] aparecerá pikachu. Algo así como cuando pones [player].


Bufferpokemon

La estructura es así:

Código:
bufferpokemon [buffer nº] [pokemon nº]
En buffers nº ponemos el número de buffer dónde se va almacenar nuestro nombre de pokemon, si ponemos 0 se almacena en el buffer 1, no en el 0, entonces el número que ahí, después para referirnos al buffer en un msg tenemos que poner un número más del que hemos puesto. Y en pokemon nº el número del pokemon de la pokedex.

Ejemplo:

Código:
#dynamic 0x800000

#org @inicio
setvar 0x4050 0x6
bufferpokemon 0x0 0x4050
msgbox 0x6 @texto
waitmsg
end

#org @texto
= Tengo un [buffer1]!
Acabo de decir que tengo un charizard.
¿Por qué he puesto 0x4050 en vez de un número de la pokedex. Es sencillo, en cualquier comando que pida un número, podemos poner el número de una variable, y el juego tomará no el número de la variable en sí, sino el número que está almacenado en la variable, de esta forma yo almacené el 6 de charizard en la var 4050, así que es lo mismo que poner 0x6. Lógicamente es más rápido poner 0x6 pero quería mostraros que se pueden poner variables y que os puede ser de utilidad ya que en otro script ya no tenemos la palabra charizard almacenada en el buffer1 pero si tenemos su numero en la var, así que hacemos un bufferpokemon y solucionado. De esta forma no tendremos que hacer un if para ver que pokemon hemos elegido y lo más importante, no tendremos que poner tres textos diferentes para bulbasaur squirtle o charmander, si almacenamos el valor del pokemon en la variable con hacer un buffer nos bastará. Fijaros en el script de fire red de cuando recibes tu pokemon, utiliza buffers y se ahorra textos, y espacio de la rom.


Bufferfirstpokemon

Este comando-buffers simplemente almacena el nombre del pokemon que tengamos del primero en el equipo. Solo necesita el parámetro del nº de buffer en el cual lo almacenamos.

Código:
bufferfirstpokemon [buffer nº]

Bufferitem y Bufferattack

La mecánica es la misma que con Bufferpokemon. Sólo que tenemos que poner un nº de un objeto de la lista de items o el número de un ataque.

Código:
Bufferitem 0x[buffer nº] 0x[nº item]
Código:
Bufferattack 0x[buffer nº] 0x[nº ataque]
Master Ball 1
Ultra Ball 2
Great Ball 3
Poké Ball 4
Safari Ball 5
Net Ball 6
Dive Ball 7
Nest Ball 8
Repeat Ball 9
Timer Ball 10
Luxury Ball 11
Premier Ball 12
Potion 13
Antidote 14
Burn Heal 15
Ice Heal 16
Awakening 17
Parlyz Heal 18
Full Restore 19
Max Potion 20
Hyper Potion 21
Super Potion 22
Full Heal 23
Revive 24
Max Revive 25
Fresh Water 26
Soda Pop 27
Lemonade 28
Moomoo Milk 29
Energypowder 30
Energy Root 31
Heal Powder 32
Revival Herb 33
Ether 34
Max Ether 35
Elixir 36
Max Elixir 37
Lava Cookie 38
Blue Flute 39
Yellow Flute 40
Red Flute 41
Black Flute 42
White Flute 43
Berry Juice 44
Sacred Ash 45
Shoal Salt 46
Shoal Shell 47
Red Shard 48
Blue Shard 49
Yellow Shard 50
Green Shard 51
HP Up 63
Protein 64
Iron 65
Carbos 66
Calcium 67
Rare Candy 68
PP Up 69
Zinc 70
PP Max 71
Guard Spec. 73
Dire Hit 74
X Attack 75
X Defend 76
X Speed 77
X Accuracy 78
X Special 79
Poké Doll 80
Fluffy Tail 81
Super Repel 83
Max Repel 84
Escape Rope 85
Repel 86
Sun Stone 93
Moon Stone 94
Fire Stone 95
Thunderstone 96
Water Stone 97
Leaf Stone 98
Tinymushroom 103
Big Mushroom 104
Pearl 106
Big Pearl 107
Stardust 108
Star Piece 109
Nugget 110
Heart Scale 111
Orange Mail 121
Harbor Mail 122
Glitter Mail 123
Mech Mail 124
Wood Mail 125
Wave Mail 126
Bead Mail 127
Shadow Mail 128
Tropic Mail 129
Dream Mail 130
Fab Mail 131
Retro Mail 132
Cheri Berry 133
Chesto Berry 134
Pecha Berry 135
Rawst Berry 136
Aspear Berry 137
Leppa Berry 138
Oran Berry 139
Persim Berry 140
Lum Berry 141
Sitrus Berry 142
Figy Berry 143
Wiki Berry 144
Mago Berry 145
Aguav Berry 146
Iapapa Berry 147
Razz Berry 148
Bluk Berry 149
Nanab Berry 150
Wepear Berry 151
Pinap Berry 152
Pomeg Berry 153
Kelpsy Berry 154
Qualot Berry 155
Hondew Berry 156
Grepa Berry 157
Tamato Berry 158
Cornn Berry 159
Magost Berry 160
Rabuta Berry 161
Nomel Berry 162
Spelon Berry 163
Pamtre Berry 164
Watmel Berry 165
Durin Berry 166
Belue Berry 167
Liechi Berry 168
Ganlon Berry 169
Salac Berry 170
Petaya Berry 171
Apicot Berry 172
Lansat Berry 173
Starf Berry 174
Enigma Berry 175
Brightpowder 179
White Herb 180
Macho Brace 181
Exp. Share 182
Quick Claw 183
Soothe Bell 184
Mental Herb 185
Choice Band 186
King's Rock 187
Silverpowder 188
Amulet Coin 189
Cleanse Tag 190
Soul Dew 191
Deepseatooth 192
Deepseascale 193
Smoke Ball 194
Everstone 195
Focus Band 196
Lucky Egg 197
Scope Lens 198
Metal Coat 199
Leftovers 200
Dragon Scale 201
Light Ball 202
Soft Sand 203
Hard Stone 204
Miracle Seed 205
Blackglasses 206
Black Belt 207
Magnet 208
Mystic Water 209
Sharp Beak 210
Poison Barb 211
Nevermeltice 212
Spell Tag 213
Twistedspoon 214
Charcoal 215
Dragon Fang 216
Silk Scarf 217
Up-grade 218
Shell Bell 219
Sea Incense 220
Lax Incense 221
Lucky Punch 222
Metal Powder 223
Thick Club 224
Stick 225
Red Scarf 254
Blue Scarf 255
Pink Scarf 256
Green Scarf 257
Yellow Scarf 258
Mach Bike 259
Coin Case 260
Itemfinder 261
Old Rod 262
Good Rod 263
Super Rod 264
S.S. Ticket 265
Contest Pass 266
Wailmer Pail 268
Devon Goods 269
Soot Sack 270
Basement Key 271
Acro Bike 272
PokéBlock Case 273
Letter 274
Eon Ticket 275
Red Orb 276
Blue Orb 277
Scanner 278
Go-goggles 279
Meteorite 280
Rm. 1 Key 281
Rm. 2 Key 282
Rm. 4 Key 283
Rm. 6 Key 284
Storage Key 285
Root Fossil 286
Claw Fossil 287
Devon Scope 288
TM01 289
TM02 290
TM03 291
TM04 292
TM05 293
TM06 294
TM07 295
TM08 296
TM09 297
TM10 298
TM11 299
TM12 300
TM13 301
TM14 302
TM15 303
TM16 304
TM17 305
TM18 306
TM19 307
TM20 308
TM21 309
TM22 310
TM23 311
TM24 312
TM25 313
TM26 314
TM27 315
TM28 316
TM29 317
TM30 318
TM31 319
TM32 320
TM33 321
TM34 322
TM35 323
TM36 324
TM37 325
TM38 326
TM39 327
TM40 328
TM41 329
TM42 330
TM43 331
TM44 332
TM45 333
TM46 334
TM47 335
TM48 336
TM49 337
TM50 338
HM01 339
HM02 340
HM03 341
HM04 342
HM05 343
HM06 344
HM07 345
HM08 346
Oak's Parcel 349
Poké Flute 350
Secret Key 351
Bike Voucher 352
Gold Teeth 353
Old Amber 354
Card Key 355
Lift Key 356
Helix Fossil 357
Dome Fossil 358
Silph Scope 359
Bicycle 360
Town Map 361
VS Seeker 362
Fame Checker 363
TM Case 364
Berry Pouch 365
Teachy TV 366
Tri-pass 367
Rainbow Pass 368
Tea 369
Mysticticket 370
Auroraticket 371
Powder Jar 372
Ruby 373
Sapphire 374

001 Pound
002 Karate Chop
003 DoubleSlap
004 Comet Punch
005 Mega Punch
006 Pay Day
007 Fire Punch
008 Ice Punch
009 ThunderPunch
00A Scratch
00B ViceGrip
00C Guillotine
00D Razor Wind
00E Swords Dance
00F Cut
010 Gust
011 Wing Attack
012 Whirlwind
013 Fly
014 Bind
015 Slam
016 Vine Whip
017 Stomp
018 Double Kick
019 Mega Kick
01A Jump Kick
01B Rolling Kick
01C Sand-Attack
01D Headbutt
01E Horn Attack
01F Fury Attack
020 Horn Drill
021 Tackle
022 Body Slam
023 Wrap
024 Take Down
025 Thrash
026 Double-Edge
027 Tail Whip
028 Poison Sting
029 Twineedle
02A Pin Missile
02B Leer
02C Bite
02D Growl
02E Roar
02F Sing
030 Supersonic
031 SonicBoom
032 Disable
033 Acid
034 Ember
035 Flamethrower
036 Mist
037 Water Gun
038 Hydro Pump
039 Surf
03A Ice Beam
03B Blizzard
03C Psybeam
03D BubbleBeam
03E Aurora Beam
03F Hyper Beam
040 Peck
041 Drill Peck
042 Submission
043 Low Kick
044 Counter
045 Seismic Toss
046 Strength
047 Absorb
048 Mega Drain
049 Leech Seed
04A Growth
04B Razor Leaf
04C SolarBeam
04D PoisonPowder
04E Stun Spore
04F Sleep Powder
050 Petal Dance
051 String Shot
052 Dragon Rage
053 Fire Spin
054 ThunderShock
055 Thunderbolt
056 Thunder Wave
057 Thunder
058 Rock Throw
059 Earthquake
05A Fissure
05B Dig
05C Toxic
05D Confusion
05E Psychic
05F Hypnosis
060 Meditate
061 Agility
062 Quick Attack
063 Rage
064 Teleport
065 Night Shade
066 Mimic
067 Screech
068 Double Team
069 Recover
06A Harden
06B Minimize
06C SmokeScreen
06D Confuse Ray
06E Withdraw
06F Defense Curl
070 Barrier
071 Light Screen
072 Haze
073 Reflect
074 Focus Energy
075 Bide
076 Metronome
077 Mirror Move
078 Selfdestruct
079 Egg Bomb
07A Lick
07B Smog
07C Sludge
07D Bone Club
07E Fire Blast
07F Waterfall
080 Clamp
081 Swift
082 Skull Bash
083 Spike Cannon
084 Constrict
085 Amnesia
086 Kinesis
087 Softboiled
088 Hi Jump Kick
089 Glare
08A Dream Eater
08B Poison Gas
08C Barrage
08D Leech Life
08E Lovely Kiss
08F Sky Attack
090 Transform
091 Bubble
092 Dizzy Punch
093 Spore
094 Flash
095 Psywave
096 Splash
097 Acid Armor
098 Crabhammer
099 Explosion
09A Fury Swipes
09B Bonemerang
09C Rest
09D Rock Slide
09E Hyper Fang
09F Sharpen
0A0 Conversion
0A1 Tri Attack
0A2 Super Fang
0A3 Slash
0A4 Substitute
0A5 Struggle
0A6 Sketch
0A7 Triple Kick
0A8 Thief
0A9 Spider Web
0AA Mind Reader
0AB Nightmare
0AC Flame Wheel
0AD Snore
0AE Curse
0AF Flail
0B0 Conversion 2
0B1 Aeroblast
0B2 Cotton Spore
0B3 Reversal
0B4 Spite
0B5 Powder Snow
0B6 Protect
0B7 Mach Punch
0B8 Scary Face
0B9 Faint Attack
0BA Sweet Kiss
0BB Belly Drum
0BC Sludge Bomb
0BD Mud-Slap
0BE Octazooka
0BF Spikes
0C0 Zap Cannon
0C1 Foresight
0C2 Destiny Bond
0C3 Perish Song
0C4 Icy Wind
0C5 Detect
0C6 Bone Rush
0C7 Lock-On
0C8 Outrage
0C9 Sandstorm
0CA Giga Drain
0CB Endure
0CC Charm
0CD Rollout
0CE False Swipe
0CF Swagger
0D0 Milk Drink
0D1 Spark
0D2 Fury Cutter
0D3 Steel Wing
0D4 Mean Look
0D5 Attract
0D6 Sleep Talk
0D7 Heal Bell
0D8 Return
0D9 Present
0DA Frustration
0DB Safeguard
0DC Pain Split
0DD Sacred Fire
0DE Magnitude
0DF DynamicPunch
0E0 Megahorn
0E1 DragonBreath
0E2 Baton Pass
0E3 Encore
0E4 Pursuit
0E5 Rapid Spin
0E6 Sweet Scent
0E7 Iron Tail
0E8 Metal Claw
0E9 Vital Throw
0EA Morning Sun
0EB Synthesis
0EC Moonlight
0ED Hidden Power
0EE Cross Chop
0EF Twister
0F0 Rain Dance
0F1 Sunny Day
0F2 Crunch
0F3 Mirror Coat
0F4 Psych Up
0F5 ExtremeSpeed
0F6 AncientPower
0F7 Shadow Ball
0F8 Future Sight
0F9 Rock Smash
0FA Whirlpool
0FB Beat Up
0FC Fake Out
0FD Uproar
0FE Stockpile
0FF Spit Up
100 Swallow
101 Heat Wave
102 Hail
103 Torment
104 Flatter
105 Will-O-Wisp
106 Memento
107 Facade
108 Focus Punch
109 SmellingSalt
10A Follow Me
10B Nature Power
10C Charge
10D Taunt
10E Helping Hand
10F Trick
110 Role Play
111 Wish
112 Assist
113 Ingrain
114 Superpower
115 Magic Coat
116 Recycle
117 Revenge
118 Brick Break
119 Yawn
11A Knock Off
11B Endeavor
11C Eruption
11D Skill Swap
11E Imprison
11F Refresh
120 Grudge
121 Snatch
122 Secret Power
123 Dive
124 Arm Thrust
125 Camouflage
126 Tail Glow
127 Luster Purge
128 Mist Ball
129 FeatherDance
12A Teeter Dance
12B Blaze Kick
12C Mud Sport
12D Ice Ball
12E Needle Arm
12F Slack Off
130 Hyper Voice
131 Poison Fang
132 Crush Claw
133 Blast Burn
134 Hydro Cannon
135 Meteor Mash
136 Astonish
137 Weather Ball
138 Aromatherapy
139 Fake Tears
13A Air Cutter
13B Overheat
13C Odor Sleuth
13D Rock Tomb
13E Silver Wind
13F Metal Sound
140 GrassWhistle
141 Tickle
142 Cosmic Power
143 Water Spout
144 Signal Beam
145 Shadow Punch
146 Extrasensory
147 Sky Uppercut
148 Sand Tomb
149 Sheer Cold
14A Muddy Water
14B Bullet Seed
14C Aerial Ace
14D Icicle Spear
14E Iron Defense
14F Block
150 Howl
151 Dragon Claw
152 Frenzy Plant
153 Bulk Up
154 Bounce
155 Mud Shot
156 Poison Tail
157 Covet
158 Volt Tackle
159 Magical Leaf
15A Water Sport
15B Calm Mind
15C Leaf Blade
15D Dragon Dance
15E Rock Blast
15F Shock Wave
160 Water Pulse
161 Doom Desire

(sorry en inglés)


Buffernumber

Este comando nos servirá para mostrar en un mensaje un número que esté almacenado en una variable, entonces si queréis guardar almacenar un número cualquiera pues se lo asignáis a una variable y ejecutáis este comando. Importante tener en cuenta de que el número que esté almacenado en un variable se mostrará como un número decimal, no hexadecimal. Si en una var tenemos A y los mostramos con Buffernumber pues se mostrará 10 y no A.

La estructura es la siguiente:

Código:
Buffernumber 0x[buffer1] 0x(variable)
Misma mecánica.




Call y return

El comando call tiene la misma función que el comando goto, nos lleva a la dirección offset que le indicamos para que se ejecute otra parte del script, pero a diferencia de goto, si utilizamos call, nos permitirá que en el script que ejecutaremos con ese call, poner al final el comando return, el cual hará que continúe el script justo después del call.


writebytetooffset

Como indica su nombre, escribe un byte en un offset, concretamente en la "General Internal Memory". Lo utilizamos para modificar ciertos valores y que nos den temporalmente una función, como un cambio de aspecto. Como cuando hacemos el efecto blanco/negro.

Si queréis saber más funciones os dejo unos enlaces:

Cambiar minisprite temporalmente

Pantallas de colores



callasm

Llama a una rutina asm para que se ejecute. Si sabéis de asm e insertáis una rutina, para que se ejecute tenéis que poner este comando seguido del offset donde se guardó la rutina.

ASM, conceptos básicos

ASM, tutorial

Tutoriales ASM de pokeco


special2

La función es exactamente igual que la de un special normal, sólo que éste tipo de especial devuelve un valor.

Código:
special2 0x(variable donde se almacena un valor) 0x(nº de special)
Por ejemplo, el special 0x130 mira si tienes un hueco en el pc para un pokemon, y en caso de que lo tengas, devolverá 1 a la variable que hemos puesto.


pause

Este pause el script durando un tiempo determinado.

Código:
pause 0x(tiempo a pausar)
Según tengo entendido, pause 0x25 es aproximadamente 1 segundo. Se suele utilizar por ejemplo para animación de la exclamación y quieres que primero se oiga el sonido antes de continuar con el script, pues después de sound ponemos un pause y arreglado.


fadedefault

Hace que la música del mapa vuelva a la canción de por defecto.


warpwalk

Mismo efecto que un warp, solo que player hace animación de estar moviéndose. Se suele utilizar para simular que entras en una casa.


warphole

Mismo efecto que un warp solo que player hará una animación de estar cayéndose por un hueco.


warpteleport

Mismo efecto que un warp solo que player hace la animación de estar teletransportandose (dando vueltas sobre sí mismo).


getplayerpos

Nos indicará en que coordenadas está player en ese momento.

Código:
getplayerpos 0x(variable 1) 0x(variable 2)
En var 1 se almacenará la posición X y en la var 2 la posición Y.


additem

Es como un giveitem sólo que no tendremos ningún mensaje que nos lo diga, es decir, que nadie se dará de cuenta.

Código:
additem 0x(nº de objeto) 0x(cantidad)

removeitem

Quita una cantidad específica de items al player, al estructura es la misma que con additem.


addpcitem y checkpcitem

Como el additem solo que te lo añade al pc. El checkpcitem es cómo un checkitem normal solo que mira si está en el pc.


movesprite2

La diferencia entre movesprite y movesprite2, es que movesprite2 hará que
la posición a donde movamos dicho sprite, sea permanente, ya que con movesprite sólo cambiamos de posición a un sprite hasta que se refresque la pantalla. Útil para no tener que poner más persons events en el mapa y ahorrarnos flags. La estructura es igual que un movesprite.


multichoice

Muestra una lista dónde podemos elegir varias opciones. Podría hacer una explicación breve, pero por el bien de vuestro conocimiento, no hay mejor tuto sobre multichoice que el de Javi:

Vamos a hacer un ejercicio de memoria y vamos a recordar el Yes/No. En aquel script, nos aparecía una caja donde podíamos escoger entre dos opciones: Sí o No. Y dependiendo de lo que escogiéramos, pasaría una cosa u otra. En este caso es lo mismo, la diferencia es que la caja contendrá hasta 6 opciones. Un ejemplo de esto es cuando vamos al PC en un Centro Pokémon y nos aparecen las opciones (pokémons, objetos…). Eso sería un multichoice. La lista de multichoices se puede encontrar en la guía de XSE para cada una de las ediciones. Los diferentes multichoices se pueden editar, existen herramientas para ello como Multichoice Editor (desarrollada por mí) o Multichoice Manager (desarrollada por Gut_Bro).

En esta ocasión tenemos 3 comandos que hacen lo mismo, es decir, muestran una caja con diferentes opciones entre las que elegir, pero nos brindan ciertas variaciones. Estos son los tres comandos:

Multichoice 0x(coordenada x) 0x(coordenada y) 0x(multichoice) 0x(B)

Multichoice2 0x(coordenada x) 0x(coordenada y) 0x(multichoice) 0x(opción seleccionada) 0x(B)

Multichoice3 0x(coordenada x) 0x(coordenada y) 0x(multichoice) 0x(opciones por columna) 0x(B)

• Coordenada x: Coordenadas en el eje x donde aparecerá la caja.
• Coordenada y: Coordenadas en el eje y donde aparecerá la caja.
• Multichoice: Número del multichoice que se mostrará.
• B: Determina si se puede pulsar el botón B para salir. 0x0 determina que se puede usar, 0x1 determina que no.
• Opción seleccionada: En el caso del multichoice2, se puede determinar qué opción saldrá marcada por defecto. Es decir, si ponemos 0x1, por ejemplo, el multichoice aparecerá con la opción número 2 seleccionada por defecto. Ojo, seleccionada no quiere decir elegida, sino que es la opción desde la que se parte.
• Opciones por columna: Por defecto, aparecen todas las opciones en una misma columna, pero se puede hacer en el caso del multichoice3, que aparezca un determinado número de opciones por cada columna. Por ejemplo, si ponemos un multichoice con 4 opciones y en este parámetro ponemos que haya 0x2 opciones por columna, aparecerán dos opciones en la primera columna y las otras dos en la segunda columna.

Recuerdo que los multichoices se pueden editar, pero en este caso, vamos a hacer el ejemplo con uno original. En Fire Red, el multichoice 0x12 tiene las opciones Yes, No e Info. Si queremos que pase una cosa u otra dependiendo de la opción elegida, pondríamos algo así:

(…)
Multichoice 0x0 0x0 0x12 0x1 ‘Muestra el multichoice
Compare LASTRESULT 0x0 ‘Comprueba si elegimos la opción 1
If 0x1 goto @yes ‘Si lo hicimos, va a @yes
Compare LASTRESULT 0x1 ‘Comprueba si elegimos la opción 2
If 0x1 goto @no ‘Si lo hicimos, va a @no
Compare LASTRESULT 0x2 ‘Comprueba si elegimos la opción 3
If 0x1 goto @info ‘Si lo hicimos, va a @info
(…)

La opción seleccionada se guarda en la variable LASTRESULT. Es importante tener en cuenta que la primera opción es representada por 0x0, no por 0x1. La 0x0 es la primera, la 0x1 es la segunda, la 0x2 es la tercera… Y así sucesivamente.


showpokepic y hidepokepic

Muestra y esconde respectivamente, un sprite de un pokemon.

Código:
showpokepic 0x(nº pokemon de pokedex) 0x(X) 0x(Y)
X e Y son las coordenadas donde se mostrará el box con el sprite del pokemon. Hidepokepic tiene la misma estructura y se usa después del showpokepic.


checkattack

Comprueba si alguno de nuestros pokemon tiene algún ataque en específico.

Código:
checkattack 0x(número del atque)
001 Pound
002 Karate Chop
003 DoubleSlap
004 Comet Punch
005 Mega Punch
006 Pay Day
007 Fire Punch
008 Ice Punch
009 ThunderPunch
00A Scratch
00B ViceGrip
00C Guillotine
00D Razor Wind
00E Swords Dance
00F Cut
010 Gust
011 Wing Attack
012 Whirlwind
013 Fly
014 Bind
015 Slam
016 Vine Whip
017 Stomp
018 Double Kick
019 Mega Kick
01A Jump Kick
01B Rolling Kick
01C Sand-Attack
01D Headbutt
01E Horn Attack
01F Fury Attack
020 Horn Drill
021 Tackle
022 Body Slam
023 Wrap
024 Take Down
025 Thrash
026 Double-Edge
027 Tail Whip
028 Poison Sting
029 Twineedle
02A Pin Missile
02B Leer
02C Bite
02D Growl
02E Roar
02F Sing
030 Supersonic
031 SonicBoom
032 Disable
033 Acid
034 Ember
035 Flamethrower
036 Mist
037 Water Gun
038 Hydro Pump
039 Surf
03A Ice Beam
03B Blizzard
03C Psybeam
03D BubbleBeam
03E Aurora Beam
03F Hyper Beam
040 Peck
041 Drill Peck
042 Submission
043 Low Kick
044 Counter
045 Seismic Toss
046 Strength
047 Absorb
048 Mega Drain
049 Leech Seed
04A Growth
04B Razor Leaf
04C SolarBeam
04D PoisonPowder
04E Stun Spore
04F Sleep Powder
050 Petal Dance
051 String Shot
052 Dragon Rage
053 Fire Spin
054 ThunderShock
055 Thunderbolt
056 Thunder Wave
057 Thunder
058 Rock Throw
059 Earthquake
05A Fissure
05B Dig
05C Toxic
05D Confusion
05E Psychic
05F Hypnosis
060 Meditate
061 Agility
062 Quick Attack
063 Rage
064 Teleport
065 Night Shade
066 Mimic
067 Screech
068 Double Team
069 Recover
06A Harden
06B Minimize
06C SmokeScreen
06D Confuse Ray
06E Withdraw
06F Defense Curl
070 Barrier
071 Light Screen
072 Haze
073 Reflect
074 Focus Energy
075 Bide
076 Metronome
077 Mirror Move
078 Selfdestruct
079 Egg Bomb
07A Lick
07B Smog
07C Sludge
07D Bone Club
07E Fire Blast
07F Waterfall
080 Clamp
081 Swift
082 Skull Bash
083 Spike Cannon
084 Constrict
085 Amnesia
086 Kinesis
087 Softboiled
088 Hi Jump Kick
089 Glare
08A Dream Eater
08B Poison Gas
08C Barrage
08D Leech Life
08E Lovely Kiss
08F Sky Attack
090 Transform
091 Bubble
092 Dizzy Punch
093 Spore
094 Flash
095 Psywave
096 Splash
097 Acid Armor
098 Crabhammer
099 Explosion
09A Fury Swipes
09B Bonemerang
09C Rest
09D Rock Slide
09E Hyper Fang
09F Sharpen
0A0 Conversion
0A1 Tri Attack
0A2 Super Fang
0A3 Slash
0A4 Substitute
0A5 Struggle
0A6 Sketch
0A7 Triple Kick
0A8 Thief
0A9 Spider Web
0AA Mind Reader
0AB Nightmare
0AC Flame Wheel
0AD Snore
0AE Curse
0AF Flail
0B0 Conversion 2
0B1 Aeroblast
0B2 Cotton Spore
0B3 Reversal
0B4 Spite
0B5 Powder Snow
0B6 Protect
0B7 Mach Punch
0B8 Scary Face
0B9 Faint Attack
0BA Sweet Kiss
0BB Belly Drum
0BC Sludge Bomb
0BD Mud-Slap
0BE Octazooka
0BF Spikes
0C0 Zap Cannon
0C1 Foresight
0C2 Destiny Bond
0C3 Perish Song
0C4 Icy Wind
0C5 Detect
0C6 Bone Rush
0C7 Lock-On
0C8 Outrage
0C9 Sandstorm
0CA Giga Drain
0CB Endure
0CC Charm
0CD Rollout
0CE False Swipe
0CF Swagger
0D0 Milk Drink
0D1 Spark
0D2 Fury Cutter
0D3 Steel Wing
0D4 Mean Look
0D5 Attract
0D6 Sleep Talk
0D7 Heal Bell
0D8 Return
0D9 Present
0DA Frustration
0DB Safeguard
0DC Pain Split
0DD Sacred Fire
0DE Magnitude
0DF DynamicPunch
0E0 Megahorn
0E1 DragonBreath
0E2 Baton Pass
0E3 Encore
0E4 Pursuit
0E5 Rapid Spin
0E6 Sweet Scent
0E7 Iron Tail
0E8 Metal Claw
0E9 Vital Throw
0EA Morning Sun
0EB Synthesis
0EC Moonlight
0ED Hidden Power
0EE Cross Chop
0EF Twister
0F0 Rain Dance
0F1 Sunny Day
0F2 Crunch
0F3 Mirror Coat
0F4 Psych Up
0F5 ExtremeSpeed
0F6 AncientPower
0F7 Shadow Ball
0F8 Future Sight
0F9 Rock Smash
0FA Whirlpool
0FB Beat Up
0FC Fake Out
0FD Uproar
0FE Stockpile
0FF Spit Up
100 Swallow
101 Heat Wave
102 Hail
103 Torment
104 Flatter
105 Will-O-Wisp
106 Memento
107 Facade
108 Focus Punch
109 SmellingSalt
10A Follow Me
10B Nature Power
10C Charge
10D Taunt
10E Helping Hand
10F Trick
110 Role Play
111 Wish
112 Assist
113 Ingrain
114 Superpower
115 Magic Coat
116 Recycle
117 Revenge
118 Brick Break
119 Yawn
11A Knock Off
11B Endeavor
11C Eruption
11D Skill Swap
11E Imprison
11F Refresh
120 Grudge
121 Snatch
122 Secret Power
123 Dive
124 Arm Thrust
125 Camouflage
126 Tail Glow
127 Luster Purge
128 Mist Ball
129 FeatherDance
12A Teeter Dance
12B Blaze Kick
12C Mud Sport
12D Ice Ball
12E Needle Arm
12F Slack Off
130 Hyper Voice
131 Poison Fang
132 Crush Claw
133 Blast Burn
134 Hydro Cannon
135 Meteor Mash
136 Astonish
137 Weather Ball
138 Aromatherapy
139 Fake Tears
13A Air Cutter
13B Overheat
13C Odor Sleuth
13D Rock Tomb
13E Silver Wind
13F Metal Sound
140 GrassWhistle
141 Tickle
142 Cosmic Power
143 Water Spout
144 Signal Beam
145 Shadow Punch
146 Extrasensory
147 Sky Uppercut
148 Sand Tomb
149 Sheer Cold
14A Muddy Water
14B Bullet Seed
14C Aerial Ace
14D Icicle Spear
14E Iron Defense
14F Block
150 Howl
151 Dragon Claw
152 Frenzy Plant
153 Bulk Up
154 Bounce
155 Mud Shot
156 Poison Tail
157 Covet
158 Volt Tackle
159 Magical Leaf
15A Water Sport
15B Calm Mind
15C Leaf Blade
15D Dragon Dance
15E Rock Blast
15F Shock Wave
160 Water Pulse
161 Doom Desire

Luego de utilizar el comando, se guardará en la variable 0x800D, del 0 al 5, que pokemon de nuestro equipo tiene ese ataque, siendo 0 el primer pokemon y 5 el último. Y si ninguno lo tiene se almacenará un 6.

Ejemplo:

Código:
checkattack 0xF
compare LASTRESULT 0x6
if 0x1 goto @nolotiene

random

Comando que almacenará un número aleatoria en hexadeciaml en la variable 0x800D.

Código:
random 0x(Nº)
El número random que nos puede dar irá desde 0 hasta Nº que le hayamos puesto menos 1.


cry

Hace el sonido de un grito pokemon especificado.

Código:
cry 0x(nº pokemon) 0x0
Cabe destacar que en Fire Red al usar showpokepic se oirá el cry del pokemon en concreto.


setmapfooter

Substituye un mapa por otro, manteniendo eventos. Se usa no tener que hacer setmaptiles a gran escala. Tutorial de juanjo.


giveitem2

Igual que giveitem, solo que además reproduce el sonido de obtención. Ideal para vagos que no quieren escribir después el comando sound.


sethealingplace

Utilizada en script de nivel 03. Indica que el mapa es punto de curación y hace mandar a player a dicho mapa en caso de derrota (centros pokemon).

Código:
sethealingplace 0x0 o 0x1
0x0 para la primera vez, ya que será el cuarto de tu madre y no se mostrará animaciones de pokeballs curandose, y 0x1 para el resto de sitios que suelen ser centros pokemon.





mmmm, lo eh utilizado mucho para guiarme pero solo una pregunta, mi advance map dice los climas pero no los numeros con los que se activa.... me los podrias pasar? :)
 

AlexKing14

A Luchar por La Gloria
re: Scripting desde cero

Uff que onda, esta bien tu aportazo muy sorprendente la forma como explicas, esto le
servira para los que empiezan y para nosotros tambien, EXELENTE :D
 

Rubire4

Usuario mítico
Respuesta: Mega-tutorial: Scripting desde cero - Actu 1-1 FINALIZADO!

mmmm, lo eh utilizado mucho para guiarme pero solo una pregunta, mi advance map dice los climas pero no los numeros con los que se activa.... me los podrias pasar? :)
Están en orden, simplemente cuenta en qué posición están.
Ninguno es 0x0, Reflejo de nubes es 0x1, etc...
Recuerda ponerlos en hexadecimal en el XSE.
 
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Gracias por el tutorial señor Xabier, por este tutorial se equiparle un nuevo mensaje a la personita, espero que con el tiempo pueda entender los demas contenidos de su maravilloso tutorial.
 

BlueFenix

Entrenador Prodigio
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Amigo este tutorial es oro puro creo que estallare de tanta informacion grasias y un saludo!
 

SalazzleX

Usuario de platino
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

Una duda, para el tipo de batalla 0x9 dice que debo editar el hex, pero el link del tutorial para quitar el mensaje de Oak la imagen que supongo que mostraba el hex que debía cambiar ah sido eliminada ¿Podrías decirme que debo sustituir?
 

deidara9216

Profesional de WaH
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

aloha mi gente, tengo una duda.

uso el comando
sound 0x13C
pause 0x25

y la música sigue sonando y solo para cuando cambio de mapa, alguien por favor
podría decirme como puedo detenerla ?

Gracias por su tiempo.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: MegaTutorial: Scripting desde cero ¡FINALIZADO!

aloha mi gente, tengo una duda.

uso el comando
sound 0x13C
pause 0x25

y la música sigue sonando y solo para cuando cambio de mapa, alguien por favor
podría decirme como puedo detenerla ?

Gracias por su tiempo.
Para revertir cambio de música debes usar el comando "fadedefault"
 

Edo

You've met with a terrible fate, haven't you?
Miembro de honor
Buenardo, breo. Tu recopilación es muy, muy útil. Sin dudas, un aporte increíble. Te agradezco el tiempo invertido y la dedicación.

Saludos.
 

ShaddEst

Usuario habitual
No entiendo lo de las comparaciones, osea, cómo haría para provocar lo de "por aquí no puedes pasar mientras no tienes pokémons" he probado a hacerlo con diferentes códigos pero nunca consigo que se mueva al conseguir un pokémon
 

Jaizu

Usuario mítico
No entiendo lo de las comparaciones, osea, cómo haría para provocar lo de "por aquí no puedes pasar mientras no tienes pokémons" he probado a hacerlo con diferentes códigos pero nunca consigo que se mueva al conseguir un pokémon
Hay una flag que activa el menú pokémon, puedes hacer un checkflag con esa misma flag y ya
 
Arriba