GBA | ASM | Menú con funciones personalizadas

Avisos

Like Tree39Gracias
Respuesta
 
Herramientas Desplegado
  #1  
08/12/2014
Predeterminado GBA | ASM | Menú con funciones personalizadas
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.

Abrime si estás usando fire red


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:

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.

Algunos datos sobre cómo está organizada la 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.

Rutina


Sin compilar


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
Dicho por Offsets
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.

Compilada

Dicho por Fire Red
01B500F003F800F003F801BD0448004700B5044800F001F800 BD03490847C04641F5060877777708E59A0608
Dicho por Emerald
01B500F003F800F003F801BD0448004700B5044800F001F800 BD03490847C04665FD090877777708F98E0908
Dicho por Ruby
01B500F003F800F003F801BD0448004700B5044800F001F800 BD03490847C0465515070877777708B9550608


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.

Abrir usuarios de fire red

El puntero para la descripción del botón, está en 3A73AC.
Supongo que ya saben que hacer.


Dicho por Offsets
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.

Extras

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).
Gracias: Zaux, .Ángel~, VGS y 27 más.

Última edición por Monika; 14/12/2017 a las 20:39
  #2  
08/12/2014
Predeterminado Re: Menú con funciones personalizadas
me convenciste con el video, hoy es demasiado tarde, mañana lo pruebo, grande aporte de todos modos, se te agradece mucho mucho mucho

es bueno ver aportes de este tipo por aqui, un saludo y gracias de nuevo :3
  #3  
08/12/2014
Predeterminado Respuesta: Menú con funciones personalizadas
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
  #4  
08/12/2014
Predeterminado
Grandísimo!!!! No sé que meterle pero de seguro que lo usaré. Gracias tío ^^
  #5  
08/12/2014
Predeterminado Respuesta: Menú con funciones personalizadas
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
  #6  
08/12/2014
Predeterminado Respuesta: Menú con funciones personalizadas
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
Gracias: laflacapkm

Me voy de gira con la gamba mariachi.
¡Hasta siempre WAHeros!
  #7  
08/12/2014
Predeterminado Respuesta: Menú con funciones personalizadas
Dicho por Dani_SR_17 Ver mensaje
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
Pensar si lo pensé, pero ahora que lo pienso no se si lo escribí en alguna parte xD.

Dicho por eing Ver mensaje
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
  #8  
08/12/2014
Predeterminado Respuesta: Menú con funciones personalizadas
Dicho por byLuzurexby777 Ver mensaje
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..)
Gracias: Monika

Me voy de gira con la gamba mariachi.
¡Hasta siempre WAHeros!
  #9  
09/03/2015
Predeterminado 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
  #10  
09/03/2015
Predeterminado 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!
Respuesta

Herramientas
Desplegado

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado
Trackbacks are Activado
Pingbacks are Activado
Refbacks are Desactivado



Extra
Estilo clásico
La franja horaria es GMT +1. Ahora son las 13:53.