Registrarse

[Otros] HGSS | Cómo añadir (desde cero) nuevos entrenadores

Mikelan98

WaH used to be a bigger place...
En este práctico tutorial, describiré las funciones básicas de cada uno de estos archivos, y de qué forma hay que editarlos para expandir el número de entrenadores disponibles.

A diferencia quizás de Pokémon Diamante, Perla y Platino, en HeartGold y SoulSilver hay un interés muy grande para saber cómo crear slots para entrenadores desde cero. Esto se debe a que, a la hora de colocar a un entrenador en un slot, hay que mirar que ese slot no esté asociado a un evento especial, a un número de PokéGear… Por eso, poder crear nuevos slots nos va a ahorrar un montón de trabajo en este sentido.

Los archivos que vamos a editar son los siguientes:

  • a/0/1/2_953 (script editable desde SDSME)
    [*]a/0/2/7_728 (texto editable desde SDSME)
    [*]a/0/2/7_729 (texto editable desde SDSME)
    [*]a/0/5/7
    [*]a/1/3/1

Vamos a describir qué hace cada archivo de los que hemos indicado, en el orden en el que sea más fácil de entender. Aun así, al final del post voy a dejar un link con los archivos ya editados, con el número de entrenadores expandido a 1600 (considero que no tiene sentido que repitáis paso a paso el tutorial, si os puedo mandar los archivos ya modificados).

Archivo de texto 728

En este archivo de texto están almacenadas todas las frases que pueden decir los entrenadores.



Al hablar o encontrarse con un entrenador .................. Al derrotar al entrenador .............. Cuando hablas con un entrenador derrotado


No se precisa un orden concreto en estos textos, aunque, por comodidad, los nuevos textos los añadiremos por tripletes (cuando te reta el entrenador 1, cuando pierde el entrenador 1, después del combate de entrenador 1, cuando te reta el entrenador 2, cuando pierde el entrenador 2…). De esta forma podremos localizarlos y editarlos fácilmente. Los nuevos textos los podemos colocar justo en el siguiente slot al último texto original (es decir, texto número 1717 en adelante).


Archivo de texto 729

En este archivo de texto se almacenan los nombres de los entrenadores (sólo sus nombres personales, no su categoría de entrenador). A diferencia del anterior archivo, el orden de los textos aquí es fundamental: el número del slot de texto se corresponde con el número del entrenador.

Como antes, podemos meter los nombres de los nuevos entrenadores a partir del último slot original del juego, es decir, desde el slot de texto 738 en adelante. El texto en el slot X corresponderá al nombre del entrenador número X.

Realmente, los entrenadores vamos a tener que meterlos a partir de 741, debido a que no vamos a poder usar el slot 740 (más adelante veremos por qué). Podríamos usar los slots 738 y 739, pero nos arriesgamos a confundirnos y tal...


Archivo a/0/5/7

Tal como describió MeroMero en su día, hace ya muchos años, este archivo binario relaciona los textos del archivo 728 con las condiciones en las que se muestran. El archivo original tiene un tamaño de 6868 bytes, con 4 bytes por slot de texto (es decir, tenemos 1717 referencias en este archivo, una para cada slot de texto). Los primeros 4 bytes se corresponden al primer texto del archivo 728; los siguientes 4 bytes se corresponden con el segundo texto; y así sucesivamente.

Como acabamos de decir, se dedican 4 bytes por texto para asignar su función. El formato, por hacer analogía a los tutoriales de MeroMero, es TT TT MM 00, donde:

TT TT es el número del slot de entrenador (siempre en little endian, por supuesto)
MM es la condición necesaria para que ese texto se muestre
00 es el padding (relleno) con ceros

Las condiciones para que los mensajes se muestren (en hex y en inglés):

00 Trainer text upon noticing you or if you talk to him/her (overworld)
01 Trainer text if you defeat him/her (fight)
02 Trainer text after you defeated him/her (overworld)
0F Trainer text if he sends in his/her last conscious Pokémon (fight)
10 Trainer text if his/her last conscious Pokémon is on critical health (fight)
14 Trainer text if you lose or draw (fight)

03 First trainer text upon noticing you or if you talk to him/her (overworld)
04 First trainer text if you defeat him/her (fight)
05 First trainer text after you defeated him/her (overworld)
06 First trainer text if you only have 1 conscious Pokémon before engaging the fight (overworld)
07 Second trainer text upon noticing you or if you talk to him/her (overworld)
08 Second trainer text if you defeat him/her (fight)
09 Second trainer text after you defeated him/her (overworld)
0A Second trainer text if you only have 1 conscious Pokémon before engaging the fight (overworld)

Para entrenadores normales (los que vamos a insertar) sólo nos van a hacer falta los números 00, 01 y 02. Estos números se deben especificar poniendo siempre el número 00 antes que los otros dos (luego veremos por qué).

Un esquema de todo esto sería:

Código:
{offset en el archivo = slot entrenador x 4} [TT TT MM 00]
En resumidas cuentas, nos bastaría con colocar lo siguiente al final del archivo binario:

Código:
E5 02 00 00 E5 02 01 00 E5 02 02 00
E6 02 00 00 E6 02 01 00 E6 02 02 00
E7 02 00 00 E7 02 01 00 E7 02 02 00
E8 02 00 00 E8 02 01 00 E8 02 02 00
…
Siempre y cuando hayamos puesto nuestros nuevos textos justo detrás de los textos originales, en el archivo de texto 741, y organizados por tripletes como ya hemos comentado.

Archivo a/1/3/1

MeroMero fue capaz de descubrir cómo funcionaba el anterior archivo, pero no fue capaz de hallar este. El hecho de no modificar este archivo, a efectos del juego, se traduce en un pequeño freeze (durante aproximadamente 50 frames) que, si bien no crashea el juego, resulta bastante evidente que "algo" le pasa.

Este archivo representa, ni más ni menos, que una serie de punteros hacia la primera referencia del entrenador que encontremos en el archivo a/0/5/7. Es un poco lioso, lo sé, así que lo voy a explicar mejor. El archivo tiene teóricamente un tamaño de 1476 bytes (en realidad es ligeramente inferior, pero da igual). El tamaño de los offsets es de 2 bytes, por lo que tenemos 738 referencias (una para cada entrenador). Los offsets representan la dirección de memoria, en el archivo a/0/5/7, donde ese entrenador tiene su mensaje con la condición 00, es decir, su primer mensaje.

Si vamos a expandir este archivo, simplemente tenemos que fijarnos en qué offset hemos escrito el primer nuevo triplete, en a/0/5/7, e ir sumando 3 x 4 bytes (0xC) en cada halfword (es decir, cada entrenador ocupa 3 entradas por 4 bytes; cada halfword debe incrementarse en 12).

Si nuestro primer nuevo entrenador está en el slot 741, podemos empezar a escribir esto en el offset 0x5CA del archivo:

Código:
D4 1A
E0 1A
EC 1A
F8 1A
04 1B
...

Archivo de scripts 953

Aquí no me voy a enrollar mucho: cuando asignamos un script de entrenador a un NPC (recordemos, el script es un número de 3000 para arriba) el juego le resta 2999 y se dirige hacia el script correspondiente al resultado. Es decir, el evento con script 3000, que corresponde al entrenador 1, ejecuta el Script #1 del archivo de scripts 953.

Ahora bien, si nos fijamos, todos los scripts de ese archivo (salvo el Script #1 y el Script #740) tienen un único comando, UseScript_#1. Realmente, en este archivo de script no importa el script por donde hayamos entrado, sino el número de dicho script.

El Script #740, sin embargo, sí tiene un uso fundamental cuando un entrenador nos ve a distancia y muestra la exclamación (cuando somos nosotros los que hablamos con el entrenador, por el contrario, ejecutaremos el Script #1). Esta es la razón por la cual nuestros nuevos entrenadores deben ser insertados a partir del slot 741: habría un "conflicto" y al hablar con el entrenador 740 estaríamos ejecutando un comando genérico para todos los entrenadores.

Para ampliar el archivo, simple y llanamente, tenemos que crear más scripts a partir del 740, cuyo único comando sea UseScript_#1. Fácil, ¿no?


Descargar archivos ya editados

Sé que habéis venido a por esto, así que aquí lo tenéis.

https://www.mediafire.com/file/dh56ce6f9acdf2e/newtrainers.7z/file

Solo tenéis que reemplazar cada archivo que os he dejado. No he incluido los archivos de texto en el zip, ya que difieren en cada idioma de la ROM y es muy fácil añadir nuevos textos con el SDSME.


Anexo: Friendly reminder de cómo asignar entrenadores a eventos

Como muchos no los sabréis o no lo tendréis muy claro, os explico cómo asignar entrenadores a NPCs con SDSME. Nos vamos a la pestaña de Overworlds, configuramos los demás aspectos del NPC (el minisprite que usa, sus coordenadas...) y nos fijamos en la siguiente imagen.


  • Rojo: Flag de entrenador; 0 si no es entrenador, 1 si lo es (en nuestro caso, sí)
  • Azul: Número de entrenador + 2999 (p. ej. Entrenador #1 - Script 3000; Entrenador 741 - Script #3740)
  • Verde: Número de pasos desde los que te puede ver (si este número es 0, no te verá y hay que hablar con el NPC para iniciar el combate)
 

XLuma

Pequeño saltamontes
Sorry, but I only know english
I think there is an interest in knowing how to do this for games like Platinum. The narcs are the same, except for one thing: trdata
SDSME doesnt have a function to edit the trainer's scripts unlike HGSS, do you have some way to edit them ? Like a standalone script editor ?
 
Arriba