Registrarse

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

FEL!X

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

Éste tutorial es para FR/LG. Para la versión Emerald (U) usad éste link: (link directo)​

¡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!


(Te dedico éste tuto @Guilly Alpha[/MENTION])​

¿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 0xC1 0x2024034 "G de GUILLY"
writebytetooffset 0xCF 0x2024035 "U de GUILLY"
writebytetooffset 0xC3 0x2024036 "I de GUILLY"
writebytetooffset 0xC6 0x2024037 "L de GUILLY"
writebytetooffset 0xC6 0x2024038 "L de GUILLY"
writebytetooffset 0xD3 0x2024039 "Y de GUILLY"
writebytetooffset 0xFF 0x202403A "7mo espacio borrado del nick"
writebytetooffset 0xFF 0x202403B "8vo espacio borrado del nick"
writebytetooffset 0xFF 0x202403C "9no espacio borrado del nick"
writebytetooffset 0xFF 0x202403D "10mo espacio borrado del nick"
writebytetooffset 0xA 0x2024047 "Marcado con cuadrado y corazón"
writebytetooffset 0x8 0x202407C "Estado envenenado"
writebytetooffset 254 0x2024080 "Nivel=254"
writebytetooffset 0x37 0x2024082 "Primer byte de salud"
writebytetooffset 0x2 0x2024083  "Segundo byte de salud"
writebytetooffset 0xF7 0x2024084  "Primer byte de salud máxima"
writebytetooffset 0x2 0x2024085 "Segundo byte de salud máxima"
writebytetooffset 255 0x202408E "Defensa especial = 255"
dowildbattle
[…]

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 0x202402C (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 0x2024080
...que escribir:
Código:
writebytetooffset 254 0x2024080
(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 0x2024040
writebytetooffset 0x2 0x2024041
writebytetooffset 0x3 0x2024042
writebytetooffset 0x4 0x2024043
writebytetooffset 0x5 0x2024044
writebytetooffset 0x6 0x2024045
writebytetooffset 0x7 0x2024046
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) 0x2024047
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) 0x202407C
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 0x202407C
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) 0x2024080

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) 0x2024082
writebytetooffset 0x(HP) 0x2024083
writebytetooffset 0x(MaxHP) 0x2024084
writebytetooffset 0x(MaxHP) 0x2024085
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 0x2024082
writebytetooffset 0 0x2024083
writebytetooffset 0x2C 0x2024084
writebytetooffset 0x1 0x2024085
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) 0x2024086
writebytetooffset 0x(Atk) 0x2024087
writebytetooffset 0x(Def) 0x2024088
writebytetooffset 0x(Def) 0x2024089
writebytetooffset 0x(Vel) 0x202408A
writebytetooffset 0x(Vel) 0x202408B
writebytetooffset 0x(SpAtk) 0x202408C
writebytetooffset 0x(SpAtk) 0x202408D
writebytetooffset 0x(SpDef) 0x202408E
writebytetooffset 0x(SpDef) 0x202408F
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 0x202408C
writebytetooffset 0x2C 0x202408D
writebytetooffset 10  0x202408E
writebytetooffset 0 0x202408F


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:

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Madre mía @Guilly Alpha esto es muy bueno para hacer combates en plan "este pokemon salvaje lleva el nombre que le dio el entrenador que lo dejo solo" (?) y muchas cosas mas.
No se me había cruzado por la cabeza que algo así era posible y siempre me he preguntado para que eran los comandos setwildbattle y dowildbattle, he aquí una respuesta a mi pregunta...
Me gusta lo bien que has explicado las cosas, se ve muy fácil de hacer (y le resultara fácil a los nuevos). Buen aporte @FEL!X

Salu2 :blush:
 

BLAx501!

A veces comento en temas :3
Miembro de honor
Usuario de Platino
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Genial tuto, @FEL!X, como siempre currándotelo para que quede bien explicado y accesible a todos :D
 

Jo7a

Kiero mi nick amarillo D:
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Ahora si, es el momento de comentar, por que estoy superinspiradis... nah es coña, solo estoy aburrido (?)

Pues me parece jodidamente cojonuda esta investigación que has hecho. Es algo a lo que se le puede dar un montón de usos y créeme que yo lo usaré.

Si también se pudiese hacer lo mismo para "chetar" a los pokemon de X entrenador sería la polla, pero bueno ya es pedir por pedir y yo no soy de esos, pero si tienes tiempo míramelo y me haces un llama-cuelga (?)

Gracias bro por este aportazo, te haces querer pedazo puta (L)

PD: El comentario de Blax es puta basura, quiéreme a mi más :p
 

Nachoius

Caminante del cielo
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

a ver jajaja no te habi acomentado pq estaba en la Uni, como dice jota mas arriba, tiene muchas aplicaciones, felix das esperanza a esta pocilga llamada wah. mis 10, + repu, esperamos que nos traigas más de estas hermosuras! slds sin duda lo mejor es el nick y los ps! :D
 

jiangzhengwenjz

Usuario mítico
Not bad, but from my perspective it should be better to handle the wildpokemon via ASM/C.

The first advantage of ASM/C over writebytetooffset is that you can handle encrypted data as well (IV, EV, ...) and the second one is that the pokemon's stat won't be recalculated to fit your modification if you simply use writebytetooffset. (e.g. You change the pokemon's level via wbto, but his attack remains the same as what it was before your modification so you need to calculate and set them manually. )
 
Última edición:

Guilly Alpha

It's eleven o'clock
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Si me dedican un tuto tendre que hacerle caso (vaya :( )

Gran gran gran tuto ¡si señor!

Me parece una investigacion de 10, que ademas le puede dar mucho mucho juego a un hack si está bien hecho. (ya me veo luchando contra un @FEL!X salvaje Dormido+Paralizado con la mitad de vida y con un ataque superior a 300)

Esto es algo muy util y mis felicitaciones por este pedazo de aporte.
Pero lo mejor de todo es lo bien explicado que esta, lo haces claro y sencillo

Te has ganado +gracias y +repu bro
 

Invert

why so serious?
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es genial bro, me gusta la forma en como explicas todo y también genial lo que has logrado.
No sé mucho de los datos de los Pokes, pero el poder manipularlos así es básicamente esplendido ya que si usas la imaginación puedes hacer cosas increíbles con ella.
Me gusta, me gusta lo que veo, seguro lo usaré cuando llegue el momento c:
 
M

Miembro eliminado 28262

Invitado
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Lo mismo que el de arriba x2 ↑↑↑

El tutorial esta wahpisimo, bien explicado, bien redactado y todo lo demás.
Ya conocia este metodo, pero jamás llegué a investigarlo taaann a fondo.
Sin duda un señor tutorial feudal digno de los dioses del olimpo
+10 Y REPU papu!

Sigue así, Buenas vibras!

#SeichCapriccola
 

Adke

weeeh
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Uouo que guapada de tutorial. Sabes que me viene de perlas, directo a favoritos :p
 
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es un gran tutorial, de momento no me han quedado dudas, excepto una: ¿se podría hacer lo mismo en una trainerbattle? Enhorabuena por el tuto :p
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es un gran tutorial, de momento no me han quedado dudas, excepto una: ¿se podría hacer lo mismo en una trainerbattle? Enhorabuena por el tuto :p
Bueno no seré Fel!x pero tengo algo de experiencia estudiando estas cosas. Así que te responderé: No, no es posible con una trainerbattle.

Verás, no existe un comando que prepare la batalla para ejecutarla luego (como si hay para las wildbattles). Entonces, al cargar los datos la ejecutas automáticamente.
Eso hace imposible editar los pokémons a través del scripting. Sí se podría con una rutina ASM que se ejecutara ni bien empezar el combate.
Si tengo algo de tiempo y ganas luego, intento hacerlo. Pero bueno no es tan difícil, cualquiera con unos mínimos conocimientos de ASM y la información que Fel!x tan gentilmente ha aportado, debería poder hacerlo.

Saludos. No dudes consultarme cualquier cosa que no haya quedado clara o cualquier otra pregunta que tengas ;)
 
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es una pena que solo se pueda con ASM, soy un zoquete en eso y seguramente no entienda nada de lo que me pongas, así que no tengas prisa por hacerlo, primero intentaré aprender algo de ASM con tutoriales del Foro. Gracias por tu ayuda :)
 

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: FR|Scripting|Wildbattle modificable (nick/estado/nivel/HP/stats)

Es una pena que solo se pueda con ASM, soy un zoquete en eso y seguramente no entienda nada de lo que me pongas, así que no tengas prisa por hacerlo, primero intentaré aprender algo de ASM con tutoriales del Foro. Gracias por tu ayuda :)
Buscando en pokeco encontré un par de rutinas que permiten hacer algo bastante parecido a lo que preguntas.
Aquí los lincks:

Opponent party generation

Generate random trainer sprite

Generate random trainer name

Algunas de las rutinas no son exactamente lo que pides, pero evidentemente si se las edita un poco, si.

No prometo nada porque estoy bastante verde en el tema del ASM, pero lo voy a probar con alguna, a ver que sale. XD

♠Un saludo!♠
 
Arriba