Respuesta: GBA | ASM | Menú con funciones personalizadas
Tengo una pregunta, Seria posible de algun modo hacer que la opcion que hemos cambiado (EXIT) funcione con una flag al igual que la pokedex??, de modo que cuando te ponen la flag esta opcion aparece. Es que la opcion que le puse no quiero que la tenga el prota desde el inicio de la historia... Gracias y buen tuto!!
Tengo una pregunta, Seria posible de algun modo hacer que la opcion que hemos cambiado (EXIT) funcione con una flag al igual que la pokedex??, de modo que cuando te ponen la flag esta opcion aparece. Es que la opcion que le puse no quiero que la tenga el prota desde el inicio de la historia... Gracias y buen tuto!!
Deje el código por si alguien la quería modificar o ver como es. Pero si insertás con el editor hexadecimal la rutina compilada que deje en el post principal, debería funcionar. O sea, compilarla (hacer el rutina.bin), sin modificaciones, te va dar lo mismo que puse yo.
@旅団.Markuzz Kaizuka estaba teniendo unos problemas modificando el menú, así que me pidió ayuda.
El quería cambiar la opción de POKEDEX. El problema que ocurre es que al seleccionarse una opción del menú distinta de RETIRE, EXIT o SAVE. El juego oscurece la pantalla. ¿Por qué? Porque todas las demás opciones abren algun tipo de menú, el jugador deja de estar en el mapa.
Pero para el caso de un script necesitamos que la pantalla se quede como está, así que debemos modificar la funcion que oscurece la pantalla.
Lo que voy a mostrar sirve tanto para fire red como para rojo fuego. Para emerald y ruby habría que hacer unas rutinas diferentes, si alguien la necesita que avise.
(Por cierto, @♠Subzero♠posteó esto para el usar el hack en rojo fuego. Aunque se equivocó en el orden de reamplazo de YYYYYY y ZZZZZZ, a ver si lo arregla)
Pero bueno además de la rutina principal, hay que insertar dos más:
Modifiquen esta rutina según sea su situación. En la primera línea, modifiquen la cantidad de opciones del menú que no deben oscurecer la pantalla.
Y al final de la rutina, agreguen los punteros a esas funciones. Tal y como está la rutina ahora, funcina igual que la original del juego. Si quieren agregar una función más deberías cambar el 3 por 4 y agregar un puntero al final.
Muy interesante. Pero si lo que deseo es oscurecer la pantalla antes de ejecutar una rutina, tal cual como ocurre al entrar a la mochila o a la pokedex. Es decir, lo que deseo es salir del sistema de mapas ¿Cómo haría en ese caso? y si es posible ¿Cómo volver a él? aunque podría hacer un warp de ser necesario
Muy interesante. Pero si lo que deseo es oscurecer la pantalla antes de ejecutar una rutina, tal cual como ocurre al entrar a la mochila o a la pokedex. Es decir, lo que deseo es salir del sistema de mapas ¿Cómo haría en ese caso? y si es posible ¿Cómo volver a él? aunque podría hacer un warp de ser necesario
Una forma de hacerlo en FR sería:
- Para oscurecer la pantalla llamás a 0x08070588, a la cual le tendrías que pasar los parámetros: (-1, 0, 0, 16, 0)
- Luego, tendrías que llamar a 0x80563f0, para liberar la memoria que ocupan los tilesets.
- Cambiar el callback de retorno (puntero almacenado en 0x3005020) a la función 0x807dd24.
- Cambiar el callback 2 con la función 0x08000544, pasándole como parámetro tu rutina principal (la que quieras que se ejecute constantemente).
- Y por último, para volver tenés que cambiar el callback 2 para que apunte a la rutina de 0x080567dc.
Eso sería algo así como una base. Dependiendo de lo que quieras hacer tal vez haya que hacer algo más.
Como siempre, te recomiendo que aprendas C y mires el código por tu cuenta. Te sería mucho más útil para aprender como funciona el engine, en lugar de tener que estar haciendo prueba y error con una lista de rutinas que te pasen.
Respuesta: GBA | ASM | Menú con funciones personalizadas
una pregunta como se hace cuando es un dialogo ya q cuando entro en offset y guardo voy al juego y algunas palabras claves como el color de tinta o el nombre de jugador aparecen como diagolo dificultando el entendimiento
una pregunta como se hace cuando es un dialogo ya q cuando entro en offset y guardo voy al juego y algunas palabras claves como el color de tinta o el nombre de jugador aparecen como diagolo dificultando el entendimiento
@旅団.Markuzz Kaizuka estaba teniendo unos problemas modificando el menú, así que me pidió ayuda.
El quería cambiar la opción de POKEDEX. El problema que ocurre es que al seleccionarse una opción del menú distinta de RETIRE, EXIT o SAVE. El juego oscurece la pantalla. ¿Por qué? Porque todas las demás opciones abren algun tipo de menú, el jugador deja de estar en el mapa.
Pero para el caso de un script necesitamos que la pantalla se quede como está, así que debemos modificar la funcion que oscurece la pantalla.
Lo que voy a mostrar sirve tanto para fire red como para rojo fuego. Para emerald y ruby habría que hacer unas rutinas diferentes, si alguien la necesita que avise.
(Por cierto, @♠Subzero♠posteó esto para el usar el hack en rojo fuego. Aunque se equivocó en el orden de reamplazo de YYYYYY y ZZZZZZ, a ver si lo arregla)
Pero bueno además de la rutina principal, hay que insertar dos más:
Modifiquen esta rutina según sea su situación. En la primera línea, modifiquen la cantidad de opciones del menú que no deben oscurecer la pantalla.
Y al final de la rutina, agreguen los punteros a esas funciones. Tal y como está la rutina ahora, funcina igual que la original del juego. Si quieren agregar una función más deberías cambar el 3 por 4 y agregar un puntero al final.
He intentado conseguir esto para que no salga la pantalla en negro, pero para la rom de esmeralda.
No he sido capaz de encontrar las compensaciones necesarias para esmeralda de estas 2 cosas que expones en tu post:
020370F0 sStartMenuCallback (en firered)
0806F394 StartMenu_FadeScreenIfLeavingOverworld (en firered)
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:
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.
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.
¡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).