Registrarse

[Scripting] Tutorial sobre Scripts

C!ro

Click the circles!
Sí, ha vuelto!

[align=center]~~ NIVEL FÁCIL ~~[/align]
Comencemos. Esto es, por supuesto, lo más basico.

  • Abre el Advance Map y ve a Options > Choose Script Editor. Luego ve a la carpeta donde tengas el XSE y haz doble click. Te aparecerá un mensajito, clickea en "Yes" (o "Sí").
  • Sencillo, ¿no? Hasta el más novato de los novatos sabría hacerlo. Incluso Hitler. Ahora viene la parte que me gusta, la parte de nuestro querido XSE, un programa imprescindible para el rom hacking. Si no sabes usarlo olvidate del rom hacking. Vamos a abrir nuestro ROM con el XSE. Archivo > Abrir > Selecciona tu ROM (Forma más rápida: Ctrl + O > Selecciona tu ROM)
  • Bien, ahora ya tenemos asignado el XSE al Advance Map y abierto nuestro ROM con XSE. En el capítulo 1 enseñaré como crear un script, cómo compilarlo, y algunos comandos básicos. Con lo que vamos ahora será con...

La creación de un script

Bien, comencemos.

Código:
#dynamic 0x800000
Y tú te preguntaras: ¿Qué es #dynamic 0x800000? Muy sencillo. Eso es lo que debes poner al principio de TOOOOOOOOOOOOOODOS los scripts que hagas.

¿Qué ocurre si me olvido de poner el comando #dynamic?

No ocurre nada grave, no se te trabará el hack ni nada parecido. el XSE te avisará al compilarlo de que te has olvidado de ponerlo.

¿Y qué es compilar?

Eso está explicado más abajo, tú sigue leyendo tranquilamente.

Bien. Sigamos creando el script.

Código:
#dynamic 0x800000

#org @inicio
Vaya, ahora hemos añadido una cosa desconocida para mí, se llama #org @inicio. ¿Qué significa?

Eso es una cosa que deberás colocar también en TODOS LOS SCRIPTS. Sin el #dynamic y el #org @inicio no funcionará tu script, pero repito que el XSE te avisará.

¿Y por qué es @inicio?

Bueno, yo lo he puesto así porque es la costumbre, pero sin embargo puedes poner lo que tu quieras, siempre y cuando sea UNA SOLA PALABRA

Ejemplos dijo:
#org @inicio

#org @1

#org @mellamociro

#org @me llamo ciro - ESTO ESTARÍA MAL
¿Ha quedado claro? Una sola palabra, repito, una sola palabra. ¿Me estoy repitiendo mucho? Lo siento, pero este suele ser un fallo muy común.

Bien, ahora explicaré dos comandos esenciales. lock y faceplayer

Estos dos comandos son opcionales, y no tienes por qué ponerlos, pero dependiendo del script sí deben ponerse (para que quede bien). En ningún caso es obligatorio para que funcione el script, pero sí para que no dé algunos errores...
Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
Bien, procedamos con la explicación.

lock: se usa para bloquear un mini (si en el Advance Map tenías puesto que estuviese mirando alrededor, sin este comando seguirá mirando al mismo tiempo que habla contigo)

faceplayer: se usa para que, al hablar con un mini, éste te mire a la cara (si le tenías puesto que estuviese mirando hacia arriba y le hablas por abajo, se girará para mirarte)

Bien, ahora que creo que eso ya ha quedado aclarado (no os quedéis con la duda, preguntadme si hay algo que no entendéis, no me molestáis, al contrario, me gusta la participación), procederemos con la explicación del conocido msgbox.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
Muy bien, el msgbox es bien fácil de utilizar... sin embargo, ahí hay algo que falta, pero ¡no te preocupes! ¡Cada cosa a su tiempo! Para empezar, procederé a explicar ese "0x6".

El 0x6 es uno de los parámetros del msgbox. Ahora procederé a explicar todos y cada uno de ellos.

0x0: Mensaje de cuando te dan un objeto (se usa para el giveitem, ya lo explicaré)

0x1: Este es parecido al 0x0, pero es cuando te encuentras una de esas Pokéball tiradas por el suelo que contienen algo.

0x2: Este es igual al 0x6, la única diferencia es que este tiene el faceplayer "incluído". Es decir, el 0x6 es un mensaje normal y corriente, pero si usas el 0x2 no necesitarás poner el faceplayer, ya que el mini te mirará automáticamente.

0x3: Este se usa para un script de un cartel (por ejemplo, en el cartel donde pone "Casa de <<jugador>>", se usaría un msgbox 0x3)

0x4: Éste creo que abre una msgbox normal, pero que no se cierra hasta que pulses A

0x5: Este es fácil de hacer, abre un YES/NO box (ya lo explicaremos más adelante, no será difícil de aprender)

0x6: Este es uno de los más usados, es como el 0x2 pero sin el faceplayer incluído. Es una caja de texto normal.

0xA: Este se usa sólo en Pokémon Esmeralda, y es para ejecutar una llamada del Pokénavegador.

Bien, ahora vamos a explicar qué es "eso que falta".

A ver, revisemos el script de nuevo.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
¿Qué es lo que falta? ¿No lo notas? Bueno, hemos puesto @frase, pero... ¿dónde está la frase que queremos mostrar? Muy simple.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6

#org @frase
Aquí iría nuestro texto. ¿Cómo lo introducimos? Muuuuy fácil, pulsa Ctrl + T y se te abrirá un cuadro donde podrás escribir.
Sí, sólo nos faltaba eso. Definir la frase que queríamos poner. Recuerda pulsar Ctrl + T para escribir tu texto, del otro modo también es posible, pero muy difícil.



Bueno, hasta ahora ha sido muy sencillo nuestro primer script, ¿no? Y supongo que me habré explicado bien. Ahora vamos a finallizar nuestro script.

Código:
release

end
Como puedes ver, son comandos sencillos. Aquí la explicación.

release: permite a los minis volver a moverse (debes ponerlo SÓLO si pusiste el comando lock, sino gastarás bytes inútilmente)

end: su nombre lo indica todo. "Final". Cierra el script, se acaba todo. Se pone SIEMPRE.

Aquí tenéis una muestra de lo que sería un script básico (al lado de cada comando (los comandos son msgbox, release, end, etc.) he puesto un ' y un comentario, después de ' lo que se ponga no se incluye en el script, es para comentar)

Código:
#dynamic 0x800000 ' Dynamic busca una dirección a partir de 0x800000.

#org @inicio ' El puntero inicial
lock 'Bloquea el mini
faceplayer ' Mira al protagonista
msgbox @frase 0x6 ' Abre una caja de mensaje y muestra lo que hayamos puesto en @frase
release ' Sólo si se puso lock, para permitir que el mini se siga moviendo
end ' Finaliza el script

#org @frase ' Aquí está el puntero de la frase
= Ciro: ¡Guau, aquí hay mucha fruta,\nincluso hay 5 manzanas!\lCreo que me comeré una.\pMamá: Claro hijo, cómete las que\nquieras.     ' Y ésta es la tan ansiada frase
Compilando el Script y asignándolo a un mini

Bien. ¿Veis en el XSE un icono de dos tuercas unidas? Sí, sí, ese icono:

Pues vale, hacemos click en él, y se nos abrirá una ventanita nueva.


Muy bien, pues lo que está remarcado en azul es el offset principal, el offset que contiene los datos de todo el script. Luego haces click en "Copiar" (SIEMPRE con el primer puntero marcado de azulito), y luego a "Cerrar" (habremos terminado con el XSE)

A continuación, vais al Advance Map, y en "Ver eventos" hacéis click encima del mini. En la barra de la derecha, buscad donde dice "Script offset" y lo sustituís por lo que hayáis copiado antes (manteniendo siempre el $).



Bueno, he modificado este capítulo porque antes no se entendía demasiado bien (eran 3 míseras líneas), supongo que ahora estará mejor.
Estos 4 comandos son sencillísimos de usar. A ver, hagamos un script con givepokemon.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x0 0x0 0x0 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Bien, ahí tenemos el givepokemon, pero antes procedamos con su explicación

givepokemon: Muy simple. Te regala un Pokémon. El que quieras, al nivel que quieras y con el objeto que quieras.

¿Cómo relleno sus parámetros?

Muy fácil:

El primer 0x0: Número del Pokémon que quieras recibir. Tiene que ser el nº de la Pokédex nacional y ha de estar en hex (el XSE tiene calculadora)

Segundo 0x0: Nivel del Pokémon que quieras recibir, también en hex.

Tercer 0x0: Pulsa Ctrl + N para abrir una nueva pestaña en el XSE, y pulsa Ctrl + O. Luego ve a la carpeta donde tengas el XSE, y abre el archivo "stditems". Ahí tienes los números de los objetos.

¿Y qué hago yo con todos esos códigos que no sé para que sirven? Ah, pues eso es muy sencillo.

  • Pulsa Ctrl + F y en "Buscar" pones el nombre (en inglés y, si son varias palabras, juntarlas, ejemplo: Restura todo = FULLRESTORE), luego pulsas en "Buscar siguiente".
  • Una vez encontrado el objeto que queramos equiparle...
  • Copiamos lo que va después del 0x, en mi caso sería 13, es el número del objeto. Volvemos al givepokemon y en el tercer 0x0, el del objeto, pegamos ese número (0x13)

Cuarto, quinto y sexto 0x0: Esos serán siempre 0x0, no los toques.

Bien, como con todo script, hay que poner un ejemplo. Supongamos que queremos recibir un Pidgey al nivel 12 con un Restaura todo equipado.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x10 0xC 0x13 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
No te preocupes, lo explicaré todo.

0x10: El número de Pidgey en la Pokédex nacional es 16, y 16 en hexadecimal es 10.

0xC: El nivel era 12, ¿no? 12 en hexadecimal es C, por lo que C se queda.

0x13: Aquí puse el restaura todo que expliqué antes.

0x0 0x0 0x0: Esto siempre va así.

Bueno, y aquí terminamos con el givepokemon. Ahora vamos con otros comandos que son mucho más sencillos.

NOTA IMPORTANTE: Al final de tu script, debes activar una flag (está explicado abajo, tú ponlo) para que el Pokémon se vea en el menú. En Ruby debes usar setflag 0x800, en FR setflag 0x828, en Esmeralda setflag 0x860.

Giveitem: Sirve para recibir un objeto.

¿Recuerdas el archivo que abrimos antes, donde el restaura todo era el número 13? Muy bien, todos esos números los usaremos también para el giveitem.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
giveitem 0x0 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Bien, antes de explicar nada del giveitem quiero preguntaros algo. ¿No habéis notado algo distinto en el script? Sí, no he puesto el msgbox. ¿Recuerdas los tipos de msgbox que expliqué antes? Pues eso usaremos en el giveitem.

Ahora procederé a explicar los parámetros.

Primer 0x0: Aquí introduce el número del objeto a recibir, ya expliqué antes como mirarlo.

Segundo 0x0: Cantidad de objetos a recibir, en hexadecimal (Por ejemplo, 10 objetos = 0xA)

Tercer 0x0: Tipo de mensaje. Debes poner 0x1 si es para encontrar una Pokéball tirada por ahí y 0x0 si es alguien el que te da el objeto.

Y, una vez aclarado esto, procedamos con el simple giveegg.

Giveegg: Para recibir un huevo Pokémon.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
giveegg 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
"Y qué corto es", dirás tú. Pues sí, es un comando muy corto, de un único y simple parámetro, el mismo que el primer 0x0 del givepokemon.

Primer y único 0x0: Número de la Pokédex nacional en hex del Pokémon a recibir en huevo.

Procedamos con el antepenúltimo de los comandos del episodio 2: givemoney

givemoney: Simplemente, te da dinero. Como el dinero que ganas al salir victorioso de una batalla, o al vender algo. Veamos cómo es:

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givemoney 0x0 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
¿Te esperabas que fuese un solo parámetro? Pues no.

Primer 0x0: Cantidad de dinero a recibir, como siempre, en hex.

Segundo 0x0: Aquí simplemente pon 0.

Vayamos con los dos últimos comandos: givecoins y removecoins.

Si alguien se pensaba que tenía algo que ver con el dinero, estaba equivocado. Bueno, en realidad, sí tiene que ver. Se refiere a las fichas del casino, las cuales se compran con dinero, ¿no?

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givecoins 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Primer y único 0x0: Número de fichas a recibir, como siempre, en hex.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
removecoins 0x0
release
end

#org @frase
= Aquí iría nuestro\nquerido texto
Primer y único 0x0: Número de fichas a quitar.
Esto es algo sencillísimo, siempre que hayas entendido el capítulo 1 no te costará entender este...

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x5
compare LASTRESULT 0x1
if 0x1 goto @inicio2
if 0x0 goto @inicio3
release
end

#org @inicio2
msgbox @frase2 0x6
end

#org @inicio3
msgbox @frase3 0x6
end

#org @frase
Aquí iría el texto donde estaría la caja.

#org @frase2
Esto es si dices que Sí

#org @frase3
Esto si dices que No.
Tú dirás: ¡¡Pero esto es mucho más largo que lo otro!!

Psé, que sea largo no quiere decir que sea difícil. Procedamos con la explicación.

msgbox @frase 0x5: Ya he explicado los tipos de msgbox antes. El 0x5 abre la caja de YES/NO, y @frase podría ser como "¿Quieres salami?"

compare LASTRESULT 0x1
if 0x1 goto @inicio2
if 0x0 goto @inicio3
: Bien, analicemos esas 3 partes. El lastresult simplemente ponlo, es necesario, ya que compara la opción que hayas escogido (YES/NO) Ahora vayamos con lo que probablemente entiendas más fácilmente. Analicemos a fondo las partes de cada if.

Primer if
0x1: Esto sería equivalente al "YES".
goto: Te envía al puntero que elijas después, en este caso @inicio2
@inicio2: Script que se ejecutará al decir que Sí. No tiene por qué ser una simple frase, de hecho, puedes meter otra YES/NO box, o un script largo, etc.
Segundo if
0x0: Esto sería equivalente al "NO".
goto: Te envía al puntero que elijas después, en este caso @inicio3
@inicio2: Script que se ejecutará al decir que No.

Bueno, ha quedado claro, ¿no?
Después simplemente creas lo demás a tu gusto. Creo que quedó claro, ¿no?
Antes de empezar con este capítulo iba a ir con otro, pero recibí una petición de un usuario que quería aprender el applymovement... así que aquí tenéis la explicación.

applymovement: sirve para movilizar un mini. Tú defines el movimiento... y el mini lo hace. La herramienta que yo uso para sacar los movimientos es "Move It"

waitmovement: explicado de manera simple, hace que hasta que un mini no termine de moverse el siguiente comando no se ejecute. Por supuesto, antes del waitmovement puedes poner cualquier cosa, eso depende del script que quieras realizar.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
applymovement 0x1 @mov1
waitmovement 0x1
release
end

#org @frase
= Hombre gordo: Mira, sé dar dos pasos\nhacia abajo

#org @mov
#raw 0x8 
#raw 0x8 ' Estos dos serían los pasos hacia abajo
#raw 0xFE 'Esto se pone SIEMPRE al final de cada applymovement, indica que se ha terminado el mov. y que el script puede continuar.
Guau, qué largo es, ¿no? Procedamos a explicar las cosas nuevas.

applymovement 0x1 @mov: @mov sería el puntero donde se indicarían los movimientos. 0x1 es el nº de la persona.

Obtener el número de la persona

Bien, primero abrimos el Advance Map, y con él nuestro hack.



Ahí tenemos nuestro dato principal. Ah, que no lo ves bien?



Sí, en el "0x" debemos poner el número que haya ahí.

Recuerda que debe estar en hexadecimal (repito que el XSE tiene una calculadora incorporada)

Bueno, seguiré explicando todo eso. Ah, otra cosa, recuerda que el @mov lo puedes cambiar, siempre y cuando sea una sola palabra, como el msgbox.

waitmovement 0x1: Lo mismo. El 0x1 se refiere al nº de persona en concreto.

¿Qué quiere decir eso?

Bueno, si pones 0x1, 0x2... el que sea, <<esperará>> por ese mini... sin embargo, si pones 0x0 esperará por cualquier applymovement.

#org @mov
#raw 0x8
#raw 0x8
#raw 0xFE
: El #org @mov algo parecido a un msgbox, y lo demás los movimientos (se pueden sacar del move it)

Bueno, y con esto termino de explicar applymovement y waitmovement.
Siento haber tardado tanto en postear este capítulo... pero bueno, aquí lo tenéis. ¿Recuerdas el givepokemon, giveitem, etc. que enseñé antes?
Pues claro, cada vez que hablas con esa persona te vuelve a dar un Pokémon/Objeto... vaya decepción, ¿no?
Bah, pero eso no nos importa, porque tenemos la ayuda de nuestras queridas flags!

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
release
end
Sí, ese script se repite inifinitamente. Cada vez que hables con esa persona, te dará el jodido Bulbasaur al nivel 5. Arreglemos eso.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x500
if 0x1 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
setflag 0x500
release
end
Antes de nada, me gustaría decir que yo, por una manía que tengo, siempre uso desde la flag 500 para arriba.

Ahora toca explicar los nuevos comandos (incluso el if que ya hemos usado)

checkflag 0x500: Como su nombre indica, "checkea", mira si la flag del "0x" está activada.
if 0x1 goto @inicio2: Si (if) la flag está activada (0x1) irás (goto) a otro puntero (@inicio2). 0x0 sería si la flag estuviese desactivada.
setflag 0x500: Activa la flag 500, para que se cumpla el if. La flag se puede activar en otro script distinto, así hasta que no se hable con una persona no se pueda ir al inicio2 de esta persona, etc.

Psé, es algo fácil, ¿no? Completemos todo el script.
Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x500
if 0x1 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
setflag 0x500
release
end

#org @frase
= Toma tu Pokémon, es un\nBulbasaur al nivel 5.

#org @inicio2
lock
faceplayer
msgbox @frase2 0x6
release
end

#org @frase2
= Pero bueno, ya te he dado a tu\nPokémon, ¿qué más quieres?
Por supuesto, las flags se pueden utilizar para un montón de cosas... pero en este capítulo sólo explicaremos esta. Recuerda, las flags no son infinitas, ahorra todas las posibles, utiliza la misma flag para todos los scripts posibles.

clearflag

El comando clearflag es un comando no tan usado como checkflag o setflag, lo que hace es desactiva la flag. Imaginemos que tenemos la flag 500 activada, y que no la volveremos a usar.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
checkflag 0x500
if 0x0 goto @inicio2
msgbox @frase 0x6
givepokemon 0x1 0x5 0x0 0x0 0x0 0x0
clearflag 0x500
release
end

#org @frase
= Toma tu Pokémon, es un\nBulbasaur al nivel 5.

#org @inicio2
lock
faceplayer
msgbox @frase2 0x6
release
end

#org @frase2
= Pero bueno, ya te he dado a tu\nPokémon, ¿qué más quieres?
Veamos las cosas que han cambiado:

if 0x0 goto @inicio2: Al cambiar ese 1 por un 0, el checkflag y el if hacen que si la flag está desactivada vaya al puntero @inicio2. Como la flag 500 estaba activada, te dará el Pokémon.

clearflag: ya he explicado la función de este comando. Ha desactivado la flag 500, que no la volveremos a necesitar, para poder hacer este script.

Se entiende la función del checkflag, setflag y clearflag, ¿verdad?

Comisión anti flags erróneas de Javi y Sayer dijo:
Las flags que deben ser utilizadas para evitar errores son las siguientes:

Desde la 0x200 hasta la 0x29F
Antes de aprender cómo hacer un script de gatillo deberemos saber qué es, ¿no?

Script de Gatillo: S con fondo verde que ejecuta un script al pisar la casilla en la que esté situada.

Sí, bueno, es muy bonito saber qué es... pero ¿cómo se programa?

Bueno, primero creamos uno nuevo. Hacemos click, y en esta barra...



Perfecto, expliquemos cómo configurar eso.

Pos(X/Y): Eso es la posición del mapa en la que está el script, no lo toques, se pone automáticamente.

Primer Desconocido: En este siempre pondremos 0003

Var number: Aquí asignaremos una variable, pon, por ejemplo, 4050.

Var value: Como aún no he enseñado las variables, este campo lo dejaremos en blanco, pero más adelante sí lo usaremos.

Segundo desconocido: Siempre irá en blanco.

Script offset: Como en un script normal, aquí irá el offset del script.

Diferencias respecto a un Script normal

  • No puedes poner lock, ya que es al pisar una casilla y no bloquearías ningún mini.
  • Lo mismo con faceplayer, no hay nadie que te pueda mirar a la cara.
  • Usaremos variables (en el nivel fácil flags) para que no se repita.
Haciendo nuestro script de gatillo
Primero diseñemos un script normal y corriente.

#dynamic 0x800000

#org @inicio
lock
faceplayer

msgbox @frase 0x6
release
end

#org @frase
= Hola
Lo marcado en negro es lo que nunca debe haber en un script de gatillo. Como ya conocemos la utilidad de las flags, completaremos el script.

Código:
#dynamic 0x800000

#org @inicio
checkflag 0x2101
if 0x1 goto @inicio2
msgbox @frase 0x6
setflag 0x2101
end

#org @frase
= Hola

#org @inicio2
release
end
Pues ya está. ¿Por qué hemos dejado vacío el inicio2? Pues para que al volver a pisar la casilla no suceda nada.

Bueno, eso era todo, combinadlo con lo que habéis aprendido en los demás capítulos y podréis hacer un gran script de gatillo.

[align=center]~~ NIVEL INTERMEDIO ~~[/align]

Sí, has oído leído bien. Vamos a explicar los comandos warp, wildbattle y trainerbattle. Empecemos.

warp: Te teletransporta a un mapa.
Bien, explicaré los parámetros de warp.

warp 0x0 0x0 0x0 0x0 0x0

Primer 0x0 y segundo 0x0: Son el banco y el número de mapa respectivamente. Pero claro, decir eso es muy fácil, vamos a explicarlo mejor.



Observa donde pone VILLA RAÍZ (0.9). VILLA RAÍZ es el nombre del mapa, y de los números entre paréntesis el que va antes del punto es el banco, el que va después el número de mapa (0 = banco, 9 = número de mapa)
Pues el banco se pone en el primer 0x, y el número en el segundo 0x. Recuerda, siempre van en hexadecimal.

Tercer 0x0: En "Ver eventos", debes crear un warp nuevo, y colocarlo donde quieras teletransportarte. Luego clickeas en el evento, y donde pone "No. de evento" lo pegas en el tercer 0x, siempre en hex.

Cuarto y quinto 0x0: La posición X y la posición Y. Vamos de nuevo al Advance Map, y ponemos el ratón encima de la casilla a la que queramos teletransportarnos. Ahí tenemos los datos. En mi caso, en el primer 0x sería 0E y en el segundo 0x sería 0B.

Y con eso ya tenemos nuestro comando completo. Existen algunas variantes, como warpmuted, warp3, warp4, warp5, warphole, warpwalk, etc. pero tú usa warp.

wildbattle: Batalla contra un Pokémon salvaje. Los parámetros son igualitos al givepokemon, pero sustrayendo los 3 últimos 0x0. Es decir...

wildbattle 0x0 0x0 0x0

Primer 0x0: Número del Pokémon en hex.

Segundo 0x0: Nivel del Pokémon en hex.

Tercer 0x0: Objeto del Pokémon (ya lo expliqué en el givepokemon)

Como veis, no tiene nada de raro... de hecho, es muy fácil, es como un givepokemon. No sé ni por qué lo puse en nivel intermedio.

trainerbattle: Batalla contra un entrenador. Este es un poco más complejo que los otros 2, así que... vamos allá.

Hacer un trainerbattle que no sea contra un entrenador cualquiera

trainerbattle 0x3 0x0 @texto

0x3: Es para que al acabar la trainerbattle el script continúe, no como los entrenadores de las rutas.

0x0: Aquí va el número de entrenador, se puede ver con Pet o Advance Trainer, yo uso el segundo.

@texto: Puntero del texto que dirá al ganarle, por ejemplo, "Oh, no me imaginaba perder!"

Ahora vamos con el 0x0. Primero abramos A-Trainer/PET, y con él el ROM.



Bien, ahí tenemos, enmarcado en rojo, el nº que debemos poner en el segundo parámetro.

Hacer un trainerbattle que sea contra un entrenador cualquiera, de las rutas, etc.

Este es casi igual al otro.

trainerbattle 0x0 0xID @frase @frase2
msgbox @frase3 0x6


0x0: Es obvio, ¿no? Cambia el tipo de trainerbattle.

0xID: Esto ya está explicado.

@frase: Sería la frase que iría despues de que el entrenador te viese en el mapa, después de la admiración.

@frase2: Equivale a @texto del tipo de trainerbattle anterior.

msgbox @frase 0x6: Este texto sería el que diría cada vez que hablas con él una vez terminada la primera batalla.

De todos modos, hay otra cosa por explicar, sólo en este tipo de trainerbattle. En el mini que quieres que sea entrenador, debes marcar la casilla "Entrenador" (en ver eventos), y donde pone "Ver Rango" sería el número máximo de pasos a los que quieres que te vea (no sé si es en hex o no, creo que sí)

Y, con esto y un trozo de pan, termino de explicar estos 3 comandos.
Vale, son dos cosas sencillísimas. Si entendimos el compare y el if, entenderemos el countpokemon.

countpokemon: Pues, cuenta los Pokémon que tienes en tu equipo para que ocurra algo según los Pokémon que tengas.

Esto, en algunos casos, puede ser una manera de ahorrar flags.

Vamos a ver, para empezar, el countpokemon no necesita parámetros, sin embargo, sí necesita ser combinado con otros coamndos.

Código:
countpokemon   ' Cuenta los Pokémon que tengas en tu equipo
compare LASTRESULT 0x2 ' Compara los Pokémon que tengas (0x2 serían 2 Pokémon, pero puedes cambiarlo por el nº de Pokémon que quieras)
if 0x1 goto @inicio2  ' Si se cumple lo anterior (equivalente al parámetro 0x1) va al puntero @inicio2.*1 
if 0x0 goto @inicio3  ' Al revés, si no se cumple (equivalente al parámetro 0x0) va a @inicio3.
*1: [b]¿Qué es "lo anterior"?[/b]: El compare LASTRESULT. Si eso se cumple, es decir, si tienes 2 Pokémon (el 0x2 del compare) irá al @inicio2.
Luego ya completarías el script a tu gusto, lo que ocurriría en el @inicio2 (con 2 Pokémon), lo que ocurriría en el @inicio3 (con los Pokémon que sean, siempre que no sean 2), en fin, con esto se puede hacer una infinidad de cosas, solo debes abrir tu imaginación. Antes lo explicaba mejor, pero si habéis entendido todo lo anterior, es que ya vais mejorando como scripters, y las cosas por aquí empezarán a repetirse, añadiendo nuevas cosas, y eso... sin embargo, nunca dejaré de aportar, quiero que os convirtáis en unos scripters excelentes.

Poner un mote

Bien. Hay 2 formas de poner un mote. Vamos a empezar explicando la más común, esa que usa el Profesor cuando cogemos el Pokémon, siempre dice... "¿Quieres darle un mote a tu Pokémon?". Bien, vamos con eso. Para esto se suele usar un YES/NO box (ya explicado antes), ya que ningún profe obliga al entrenador a poner un mote. Además, debo decir que esto sólo sirve para el primer Pokémon del equipo.

Código:
#dynamic 0x800000

#org @inicio
lock
faceplayer
msgbox @frase 0x5
compare LASTRESULT 0x1
if 0x1 goto @inicio2      ' Si dices que SÍ, irás al puntero del mote
if 0x0 goto @inicio3      ' Si dices que NO... pues no irás xD, irás a otro.
release
end

#org @inicio2
special 0x9E              ' Un special ejecuta una acción "especial", como su nombre indica. En este caso, la número 9E, que es poner un mote al 1er Pokémon del equipo.
goto @inicio3             ' goto simplemente va al puntero que le indiques, no es como el if, que necesita que se cumpla una condición.
end

#org @inicio3            ' Aquí iría el resto del script que queramos...
msgbox @frase2 0x6     ' Frase que blablabla...
end

#org @frase
= ¿Quieres ponerle un mote a tu\nPokémon?

#org @frase2
= Bueno, ahora... blablabla
Bueno, en el script está todo explicado, espero que lo entendáis...

Pero, ¿cuál es el otro tipo?

Muy fácil. Tan fácil como decir que el otro tipo de renombrado es el del "Inspector de motes", y que te permite elegir a quién quieres renombrar. El script sería idéntico al anterior (puedes modificarlo a tu gusto), pero cambiando el special. Este no es un special 9E, sino 9F. Sustituimos special 0x9E por special 0x9F y... ¡listo!

Supongo que está bien explicadillo, ¿no? ;)
Para hacer un simple movimiento de cámara usaremos un simple applymovement y 2 specials.

Código:
special 0x113 [special 0x116 (Emerald)]
applymovement MOVE_CAMERA @mov
waitmovement 0x0
Contenido de tu script
applymovement MOVE_CAMERA @mov2
waitmovement 0x0
special 0x114 [special 0x117 (Emerald)]
Procedamos con la explicación.

special 0x113: Activa un special, en este caso el 113, que permite el movimiento de cámara. Se pone siempre, al principio y al final (al final es 114).

special 0x114: Finaliza el mov. de cámara.

applymovement MOVE_CAMERA @mov
waitmovement 0x0
Contenido de tu script
applymovement MOVE_CAMERA @mov2
waitmovement 0x0
: Es como un applymovement normal y corriente, luego en #org @mov y #org @mov2 pones los movimientos normales y corrientes, como si la cámara fuese un mini (el segundo MOVE_CAMERA es para centrar la cámara y que puedas manejar a tu mini centrado)
Sí, habéis leído bien, y es probable que por el título no entiendas mucho, pero no te preocupes, con leer esto lo entenderás. Para empezar, necesitamos una herramienta llamada FSF (Free Space Finder), que, como si nombre indica, "busca espacio libre".

Abriremos nuestro ROM con la herramienta. Yo, le dí a Buscar y ya encontró una dirección vacía, la cual vamos a aprovechar.



Recuerda, dale a "copiar". Ya hemos terminado con el FSF, así que podremos cerrarlo. Ahora abramos el XSE y nuestro ROM con él.



Pegamos la dirección libre ahí, y clickeamos en el botón de descompilar

* Debes ir a Opciones > Opciones de descompilación (Ctrl + D) y desactivar la casilla de "refactorización".

Si la dirección de verdad estuviese vacía, nos saldría esto.

Código:
'---------------
#org 0x8000D6   ' Esta es mi dirección vacía, pero puede variar, por supuesto
Ahora viene mi parte favorita. Vamos a abrir el A-Text (sí, quítale el polvo y engrásalo, porque lo vamos a usar), y con él nuestro ROM. Entonces clickeamos en "Search" y ponemos el texto que queramos reemplazar... por ejemplo... Cuando el profesor pide ayuda en la Ruta 101. Pongamos "H-help me!" en la barra, y le damos a Search.



Ahí tenemos lo que nos gusta, "Text found at offset 1495310". Buff, pero eso está en decimal... ¿pues qué hacemos? Nos dirigimos al XSE, y pasamos eso a hexadecimal. Muy bien, a mí me dió 16D10E. Pues ahora hagamos un msgbox. Sin embargo, no lo haremos como "msgbox @frase 0x6"... pondremos esto: msgbox 0x(Dirección obtenida) 0x6. Osea, msgbox 0x16D10E 0x6. Nuestro script se vería así:
Código:
#org 0x8000D6
msgbox 0x16D10E 0x6
end
Ahora le damos a compilar, y en la ventanita abierta a cerrar. Luego volvemos a hacer click en "Descompilar, y..."



Listo, ya podemos editar nuestro maravilloso texto, cuando terminemos clickeamos en compilar, en cerrar y... ¡se acabó!

Nota: Recuerda que si te sobrepasas un caracter, puedes joderlo todo.

Nota2: Aquí podéis encontrar direcciones interesantes de FR, y aquí de Ruby.
¿No sabes qué es eso de poner colores a los textos? Bueno, aquí, en este mini-capítulo, te lo voy a enseñar. ¿No has visto algunos vídeos (o mismo el Rojo Fuego) en los que los textos cambian de color? ¡Pues es eso! ¡Y te voy a explicar cómo!

Código:
#dynamic 0x800000

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

#org @frase
Ahora vamos a escribir nuestra frase. Yo haré un diálogo entre "Mamá" y "Profesor", en el cual la madre hablará en color rojo y el profesor en color azul.

Código:
= [red_rs]Mamá: Profesor, debería blabla\p[blue_rs]Profesor: Pero si hago blabla,\nusted no puede hacer ble.\p[red_rs]Mamá: Eso no me importa Profesor,\nusted es muy asdf y podrá ayudarme.
Bien, como puedes ver, el "[red_rs]" hace que todo el texto que vaya a continuación salga en rojo (red). El "rs" viene de "ruby/sapphire", en FR sería "[red_fr]" y en Esmeralda "[red_em]".

¿Y cuáles son todos los códigos de colores?

Cuando tengas abierto el XSE, pulsa F2, y se te abrirá la ventana de ayuda. Vas a "Appendix" y luego a "Message codes", allí salen todos.
Buff, hacía ya casi una semana que no actualizaba, así que hoy toca... ¡hacer scripts de gatillo con variables!

Para empezar... ¿qué es una variable?

Cheve_X dijo:
Las variables son como alcancías con candado (no como esas que se rompen) (?), puedes abrirlas y ponerle dinero o puedes sacarle el dinero que ya le pusiste... pero no podrás sacarle dinero si nunca le has puesto y nunca podrás ponerle mas dinero si ya no tienes lugar
Sí, sin el tuto de Cheve no sabría ni qué es una variable ^^

Pero... ¿qué queremos decir con eso? Una variable puede tener un valor. Para explicarlo, voy a usar la frase de Cheve como ejemplo. Variable va a ser "Hucha", y Valor va a ser "Moneda". Mediante los comandos setvar, addvar y subvar podremos quitarle, sumarle y fijarle un nº de monedas a nuestra hucha. Una hucha comienza teniendo 0 monedas, pero a medida que vas ahorrando sus monedas van aumentando.
¿No lo has entendido? Cambia todas las palabras "Hucha" por Variable y todas las palabras "Moneda" por Valor.
Ahora explicaré los comandos.
addvar: Añade una moneda a la hucha.
subvar: Sustrae un número de monedas a la hucha.
setvar: Cambia el nº de monedas al que definas.

Pero... ¿y los parámetros?

addvar 0x 0x: El primer parámetro es la variable, y el segundo es el nº de monedas que desees añadir.
subvar 0x 0x: Igual que addvar. El primero, la variable, el segundo, monedas a sustraer.
setvar 0x 0x: Este se suele usar más que los otros dos. Con este le das un nº de monedas fijo a la hucha (monedas que puedes cambiar mediante addvar, subvar y setvar). El primer parámetro es la variable, el segundo parámetro es el nº de monedas que tendrá la hucha (NO suma ni resta, fija unas monedas)

Que sí que sí, que saber todo esto mola mogollón, pero... ¿cómo dijiste que se desactivaba un script de gatillo mediante una variable?

Bien, para esto haremos uso del "Var number" y "Var value" que vimos antes. En "Var number" pondremos una variable, y en "Var value" un valor de la variable (si anteriormente no usamos esta variable, sería 0000)

¿Y qué variables puedo usar?

Pues éstas:

Cheve_X dijo:
Ruby: 5000 - 6FFF (Créditos Garfiuld)

Rojo Fuego: 40FF hacia abajo (Según javi4315) 5000 - 7FFF (Según Garfiuld)

Esmeralda: 5000 - 7FFF (Créditos Garfiuld)
Bien, ahora, al final del script de gatillo, pondremos un "setvar 0xVariable puesta en Var number 0x1". Ésto cambiará el valor de la variable que pusimos en "Var number", y como en "Var value" pusimos 0000, eso hace que sólo se ejecute el script de gatillo cuando el valor de la variable sea 0. Al poner el setvar, hacemos que el valor sea 1, entonces no se seguirá ejecutando.

Las variables tienen muchos más usos, pero en este capítulo solo daremos éste. Saludos!

No tengo pensado continuar el tutorial, o al menos no por ahora. Hace 2 años que no scripteo, y no recuerdo lo suficiente como para hacer un nivel avanzado. Aún así, podré responder algunas dudas que tengáis.
 
Última edición por un moderador:

Hunter Digi Ace

Pokehacker Retirado
siii xD alguien lo a resucitado, no os podeis imaginar mi cara cuando intente entrar al tutorial y ya no funcionaba e.e
en fin muchas gracias (a los vagos como yo que les da palo aprenderse los comandos les va muy bien el tuto)
espero que actualices el tuto para poder hacer cosas tan increíbles como la de algunos intros XD
EDITO: solo falta que digas en los applymovement que el numero del prota es FF XD
 

ZeKro

Aioh con er corasón
Com le llevo diciendo a Ciro unas 20 veces xD, es un gran tutorial, con el que a mas de uno le ahorraras dolores de cabeza con los scripts(yo entre ellos xD).

Ademas de que es muy completo y sobre todo, ¡¡¡usa los comandos nuevoos!!! Es el primer tutorial de scripts que leo(he leido muchos) con los nuevos comandos. xD

Como ya he dicho, un gran tutorial de scripts! =)

Y si encima de eso lo vas actualizando con cosas nuevas ya es el mejor definitivamente! =)
 

fm~

Llámame FM.
[align=center]Yeah, volvió! xDD

Muchas gracias amigo, gran recopilación... Excelentes tutoriales, siempre que me olvidaba de algo, venía a este tema =3

Saludos.
[/align]
 

pikachu240

Junior C# Developer
Muchisimas GRACIAS me ha ayudado muucho de veras!!! me a ayudado a entender mucho mejor los temas que has puesto sobretodo el de los setvar :) jeje espero que lo amplíes ya que me gusta como lo explicas ;)
 

Shiro~

*Scripter*
Disculpa por no comentar antes xD, estaba algo ocupado.
Déjame felicitarte perla guía. Es muy buena, está muy bien explicada, es simple, pero ilustrativa, seguro que les sirve a los que recién empiezan en esto, y también a los demás que avecen se olvidan de alguno comandos como yo xD.
Espero que pongas el "NIVEL AVANZADO!" si es que existe xD
Saludos, buen trabajo!!
 

Mr. Raya

He vuelto
I love you tutorial,lo que dice KIWI esta bien explicado...
a mi me gustaria aprenderlo pero ahora no puedo debido a los PIIIIIII estudios,pero
seguro que tu nuevo tutorial resulta ser de gran utilidad para nuevos en el foro.

Sige asi
:furia:
 

C!ro

Click the circles!
Bueno, hoy se me ocurrió que podría haber gente que quisiese repasar cosas en el coche, o en cualquier sitio sin conexión, así que he hecho un archivo del primer capítulo.

Si os gusta, puedo seguir haciéndolos. La descarga está en el post principal. ¡Saludos!
 

Gender

DeathSpace
Muchas gracias Ciro, está muy bueno tu tuto, muy bien
explicado, y servirá a muchos que no entienden los scripts
como yo, espero y sigas así y menos troll,
Gender
 

ThePokePsy

Psyduck a tiempo parcial.
Me encantan estos tutoriales... entre estos, y las clases de kiwi, casi sabré hacer cualquier script xd! Oye Ciro, podrías poner la lista de movimientos del applymovement? Es que no sale e,e
 

yo soy Yo

Traducir es aburrido...
Gran aportación, espero que sigas hasta abarcar todos los comandos existentes.

Como nota (para que mi mensaje no sea spam :)), aviso: Los links de direcciones importantes en Ruby y FireRed, dentro del apartado de editar textos especiales, están rotos.
 

Nattramn

Usuario de Bronce
Honestamente ahora que veo bien tu tutorial me doy cuenta de que todo es nivel basico xD.

Bueno, que decirte, tu tutorial esta bastante completo pero creo que debes seguir actualizandolo, hay muchos novatos que lo siguen esperando.

Saludos!
xRëvénge™?
 
Gracias, es un tuto demasiado completo, nos servira mucho a los n00b ;)
aunque aun faltan muchos comandos.
yo voy a por lo básico.
De nuevo gracias :D
 

Deryko

Nick naranja para Dery #FreeDeryko
Qué decir tío.

Me ha gustado mucho y servirá a todos.
A ver si lo sigues continuando para ampliar horizontes.
 
ufff, papa esta firme su tuto me ayudo bastante para seguir editando mi poke, solo quiero saber como editar las posiciones de vuelo OMG pero gracias.
 
Arriba