Registrarse

PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2

Estado
Cerrado para nuevas respuestas.
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:


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:
Código:
X##X##X (X=letra, #=número)
*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.
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
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).
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.
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.
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.
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.
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.
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!
 

Oigres

Wu&#596;&#613;o &#592; &#623;u&#596;&#613;o
Wow, ¡WOW! Increíble, estaría de putísima madre hacer un programa compilador de esto... ¡JODER!
@Tyren Lannister , seguro que esto te interesa, recuerdo que prefieres los MM a los juegos normales ;D
 

Drive

Cazador de subnormales
Staff
Redactor/a
Bueno, todos saben que cualquier cosa referente a NDS tendrá mi apoyo y participación (si quieren). Así que me parece estupendo lo que acabas de traer y aportar.
 

Tyren Sealess

A fullmetal heart.
@@Tijeras77, cómo sabía que la mención era aquí y tuya. Pues sí, aportazo donde los haya, si en un futuro logro aprender lo suficiente de gba como para dar el salto a nds, quizá sea con esto. Eso sí, por lo que he visto es bastante menos intuitivo que otros tipos de scripting; hay un buen trabajito aquí.
 

SuperNeku

~ Fantasma de RomHacker ~
Gwah. Lo has hecho, Piplup. *~* Mucha suerrte con ello. Te animo desde el otro lado de la pantalla. Siempre me han gustado más los MM. :O
Pro. c:
 

H.B.P

Emperador Kaktiácero
Miembro de honor
Toda investigación referente a PMM es bien recibida, y ya si hablamos de PMM2 pues más todavía, de hecho es una gran saga y debería de haber más avances, así que muchísimas gracias por tu aporte.
 

CelticFrostie

Sexador de pollos
Bueno, esto ya es la repanocha.
Aunque lo hubiera preferido en GBA (tiene que ser más fácil (?)), meterse con DS, y más con juegos ajenos a la saga principal ya es de echarle muchos huevos.
En fin, poco más que comentar ya que no hay todavía un compilador para nuevos scripts, sólo desearte mucha suerte y agradecerte que te tomes la molestia de investigar en éste tipo de plataformas, que es lo que nos falta.
 
Hola. Después de días investigando a ratos, tengo alguna información más sobre los scripts y su funcionamiento, pero hoy es más teórica. Mucha de esta información fue descubierta por Nerketur, el resto ha sido descubierta por mí. Yo sólo pongo en común todo el conocimiento que pueda.

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:
Código:
X##X##X (X=letra, #=número)
*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.
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
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.


Eso es todo por hoy, comenten qué les parece esto! También post principal actualizado con esta información ;D

That's all,

Plup!
 

SuperNeku

~ Fantasma de RomHacker ~
Joder, tío. Que vas enserio con esto de destripar PMM. x'D!
No sé cómo hacéis, dude. Pero te animo, Piplup-Ñam.
Máquinas los de WaH. xD!
 

DeadApolo

A'KERIA'S TRACES
brutal, ya estamos mas cerca de los hacks MM xD, sigue así que de seguro pasarán a la historia con todo esto xD.

Atte:

ApoloD
 

H.B.P

Emperador Kaktiácero
Miembro de honor
Veo que la cosa avanza, bien, espero que pronto logres traer más novedades sobre la investigación, los fundamentos teóricos que encontraste están bien ordenados por ahora.
 
Estado
Cerrado para nuevas respuestas.
Arriba