Registrarse

[Otros] Cómo empezar en Decompilación viniendo de GBA

Jack Johnson

Hoenn Adventures Dev
Miembro del equipo
Administrador
Introducción
Lo primero que debes saber es que no necesitas saber programar más allá de lo que sabías de ROM Hacking binario de toda la vida. Lo verás enseguida que leas esta guía.
Sólo necesitas cuatro cosas:


¿Dónde está todo?
Cuando hayáis instalado el repositorio seguramente estéis perdidos entre tanta carpeta y tanto archivo. No os preocupéis, no vais a usar la mayoría.
Estas son las rutas más importantes que deberéis conocer:
  • /data
    • /layouts
    • /maps
      • /LittlerootTown
        • /scripts.inc: Hay una carpeta por cada mapa, en la cual hay varios archivos. El que te interesa a ti, ROM Hacker, es este. Aquí encontrarás todos los scripts del mapa. Scripts de nivel, de gatillo, de NPCs, de postes...
      • /...
    • /scripts: En esta carpeta hay scripts importantes o comunes, como la guardería, o los Centros Pokémon.
    • /text: En esta carpeta encontrarás textos para los scripts de la carpeta anterior.
    • /tilesets: Aquí encontrarás perfectamente clasificados en carpetas todos los tilesets existentes en el juego.
  • /graphics: Aquí están todos los gráficos (y fuentes) de la ROM.
  • /include
    • /constants:Aquí encontrarás información interesante como por ejemplo:
      • /flags.h: Un listado de todas las flags existentes, usadas o no.
      • /vars.h: Un listado de todas las variables existentes, usadas o no.
  • /src
    • /data
      • /pokemon: En esta carpeta encontrarás un montón de archivos relacionados con las stats, evoluciones, etc. de los Pokémon. En resumen, todo lo que hacías con YAPE, Gen III Suite o Gen 3 Tools.
      • /text: Todos los archivos para traducir nombres de movimientos, habilidades, naturalezas...
      • battle_moves.h: Los datos de los movimientos, véase potencia, precisión, objetivos...
      • items.h: Aquí se encuentran todas las características de los objetos, como por ejemplo, el bolsillo en el que se guardan.
      • script_menu.h: Los dichosos multichoices que tanta lata daban antaño, se encuentran aquí en un mismo archivo.

Vamos a mapear un poco
Porymap es el editor de mapas que se usa en decompilación. ¿Os suena, no?

porymap_1.png
porymap_2.png

porymap_3.png

porymap_4.png

Habréis podido observar que los permisos de movimiento aquí se llaman colisiones y difieren un poco de vuestro querido Advance Map. No os preocupéis, he aquí la equivalencia:
SímboloAltura
Intercambio entre alturas. '0' en Advance Map.
×Obstáculo. '1' en Advance Map.
Agua, surfeable. '4' en Advance Map.
2Pasable, altura 1. '8' en Advance Map.
3Pasable, altura 2 (por defecto). 'C' en Advance Map.
4Pasable, altura 3. '10' en Advance Map.
......
+Puente. '3C' en Advance Map.
Cuando el símbolo está rojo, significa que no es pasable, lo que en Advance Map se traduciría a sumar uno al byte de permisos (por ejemplo, C sería D).

Scripts
En cuanto al scripting, es bastante sencillo localizar scripts, pues cada script tiene un nombre descriptivo (y si no te gusta, lo puedes cambiar). Olvídate de offsets, solo necesitas un nombre.
Por ejemplo, en la imagen anterior se mostraba el script llamado Route101_EventScript_RouteSign, el cual se encuentra en el archivo /data/maps/Route101/scripts.inc.
Encontraremos el script buscando con ctrl + F y escribiendo el nombre del Script.
Código:
Route101_EventScript_RouteSign:: @ 81EBE0D
    msgbox Route101_Text_RouteSign, MSGBOX_SIGN
    end

Route101_Text_RouteSign: @ 81EC0C8
    .string "ROUTE 101\n"
    .string "{UP_ARROW} OLDALE TOWN$"
Aquí prácticamente todos los comandos se llaman igual. Por si acaso, dejo una equivalencia entre los más habituales:
Comando XSEComando decomp
givepokemongivemon
showspriteaddobject
hidespriteremoveobject
movespritesetobjectxy
if 0x0 call @xxx
if 0x1 call @xxx
if 0x2 call @xxx
if 0x3 call @xxx
if 0x4 call @xxx
if 0x5 call @xxx
call_if_lt xxx (less than)
call_if_eq xxx (equal)
call_if_gt xxx (greater than)
call_if_le xxx (less or equal)
call_if_ge xxx (greater or equal)
call_if_ne xxx (not equal)
if 0x0 goto @xxx
if 0x1 goto @xxx
if 0x2 goto @xxx
if 0x3 goto @xxx
if 0x4 goto @xxx
if 0x5 goto @xxx
goto_if_lt xxx
goto_if_eq xxx
goto_if_gt xxx
goto_if_le xxx
goto_if_ge xxx
goto_if_ne xxx

Pese a todo, no es mala práctica trabajar una temporada paralelamente con una ROM original y XSE para ver más diferencias. Como podéis observar, al lado del nombre de los scripts aparece el offset original de estos, por lo que si lo buscas en XSE encontrarás su equivalente.
Incluso viendo otros scripts podrás copiar y adaptarlos a los tuyos.

IMPORTANTE: Los comentarios se colocan con una @ delante del texto, los scripts se inician con el nombre del script y dos veces dos puntos ( :: ). Si el script es de texto o de movimiento, se usa únicamente una vez ( : ).

Insertar gráficos
Los gráficos pequeños (sprites, iconos, etc.) y tilesets se componen de una paleta (.pal) y un mapa de bits (.png). Los gráficos más grandes tendrán también un tilemap, que son los .RAW de toda la vida, solo que aquí están en formato .BIN.

Para modificar cualquier mapa de bits, usaremos GraphicsGale. Para ello abriremos el archivo original y el archivo modificado a la vez.
gg_!.png
Manteniendo seleccionada la ventana del original (justo al revés que en la foto 🤦‍♂️) Seleccionaremos el botón de paleta y haremos clic en Load palette.
Se abrirá la ventana Load Palette, donde, desde el botón File▾, seleccionaremos Import from File. Aquí buscaremos el archivo nuevo (indexado a tantos colores como el archivo original tenga).
1586739736119.png
Una vez cargado, seleccionaremos todos los colores de izquierda a derecha (obviando los negros, que no los vamos a utilizar) bajo 'Drag to select' y los colocaremos debajo de 'Click to paste'. IMPORTANTE: la casilla Match Pixels with Colors debe estar desmarcada.

Haremos clic en OK y veremos que la imagen original tiene ahora la paleta de la imagen nueva. Ahora volvemos a la imagen nueva y haremos CTRL + A para seleccionarla entera. Entonces copiaremos con CTRL + C e iremos a la imagen original donde pegaremos con CTRL + V. Se deselecciona con el botón derecho del ratón.

Guardamos y ya tenemos el mapa de bits cambiado. Ahora toca modificar las paletas. Si tienes suerte y no hay un .pal con el mismo nombre que el mapa de bits, has terminado. De lo contrario, abre el archivo .pal con un editor de código (Visual Studio Code, por ejemplo) y edítalo con la paleta nueva, por ejemplo:
Código:
JASC-PAL
0100
16
65 65 90
222 230 238
213 213 222
205 205 213
197 197 205
164 180 255
115 139 255
74 98 255
32 65 255
74 180 189
255 230 49
90 90 123
123 123 172
65 65 90
255 255 255
0 0 0
El primer color empieza en la línea 4 y las cifras son valores R G B. Ahora guarda la paleta y se acabó.

Los mapas de tiles (o tilemaps) son los RAW de toda la vida, pero cambiando la extensión por BIN. Un buen editor de tilemaps es el Tileset Studio.

Al final de la edición de un gráfico, no olvides borrar todos los archivos con el nombre del gráfico que no sean ni PNG, ni PAL, ni BIN. Esto hará que el compilador detecte los cambios.

Y hasta aquí un resúmen de lo que puedes hacer en decompilación sin saber programar en C. Lo demás es investigar un poco, ya que muchas de las funciones son análogas a binario (o ROM Hacking normal).

Por supuesto, si quieres meter más mecánicas o introducirte más en el código, sí necesitarás conocimientos de programación en lenguaje C.
 
Última edición:

Rubire4

Usuario mítico
¡Muy buen tutorial! Está de lujo para la gente que se quiera pasar a Decomp, pues la mayoría ya está trabajando en GBA.
Sin embargo creo que deberíais ir empezando a crear tutoriales para gente sin ninguna experiencia en GBA, ni en Fan Gaming en general. En el ROM Hacking no se te pide ningún tipo de experiencia propia para empezar, mientras que aquí los tutoriales que tenemos son en base a ya saber lo mínimo de RH.
 

Edo

You've met with a terrible fate, haven't you?
Miembro de honor
Te amo, breo.

Después de estar hablando por un rato con Eing y Criisss, hoy decidí pasarme a decomp. A ver, que no tiene mucho sentido permanecer en el RH tradicional solo por algún sentido de nostalgia o qué sé yo. Y apenas entré en el foro para ver con qué me encontraba, ¡di con este tema! Me siento bendecido, en honor a la verdad.
En fin, que me lo leeré todo y ya veré por dónde sigo. Muchas gracias por el aporte.

Saludos.
 

deidara9216

Profesional de WaH
Tengo una duda, y como se agregan objetos nuevos Y se les da las propiedades que se usaban como mega piedras !?
 

Lunos

Enfrentando a La Organización
Miembro insignia
Tengo una duda, y como se agregan objetos nuevos Y se les da las propiedades que se usaban como mega piedras !?
1) Define el objeto en include/constants/items.h
2) Añade sus datos de objeto en src/data/items.h
3) Añade su descripción en src/data/text/item_descriptions.h

Opcionalmente, para darle un sprite:
1) Añade el sprite en graphics/items/icons
2) Exporta su paleta en .pal con formato JASC y arrojala en graphics/items/icon_palettes
3) Define el sprite en include/graphics.h
4) Define la ruta hacia dicho sprite y su paleta en src/data/graphics/items.h
Y por ultimo enlaza el sprite y paleta que definiste al objeto añadido, en la tabla ubicada en src/data/item_icon_table.h

Yo sé que tú estás usando Pokeemerald-expansion por nuestra conversación en mi tema, pero otros usuarios podrian no haberlo visto. Recuerda que las Mega Piedras no existen como tal por defecto y eso podria confundir a otras personas que lean tu post. A la hora de hacer preguntas, ser tan especifico como sea posible es importante.

En fin, habiendo clarificado eso, a la hora de insertar los datos de tu objeto, observa como están implementadas cualquiera de las Mega Piedras ya presentes. Ese es el concepto que aplica aquí en terminos generales, de hecho. Esto es una cuestión de observar como están definidos los demas objetos y expandir o modificar como tú lo necesites.
EDITO: Y de la misma forma, el mismo concepto aplica a especies, movimientos, habilidades y tal.
 
Última edición:
Arriba