Registrarse

[pokeruby] Cómo quitar el mensaje de pila interna.

Kaktus

Miembro insignia
Miembro insignia


¡Hey!

Bueno, pues tras estar un ratillo trasteando este nuevo gran avance del rom hacking, he logrado un par de cosas que estoy seguro que a más de uno le va a servir. (Hasta el momento estoy impresionado con la facilidad de cambiarlo absolutamente TODO si se tiene un mínimo de nociones básicas programación)

¡Vamos allá!

Requisitos:
- Este genial tema de introducción a pokeruby de Lunos


Tutorial:
Simplemente voy a ir al grano, no me quiero enrrollar, así que...

1.- Vamos a la ruta: pokeruby\src\main_menu.c y abrimos el archivo con un editor, preferentemente Notepad++ o cualquier otro que soporte el formato del lenguaje de programación C y veremos algo así:




2.- Pulsaremos Ctrl + F para buscar la palabra "Task_MainMenuWaitForRtcErrorAck" sin las comillas o iremos a la línea 66, que en cualquier caso, es el primer resultado de dicha búsqueda.

Y aquí es donde viene un punto en el que nos tenemos que parar a plantear si estamos loquísimos y nos da igual borrar datos de la versión original, o si por seguridad, dejaremos esos datos donde están, pero sin que sean leídos por el juego.

(Las personas que entiendan un mínimo de programación sabrán que me refiero a borrar datos, o a comentarlos.)

Yo en mi caso, prefiero comentar lo que no vaya a usar, ya que no me molestan pero puede que algún día los quiera volver a poner o vete tú a saber.

Una vez dicho esto, empecemos a hacer lo que todos estábamos esperando, manosear el juego.

Deberíamos estar viendo algo tal que así:



3.- Comentaremos la línea que dice:
Código:
[COLOR="DarkOrchid"]static void[/COLOR] Task_MainMenuWaitForRtcErrorAck(u8 taskId);
Es decir, que le añadiremos esto // delante de todo, para que sea ignorado. Y veremos que toda la línea cambia de color



¡Bien, ya hemos comentado la primera línea! (Recuerdo que también podemos optar por borrarla si os incomodara dejar eso así, pero vaya, que el resultado es el mismo, y comentando queda algo más chapuza pero es más seguro, así si en un futuro tuviéramos que dejarlo tal y como estaba, no tendríamos que andar buscando los archivos originales y blablaba...)

4.- De nuevo haremos otra búsqueda de la misma palabra, "Task_MainMenuWaitForRtcErrorAck", o iremos a la línea 364, que de nuevo viene a ser lo mismo.



Y ahora es donde viene lo chungo, nos vamos a hinchar a poner "//" concrétamente, tal y como se ve en la siguiente imagen:
(También podríamos optar por hacer comentarios de bloques, pero no son demasiadas líneas y pienso que se va a ver mucho menos lioso de esta manera para la gente que no sepa mucho acerca de programar)



Es decir, que de todo el "if (!(RtcGetErrorStatus() & R... BLABLABLA"
dejaremos ÚNICAMENTE, la línea que dice:

Código:
gTasks[taskId].func = Task_MainMenuDraw;
Más tarde explicaré porqué estamos comentando todo esto y porqué no nos interesa que el juego lo lea.

5.- Por último, el siguiente void a lo que acabamos de comentar, es decir, lo que hay justito abajo de lo hemos comentado, también vamos a comentarlo, en esta ocasión, entero, ya que no nos interesa que ese void exista.

Quedaría algo así:




¡Y listo! guardamos el archivo, y lo compilamos.
(Compilamos abriendo "cygwin.bat", escribimos "cd pokeruby", por último "make" y esperamos a que todo quede bien compilado)

Y ya podemos usar nuestra ROM sin ese molesto y poco visual mensajito cada vez que iniciamos el juego, así de rápido y sencillo.


Ahora tenéis dos opciones, leer lo que hemos hecho para entender por qué hemos quitado cada cosa y como funcionaba, para aprender un poquito más sobre programación o sobre la interpretación del juego, o seguir nuestra vida con un bonito resultado :p

Para empezar, hemos comentado la línea en la que se declaraba la función/void para cargar ese mensajito. digamos que en esa línea, esa función aún no estaba declarada, pero ya tenía un espacio para más tarde ser usada. Necesitamos comentarlo, ya que si esto quedara vacío, serían datos inútiles para la ROM y ocuparía espacio innecesariamente, además, si no lo quitamos, no podemos compilar.

Más tarde, hemos comentado un condicional entero, me podría extender explicándolo en profundidad pero básicamente, este condicional comprueba si la pila interna funciona, en caso de ser así, pasamos a la pantallita de "Continuar blabla", en caso de que no, nos saltaba el error. Pues nosotros, sencillamente hemos eliminado ese condicional, y obligamos al juego a que sí o sí, la pila esté en buen o mal estado, salte directamente a dicha pantalla de "nuevo juego, continuar, opciones..."

Por último, hemos hecho desaparecer la función que se da en caso de que la pila interna esté defectuosa. Esto es algo completamente lógico, ya que antes hemos eliminado la línea en la que se declaraba, y si escribimos una función en un lugar no declarado/inexistente, lo único que vamos a conseguir es errores por todas partes (Y directamente que no nos compile la ROM)

Esto no tiene porque ocasionar ningún error, pero en caso de que por algún extraño motivo pensarais que así fuera tras aplicar este método, sería tan sencillo como quitar los comentarios a todas las líneas que hemos comentado para volver a tener el dichoso mensaje, pero que ese supuesto error no vuelva a ocasionarse. (Por supuesto, no es necesario decir que si se revierte el proceso y sigue dándoos ese error "X", no es culpa de esto, si no de otra cualquier cosa.

Creo que al final, incluso intentando no extenderme lo he hecho, pero bueno, al fin y al cabo todos sabemos como funcionan las cosas por aquí, el que tiene interés por aprender, se lo lee todo, y el que simplemente viene por que quiere quitar este mensaje que le molesta y lo demás le da igual, mira las imágenes se lo lee por encima y aplica el tutorial, que es muy sencillito.

¡Espero que todos podáis disfrutar de este primer mini-avance de todo lo que tengo ganas de cambiar en dichas ROMs y que comentéis que os parece! ( Y qué opinéis del nuevo InmortalKaktus ( ͡° ͜ʖ ͡°) )

Chaoo :D

 
Última edición:

kakarotto

Leyenda de WaH
Bien hecho Inmortal. Eres un referente en este mundo y quiza la decisión de que hayas vuelto tiene algo que ver con las incontables personas que han insistido que vuelvas, o simplemente un poco de nostalgia..

No importa realmente. El tutorial está bastante bien pero quiero aclarar unas series de "peligros"...

Si se elimina trozos de código de la función original, el tamaño original de esta cambiará, y por consiguiente los correspondientes offsets que apuntan a las direcciones también.

Esto es un problema en el cual se soluciona haciendo una .ini a mano pero imaginate que hay 1000 funciones después de la función que acabas de editar... Es una locura..
 

Kaktus

Miembro insignia
Miembro insignia
Bien hecho Inmortal. Eres un referente en este mundo y quiza la decisión de que hayas vuelto tiene algo que ver con las incontables personas que han insistido que vuelvas, o simplemente un poco de nostalgia..

No importa realmente. El tutorial está bastante bien pero quiero aclarar unas series de "peligros"...

Si se elimina trozos de código de la función original, el tamaño original de esta cambiará, y por consiguiente los correspondientes offsets que apuntan a las direcciones también.

Esto es un problema en el cual se soluciona haciendo una .ini a mano pero imaginate que hay 1000 funciones después de la función que acabas de editar... Es una locura..
Bueno, a pesar de que ya te respondí en este tema repecto a la duda, me gustaría aclarar en el post que esto no es así, para la gente que venga en un futuro y esta suposición que dejaste le pueda confundir.

Estamos trabajando con información decompilada escrita en lenguaje C, y mientras trabajemos con dichos recursos, la gran parte de la información por no decir prácticamente todo, aún no tiene un offset o dirección específica ya especificada. Aquí trabajamos llamando a funciones por sus nombres, que son lo que en una ROM compilada llamaríamos efectivamente, offsets o direcciones.

Por tanto la principal diferencia entre trabajar con información compilada y decompilada hablando sobre las llamadas a funciones, es precisamente, que en la información decompilada, tiene por dirección un nombre que está guardado de forma "dinámica" y que si por cualquier cosa, metemos más datos antes de dicha dirección, no existiría ningún tipo de problema. Sin embargo, cuando la ROM se compila, se fija una dirección para todas las funciones, y ahora el método de llamarlas es por su dirección en hexadecimal, que es estática y no varía.

Lo único que aún no tengo muy claro si tiene definido un offset o no en la versión decompilada son diálogos de npc's comunes, ya que a la derecha del nombre de la función aparece un @ y seguido una dirección hexadecimal. Por el resto de cosas no hay problema.

¡Espero haber resuelto vuestras dudas! ^-^
 

Lunos

Enfrentando a La Organización
Miembro insignia
Lo único que aún no tengo muy claro si tiene definido un offset o no en la versión decompilada son diálogos de npc's comunes, ya que a la derecha del nombre de la función aparece un @ y seguido una dirección hexadecimal. Por el resto de cosas no hay problema.

¡Espero haber resuelto vuestras dudas! ^-^
Holi. Pasaba a comentar que todo lo que viene despues de un @ son comentarios ignorados por el compilador a la hora de crear la ROM.

Esto lo aprendí mientras hacia mis cosirijillas para añadir a Chimchar en Pokeruby.
 

kakarotto

Leyenda de WaH
Inmortal, no sé si lo sabras, pero cuando compilas pokeruby por ejemplo, se te genera un archivo llamado pokeruby.map.

Dicho .map aparecen todas los offsets compilados. Logicamente si cambias el tamaño de las funciones originales cambiaran los offsets donde apuntan.

La desventaja de pokeruby es que tienes que hacerlo todo desde el principio para luego compilarlo. ¿Y si tengo un hack con cosas definidas creadas por mi y quiero meter información que he cambiado en pokeruby? Se puede. pero sólo ciertas partes como inyectar una funcion por otra reemplazando. Lo que necesito aprender es como linkear en el offset original de una funcion una instruccion asm que te lleve a la funcion mejorada o cambiada con un tamaño superior y que todo funcione perfecto.

Espero se me haya entendido.
 

Laquin

Usuario mítico
Inmortal, no sé si lo sabras, pero cuando compilas pokeruby por ejemplo, se te genera un archivo llamado pokeruby.map.

Dicho .map aparecen todas los offsets compilados. Logicamente si cambias el tamaño de las funciones originales cambiaran los offsets donde apuntan.

La desventaja de pokeruby es que tienes que hacerlo todo desde el principio para luego compilarlo. ¿Y si tengo un hack con cosas definidas creadas por mi y quiero meter información que he cambiado en pokeruby? Se puede. pero sólo ciertas partes como inyectar una funcion por otra reemplazando. Lo que necesito aprender es como linkear en el offset original de una funcion una instruccion asm que te lleve a la funcion mejorada o cambiada con un tamaño superior y que todo funcione perfecto.

Espero se me haya entendido.
Gracias por ese dato, no tenía ni idea de ello.

Respecto a tu duda, no, no te he entendido. XD
¿Por qué tienes que acudir al reemplazo? ¿Y qué importa el tamaño de la función?
 

kakarotto

Leyenda de WaH
Cuando compilas pokeruby no importa si es mayor o menor la funcion. El problema es si quieres usar una rom con cosas cambiadas y esperas no sobreescribir ningun dato. Para ello hay que hacer un linker, como una especie de "goto".

Samu, por ejemplo, me explico cual es la rutina, pero desgraciadamente no funcionó. Entonces no se a que se debe el tema.
 

Kaktus

Miembro insignia
Miembro insignia
Respuesta: Re: Cómo quitar el mensaje de pila interna.

Inmortal, no sé si lo sabras, pero cuando compilas pokeruby por ejemplo, se te genera un archivo llamado pokeruby.map.

Dicho .map aparecen todas los offsets compilados. Logicamente si cambias el tamaño de las funciones originales cambiaran los offsets donde apuntan.

La desventaja de pokeruby es que tienes que hacerlo todo desde el principio para luego compilarlo. ¿Y si tengo un hack con cosas definidas creadas por mi y quiero meter información que he cambiado en pokeruby? Se puede. pero sólo ciertas partes como inyectar una funcion por otra reemplazando. Lo que necesito aprender es como linkear en el offset original de una funcion una instruccion asm que te lleve a la funcion mejorada o cambiada con un tamaño superior y que todo funcione perfecto.

Espero se me haya entendido.
Esto que comentas es exactamente lo mismo que se hacía antes con las rutinas, sólo que ahora, el compilador es cygwin, y tienes que buscar el lugar en el que se compila dicho código a formato hexadecimal, así pasando diréctamente de C a HEX evitando pasar por ASM/Ensamblador.

No es nada nuevo, y respecto a tu duda, supongo que te refieres a que la nueva rutina, puede ser reemplazada por una ya existente siempre y cuando no ocupe más espacio que la original, ya que en tal caso, se tendría que insertar la nueva rutina en un espacio vacío y repuntear todas las llamadas hechas a la antigua rutina, con el offset de la nueva. Creo que te refieres a eso, y si es así, estás en lo correcto :)
 

Laquin

Usuario mítico
Re: Respuesta: Re: Cómo quitar el mensaje de pila interna.

Esto que comentas es exactamente lo mismo que se hacía antes con las rutinas, sólo que ahora, el compilador es cygwin, y tienes que buscar el lugar en el que se compila dicho código a formato hexadecimal, así pasando diréctamente de C a HEX evitando pasar por ASM/Ensamblador.

No es nada nuevo, y respecto a tu duda, supongo que te refieres a que la nueva rutina, puede ser reemplazada por una ya existente siempre y cuando no ocupe más espacio que la original, ya que en tal caso, se tendría que insertar la nueva rutina en un espacio vacío y repuntear todas las llamadas hechas a la antigua rutina, con el offset de la nueva. Creo que te refieres a eso, y si es así, estás en lo correcto :)
¿Y qué si se repuntean las rutinas del juego? Si no vas a necesitar llamar a las funciones por su dirección, sino que por el nombre de la rutina, por lo que no hay ningún problema.
 

Kaktus

Miembro insignia
Miembro insignia
Respuesta: Re: Respuesta: Re: Cómo quitar el mensaje de pila interna.

¿Y qué si se repuntean las rutinas del juego? Si no vas a necesitar llamar a las funciones por su dirección, sino que por el nombre de la rutina, por lo que no hay ningún problema.
Es lo que digo, que la ventaja de trabajar con pokeruby es que no te tienes que preocupar de a donde va a parar cada cosa, cualquier mínimo cambio va a cambiar todas las direcciones.

Yo creo que la duda ya se resolvió, pero por si a caso, aclaro que no hay ningún tipo de problema al cambiar el tamaño del juego (A no ser que quieras usar las típicas herramientas de ROM Hacking, pero en tal caso, ni si quiera deberíais tocar pokeruby). El juego va a ser 100% funcional, y sin margen de errores.
 
Arriba