Registrarse

[Scripting] E | Wildbattle modificable (nick/estado/nivel/HP/stats)

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
E|Scripting|Wildbattle modificable (nick/marca/estado/nivel/HP/stats)

Sí, para aquellos que usáis Emerald (U) os traigo la versión de éste tuto que saqué para FR ayer. He reinvestigado a partir del data de esmeralda y como veis los resultados son los mismos. Os dejo las direcciones y todos los datos que necesitéis en éste tuto. Está todo comprobado,admito que he jugado un ratito con la rom de Esmeralda ;)
¡Hola WAH! Hoy traigo con mucha ilusión un tema que llevo investigando desde hace varios días. Se trata del data estructure de un pokémon salvaje. Gracias a que la web de Bulbapedia te da el orden del data pokémon y el offset desde donde se cargan los wildbattle he conseguido realizar una investigación. El resultado ha sido éste, un wildbattle personalizable.

Con este tuto podréis personalizar éstas características del pokémon salvaje:
  • Nick
  • Marca
  • Estado
  • Nivel
  • Cantidad de puntos de vida
  • Cantidad máxima de puntos de vida
  • Estadísticas (Atk,Def,Vel,SpAtk,SpDef)

¡Y si! ¡Todas estas características se mantienen si el pokémon es capturado!


(Ahora te menciono a ti @Jaizu[/MENTION] x'D. Te lo dedico)​

¿Cómo lo hacemos?

Sencillo, aprovecharemos los comandos setwildbattle y dowildbattle para cambiar antes de empezar el combate todas las características del pokémon salvaje mediante writebytetooffsets (WBTOs):

Os dejo un ejemplo y el fragmento que lo definió:
Código:
[...]
setwildbattle 0x8 0x5 0x0 
writebytetooffset 0xC4 0x202474C "J de JAIZU LOL"
writebytetooffset 0xBB 0x202474D "A  de JAIZU LOL"
writebytetooffset 0xC3 0x202474E "I de JAIZU LOL"
writebytetooffset 0xD4 0x202474F "Z de JAIZU LOL"
writebytetooffset 0xCF 0x2024750 "U de JAIZU LOL"
writebytetooffset 0x00 0x2024751 "Espacio intermedio entre JAIZU y LOL"
writebytetooffset 0xC6 0x2024752 "L de JAIZU LOL"
writebytetooffset 0xC9 0x2024753 "O de JAIZU LOL"
writebytetooffset 0xC6 0x2024754 "L de JAIZU LOL"
writebytetooffset 0xFF 0x2024755 "10mo espacio borrado del nick"
writebytetooffset 0xA 0x202475F  "Marcado con cuadrado y corazón"
writebytetooffset 0x8 0x2024794  "Estado envenenado"
writebytetooffset 254 0x2024798 "Nivel=254"
writebytetooffset 0x37 0x202479A "Primer byte de salud"
writebytetooffset 0x2 0x202479B  "Segundo byte de salud"
writebytetooffset 0xF7 0x202479C  "Primer byte de salud máxima"
writebytetooffset 0x2 0x202479D "Segundo byte de salud máxima"
writebytetooffset 255 0x20247a6 "Defensa especial = 255"
dowildbattle
end
[…]

Código:
setwildbattle 0x(especie pokémon) 0x(nivel) 0x(objeto)
Éste primer comando generará un nuevo pokémon salvaje según su especie, nivel y objeto en 0x202474C (la propia que usa el juego para los pokémon salvajes, trankis, es segura). Tras ello, modificaremos éste data creado en dicha dirección mediante WBTOs para personalizarlo.

Código:
dowildbattle
Éste comando cerrará la serie de WBTOs intermedios y realizara el wildbattle que hemos diseñado gracias a los anteriores comandos.

WBTOS

Antes de empezar os recuerdo que XSE convertirá cualquier parámetro numérico igual o inferior a 255 a su versión en hexadecimal, por lo que es lo mismo escribir en XSE el parámetro 10 que el 0xA.

Es lo mismo...
Código:
writebytetooffset 0xFE 0x2024798
...que escribir:
Código:
writebytetooffset 254 0x2024798
(XSE nunca leerá ni convertirá parámetros superiores a 255)

Por lo tanto, no tendréis que buscar valores superiores a 255 para los bytes, solo lo haréis en caso de los words, es decir, las parejas de bytes. (Tranquilos, Os dejo un link a un conversor decimal-hexadecimal para que os sea más sencillo: Conversor binario/decimal/hexadecimal)
Y ahora vamos a ver los WBTOs que he investigado:

Nick


En éste apartado le damos un Nick al pokémon salvaje. El Nick se compone de 7 letras. Pensad que las letras deben estar en hex (Os dejo éste link a una herramienta del usuario kakaroto para ello: [Tool] Text Hex Convert - The PokéCommunity Forums
Código:
writebytetooffset 0x1 0x202474C
writebytetooffset 0x2 0x202474D
writebytetooffset 0x3 0x202474E
writebytetooffset 0x4 0x202474F
writebytetooffset 0x5 0x2024750
writebytetooffset 0x6 0x2024751
writebytetooffset 0x7 0x2024752
writebytetooffset 0x8 0x2024753
writebytetooffset 0x9 0x2024754
writebytetooffset 0x10 0x2024755
Como anotación rápida no es lo mismo un espacio que un texto vacío. El espacio es el byte 0x00 y el espacio vació es 0xFF. Parecerá tonto pero si queréis que el Nick sea menor a 0x7 deberéis rellenar el espacio del nickname que no vayáis a utilizar con 0xFF empezando por el final. Pensad que si no lo hacéis se verán los caracteres propios del pokémon.

Marca


La marca yo lo considero algo sin importancia pero se puede cambiar también, lo define así:
Código:
writebytetooffset 0x(byte) 0x202475F
Lista de bytes:
Código:
	0x0 	nada
	0x1	círculo
	0x2	cuadrado
	0x3	0x1+0x2
	0x4 	triángulo
	0x5	0x1+0x4
	0x6	0x2+0x4
	0x7	0x2+0x1+0x4
	0x8	corazón
	0x9	[…] combinaciones siguientes con 0x8

Estado


¿Quién no ha deseado en un evento combatir con un Snorlax mientras duerme? Pues con esto podrás añadirle efectos de estado al pokémon salvaje mediante la modificación de un byte.
Código:
writebytetooffset 0x(byte) 0x2024794
Código:
	0x0 a 0x7	SLP 	Dormido (0 turnos) a Dormido (7 turnos)
	0x8 		PSN 	Envenenado
	0x10 		BRN 	Quemado
	0x20 		FRZ 	Congelado
	0x40 		PAR 	Paralizado
	0x80 		PSN2 	Tóxico
Por ejemplo, si queremos que nuestro pokémon salvaje aparezca con el estado dormido y le dure 3 turnos usaremos:
Código:
	writebytetooffset 0x3 0x2024794
A parte de estos estados el juego tiene otros estados válidos pero que permanecen ocultos, éstos son los estados dobles dónde uno actúa de principal (el que vemos) y otro de secundario aunque, en realidad, se activen ambos. ¿Veneno paralizante? Sí, existe en el propio juego y es totalmente válido. Os dejo una lista de las combinaciones que he comprobado durante mi investigación:

Código:
0x0 a 0x7	 SLP (0) a SLP (7)
0x8	 	 PSN
0x9 a 0xF	 SLP (0) a SLP (7) + PSN
0x10	 	 BRN
0x11 a 0x17 	SLP (0) a SLP (7) + BRN
0x18	 	 PSN + BRN
0x19 a 0x1F	SLP (0) a SLP (7) + PSN + BRN
0x20	 	 FRZ
0x21 a 0x27 	SLP (0) a SLP (7) + FRZ
0x28	 	 PSN + FRZ
0x29 a 0x2F 	SLP (0) a SLP (7) + PSN + FRZ
0x30	 	 BRN + FRZ
0x31 a 0x37 	SLP (0) a SLP (7) + BRN + FRZ
0x38	 	 PSN + BRN + FRZ
0x39 a 0x3F 	SLP (0) a SLP (7) + PSN + BRN + FRZ
0x40	 	 PAR
0x41 a 0x47 	SLP (0) a SLP (7) + PAR
0x48	 	 PSN + PAR
0x49 a 0x4F 	SLP (0) a SLP (7) + PSN + PAR
0x50	 	 BRN + PAR
0x51 a 0x57 	SLP (0) a SLP (7) + BRN + PAR
0x58	 	 PSN + BAR + PAR
0x59 a 0x5F 	SLP (0) a SLP (7) + PSN + BAR + PAR
0x60	 	 FRZ + PAR
0x61 a 0x67 	SLP (0) a SLP (7) + FRZ + PAR
0x68	 	 PSN + FRZ + PAR
0x69 a 0x6F 	SLP (0) a SLP (7) + PSN + FRZ + PAR
0x70	 	 BRN + FRZ + PAR
0x71 a 0x77 	SLP (0) a SLP (7) + BRN + FRZ + PAR
0x78	 	 PSN + BRN + FRZ + PAR
0x79 a 0x7F 	SLP (0) a SLP (7) + PSN + BRN + FRZ + PAR
0x80	 	 PSN2
0x79 a 0x7F 	SLP (0) a SLP (7) + PSN2
[…]
0xFF	SLP (7) + PSN2+ PSN + BRN + FRZ + PAR + PSN2 (Todos)

Nivel


El nivel está relacionado con sus estadísticas. Por ello, debo aclarar que al cambiar el nivel mediante WBTO de un pokémon esto solo cambiará el nivel aparente durante el combate. Eso sí, al atrapar el pokémon, éste ganará el nivel aparente como real en lugar del nivel determinado en el setwildbattle. El nivel establecido en el setwildbattle es el que genera sus estadísticas de combate así que si queréis que un pokémon coincida su nivel con sus estadísticas no modifiquéis éste parámetro. El WBTO para el nivel es el siguiente:
Código:
writebytetooffset 0x(nivel) 0x2024798

Cantidad de puntos de vida y cantidad máxima de puntos de vida


¿Quién no ha querido hacer un combate con un pokémon que ya había sido herido por terceros? Con estos WBTOS podréis modificar la salud del pokémon tanto para establecer los niveles de salud que queráis. Son éstos comandos.
Código:
writebytetooffset 0x(HP) 0x202479A
writebytetooffset 0x(HP) 0x202479B
writebytetooffset 0x(MaxHP) 0x202479C
writebytetooffset 0x(MaxHP) 0x202479D
Como veis la salud son words es decir, parejas de bytes, esto ocurre puesto que la salud puede superar los 255 puntos es decir 0xFF como es el caso de 256 = 0x01 0x00 = 0xFF + 0x01.

Pongamos por ejemplo que queremos que nuestro pokémon tenga 150/300 puntos de salud (300 equivale a 0x1 0x2C)
Código:
writebytetooffset 150 0x202479A
writebytetooffset 0 0x202479B
writebytetooffset 0x2C 0x202479C
writebytetooffset 0x1 0x202479D
Posibles bugs: Si el HP supera al maxHP el juego puede cerrar o crashear a el juego. Es algo normal, no puedes tener algo que tu tope no te permite ¿No? Haría carecer de sentido lo que es el MaxHP.

Estadísticas (Atk,Def,Vel,SpAtk,SpDef)


Éstas estadísticas se generaran por defecto por el nivel y la especie determinados en el setwildbattle pero se pueden modificar. Imagínate que por alguna causa quieras que un pokémon salvaje gane o pierda fuerza durante un combate, aquí tienes la solución.
Código:
writebytetooffset 0x(Atk) 0x202409E
writebytetooffset 0x(Atk) 0x202479F
writebytetooffset 0x(Def) 0x20247A0
writebytetooffset 0x(Def) 0x20247A1
writebytetooffset 0x(Vel) 0x20247A2
writebytetooffset 0x(Vel) 0x20247A3
writebytetooffset 0x(SpAtk) 0x20247A4
writebytetooffset 0x(SpAtk) 0x20247A5
writebytetooffset 0x(SpDef) 0x20247A6
writebytetooffset 0x(SpDef) 0x20247A7
Al igual que el caso anterior, las estadísticas son words ya que pueden superar los 255 puntos. El primer byte de cada estadística determina los primeros 255 y el segundo los siguientes. Por lo tanto, si queremos que el ataque especial de un pokémon sea de 300 (0x01 0x2C) y su defensa especial 10 haremos lo siguiente:
Código:
writebytetooffset 0x1  0x20247A4
writebytetooffset 0x2C  0x20247A5
writebytetooffset 10  0x20247A6
writebytetooffset 0   0x20247A7


Cualquier duda me la mandáis por aquí, las dudas de uno le servirán para los demás. Todos salimos ganando.

¡Un abrazo a todos!

FEL!X, ~Tu amigo el espadachín

PD: En la investigación he encontrado más cosas pero aún las estoy testeando. Seguramente en el subforo de investigaciones cuelgue todo el tema para compartirlo con quién esté interesado. Entre otras cosas porque se podría personalizar aún más con, por ejemplo; el moveset, el tipo de pokéball, el entrenador, etc [...]. :blush:

Os dejo algunos tutoriales relacionados a éste temario:
 
Última edición:

Miikel

Amante de los Pkmn Tipo Dragón
Respuesta: E|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Ni un comentario ? omg esto es un agran aportazo!
Gracias por postear algo tan util, lo usare en mi hack con los Dark Pokémons y con algunos rivales...
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: E|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es un excelente aporte, pero ojala hubiera forma de cambiar el OT del Pokémon </3
¿Es idea mia o ya habias posteado este tema, Felix? xD
EDITO: Estoy tontisimo, gracias Laquin.
 
Última edición:

Cheve

MoonLover~
Miembro de honor
Respuesta: E|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es un excelente aporte, pero ojala hubiera forma de cambiar el OT del Pokémon </3
¿Es idea mia o ya habias posteado este tema, Felix? xD
Probablemente se pueda cambiar, pero tendrás dos problemas a solucionar:

a. Que el OT ID se usa para calcular la encriptación de la parte de los datos

b. Que una vez capturado el pokémon se reemplazara por el tuyo ([PLAYER])

c. Cambiará la probabilidad innata del pokémon de ser Shiny

Asi que terminarías teniendo un bad egg o no viendo cambio alguno o uno no deseado <3
 

Laquin

Usuario mítico
Respuesta: E|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es un excelente aporte, pero ojala hubiera forma de cambiar el OT del Pokémon </3
¿Es idea mia o ya habias posteado este tema, Felix? xD
Es idea tuya más o menos, el otro post era para Fire Red y este es para Emerald.

Como te han dicho todos, me parece un aporte fantástico; y si se tienen buenas ideas se podrían hacer scripts mucho más realistas.
Además, me parece estupendo que hayas investigado para más de una ROM, para que todos puedan disfrutar de esto.

¡Muchas gracias, FEL!X!
¡Saludos!
 
Arriba