ATENCIÓN: Todo en este post está sujeto a investigación y debe ser comprobado con detalle. Por tanto, es posible que nada de lo que se escriba aquí sea cierto.
Hola a todos. Recientemente vi un post en PokéCommunity (éste), en el cual el usuario Nerketur presentaba una herramienta que abría determinados tipos de archivos de los ROMS de Mundo Misterioso 2 (Oscuridad y Tiempo) en versión USA. En concreto, la herramienta abre .ssa, .ssb y .lsd, entre otros.
Estos archivos son los que almacenan TODOS los scripts del juego. En su momento (junio de 2012) Nerketur ya los investigó, y se puede ver que consiguió descifrar buena parte de estos archivos. Ahora he querido investigar yo estos scripts, intentando continuar lo que él comenzó.
En concreto, he estado investigando los archivos .ssb, que contienen los comandos de los scripts (mover minis, mensajes, etc.). Los archivos .ssa, sobre los que aún no he indagado nada, parecen tener información como los Pokémon que intervienen, su situación inicial o el mapa en el que tiene lugar el script (investigado por Nerketur).
Más adelante (en un futuro post) explicaré exhaustivamente cómo funcionan estos archivos, pero ahora escribo una lista de los comandos que he conseguido entender:
Por favor, comentad qué os parece! ;D
That's all,
Plup!
Hola a todos. Recientemente vi un post en PokéCommunity (éste), en el cual el usuario Nerketur presentaba una herramienta que abría determinados tipos de archivos de los ROMS de Mundo Misterioso 2 (Oscuridad y Tiempo) en versión USA. En concreto, la herramienta abre .ssa, .ssb y .lsd, entre otros.
Estos archivos son los que almacenan TODOS los scripts del juego. En su momento (junio de 2012) Nerketur ya los investigó, y se puede ver que consiguió descifrar buena parte de estos archivos. Ahora he querido investigar yo estos scripts, intentando continuar lo que él comenzó.
En concreto, he estado investigando los archivos .ssb, que contienen los comandos de los scripts (mover minis, mensajes, etc.). Los archivos .ssa, sobre los que aún no he indagado nada, parecen tener información como los Pokémon que intervienen, su situación inicial o el mapa en el que tiene lugar el script (investigado por Nerketur).
Más adelante (en un futuro post) explicaré exhaustivamente cómo funcionan estos archivos, pero ahora escribo una lista de los comandos que he conseguido entender:
Absolutamente todos los scripts del juego se encuentran dentro de una carpeta llamada SCRIPTS. Dentro de ésta, hay 222 carpetas. No las listaré todas por un tema de esfuerzo, pero hay 221 con nombres muy similares y otra llamada COMMON.
En SCRIPTS/COMMON solo hay un archivo: unionall.ssb . No sé cuál es su utilidad, puede que lleve eventos comunes que se llaman muchas veces o alguna otra cosa, no sé.
Las otras 221 carpetas tienen un nombre que sigue esta pauta:
*A dos carpetas les falta la última letra, y excepto COMMON, el resto siguen la pauta
A diferencia de COMMON, el resto de carpetas llevan dentro un archivo .lsd, y como mínimo (pero no siempre) un .ssa y un .ssb .
En cada carpeta se encuentran todos los scripts que tienen lugar en un sólo mapa, así que es de suponer que en algún otro archivo se encuentra codificado esto.
En SCRIPTS/COMMON solo hay un archivo: unionall.ssb . No sé cuál es su utilidad, puede que lleve eventos comunes que se llaman muchas veces o alguna otra cosa, no sé.
Las otras 221 carpetas tienen un nombre que sigue esta pauta:
Código:
X##X##X (X=letra, #=número)
A diferencia de COMMON, el resto de carpetas llevan dentro un archivo .lsd, y como mínimo (pero no siempre) un .ssa y un .ssb .
En cada carpeta se encuentran todos los scripts que tienen lugar en un sólo mapa, así que es de suponer que en algún otro archivo se encuentra codificado esto.
Los archivos .ssa y .ssb se encuentran dentro de las carpetas anteriormente mencionadas. La mayoría de veces hay un .ssa y un .ssb con el mismo nombre: son los scripts del juego en sí. Además, hay otros archivos .ssb, llamados enter##.ssb, donde # es un número, y un enter.sse . Como su nombre parece indicar, son los encargados de gestionar los warps del juego, aunque no sé como aún.
Los archivos .lsd son muy sencillos. Hay uno por carpeta*, y tiene el mismo nombre que ésta. Lo único que indican es qué archivos hay en la carpeta en cuestión, exceptuando los archivos enter## .
*Sólo hay archivo .lsd si en la carpeta en cuestión hay archivos .ssa y .ssb además de los enter##.ssb
*Sólo hay archivo .lsd si en la carpeta en cuestión hay archivos .ssa y .ssb además de los enter##.ssb
Archivos que parecen contener datos varios sobre los scripts, como por ejemplo la posición inicial de los Pokémon y objetos que aparecen, así como (posiblemente) las coordenadas de la cámara, etc.
Código:
Información conseguida por Nerketur, des del principio del archivo:
KKKK LLLL A B C D E F G Z
KKKK: Número de grupos Z que tiene el archivo
LLLL: Número de grupos (suma de grupos A, B, C, D, E, F y G)
A (función desconocida):
AAAA BBBB CCCC DDDD
B (información sobre Pokémon):
AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH
AAAA: ID del Pokémon
BBBB: Dirección hacia la que mira
CCCC: Posición en el mapa (coordenada X)
DDDD: Posición en el mapa (coordenada Y)
EEEE: ???
FFFF: ???
GGGG: ???, si no se usa es "FFFF"
HHHH: Siempre es "FFFF"
C (probablemente información sobre objetos):
AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ
AAAA: ID del objeto
BBBB: ???
CCCC: ???
DDDD: ???
EEEE: Posición en el mapa (coordenada X)
FFFF: Posición en el mapa (coordenada Y)
GGGG: ???
HHHH: ???
IIII: ???, si no se usa es "FFFF"
JJJJ: Siempre es "FFFF"
D (probablemente información sobre la cámara):
*exactamente igual que los grupos C*
No se sabe nada de los grupos E, F, G y Z
Aquí se encuentran los comandos que se ejecutan con el script (mensajes, mover personajes, etc.), así como las cadenas de texto que se muestran en el script.
Los comandos 009B, 0099 y 009A muestran una frase por pantalla. 009B se usa para los mensajes de cualquier personaje.
0099 0039 se usa para las frases que el protagonista dice, y tienen una estructura especial (if else), que escoge entre dos frases (una para macho y otra para hembra) como sea necesario.
009A 003A se usa para las frases que dice nuestro compañero. También tiene una estructura especial (if if else), que escoge entre tres frases dependiendo de su personalidad (probablemente en las versiones europeas también dependa de su género).
0099 0039 se usa para las frases que el protagonista dice, y tienen una estructura especial (if else), que escoge entre dos frases (una para macho y otra para hembra) como sea necesario.
009A 003A se usa para las frases que dice nuestro compañero. También tiene una estructura especial (if if else), que escoge entre tres frases dependiendo de su personalidad (probablemente en las versiones europeas también dependa de su género).
Código:
Mensaje normal
009B XXXX [ID de la frase]
Habla el protagonista (if else)
0099 0039
005A 0004 XXXX [ID de la frase para macho]
0061 XXXX [ID de la frase para hembra]
Habla el compañero (if if else)
009A 003A
005A 0001 XXXX [ID de la frase para personalidad 1]
005A 0002 XXXX [ID de la frase para personalidad 2]
0061 XXXX [ID de la frase para personalidad 3]
0092 muestra en pantalla el gráfico de una cara. Tras 0092 hay que escribir la ID del Pokémon en cuestión, la expresión facial que estará haciendo y la posición en la que se mostrará el gráfico.
Código:
0092 XXXX XXXX XXXX [ID Pokémon] [ID expresión facial] [ID posición en pantalla]
Antes de realizar el movimiento (y algunos otros comandos), se encuentra 0077, un simple indicador del Pokémon que debe realizar el comando siguiente.
00AB es un comando muy complicado. Tras él hay que escribir cinco datos. El segundo y el tercero podrían ser la velocidad (no sé cuál de ellos), mientras que el cuarto y el quinto son las coordenadas hasta las que se mueve el minisprite en cuestión.
IMPORTANTE: Tengo la teoría que, a diferencia de los juegos de GBA, en Mundo Misterioso los tiles (y por tanto coordenadas) van de 8 píxeles en 8. Al escribir las coordenadas esto podría ser muy importante.
00AB es un comando muy complicado. Tras él hay que escribir cinco datos. El segundo y el tercero podrían ser la velocidad (no sé cuál de ellos), mientras que el cuarto y el quinto son las coordenadas hasta las que se mueve el minisprite en cuestión.
IMPORTANTE: Tengo la teoría que, a diferencia de los juegos de GBA, en Mundo Misterioso los tiles (y por tanto coordenadas) van de 8 píxeles en 8. Al escribir las coordenadas esto podría ser muy importante.
Código:
Indicador de qué minisprite realiza el comando
0077 XXXX [ID Pokémon]
Mover un minisprite
00AB XXXX XXXX XXXX XXXX XXXX [?] [velocidad (probablemente)] [velocidad (probablemente)] [coordenada de destino X] [coordenada de destino Y]
0129 hace que el script se pause por un número de frames, escrito en hexadecimal.
0034 hace que el programa se pause hasta que se pulsa un botón. Las IDs de los botones en cuestión están por ser investigadas aún.
0034 hace que el programa se pause hasta que se pulsa un botón. Las IDs de los botones en cuestión están por ser investigadas aún.
Código:
Esperar un número determinado de frames
0129 XXXX [cantidad de frames]
Esperar a pulsar un botón
0034 XXXX [ID del botón (probablemente)]
Tanto 001C como 0021 sirven para reproducir una canción usando un fundido de entrada (sube progresivamente el volumen), no sé la diferencia entre uno y otro. Tras el comando, hay que escribir el ID de la canción, cuánto dura el fundido de entrada (0000 si no se quiere fundido) y el volumen al que llegará la música tras el fundido.
Tanto 001A como 001F, por su parte, ejecutan un fundido de salida (el volumen desciende progresivamente hasta el silencio total). No hace falta especificar nada más que la duración del fundido de salida.
00D9 reproduce un efecto de sonido, el cual se especifica tras el comando.
Tanto 001A como 001F, por su parte, ejecutan un fundido de salida (el volumen desciende progresivamente hasta el silencio total). No hace falta especificar nada más que la duración del fundido de salida.
00D9 reproduce un efecto de sonido, el cual se especifica tras el comando.
Código:
Fundido de entrada de música
001C XXXX XXXX XXXX [ID canción] [duración del fundido en frames] [volumen final]
0021 XXXX XXXX XXXX [ID canción] [duración del fundido en frames] [volumen final]
Fundido de salida de música
001A XXXX [duración del fundido en frames]
001F XXXX [duración del fundido en frames]
Reproducir efecto de sonido
00D9 XXXX [ID efecto de sonido]
00CD realiza un fundido a negro de la pantalla superior, y 00BE lo realiza en la pantalla inferior. Se puede especificar su duración, y desconozco que es lo que se debe escribir antes.
00C7 hace un fundido a blanco, y se puede especificar su duración también. Aún debo investigar si sólo funciona para una pantalla o para las dos, o si eso se puede especificar.
00C7 hace un fundido a blanco, y se puede especificar su duración también. Aún debo investigar si sólo funciona para una pantalla o para las dos, o si eso se puede especificar.
Código:
Fundido en pantalla superior
00CD XXXX XXXX [?] [duración del fundido en frames]
Fundido en pantalla inferior
00BE XXXX XXXX [?] [duración del fundido en frames]
Fundido a blanco
00C7 XXXX XXXX [?] [duración del fundido en frames]
0065 realiza movimientos especiales, como los saltos, rotar sobre si mismo, etc. Tras el comando se debe escribir la ID del movimiento en cuestión, y algo que aún no he averiguado.
00DF muestra un icono expresivo sobre la cabeza de un minisprite, que se especifica a continuación del comando.
Antes de estos comandos también se debe usar 0077 para indicar qué minisprite debe realizar el movimiento.
00DF muestra un icono expresivo sobre la cabeza de un minisprite, que se especifica a continuación del comando.
Antes de estos comandos también se debe usar 0077 para indicar qué minisprite debe realizar el movimiento.
Código:
Movimientos especiales de minisprites
0065 XXXX XXXX [ID del movimiento] [?]
Mostrar icono expresivo
00DF XXXX XXXX [ID del icono] [?]
Código:
POKÉMON
0000 Protagonista
0004 Compañero
0038 Koffing/Zubat (no sé cuál es cuál)
0041 Koffing/Zubat (no sé cuál es cuál)
0045 Lapras
0051 Grovyle
EXPRESIONES FACIALES
0000 Normal ·-·
0001 Sonreír ^o^
0002 Daño >-<
0004 Preocupación ´-`
000B Adoración @o@
000C Sorpresa OoO'
POSICIÓN DE LAS CARAS
0000 Abajo izquierda
0005 Abajo izquierda (parece ser que éste es específico para el protagonista)
0006 Abajo derecha
ICONOS EXPRESIVOS
0058 Icono exclamación
005B Sorpresa grande
00AB Gotas rápidas
00AC Sorpresa pequeña
01C0 Sorpresa grande
MOVIMIENTOS ESPECIALES
0027 Sorpresa
0029 Saltos rápidos
0045 Negación rápida
0047 Caminar sin moverse (se usa para cuando algún personaje explica algo muy largo)
Por favor, comentad qué os parece! ;D
That's all,
Plup!