Registrarse

[ASM] Menú con funciones personalizadas

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.

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
Compilamos y anotamos en algún lado el offset que nos dio.

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:
Código:
#DYNAMIC 0x800000

#org @Descripcion
= Al seleccionar esta opción,\nrealizarás unos pasos de baile.
Nuevamente compilamos y anotamos el offset.

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
Compilamos y anotamos el offset.

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.

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.

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

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:
M

Miembro eliminado 28262

Invitado
me convenciste con el video, hoy es demasiado tarde, mañana lo pruebo, grande aporte de todos modos, se te agradece mucho mucho mucho :D

es bueno ver aportes de este tipo por aqui, un saludo y gracias de nuevo :3
 

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
Sabía que algo como esto se podía hacer xD. Me alegra que lo hayas traído, seguro que me resulta muy util en un futuro no muy lejano xD. Mil gracias tío :D
 

Dani_SR_17

¡Pokémon LionHeart!
Buah, que pasada algo muy, muy útil.

No he leído todo el post, pero si el principio, y no has pensado en una cosa (o eso creo xD).
Al reemplazar ese botón, puedes obtener tantos como quieras, es tan sencillo como que ese botón que modificas, te lleve a un multichoice.

Seguro que uso esto :rolleyes:
 

eing

Miembro de honor
Miembro de honor
A ver la idea está bien, es un buen trabajo hecho por fbi de pokeco, knizz y tu el tutorial con la rutina para hacerlo.
Pero si fuese tu lo que haria es usar ese último espacio para colocar un "MÁS".
Y asi los punteros se cambien a otros, y haber x funciones de más.
No he probado bien como funciona, pero cuando tenga ganas lo adapto a rubí, y coloco el más y el menos.
Asi se podrán ver paginadas varias opciones.

Ejemplo de array de tres:
Pokedex - pokemon - MÁS
MENOS - Player - MÁS
" - MOCHIL- MÁS

Y guadandi en una variable en que pagina estss ;)
 

Kaiser de Emperana

Called in hand
Buah, que pasada algo muy, muy útil.

No he leído todo el post, pero si el principio, y no has pensado en una cosa (o eso creo xD).
Al reemplazar ese botón, puedes obtener tantos como quieras, es tan sencillo como que ese botón que modificas, te lleve a un multichoice.

Seguro que uso esto :rolleyes:
Pensar si lo pensé, pero ahora que lo pienso no se si lo escribí en alguna parte xD.

A ver la idea está bien, es un buen trabajo hecho por fbi de pokeco, knizz y tu el tutorial con la rutina para hacerlo.
Pero si fuese tu lo que haria es usar ese último espacio para colocar un "MÁS".
Y asi los punteros se cambien a otros, y haber x funciones de más.
No he probado bien como funciona, pero cuando tenga ganas lo adapto a rubí, y coloco el más y el menos.
Asi se podrán ver paginadas varias opciones.

Ejemplo de array de tres:
Pokedex - pokemon - MÁS
MENOS - Player - MÁS
" - MOCHIL- MÁS

Y guadandi en una variable en que pagina estss ;)
Eso sí no se ocurrió xD. Igual eso tendría un problema que es que los menús Pokedex, Pokemon y Pokenav necesitan ser activados por flags. Así que si uno cambia de página al principio del juego faltaría dos o tres opciones xD. Así que si hiciera eso tendría que cambiar sólo las de abajo de éstas ^^
Me voy a poner a ver que onda con lo que decís :p
 

eing

Miembro de honor
Miembro de honor
Pensar si lo pensé, pero ahora que lo pienso no se si lo escribí en alguna parte xD.


Eso sí no se ocurrió xD. Igual eso tendría un problema que es que los menús Pokedex, Pokemon y Pokenav necesitan ser activados por flags. Así que si uno cambia de página al principio del juego faltaría dos o tres opciones xD. Así que si hiciera eso tendría que cambiar sólo las de abajo de éstas ^^
Me voy a poner a ver que onda con lo que decís :p
Te equivocas, esas dos o tres opciones solo faltarían en la primera página, pero no seria ningun problema, puesto que no son espacios en blanco, si no que se acorta el array evitando mostrarlas.
Ademas incluso se podria poner ??? Mientras no se haya desbloqueado ese acceso.
Y dejarlo en plan misterio.. Haha (y se podría eh..)
 

Shido

comiendo personas
Respuesta: GBA | ASM | Menú con funciones personalizadas

No ya enserio me Sera muy útil para mi hack la probaré a ve que tal
Tan sólo es tener imaginación para darle un buen uso .

Tu tutorial está bien explicado fácil de entender a menos para mi esta es un buen tutorial
 

VGS

I Love Enchiladas ♥
Respuesta: GBA | ASM | Menú con funciones personalizadas

Wow!!! Super aportaso!
Gracias por compartirlo, esta super genial que ya se pueda editar el menu.
Eso me hace volver a aquellos días del 2010 donde hackeaba pokemon ruby :3
No lo se, tal vez lo intente de nuevo.
Saludos!
 

Nachoius

Caminante del cielo
Respuesta: GBA | ASM | Menú con funciones personalizadas

Esto esta muuuuuuuuuuuuuuuuuy bueno, con un poco de imaginación se pueden hacer grandes cosas! :) si logro inventar algo en mi caos de cabeza y lo aplico, lo dejaré acá, está muy pero muy bueno. podrías curar tus pkm sin necesidad de ir a un pkmcenter! :O o quizás quien sabe que cosa jajaja! sus give item para algo raro o que se yo. meditaré.
 
Respuesta: GBA | ASM | Menú con funciones personalizadas

He hecho esto en una Rom Inglesa y en otra española y he encontrado 2 fallos en el tutorial:
1º En la rutina pones en el script executer pones la cifra correcta, pero en la aclaración de abajo pones que en RUTINA_EXIT que sustituyamos las YYYYYY por las cifras que nos dejas abajo, pero, almenos en fire red, pones la misma cifra que en el SCRIPT_EXECUTER, entonces no funcionaría, el numero correcto sería 06F541 habiendole sumado el +1 ya.
2º En el script, si lo compilas como tu lo has dado, los textos no se leen, para que se lean tienes que poner un "callstd 0x6" debajo de cada "msgbox". Supongo que tu ya has hecho esto, ya que te funciona, pero debe de habérsete olvidado escribirlo. Por lo demás, un gran aporte.:awesome:
 

Kaiser de Emperana

Called in hand
Respuesta: GBA | ASM | Menú con funciones personalizadas

He hecho esto en una Rom Inglesa y en otra española y he encontrado 2 fallos en el tutorial:
1º En la rutina pones en el script executer pones la cifra correcta, pero en la aclaración de abajo pones que en RUTINA_EXIT que sustituyamos las YYYYYY por las cifras que nos dejas abajo, pero, almenos en fire red, pones la misma cifra que en el SCRIPT_EXECUTER, entonces no funcionaría, el numero correcto sería 06F541 habiendole sumado el +1 ya.
2º En el script, si lo compilas como tu lo has dado, los textos no se leen, para que se lean tienes que poner un "callstd 0x6" debajo de cada "msgbox". Supongo que tu ya has hecho esto, ya que te funciona, pero debe de habérsete olvidado escribirlo. Por lo demás, un gran aporte.:awesome:
Gracias por el aviso, no se me debí haber equivocado a la hora de hacer el post, copiando y pegando offsets xD. Ya edité.

Y lo del callstd es porque vos estás usando XSE 1.0, mientras que yo uso XSE 1.1, dónde no se agrega el callstd después de cada msgbox.
 

jiangzhengwenjz

Usuario mítico
I beg people's help.
Nice tutorial indeed and I've just tried to expanded the 2 tables. However, the screen will be very stuck haha as the 8th option can't be fully shown because of the description box.
And I adjusted 2 asm codes in the ROM to reach the goal without influencing the "EXIT". Here's a picture, which is very ugly. The script is running quite well. I hope someone will teach me how to adjust the Y-coordinate of the start menu as I'm still a newbie...

If it's inappropriate to reply this thread, anyone can delete this post as I'm not very familiar with the rules.
P.S. I'm too lazy to change the description, don't mind
Here's my source codes and what I did:
1. Firstly, repoint the 2 tables.
2. change pointer @0806F3C0 to point to main1.asm
3. the codes and locations:
hook1.asm
Código:
.thumb
.align 2
@insert at 0806f39c
bx r0
lsl r0, r0, #0
hook2.asm
Código:
@insert at 0806edf4
.thumb
.align 2
ldr r2, =pointer_of_main2
bx r2
main1.asm
Código:
.thumb
.align 2
ldr r0, =0x0806F4E9
cmp r1, r0
beq return
ldr r0, =pointer_of_new_function_to_run_scripts
cmp r1, r0
beq return
ldr r0, =0x0806f3a1
bx r0

return:
pop {r0}
bx r0
main2.asm
Código:
.thumb
.align 2
ldr r2, =0x0806ed95
bl linker
mov r0, #9
ldr r2, =0x0806ed95
bl linker
pop {r0}
bx r0


linker:
bx r2
4. Follow the tutorial to add a new entry to the 2 tables and create a working script.
5. The code do nothing with "EXIT" so no need to change any pointers about it.


Edit:
Why not just remove the blue box?? xDDDDDDDDDDDD
 
Última edición:
Respuesta: GBA | ASM | Menú con funciones personalizadas

Muy buen aporte, soy nuevo en rom haking pero ya estoy aprendiendo bastante rápido, me gustaría poner una opción en el menú de enter que al pulsarla tu sprite cambiase, por ejemplo que pusiese, "poner chaqueta" y tu sprite cambiase a uno con chaqueta. ¿Es posible? Por favor respondeme si se puede y explícame todo. ¡Muchas gracias adelantadas!
 

Dragonite

But where's your heart
Respuesta: GBA | ASM | Menú con funciones personalizadas

Muy buen aporte, soy nuevo en rom haking pero ya estoy aprendiendo bastante rápido, me gustaría poner una opción en el menú de enter que al pulsarla tu sprite cambiase, por ejemplo que pusiese, "poner chaqueta" y tu sprite cambiase a uno con chaqueta. ¿Es posible? Por favor respondeme si se puede y explícame todo. ¡Muchas gracias adelantadas!
Sólo debes ver cómo cambiar el sprite del prota (que hay algunos tutos) y ya, combinas las dos cosas y hecho.
 

TheGatolete2

¿Sin puesto de mod para mi no hay paraíso?.
Respuesta: GBA | ASM | Menú con funciones personalizadas

Hola , muy bueno el aporte y espero que en el hacking nds se logren cosas interesantes
 

~Zane~

Let's Roll Arceus
Respuesta: GBA | ASM | Menú con funciones personalizadas

Se podria mas de una opcion???
 
Arriba