Registrarse

[pokeruby - pokeemerald] Correr en interiores

Laquin

Usuario mítico
¡Buenas! Hoy os traigo un pequeño tutorial de Pokeruby y Pokeemerald (https://whackahack.com/foro/t-56554/introduccion-pokeruby-proyecto-decompilacion-pokemon-r-s): correr en interiores. Como no se debería editar la ROM compilada con estas descompilaciones (pues al compilarla de nuevo se borrarían los cambios), debemos hacerlo mediante un cambio en el código. La verdad, encontrarlo me ha costado más de lo que creía, pero creo que merecerá la pena.

Tenemos que entrar en la carpeta src, y buscar dentro de esta el archivo bike.c.
Una vez dentro, iremos a la línea 914, donde está escrito lo siguiente:
Código:
if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR)
Esta línea lo que hace es mirar dos cosas:
  1. Si el bloque en el que estemos nos impide correr(como la hierba larga, entre otros)
  2. Si el mapa en el que estemos es un mapa interior
Y, entre ambas condiciones, vemos que pone ||. Esto significa que, con que tan solo una de las condiciones se cumpla, toda la expresión será verdadera. (Una puerta OR básicamente). Si es verdadera, no nos va a dejar correr.

Ahora bien, nosotros queremos que nos deje correr aunque sea un mapa interior; es decir, no queremos que tenga en cuenta el tipo de mapa en el que estamos. Por ende, simplemente lo quitaremos de ahí (y, junto a él, quitaremos el ||).

Con eso bastaría, pero en vez de borrarlo, me gusta más la idea de dejarlo como comentario. Los comentarios son ignorados por el compilador, por lo que al crear la ROM sería igual que si borrasemos el código en sí. Sin embargo, si algún día cambiamos de opinión y queremos volver a poner esta condición, este trozo de código va a seguir en el archivo.

¿Y cómo se crea un comentario? Simplemente poned lo que queráis quitar entre /* y */, tal que así:
Código:
if (IsRunningDisallowedByMetatile(tile) != FALSE/* || gMapHeader.mapType == MAP_TYPE_INDOOR*/)
Si quisiéramos volver a impedir correr en interiores, simplemente quitaríamos el /* y */ y ya.
En src/bike.c, en la línea 1073, está escrito lo siguiente:
Código:
if (!(gMapHeader.flags & 4) || IsRunningDisallowedByMetatile(metatile) == TRUE)
Pues simplemente vamos a quitar, o mejor comentar (por lo mismo que he explicado en el tutorial para Pokeruby), eso de !(gMapHeader.flags & 4) || y ya:
Código:
if (/*!(gMapHeader.flags & 4) ||*/ IsRunningDisallowedByMetatile(metatile) == TRUE)

Ahora solo queda compilar:
Código:
make NODEP=1
Y ya podemos correr en interiores:



¡Saludos!
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Pokeruby/Pokeemerald | Correr en interiores

Holi, solo pasaba a comentar que RS_IsRunningDisallowed es la función usada en RS. Quedó en Emerald como un resto y como tal, no sirve para Pokeemerald.
En Pokeemerald, la función correcta es "IsRunningDisallowedByMetatile" que está 8 lineas mas abajo.
Lo que no sé es que parte de esa función hay que bloquear, jajaja.
 

Laquin

Usuario mítico
Re: Respuesta: Pokeruby/Pokeemerald | Correr en interiores

Holi, solo pasaba a comentar que RS_IsRunningDisallowed es la función usada en RS. Quedó en Emerald como un resto y como tal, no sirve para Pokeemerald.
En Pokeemerald, la función correcta es "IsRunningDisallowedByMetatile" que está 8 lineas mas abajo.
Lo que no sé es que parte de esa función hay que bloquear, jajaja.
Holi, solo pasaba a comentar que RS_IsRunningDisallowed es la función usada en RS. Quedó en Emerald como un resto y como tal, no sirve para Pokeemerald.
En Pokeemerald, la función correcta es "IsRunningDisallowedByMetatile" que está 8 lineas mas abajo.
Lo que no sé es que parte de esa función hay que bloquear, jajaja.
Y esto, amigos, es lo que pasa si no comprobáis que lo que habéis hecho funcione, jajajaja...

Fuera coñas, lo siento por el error xD Y gracias, @Lunos, por hacérmelo saber.

Como bien dices, la función RS_IsRunningDisallowed solo se usa, como su nombre indica, en RS. Lo decidieron dejar ahí, pero realmente no sirve de absolutamente nada. Y no, no hay que quitar nada de la función que mencionas.

Ya he investigado, y he encontrado este método para pokeemerald.

En src/bike.c, en la línea 1073, está escrito lo siguiente:
Código:
if (!(gMapHeader.flags & 4) || IsRunningDisallowedByMetatile(metatile) == TRUE)
Pues simplemente vamos a quitar, o mejor comentar, eso de !(gMapHeader.flags & 4) || y ya:
Código:
if (/*!(gMapHeader.flags & 4) ||*/ IsRunningDisallowedByMetatile(metatile) == TRUE)
Si tenéis algún problema, decidme. Aunque no deberíais, porque esta vez sí lo he probado. :p

¡Saludos!
 
Última edición:
Pues, que yo recuerde el UPRandomizer tiene una opción para poder correr en interiores, me parece bastante más cómodo ya que funciona tanto en el remake de la primera y tercera gen.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Pokeruby/Pokeemerald | Correr en interiores

Pues, que yo recuerde el UPRandomizer tiene una opción para poder correr en interiores, me parece bastante más cómodo ya que funciona tanto en el remake de la primera y tercera gen.
UPR genera una ROM, tú no puedes modificar una ROM con los proyectos de decompilación.

Los proyectos de decompilación van de permitirte editar el codigo fuente que tras pasarlo por un compilador, genera la ROM/el juego.
 

KleinStudio

Un plato es un plato
Miembro del equipo
Webmaster

Asmodeo Leviatan

¿La Iglesia inventó el Infierno? O es lo contrario
Arriba