Você está na página 1de 28

Poké-Hacking: La técnica detrás del

mito.
Aprende a programar scripts y traducir el ROM.
Por: ~Areku!

Introducción.

Hola de nuevo! ^^U!


Bueno, este es mi 4ta guía, decidí esta vez incluir en gran parte una
traducción y adaptación que he hecho de una las mejores guías acerca del
Scripting en el Poké-Hacking, “XSE – Comprehensive Scripting Guide”,
redactada por HackMew, una gran ROM-Hacker y una gran persona a la cual
admiro bastante y que ha aportado bastante al hacking.

Si deseas publicarla en algún foro, no hace falta avisarme, sólo darnos


el crédito necesario a ambos (~Areku y HackMew) y listo ^^.

Y recuerden esto:

¡¡¡Prohibida su venta!!!
Palabras raras (‘’’._.’’’?)
Compilar:
Se le llama así al procedimiento de convertir una serie de
órdenes que podemos interpretar fácilmente a un código.

Decompilar:
Es lo contrario a compilar; convierte código a una serie de
órdenes.

Hexadecimal:
Sistema universal de codificación que va desde el 0 a la F.
(Lo veremos más adelante a detalle.

Scripts: ¿Qué son?


Bueno, viene del inglés guión, y aplicado al Poké-Hacking son
la gran mayoría aquellas acciones que ocurren a lo largo del juego
tales como movimientos, diálogos, batallas, movimiento de datos
como variables, flags, entre muchas otras cosas interesantes ^^
escritas en una serie de órdenes. El código más utilizado por los
ROM-Hackers es el Rubikon, originalmente utilizado por
ScriptEd de Kyoufu Kawa y DJ Bouché y mejorado por el XSE
(eXtreme Script Editor), de nuestro amigo italiano HackMew, 2
grandes programadores que han aportado bastante al hacking.

*El origen de los Scripts*


Todos los ROM-Hacker comienzamos por la parte más fácil
del hacking, la cual trabaja con herramientas o Hack-tools y no
necesita mucha habilidad ni conocimientos, con la excepción de la
creación de un mapa o los gráficos, donde se necesita conocer un
poco de estética y tener algo de imaginación visual.
Y crear scripts es algo parecido, contamos con las
herramientas para descompilar scripts el cual trabaja en un
lenguaje de programación bastante sencillo de entender, y si,
como todo código lo compilamos mal, se nos va al caño nuestro
script. Si crees que crear un script tiene mucha similitud con
programar, tienes mucha razón.

Y bueno, todo ROM sea de Pokémon o no, incluso de SNES,


NES, N64, GBC y todas las ROM de Nintendo trabajan con un
sistema de codificación llamado “sistema hexadecimal”, de ahí se
han basado absolutamente todos los programadores de
herramientas para crearlas, analizando el comportamiento del
ROM al cambiar parte de su código, interesante ¿No?.

Aunque el crear scripts en GBA existe una gran ventaja,


que se cuenta con una base de datos de órdenes, que interpretan
la gran mayoría de los códigos y lo decompila a un lenguaje de
programación, en lugar de tener que estar descifrando sólo
código, código y más código en unos números y letras que no
entendemos ^^ (Qué flojera l-<_>-l).

Los Scripts en el ROM.


En una primera impresión los scripts nos parecen una serie
de números y letras que nos quieren decir algo, una mezcla de
números y letras, y bueno, no es muy obvio.
El scripting puede ser considerarse como un lenguaje
programación aunque limitándose a una serie de comandos pre-
definidos presentes en nuestra ROM, y bueno, podrás darte
cuenta de que un script es una serie de instrucciones
representadas por comandos ya elaborados.

Bueno, comencemos con el tema, todo script está localizado


en un offset en nuestra ROM, te preguntarás ¿Y eso con qué se
come? Hehe, pues es en realidad la dirección donde se guardan
los datos que contiene nuestro script.

Todo, absolutamente toda información, ya sea sprites,


diálogos, movimientos, comportamientos de los minis,
entrenadores, pokemons y obviamente los scripts, tienen un
offset; esto nos es muy útil a la hora de crear un script, no
debemos elegir una dirección al azar, ya que podría sobrescribir
datos valiosos de nuestra ROM para que funcione correctamente
y dañarlo.

Me gustaría incluír la comparación que HackMew hizo de


una ROM con un libro, intentaré de que la traducción del inglés
sea lo más fiel al original ^^.

“Tomemos un libro, este libro tiene páginas, las cuales están


ennumeradas, cada página tiene algunos párrafos, ahora tratemos
el libro como un ROM; los párrafos representan los diferentes
scripts; las palabras dentro de los párrafos representan las
líneas de comandos con sus respectivos parámetros.”

Entonces un offset es muy parecido a la página de un libro y


el necesitaremos saber qué pagina de libro, o más bien qué offset
tiene nuestro script para poder colocarselo a un minisprite, un
gatillo o un poste (más adelante veremos qué es cada cosa).

El sistema hexadecimal
El sistema hexadecimal es un sistema de numeración de
base 16 (es decir, utilizan 16 símbolos como dígitos), usualmente
utiliza el 0-9, más el “A”, “B”, “C”, “D”, “E” y “F” o
alternativamente “a”, “b”, “c”, “d”, “e” y “f” para representar
valores del 10 al 15. No estamos acostumbrados a utilizar la
numeración de esta forma, ya que los seres humanos siempre nos
hemos acostumbrado a trabajar con el sistema decimal, del 0 al
9.
Pero, ¿Por qué me quiero centrar tanto hacia el sistema
hexadecimal o “hex”? Primeramente por que los editores
hexadecimales definen todos los datos numéricos como
hexadecimales. Entonces, cuando utilices un script podrías
utilizar un editor hexadecimal para depurar el script, o sea,
corregir cualquier error. (haha, repito demasiado “hexadecimal” ¿No creen?, es para que se
acostumbren a este término, bastante importante en el ROM-Hacking a nivel universal, no sólo de Pokémon o de

GBA)

Bueno, tomaré de nuevo el ejemplo del libro de HackMew


pero ahora con otro enfoque.

Supongamos que ese libro te ha gustado mucho, pero hay un


pequeño problema, está en inglés, necesitarías traducirlo al
español ¿No?. La información es básicamente la misma, pero
necesitas traducirla a tu idioma para de esta forma entenderla.

Exactamente ocurre lo mismo con el sistema hexadecimal y


el sistema decimal ^^. El hexadecimal es el lenguaje del editor
(en el caso del libro sería el inglés) y el decimal el lenguaje que
utilizamos comúnmente. Los datos y la información son
exactamente iguales, pero expresado en otra forma u otro
sistema.
He aquí una pequeña tabla que nos muestra una comparación
de algunos números del sistema decimal con el sistema
hexadecimal, tomada de la guía oficial del XSE, hecha por
HackMew.

Decimal (Dec) Hexadecimal (Hex)


00 0x00
01 0x01
02 0x02
03 0x03
04 0x04
05 0x05
06 0x06
07 0x07
08 0x08
09 0x09
10 0x0A
11 0x0B
12 0x0C
13 0x0D
14 0x0E
15 0x0F
16 0x10
17 0x11
18 0x12
19 0x13

De modo que cuando queremos trabajar este tipo de


numeración en XSE podemos optar por 2 formas.
- Usar el prefijo “0x”, por ejemplo 0x1F4. El “0”
denota un número y el “x” que trabajamos con
hexadecimal.
- Utilizar el prefijo “&H”, por ejemplo &H3e8

Esto es bastante importante, ya que si no agregamos estos


prefijos el número será tratado como número decimal y se
distorsionará el valor. Por ejemplo si compilamos solamente
“12” valdrá eso, en cambio si compilamos 0x12 tomará el
valor de 19, ya que ese es su valor hexadecimal.

Y bueno, quisiera escribir algunas curiosidades que me


parecieron interesantes.
1.- El compilador de scripts no distingue mayúsculas ni
minúsculas al compilar un script. Da igual si compilas 0xF3
que 0xf3 o de esta forma 0xDa0E, aunque la “x” debe
siempre ir en minúscula.

2.- Muchos comandos y números en hexadecimal que se


compilan en un script utilizan la “ingeniería reversa” es
decir, si tu compilas 0x12AB00 en el editor aparecerá 00
AB 12.

Términos extraños
Imagina por tercera vez el mismo libro. (Otra vez la burra
al trigo ¬¬U!) Y… ¡Oh sorpresa!
Encuentras un párrafo mal escrito, hay palabras que le
faltan sílabas y letras, y no entiendes concretamente lo que dice
el párrafo.
Ahora comparémoslo con el ROM, la palabra en este caso es
el comando; las letras y algunas sílabas son los parámetros, con
esto quiero decir que una palabra no nos dice nada si no tiene
letras, al igual que un comando no nos dice nada si no tiene
parámetros, entonces un comando, por ende, necesita tenerlos,
para que de esta forma nos diga qué expresa en concreto, qué
valores tiene o qué es lo que hará.
Un claro ejemplo de un comando debe incluir un parámetro
y que no lo tiene:
Wildbattle

¿Qué significa esto?


Una batalla contra un Pokémon, sólo eso. Pero te
preguntarás ¿Qué Pokémon? ¿Qué nivel tiene? ¿En qué
escenario?
Pues bien, los parámetros nos responden a esas incógnitas,
entonces el mismo comando pero ahora con los parámetros
incluídos sería escrito de esta forma:
Wildbattle 0x4 0x5 0x0

Ahora podemos darnos cuenta de que se trata de una


batalla contra un Charmander, nivel 5 en un escenario regular.
Quiero pensar que quedó claro todo ^^U!

Ahora pasemos a lo demás, esos parámetros de los que hablé


ahora suelen escribirse en parejas de dígitos, por ejemplo 04, FE
o 9A. Un byte puede representar desde el 0 (00) hasta el 255
(FF), de hecho, los comandos que compilamos los ROM-Hackers
se convierten a bytes una vez compilados, al igual que toda la
información y datos que ingresamos a nuestra ROM, sean sprites,
minisprites, tiles, scripts, etc.
Así que, cuando compilamos un comando con parámetros, se
convierte todo a sistema hexadecimal.

Tal vez todo esto suene confuso en un inicio, pero hagamos un


resumen de algunas palabras raras utilizadas en el Scripting.

Byte:
La unidad más pequeña de información, consiste en una
pareja de dígitos en sistema hexadecimal. Puede significar desde
0 (00) hasta 255 (FF).

Word:
Es otro tipo de parámetro, este consiste en 2 bytes, es
decir, 2 parejas de dígitos, un ejemplo de ello es el “People ID”
del AdvanceMap.

Flag:
Es un tipo especial de “Word”, ésta mas bien actúa como
interruptor, ya que puede tener 2 tipos de valor, activado y
desactivado. (0 y 1)
Estas suelen utilizarse para evitar la repetición de un script o
para deshabilitar algun evento después de ocurrir otro.
Existen también “flags” especiales, las cuales nos permiten
activar la PokéDex, el PokéNav y las de las medallas de gimnasio.

Offset:
Es la dirección del ROM en la que se guarda el script que
hacemos. Un ejemplo podría ser 0x7A6B5A. Se forma por 3
bytes.

Pointer o Puntero:
Bueno, yo confundía este término con el de Offset, pero después
de leer la guía del XSE me dí cuenta que es casi lo mismo, la única
diferencia es que contiene un byte al inicio que determina qué
tipo de memoria accederá. Por lo ahora sólo utilizar la memoria
ROM, de modo que un puntero se conforma de esta forma, 1 byte
que determina el tipo de memoria al que accederemos y los
últimos 3 bytes nos indican el offset.
08 XX XX XX

Bueno, supongo que ya tienes una noción del lenguaje en el


scripting, el tipo de codificación que existe, qué es un puntero,
offset, parámetro, etc.

Traduciendo una ROM.


Ahora pasemos a la siguiente lección:
En lo personal, antes de saber scriptear yo solía traducir, así que
aprendiendo a traducir o cambiar un diálogo nos es fácil, les
enseñaré la forma en la que yo solía traducir ^-^.

Para eso necesitaremos el Thingy32, un editor hexadecimal que


soporta tablas.
¿Y qué es una tabla? Pues es un archivo que nos permite
interpretar cada byte de nuestra ROM como una letra, número o
signo y de esta forma poder crear nuestros diálogos.
El editor se encuentra en www.wah.studiopokemon.com en la
sección de herramientas y las tablas en esa misma página pero en
la sección Tablas.

Bueno, ahora aprenderemos a utilizar el Thingy32, lo abrimos, en


primera instancia nos pedirá el ROM, en tipo de archivo,
seleccionamos “Todos los archivos(*.*)” para que de esta forma
podamos encontrar nuestra ROM de GBA.
Pulsamos Abrir, ahora nos pedirá una tabla, la cual consiste en un
archivo con extensión TBL.
WAH tiene 3 tablas, ahora lo que nos interesa es la “Tabla.tbl”
La cual nos permite convertir cada byte a una letra, signo o clave,
como ya lo habia mencionado.
Cuando nos pida la segunda tabla, podemos optar por cancelar o
por abrir cualquier otra de las 2. Una vez que te hayas decidido
aparecerá esta pantalla.

Solo veo un montón de signos raros >_<. ¿Y dónde están los


diálogos ¬_¬…?
Recuerda que estás abriendo el ROM y que él contiene
absolutamente toda la información que lo hace funcionar,
diálogos, sprites, scripts, etc.
Los diálogos se encuentran en una parte del ROM, de modo que
podemos encontrarlo fácilmente.
Basta con pulsar “B”, aparecerá esto.
Ahora probemos con un diálogo que queramos modificar y lo
tecleamos en esa ventana, he aquí un ejemplo:

Ahora pulsamos “Enter”

Ahora el dicho de “El que busca encuentra” se hace tan real como
esto.
¿Y cómo lo selecciono x3!!!?
Pulsa la barra de espacio al inicio del texto, ahora desplázate con
el cursor hasta la “$” donde finaliza el mensaje, una vez que
llegues a este punto presiona de nuevo la barra de espacio.
Aparecerá esto:

Escribe tu propio diálogo.


Recuerda no pasarte de la línea, esto se evita poniendo las
claves de salto de línea, las dejo aquí, nos serán bastante útiles.
“$2” salto de línea automático.
“$1” Salto de párrafo. (Es cuando aparece la flecha roja al
final del texto)
“$$” Fin del texto.

Ahora pondré un ejemplo de estas 3 claves.

Ahora pulsamos Enter, se guarda automáticamente al hacer


cualquier cambio. Veamos cómo nos quedó en el emulador ^^.
Estilos de letra
Gracias a HackMew y su guía, pude enterarme de que puede
escribirse más de un estilo de letra, un gran truco para aquellos
que nos gusta variar de estilo ^^.
Utilizando bytes en el thingy.
Bueno, este es un tema que quise agregar debido a que nos
podría ser útil usar el nombre el protagonista, un color diferente
en los diálogos, variar el estilo de letra entre el estilo japonés y
el occidental, un búfer (esto último lo usan mas que nada los
scripters avanzados, no lo necesitaremos en un inicio), entre
otras cosas.

En el XSE todo esto es posible, pero preferiría explicarlo


cómo pueden hacerlo manualmente para que de esta forma
puedan dominar ambos métodos.

Bueno, modificaré este mismo texto para no buscar de


nuevo otro, y mostrarles cómo se pueden escribir bytes en el
Thingy32.

Editamos de nuevo

Ahora en lugar de escribir nuestro texto lo que haremos


será escribir una arroba "@” y nos aparecerá esto.
Ponemos el byte que queremos, y automáticamente el editor
lo reconocerá como ingresado.
¿Cómo podemos saber el byte que ingresamos?
Simple, los bytes aparecen debajo de donde escribimos, a
diferencia de los caracteres, signos, letras y números que
aparecen en donde escribimos.

Les dejo una serie de bytes combinados con las que pueden
hacer cosas interesantes.

Nombre del protagonista:


FD + 01

Todo esto que sigue se pone antes de nuestro texto, así que
recuerda guardar los suficientes espacios para insertar los
bytes, por ejemplo, asigna 3 espacios si quieres insertar 3 bytes.
He aquí algunos trucos.

Darle color a nuestro texto.


FC + 01 + Byte de color de texto:
Ejemplo FC + 01 + 02 para color rojo.
He aquí una tabla de los colores gracias a HackMew.
[Transparente] 00
[darkgrey_rs] 01
[red_rs] 02
[lightgreen_rs] 03
[blue_rs] 04
[yellow_rs] 05
[cyan_rs] 06
[magenta_rs] 07
[grey_rs] 08
[black_rs] 09
[black2_rs] 0A
[lightgrey_rs] 0B
[white_rs] 0C
[skyblue_rs] 0D
[darkskyblue_rs] 0E
[white2_rs] 0F

Estilo japonés de letra:


FC + 16

Estilo occidental de letra:


FC + 15

…:::Ingresar los movimientos:::…


Bueno, en esto también utilizaremos el Thingy32, pero
ahora cambiaremos la tabla llamada “tabla.tbl” a la tabla de
“Movimientos.tbl”, para hacer esto, no necesitas cerrar el
Thingy, basta con presionar “O” y seleccionar Abrir nueva tabla…

Ahora nuestra pantalla se ve así, no?


Bueno, aquí no cambiaremos ningún movimiento por otro, sino que
insertaremos nuevos en un espacio vacío del ROM, para aquellos
que no lo saben, Pokémon Ruby sólo utiliza casi el 60 o 70% de su
capacidad total de 16MB. De modo que nos queda muchísimo
espacio libre para poder ingresar los datos que queramos, como
scripts, diálogos o movimientos, entre muchas otras cosas, el
espacio libre se caracteriza por repetirse mucho los bytes FF y
00, como puedes observar los bytes se ubican al lado izquierdo
del editor.

Ahora vamos a un espacio libre del ROM.

Ahora podemos optar por 2 opciones, ingresarlos como bytes o


como claves de movimiento. Les dejo la lista de Bytes y la
intepretación de cada byte según la tabla.
Ni crean que traduciré cada movimiento >.<, así que si no saben
inglés les dejo una noción de lo que significa cada cosa.
Down=Abajo
Up=Arriba
Left=Izquierda
Right=Derecha
Slide=Deslizar
Run=Correr
Jump=Correr
Alert=Exclamación (!)
Question=Pregunta (?)
Love=Amor (♥) Sale un corazón.

HopTile=Cuando salta de una baldosa. (Esta imagen es un


ejemplo) (Díganme quien diablos les explica tan detalladamente
todo esto xD)
(Tomada del Pokémon Never Black&White, hecho por mi amigazo
Skoria)

Y ahora los números


0=Mirar
1=Caminar

00=Down0
01=Up0
02=Left0
03=Right0
04=Down1
05=Up1
06=Left1
07=Right1
08=Down2
09=Up2
0A=Left2
0B=Right2
0C=HopTileDown
0D=HopTileUp
0E=HopTileLeft
0F=HopTileRight
10=Delay0
11=Delay1
12=Delay2
13=Delay3
14=Delay4
15=Down3
16=Up3
17=Left3
18=Right3
19=StDown1
1A=StUp1
1B=StLeft1
1C=StRight1
1D=StDown2
1E=StUp2
1F=StLeft2
20=StRight2
21=StDown3
22=StUp3
23=StLeft3
24=StRight3
25=StDown4
26=StUp4
27=StLeft4
28=StRight4
29=Down3
2A=Up3
2B=Left3
2C=Right3
2D=Down4
2E=Up4
2F=Left4
30=Right4
31=SlideFaceDown
32=SlideFaceUp
33=SlideFaceLeft
34=SlideFaceRight
35=RunDown
36=RunUp
37=RunLeft
38=RunRight
39=St0
3A=HighHopDown
3B=HighHopUp
3C=HighHopLeft
3D=HighHopRight
3E=Up0A
3F=Down0A
40=mov40
41=mov41
42=JumpDown
43=JumpUp
44=JumpLeft
45=JumpRight
46=HopDown
47=HopUp
48=HopLeft
49=HopRight
4A=HopDown180
4B=HopUp180
4C=HopLeft180
4D=HopRight180
4E=Down0B
4F=StRun
50=mov50
51=mov51
52=mov52
53=mov53
54=Hide
55=Show
56=Alert
57=Question
58=Love
59=mov59
5A=Pokeball
5B=mov5B
5C=mov5C
5D=mov5D
5E=mov5E
5F=mov5F
60=mov60
61=mov61
63=Up0B
64=mov64
65=Right0A
66=RunStopLoopDown
67=RunStopLoopUp
68=RunStopLoopLeft
69=RunStopLoopRight
6A=StDown1i
6B=StUp1i
6C=StLeft1i
6D=StRight1i
6E=StDown5
6F=StUp5
70=StLeft5
71=StRight5
72=Down15
73=Up15
74=Left15
75=Right15
76=mov76
77=mov77
78=mov78
79=mov79
7A=Down6
7B=Up6
7C=Left6
7D=Right6
7E=RunDown2
7F=RunUp2
80=RunLeft2
81=RunRight2
82=Down7
83=Up7
84=Left7
85=Right7
86=IceSlideDown
87=IceSlideUp
88=IceSlideLeft
89=IceSlideRight
8A=8A
8B=8B
8C=8C
8D=8D
8E=8E
8F=8F
90=90
91=91
92=92
93=93
94=94
95=95
96=96
97=97
98=98
99=99
9A=9A
9B=9B
9C=9C
9D=9D
9E=9E
9F=9F
A0=A0
A1=A1
A2=A2
A3=A3
A4=A4
A5=A5
A6=A6
A7=A7
A8=A8
A9=A9
AA=AA
AB=AB
AC=AC
AD=AD
AE=AE
AF=AF
B0=B0
B1=B1
B2=B2
B3=B3
B4=B4
B5=B5
B6=B6
B7=B7
B8=B8
B9=B9
BA=BA
BB=BB
BC=BC
BD=BD
BE=BE
BF=BF
C0=C0
C1=C1
C2=C2
C3=C3
C4=C4
C5=C5
C6=C6
C7=C7
C8=C8
C9=C9
CA=CA
CB=CB
CC=CC
CD=CD
CE=CE
CF=CF
D0=D0
D1=D1
D2=D2
D3=D3
D4=D4
D5=D5
D6=D6
D7=D7
D8=D8
D9=D9
DA=DA
DB=DB
DC=DC
DD=DD
DE=DE
DF=DF
E0=E0
E1=E1
E2=E2
E3=E3
E4=E4
E5=E5
E6=E6
E7=E7
E8=E8
E9=E9
EA=EA
EB=EB
EC=EC
ED=ED
EE=EE
EF=EF
F0=F0
F1=F1
F2=F2
F3=F3
F4=F4
F5=F5
F6=F6
F7=F7
F8=F8
F9=F9
FA=FA
FB=FB
FC=FC
FD=FD
FE=Exit
FF=FF

Bueno, hemos llegado al final de este manual, espero y les haya


servido ^^.
Suerte!