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

Avisos

Like Tree26Gracias

Respuesta
 
Herramientas Desplegado
  #1  
09/02/2015
Predeterminado PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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:


Estructura

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.

Scripts: .lsd, .ssa y .ssb

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.

Archivos .lsd

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 .ssa

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

Archivos .ssb

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.

Comandos para los .ssb

Mostrar texto por pantalla

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]

Mostrar una cara

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]

Mover un minisprite

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]

Esperar

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)]

Música y sonido

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]

Efectos visuales

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]

Especiales

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] [?]

IDs

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!
  #2  
09/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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
Gracias: Piplup-fan
  #3  
09/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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.
Gracias: Piplup-fan


'Aprende obsequiar tu silencio, a quien no te pide palabras. Y tu ausencia, a quien no pide tu presencia.'


Mi RPG


"Because you're the only thing I want to protect."
Pokemon: Neutral Love. Coming Soon.
  #4  
09/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
@@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í.
Gracias: Piplup-fan

¡Gracias a todos!
No habría recibido este premio sin:
El Señor del Agua y la Arena | Un Cuento de Madrid | En el Festival de la Victoria | Hijos del Bosque, Hijos del Viento | La Biblioteca Olvidada



¡Gracias, Rata! Se te recuerda... :c
  #5  
09/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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:
Gracias: Piplup-fan


"Es más fácil vivir tan solo de acuerdo a tus propias reglas."
  #6  
09/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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.
Gracias: Piplup-fan
¡Alabado sea el Helix!




¡Cliquea aquí, por probar no se pierde nada!

*-*

Paso 1: Ctrl+F
Paso 2: Pulsa "V"

KKKKKKKKKKKKKKKKKKKKKKKKK
KKKKKKKKKVKKKKVKKKKKKKKKK
KKKKKKKKKVKKKKVKKKKKKKKKK
KKKKKKKKKVVVVVVKKKKKKKKKK
KKKKKKKKKVKKKKVKKKKKKKKKK
KKKKKKKKKVKKKKVKKKKKKKKKK
KKKKKKKKKKKKKKKKKKKKKKKKK

  #7  
10/02/2015
Predeterminado
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.
Gracias: Piplup-fan
  #8  
16/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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.

Estructura

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.

Scripts: .lsd, .ssa y .ssb

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.

Archivos .lsd

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 .ssa

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

Archivos .ssb

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!
Scripting en Mundo Misterioso 2!




Thanks to kazeh



Y tú... ¿Qué Lex eres?



Y por cierto... Plup!
  #9  
16/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
¡Vaya!

Que bueno! Gracias por el aporte ^^
Gracias: Piplup-fan

Retirado del RomHacking




Skype: scriptercheve
Twitter: The Moon Lover



"Cuando oigas a un niño preguntar
Por qué el sol viene y se va
Dile: porque en esta vida no hay
Luz sin oscuridad"


  #10  
16/02/2015
Predeterminado Respuesta: PMM2 | [En proceso] Scripting en Pokémon Mundo Misterioso 2
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!
Gracias: Piplup-fan


"Es más fácil vivir tan solo de acuerdo a tus propias reglas."
Respuesta

Herramientas
Desplegado

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado
Trackbacks are Activado
Pingbacks are Activado
Refbacks are Desactivado



Extra
Estilo clásico
La franja horaria es GMT +1. Ahora son las 14:01.