Jaos Dawn

jaosdawn

Tutorial Extenso sobre Scripts

Tutorial Extenso sobre Scripts [ACT. 24/11/2011] 
[ESTADO: INCOMPLETO]

Hola a todos. Mi inspiración para crear este extenso tutorial sobre scripts ha sido un amigo al que le estoy ayudando a hacer un hack. En realidad, hay otra cosa que me ha motivado para crear esto, y es que hay muchos tutoriales sobre scripts, de hecho, todos me han ayudado a avanzar en el mundo del scripting (sin ellos no podría haber creado esto), sin embargo, siempre me quedaba alguna duda por aquí y por allá. En este tutorial pienso enseñar cómo "scriptear" como si fueses el más novato de los usuarios. Pienso redactar esto de modo que no quede absolutamente NINGUNA duda. 
Y, una vez dicho esto, comienzo. 

Nota 
Si hay algo que no os ha quedado claro (que supongo que no, he tratado de machacarlo hasta que sea bien comprensible) quiero que no tengáis timidez y que me lo digáis
Te aconsejo leer el diccionario, hecho por Eing y Zuru

~~ NIVEL FÁCIL ~~
Actualizando el XSE 

Este paso es sencillísimo.

  1. Vamos a la pestaña "Ayuda" > "Actualizar" > "Comprobar automáticamente".
  2. Pulsamos Ctrl + U. Se abrirá una pestaña.
  3. Por último, pulsa en "Siguiente" hasta que el XSE empiece a descargar las actualizaciones.


Y listo, tendréis el XSE actualizado.
(1) Creando y compilando nuestro primer Script 

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í").
    [Imagen: sinttulopqj.png]
  • 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...

(1.1)La creación de un script 
Bien, comencemos.

Código:
#dynamic 0x80000

Y tú te preguntaras: ¿Qué es #dynamic 0x80000? 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 0x80000

#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 Escribió:#org @inicio

#org @1

#org @lacacadetucasa

#org @la caca de tu casa

¿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 0x80000

#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 0x80000

#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 0x80000

#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 0x80000

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

[Imagen: ajustedelinea.png]

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.
(1.2)Compilando el Script y asignándolo a un mini 

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

Pues vale, hacemos click en él, y se nos abrirá una ventanita nueva.
[Imagen: compilebox.png]

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 $).

[Imagen: scriptbox.png]

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.
(2) Comandos: Givepokemon, Giveitem, giveegg, givemoney, givecoins y removecoins 

Estos 4 comandos son sencillísimos de usar. A ver, hagamos un script con givepokemon.

Código:
#dynamic 0x80000

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

#org @frase
= Aquí iría nuestronquerido 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. 

(2.1)Equipando un objeto 
¿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...
    [Imagen: objeto.png]
  • 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 0x80000

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

#org @frase
= Aquí iría nuestronquerido 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 0x80000

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

#org @frase
= Aquí iría nuestronquerido 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 0x80000

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

#org @frase
= Aquí iría nuestronquerido 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 0x80000

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

#org @frase
= Aquí iría nuestronquerido 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 0x80000

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

#org @frase
= Aquí iría nuestronquerido texto

Primer y único 0x0: Número de fichas a recibir, como siempre, en hex.

Código:
#dynamic 0x80000

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

#org @frase
= Aquí iría nuestronquerido texto

Primer y único 0x0: Número de fichas a quitar.
(3)YES/NO box 
Esto es algo sencillísimo, siempre que hayas entendido el capítulo 1 no te costará entender este...

Código:
#dynamic 0x80000

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

(3.1)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.
(3.2)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?
(4)Comandos: Applymovement y waitmovement 

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. Aquítienes una lista de los movimientos más importantes (los he sacado del Move It, y cosarara me ha ayudado con algunos que faltaban)

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 0x80000

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

#org @frase
= Hombre gordo: Mira, sé dar dos pasosnhacia 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. Al 0x1 le he dedicado un apartado, ya que es muy importante.

(4.1)Nº de persona 
Bien, primero abrimos el Advance Map, y con él nuestro hack.

[Imagen: mini1hf.png]

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

[Imagen: mini2z.png]

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, están en el post que di arriba, pero yo los saqué del Move It.

Bueno, y con esto termino de explicar applymovement y waitmovement.
(5)Flags: ¡Mis scripts se repiten continuamente! 

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 0x80000

#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 0x80000

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

Antes de nada, me gustaría decir que yo, por una manía que tengo, siempre uso desde la flag 2100 para arriba.

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

checkflag 0x2100: 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 0x2100: Activa la flag 2100, 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 0x80000

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

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

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

#org @frase2
= Pero bueno, ya te he dado a tunPoké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.

(5.1)Comando: 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 2100 activada, y que no la volveremos a usar.

Código:
#dynamic 0x80000

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

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

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

#org @frase2
= Pero bueno, ya te he dado a tunPoké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 2100 estaba activada, te dará el Pokémon.

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

Se entiende la función del checkflag, setflag y clearflag, ¿verdad?
(6)Haciendo un script de gatillo 
Antes de aprender cómo hacer un script de gatillo deberemos saber qué es, ¿no?

Script de Gatillo: S con fondo verde [Imagen: 29107217.png] 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...

[Imagen: sg2l.png]

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.

(6.1)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.
(6.2)Haciendo nuestro script de gatillo 
Primero diseñemos un script normal y corriente.

Cita:#dynamic 0x80000

#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 0x80000

#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.
~~ NIVEL INTERMEDIO ~~

(1)Comandos: Warp, wildbattle, trainerbattle 
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.

[Imagen: banconumero.png]

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. [Imagen: 54852954.png] 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.

[Imagen: trainerbattle.png]

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.
(2)Comando: countpokemon & Poner mote 
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 0x80000

#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 tunPoké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?
(3)Movimiento de cámara 
Para hacer un simple movimiento de cámara usaremos un simple applymovement y 2 specials.

Código:
special 0x113
applymovement MOVE_CAMERA @mov
waitmovement 0x0
Contenido de tu script
applymovement MOVE_CAMERA @mov2
waitmovement 0x0
special 0x114

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)

Aquí tengo un ejemplo del MOVE_CAMERA (Minuto 1:30):


(4)Editar textos especiales con XSE 
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 (FreeSpace 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.

[Imagen: fsffg.png]

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

[Imagen: barradireccion.png]

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.

[Imagen: textde.png]

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 @frase0x6"... 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..."

[Imagen: helpmeh.png]

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.
(Mini-Capítulo)Poniendo colores a los textos 
¿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 0x80000

#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 blablap[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.
(5)Aprendamos a hacer scripts de gatillo con variables 
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 Escribió: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 Escribió: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!
Respuestas a los comentarios {ACT. 9/11/2011} 

@[Hachiaito] : 

  1. a continuación del @ solo puede haber una palabra
  2. La frase debe ir después del end, tu script sería algo así:

    #dynamic 0x80000

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

    #org @Losiento
    = [PLAYER], el profesor mendijo que lamentablemente no puedelpasar nadie sin su autorización


Edito: Donde pone [PLAYER] se sustituiría en el juego por el nombre que le hayas dado al profesor al principio, en la intro (siempre que pongas [PLAYER] mostrará tu nombre, si pones [RIVAL] el de tu rival (Brendan/May/Gary)

@Flaer! : Gracias, en este tutorial pretendo explicar todo lo que he aprendido a lo largo de mi tiempo como Rom-Hacker (llevo 2 años hackeando, pero solo hace medio año que empecé a hacer scripts, etc., antes hackeaba modificando sólo los mapeados... jeje), y que la hasta el usuario más novato pueda convertirse en un gran scripter con solo 5 minutos de lectura (Obviamente, uno no se hará un gran hacker de la noche a la mañana, lleva tiempo). En fin, gracias por tu apoyo, espero tener tiempo suficiente como para ayudar a todos con los scripts.¡Viva yo! (?)

@GoldenSniper: No te preocupes, puedes guardar el tutorial donde quieras, a mi plim, yo con tal de que si lo posteas en alguna web me des creditos... xD

@brais-pokemon : Madre mía... ese script está fatal, ¿en serio te has leído el tutorial? ._. Aquí te lo traigo corregido, en blanco está lo que te faltaba.

#dynamic 0x80000

#org @inicio
lock (se pone si pones release)
faceplayer (deduzco que es una persona)
msgbox @frase 0x6
release
end

#org @frase
Hola [player] como estas??

@RMax: Primero, es #dynamic 0x80000 (te faltaba un 0 xD). Y eso me pasaba a mí al principio, yo no sabía por qué era, hasta que al final, decidí cambiar de flag. Probablemente sea eso. En vez de 2100, prueba con 2101, a lo mejor ya has usado la 2100.
Y otro fallo que he visto en tu script (no es un fallo de funcionamiento, es otro tipo de fallo) es que has activado la flag en @inicio, es decir, si haces click en la cajita de "No", no podrás recibir la MasterBall, mientras que el texto es "Pues que mal nSi cambias de opinión, estarelesperandote". 
Ah, otra cosa, parece que el script sería al hablar con el mini del profesor, ¿no? Entonces, ¿por qué en algunos pones lock y faceplayer y en otros no? Además, en uno has puesto release sin haber puesto lock, y avisé que eso NUNCA se hace. En resumen, el script arreglado sería este:

Código:
#dynamic 0x80000
#org @inicio
lock
faceplayer
checkflag 0x2101
if 0x1 goto @inicio2
msgbox @frase 0x5
compare LASTRESULT 0x1
if 0x1 goto @opcionyes
if 0x0 goto @opcionnope
release
end

#org @opcionyes
lock
faceplayer
msgbox @frase2 0x6
giveitem 0x1 0x1 0x0
setflag 0x2101
release
end

#org @opcionnope
lock
faceplayer
msgbox @frase3 0x6
release
end

#org @inicio2
lock
faceplayer
msgbox @frase4 0x2
release
end

#org @frase
= Hola [player], he encontrado una Pokebolanmuy peculiar, y como no soy unlentrenador Pokémon como tú, no melsirve. Por eso, me gustaríalregalarte esta pokebola para que telayude en tu camino. ¿La Quíeres?

#org @frase2
= Ojala te ayude. He oido que puedesnatrapar cualquier Pokémon sinlfallar con esta pokebola 

#org @frase3
= Pues que mal nSi cambias de opinión, estarelesperandote 

#org @frase4
= Ve y atrapa al Pokémon mas raro dentodos.

Por cierto, si te preguntas por qué en el puntero @opcionnope no he puesto el setflag, es para que tengas la opción de escoger la opción "SÍ".

Bueno, eso es todo, debería funcionarte así. Saludos.

@RMax: El error está en el applymovement que mueve al jugador. Es applymovement MOVE_PLAYER @punteroquetuquieras

@Nat: La frase va definida debajo, además, no debes poner msgbox 0x2 si pusiste faceplayer. Tu scripy sería así.

[code]#dynamic 0x80000

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

#org @frase
Aquí el texto

Si es que lo he explicado mil veces, y una misma duda era igual (La de Hachiato). Es solo cosa de leer un poquillo...

@♣♦@3Rd º1♦♣: Gracias, trataré de acabarlo cuando sea posible.
Hoy habia 3 visitantes (10 clics a subpáginas) ¡Aqui en esta página!

48.858309 2.294533 Eiffel Tower, Paris, France Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis