Kaiser de Emperana
Called in hand
Bueno, antes que nada quiero aclarar que yo no soy el el que diseñó este sistema, yo solo usé unos offset que encontré por ahí y adapté una rutina de ASM de Sonicarvalho posteada en este foro (cosa que sólo pude hacer gracias a la ayuda de eing y cosarara xD).
La rutina de Sonicarvalho la pueden encontrar aquí. Ésta consiste en ejecutar scripts desde rutinas ASM, el problema es que unicamente funciona desde el overworld, por lo que la preparé para que pueda ser llamada desde el menú.
Bueno, para este tutorial necesitan:
- XSE.
- Un editor hexadecimal, yo recomiendo Hex Workshop o HxD.
- Conocimientos básicos de hex (buscar offsets, copiar, pegar, etc.).
Bueno, comencemos.
Nuestro objetivo es remplazar esa función por una diferente, pero programar una función nueva es algo bastante dificil, al menos para gente como yo xD. Por eso vamos a usar la rutina que nos dejó Sonicarvalho, que permite ejecutar scripts "normales" (los del XSE) desde una rutina ASM.
El problema está en que la rutina de Sonicarvalho no funciona desde el menú, por eso modifiqué levemente la función para que antes de ejecutarse ésta cierre el menú.
Abrimos el XSE, y desde éste abrimos nuestro rom. Allí ponemos nuestro texto, yo voy a poner algo así:
Compilamos y anotamos en algún lado el offset que nos dio.
Compilamos y anotamos el offset.
En el editor tenemos que buscar un espacio vacío de 44 Bytes o más (pueden usar FSF, no es necesario) y allí debemos pegar nuestra rutina. OJO, tienen que pegarla en un offset que termine en 0000, ejemplo 840000 (la verdad que desconozco la razón de ésto, usualmente se debe pegar la rutina en un offset cuyo último dígito sea 0, 4, 8 o C pero con ésta rutina por alguna razón sólo pude hacerla funcionar en offset como 800000; seguramente se pueda pegar en alguna parte diferente pero como no lo se, recomiendo hacer ésto). Otra advertencia, tiene que remplazar los datos, no insertar.
Nuevamente anotamos el offset y pasamos al siguiente paso.
Primero, para los que hayan copiado y pegado la rutina ya compilada, hay un puntero que dice 77777708, allí tienen que modificarlo para que guíe a su script. Ya saben, si su script está en 800514, ponen 14058008.
Después nos vamos a donde están los punteros del EXIT de menú. Para eso vayan al offset 3A7374. Allí van a tener una estructura así: XXXXXX08YYYYYY08.
El primer puntero indica el texto que muestra en el menú. Así que modifican el puntero para el texto que insertamos primero.
El segundo puntero indica la función que tiene el botón. Alli tenemos que poner permutada la dirección donde insertamos la rutina +1. Si la insertamos en 81F54C. Ponemos 4DF58108.
Después nos vamos a otro puntero que lleva también a la función original del EXIT. Este se encuentra en 06F3C4. Allí ponemos exactamente lo mismo que antes.
Bueno como ven, yo hice un script totalmente inútil que no ayuda en nada xD. Pero era solo una demostración, lo que hagan se los dejo a su imaginación, podrían hacer cualquier tipo de cosa, como un celular, un mapa en el menú, etc.
Bueno ahora los Créditos:
Sonicarvalho, por la rutina original.
knizz y FBI agent, por los offsets del menú.
Bueno eso es todo, espero ver hacks con menús personalizados ^^.
Suerte.
---------------------------------
Y para los que quieran un ips... (es para ver en un rom en blanco, no se les ocurra parchear un hack xD).
La rutina de Sonicarvalho la pueden encontrar aquí. Ésta consiste en ejecutar scripts desde rutinas ASM, el problema es que unicamente funciona desde el overworld, por lo que la preparé para que pueda ser llamada desde el menú.
Bueno, para este tutorial necesitan:
- XSE.
- Un editor hexadecimal, yo recomiendo Hex Workshop o HxD.
- Conocimientos básicos de hex (buscar offsets, copiar, pegar, etc.).
Bueno, comencemos.
Introducción
Bueno, como saben al presionar el boton Enter, se abre un menú alineado a la derecha (Pokedex, Pokemon, Mochila, etc.). Este menú tiene 7 funciones en fire red y 8 funciones en ruby y emerald. Todas son muy importantes menos una, la función EXIT, que puede ser ejecutada simplemente presionando el boton B.Nuestro objetivo es remplazar esa función por una diferente, pero programar una función nueva es algo bastante dificil, al menos para gente como yo xD. Por eso vamos a usar la rutina que nos dejó Sonicarvalho, que permite ejecutar scripts "normales" (los del XSE) desde una rutina ASM.
El problema está en que la rutina de Sonicarvalho no funciona desde el menú, por eso modifiqué levemente la función para que antes de ejecutarse ésta cierre el menú.
Insertando los texto
Bueno, eso de cambiar la función suena bien, pero quedaría muy mal si tenemos que apretar un botón que diga EXIT. Para eso vamos a usar XSE.Abrimos el XSE, y desde éste abrimos nuestro rom. Allí ponemos nuestro texto, yo voy a poner algo así:
Código:
#DYNAMIC 0x800000
#org @TextoDelMenu
= BAILAR
En fire red el menú tiene una descripción de lo que hace cada función, por eso también debemos insertar un texto para esto. Tengan en cuenta que no puede pasar las 2 líneas o sino no se verá. Yo voy a usar este:
Nuevamente compilamos y anotamos el offset.
Código:
#DYNAMIC 0x800000
#org @Descripcion
= Al seleccionar esta opción,\nrealizarás unos pasos de baile.
Insertando nuestro script
Bueno, ahora toca insertar el script que queremos que se ejecute cuando apretemos el botón. Lo haremos nuevamente en XSE, yo voy a usar este script:
Código:
#DYNAMIC 0x800000
#org @inicio
lockall
applymovement 0xFF @mov1
waitmovement 0xFF
msgbox @frase1 0x6
applymovement 0xFF @mov2
waitmovement 0xFF
msgbox @frase2 0x6
releaseall
end
#org @frase1
= ¡A bailar!
#org @frase2
= ¡Aww yeah!
#org @mov1
#raw 0x0 'Mirar Abajo
#raw 0xFE 'Finalizar Movimientos
#org @mov2
#raw 0x1A 'Esperar 3
#raw 0x2 'Mirar Izquierda
#raw 0x18 'Esperar 1
#raw 0x3 'Mirar Derecha
#raw 0x18 'Esperar 1
#raw 0x2 'Mirar Izquierda
#raw 0x18 'Esperar 1
#raw 0x3 'Mirar Derecha
#raw 0x18 'Esperar 1
#raw 0x6 'Mirar Izquierda (Rápido)
#raw 0x18 'Esperar 1
#raw 0x7 'Mirar Derecha (Rápido)
#raw 0x18 'Esperar 1
#raw 0x6 'Mirar Izquierda (Rápido)
#raw 0x18 'Esperar 1
#raw 0x3 'Mirar Derecha
#raw 0x18 'Esperar 1
#raw 0x6 'Mirar Izquierda (Rápido)
#raw 0x18 'Esperar 1
#raw 0x7 'Mirar Derecha (Rápido)
#raw 0x18 'Esperar 1
#raw 0x54 'Saltar en el Lugar (Mirando Izquierda)
#raw 0x18 'Esperar 1
#raw 0x55 'Saltar en el Lugar (Mirando Derecha)
#raw 0x18 'Esperar 1
#raw 0x0 'Mirar Abajo
#raw 0x18 'Esperar 1
#raw 0x66 'Feliz (^_^)
#raw 0x18 'Esperar 1
#raw 0xFE 'Finalizar Movimientos
Insertando la rutina ASM
Bueno lo que sigue es abrir el editor hexadecimal y desde este nuestro rom. Bueno escribo esto para los que no estén muy familiarizados con la rom, para que no sólo copien al pie de la letra lo que digo, sino que entiendan algo xD
Empecemos con algo muy básico. El editor hexadecimal muestra todos los datos de nuestra rom. El editor trabaja en Bytes (en algunos lados pueden leer que trabaja de a 8bits, eso es porque 1Byte es igual a 8bits), o sea divide todos los datos en grupos de dos caracteres hexadecimales. A cada uno de esos Bytes les asigna un número para identificarlos (offset). El Byte 1 está en el offset 00000000 (también conocido como 0 xD, le pongo 6 dígitos porque así es como trabaja el rom). El Byte 2 en 000001, el 15 en 00000F, el 25487 en 00638E. Siempre el número en hexadecimal -1.
Bueno, empecemos con las cosas que vamos a modificar. Como dije antes, el editor nos muestra todos los datos, pero entender que significa cada cosa es algo inhumano. No podemos saber a simple vista que hay en cada offset, pero gracias a investigaciones de otras personas y a los datos que nos dan las herramientas que usamos, podemos saber donde se encuentran algunas cosas. Por ejemplo, gracias al XSE sabemos donde están guardados los textos y el script que insertamos. Pero eso lo sabemos nosotros, estos datos están en el rom pero actualmente no hay nada que haga que el rom los lea, sólo están ahí. Por eso hay que modificar unos punteros.
Los punteros son un conjunto de 4 Bytes que tienen escrita la dirección del offset al que están llamando, pero tiene el offset permutado. ¿Qué es permutado? Es que tiene los Bytes en el orden opuesto, por ejemplo:
Offset:061578 Puntero llevando al offset:78150608
Offset:7F5C14 Puntero llevando al offset:145C7F08
Offset:125A28 Puntero llevando al offset:285A1208
Ahora la duda que supongo tendrán todos es ¿Pero que car*jo es ese 08 del final? Bueno hace un rato le dije que el rom trabaja los offset con 6 dígitos, pero eso no es completamente verdad. En el editor hexadecimal vemos toda la memoria ROM del juego, pero cuando un emulador o una consola reproduce el rom éstos generan unas 8 memorias más. Estas serían (no le voy a decir los nombres porque trabajar con esto ya es algo más avanzado que no necesitan saber):
La que va de 00000000 hasta 00FFFFFF
La que va de 01000000 hasta 01FFFFFF
La que va de 02000000 hasta 02FFFFFF
La que va de 03000000 hasta 03FFFFFF
La que va de 04000000 hasta 04FFFFFF
La que va de 05000000 hasta 05FFFFFF
La que va de 06000000 hasta 06FFFFFF
La que va de 07000000 hasta 07FFFFFF
Y la memoria rom es la que vemos con el editor hexadecimal, que aunque éste diga que un offset se llama 00F51487, al estar el juego emulándose se llama 08F51487.
La memoria rom va desde 08000000 hasta 08FFFFFF. Y para aquellos que hayan expandido su rom, tendrán también una segunda memoria rom que va desde 09000000 hasta 09FFFFFF.
Y bueno, eso sería un poco de la organización de la rom, lo que vamos a hacer en los próximos pasos del tutorial es cambiar algunos punteros.
Empecemos con algo muy básico. El editor hexadecimal muestra todos los datos de nuestra rom. El editor trabaja en Bytes (en algunos lados pueden leer que trabaja de a 8bits, eso es porque 1Byte es igual a 8bits), o sea divide todos los datos en grupos de dos caracteres hexadecimales. A cada uno de esos Bytes les asigna un número para identificarlos (offset). El Byte 1 está en el offset 00000000 (también conocido como 0 xD, le pongo 6 dígitos porque así es como trabaja el rom). El Byte 2 en 000001, el 15 en 00000F, el 25487 en 00638E. Siempre el número en hexadecimal -1.
Bueno, empecemos con las cosas que vamos a modificar. Como dije antes, el editor nos muestra todos los datos, pero entender que significa cada cosa es algo inhumano. No podemos saber a simple vista que hay en cada offset, pero gracias a investigaciones de otras personas y a los datos que nos dan las herramientas que usamos, podemos saber donde se encuentran algunas cosas. Por ejemplo, gracias al XSE sabemos donde están guardados los textos y el script que insertamos. Pero eso lo sabemos nosotros, estos datos están en el rom pero actualmente no hay nada que haga que el rom los lea, sólo están ahí. Por eso hay que modificar unos punteros.
Los punteros son un conjunto de 4 Bytes que tienen escrita la dirección del offset al que están llamando, pero tiene el offset permutado. ¿Qué es permutado? Es que tiene los Bytes en el orden opuesto, por ejemplo:
Offset:061578 Puntero llevando al offset:78150608
Offset:7F5C14 Puntero llevando al offset:145C7F08
Offset:125A28 Puntero llevando al offset:285A1208
Ahora la duda que supongo tendrán todos es ¿Pero que car*jo es ese 08 del final? Bueno hace un rato le dije que el rom trabaja los offset con 6 dígitos, pero eso no es completamente verdad. En el editor hexadecimal vemos toda la memoria ROM del juego, pero cuando un emulador o una consola reproduce el rom éstos generan unas 8 memorias más. Estas serían (no le voy a decir los nombres porque trabajar con esto ya es algo más avanzado que no necesitan saber):
La que va de 00000000 hasta 00FFFFFF
La que va de 01000000 hasta 01FFFFFF
La que va de 02000000 hasta 02FFFFFF
La que va de 03000000 hasta 03FFFFFF
La que va de 04000000 hasta 04FFFFFF
La que va de 05000000 hasta 05FFFFFF
La que va de 06000000 hasta 06FFFFFF
La que va de 07000000 hasta 07FFFFFF
Y la memoria rom es la que vemos con el editor hexadecimal, que aunque éste diga que un offset se llama 00F51487, al estar el juego emulándose se llama 08F51487.
La memoria rom va desde 08000000 hasta 08FFFFFF. Y para aquellos que hayan expandido su rom, tendrán también una segunda memoria rom que va desde 09000000 hasta 09FFFFFF.
Y bueno, eso sería un poco de la organización de la rom, lo que vamos a hacer en los próximos pasos del tutorial es cambiar algunos punteros.
En el editor tenemos que buscar un espacio vacío de 44 Bytes o más (pueden usar FSF, no es necesario) y allí debemos pegar nuestra rutina. OJO, tienen que pegarla en un offset que termine en 0000, ejemplo 840000 (la verdad que desconozco la razón de ésto, usualmente se debe pegar la rutina en un offset cuyo último dígito sea 0, 4, 8 o C pero con ésta rutina por alguna razón sólo pude hacerla funcionar en offset como 800000; seguramente se pueda pegar en alguna parte diferente pero como no lo se, recomiendo hacer ésto). Otra advertencia, tiene que remplazar los datos, no insertar.
MIRAR EL FINAL DE ESTE POST
Código:
.align 2
.thumb
Main:
push {r0,lr}
bl CERRAR_MENU
bl RUTINASONICARVALHO
pop {r0,pc}
CERRAR_MENU:
ldr r0, RUTINA_EXIT
bx r0
RUTINASONICARVALHO:
push {lr}
ldr r0, SCRIPT_ADRESS
bl SCRIPT_ROUTINE
pop {pc}
SCRIPT_ROUTINE:
ldr r1, SCRIPT_EXECUTER
bx r1
.align 2
RUTINA_EXIT:
.word 0x08YYYYYY
SCRIPT_ADRESS:
.word 0x08XXXXXX
SCRIPT_EXECUTER:
.word 0x08ZZZZZZ
Offsets dijo:En YYYYYY, ponen este offset +1:
Ruby: 08071554
FireRed: 0806F540
Emerald: 0809FD64
En ZZZZZZ, ponen este offset +1:
Ruby: 080655B8
FireRed: 08069AE4
Emerald: 08098EF8
Y en XXXXXX ponen el offset del Script que quieren que se ejecute.
Fire Red dijo:01B500F003F800F003F801BD0448004700B5044800F001F800BD03490847C04641F5060877777708E59A0608
Emerald dijo:01B500F003F800F003F801BD0448004700B5044800F001F800BD03490847C04665FD090877777708F98E0908
Ruby dijo:01B500F003F800F003F801BD0448004700B5044800F001F800BD03490847C0465515070877777708B9550608
Nuevamente anotamos el offset y pasamos al siguiente paso.
Modificando Punteros
Bueno, ya les expliqué que son los punteros y como funcionan ahora vamos a sobre escribirlos. Yo voy a trabajar en fr así que voy a ir poniendo sus punteros, al final de la explicación dejo los de ruby y emerald.Primero, para los que hayan copiado y pegado la rutina ya compilada, hay un puntero que dice 77777708, allí tienen que modificarlo para que guíe a su script. Ya saben, si su script está en 800514, ponen 14058008.
Después nos vamos a donde están los punteros del EXIT de menú. Para eso vayan al offset 3A7374. Allí van a tener una estructura así: XXXXXX08YYYYYY08.
El primer puntero indica el texto que muestra en el menú. Así que modifican el puntero para el texto que insertamos primero.
El segundo puntero indica la función que tiene el botón. Alli tenemos que poner permutada la dirección donde insertamos la rutina +1. Si la insertamos en 81F54C. Ponemos 4DF58108.
Después nos vamos a otro puntero que lleva también a la función original del EXIT. Este se encuentra en 06F3C4. Allí ponemos exactamente lo mismo que antes.
El puntero para la descripción del botón, está en 3A73AC.
Supongo que ya saben que hacer.
Supongo que ya saben que hacer.
Offsets dijo:Emerald:
Punteros de EXIT: 510578
Otro puntero a la función original: 09FB8C
Ruby
Punteros de EXIT: 376D5C
Otro puntero a la función original: 0713F8
¡A probar!
Eso es todo ahora a abrir su rom y a probar lo que hicimos:Bueno como ven, yo hice un script totalmente inútil que no ayuda en nada xD. Pero era solo una demostración, lo que hagan se los dejo a su imaginación, podrían hacer cualquier tipo de cosa, como un celular, un mapa en el menú, etc.
Como ven remplazando el EXIT la función nueva quedaría en el el último lugar del menú. Pero al igual que modificamos esto se pueden modificar todas las funciones, si cambiamos algunos punteros de lugar podemos cambiar fácilmente el órden en que se muestra el menú.
Les explico la estructura de como esta guardado. Todas las opciones tienen el mismo sistema, [puntero texto][puntero función], y además están en órden: [texto1][función1],[texto2][función2],[texto3][función3]...
Con ésto ya pueden saber como modificar los punteros. Y para ahorrarles es trabajo, los punteros del menú empiezan en:
Fire Red: 3A7344
Emerald: 510540
Ruby: 376d24
Unas advertencias. La pokedex, pokemon y pokenav deben ser activadas por flags, así que probablemente van a tener que pensar algunas cosas más si modifican éstos. Y en fire red, las opciones tiene descripciones, así que si cambian el orden éstas van a quedar desordenada (No es un problema la verdad, si total tienen que traducirlas xD).
MIRAR ESTE POST
Les explico la estructura de como esta guardado. Todas las opciones tienen el mismo sistema, [puntero texto][puntero función], y además están en órden: [texto1][función1],[texto2][función2],[texto3][función3]...
Con ésto ya pueden saber como modificar los punteros. Y para ahorrarles es trabajo, los punteros del menú empiezan en:
Fire Red: 3A7344
Emerald: 510540
Ruby: 376d24
Unas advertencias. La pokedex, pokemon y pokenav deben ser activadas por flags, así que probablemente van a tener que pensar algunas cosas más si modifican éstos. Y en fire red, las opciones tiene descripciones, así que si cambian el orden éstas van a quedar desordenada (No es un problema la verdad, si total tienen que traducirlas xD).
MIRAR ESTE POST
Bueno ahora los Créditos:
Sonicarvalho, por la rutina original.
knizz y FBI agent, por los offsets del menú.
Bueno eso es todo, espero ver hacks con menús personalizados ^^.
Suerte.
---------------------------------
Y para los que quieran un ips... (es para ver en un rom en blanco, no se les ocurra parchear un hack xD).
Última edición: