Registrarse

[RH - Scripting] Ayuda. Elegir las habilidades del pokemon rival

Estado
Cerrado para nuevas respuestas.

Chema

Very Friendly
Ok, he estado tratando de averiguar el como definir habilidades de los pokémon de un trainerbatte, pero no consigo nada por aqui. ¿Alguien seria tan caritativo y me puede decir su existe una forma de colocar a X pokémon de un entrenador una determinada habilidad en caso de tener dos habilidades?
 

Yim

Si Necesitas algo no dudes en decirme
Última edición:

Chema

Very Friendly
YimproYT, gracias por tu ayuda, pero lo que necesito es saber si hay forma de elegir la habilidad al pokémon rival a una que tu quieras, como por ejemplo: Ninetales en mi hack posee 2 habilidades (absorb. fuego y sequía), pero al pelear contra un rival que tiene a ninetales solo usa absorb. fuego, entonces lo que quiero es hacer que dicho ninetales use sequia, pero el advance trainer no posee esos parámetros para modificar que habilidad usar.
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Veamos, hay un offset de la RAM donde están almacenados los datos de los Pokémon del rival. Lo que no se es cuando se cargan esos datos, pues si es después de la batalla no sirve de nada.

De otra forma si consigo localizar los datos de un entrenador en concreto se podría hacer fácilmente.

Cuando tenga el portátil al mano echaré un vistazo y te lo diré.
 

Laquin

Usuario mítico
Okay, allé vamos. No tengo el ordenador aquí (estoy desde el móvil), así que siento que no pueda hacer pruebas y comprobar yo mismo que esto funcione.

He estado buscando cómo se estructura la información de un Pokémon. Es decir: en qué posición de la RAM empieza la imformación, qué partes la componen, y dónde empiezan estas partes.

Para que me entiendas, supongamos que quieres saber dónde en la RAM se encuentra el nivel del pokémon de tu equipo, por ejemplo. Mira este link: https://m.bulbapedia.bulbagarden.net/wiki/Pokémon_data_structure_in_Generation_III

Si buscas ahí, verás que, en FR, el data de los Pokémon comienza en la dirección 0x0202402C de la RAM. Como ahí te pone, cada pokémon tiene una información que ocupa 100 bytes. También te pone que la información del pokémon oponente es la primera de la lista(es decir, se almacena en el 0x0202402C.

Como lo que nos interesa es ese Ninetales del oponente, no tenemos que hacer ningún cálculo en especial. (Y si quieres que el Ninetales sea, por ejemplo, el segundo del equipo, añade 0x64 (100 en hexadecimal) al offset primero. Así, la información del segundo pokémon del oponente se guardaría en 0x02024090).

Vale, sigamos. En esa misma página nos póne cómo se almacena esta información. En el byte número 0 de la info del pokémon tenemos la personalidad. Cuatro bytes más tarde, el OT ID. Otros cuatro bytes más adelante, el nombre, etc.
Y no solo eso: estas partes de la estructura, ¡son en sí otras subestructuras! Mira: en el byte 32 ves que empieza la parte de "data": https://m.bulbapedia.bulbagarden.net/wiki/Pokémon_data_substructures_in_Generation_III

Pues esto nos da para rato. Esa parte ocupa 48 bytes. Y es que esta sub-estructura tiene, a su vez, más sub-estructuras. XD

Como bien explica la enciclopedia, esta tiene cuatro sub-estructuras: Growth, Attacks, EVs & Condition y Miscellaneous. Cada una de estas ocupa 12 bytes. Nos importa la última, que es donde se guarda, entre otros, la habilidad del Pokémon.

Vale, si cada sub-estructura ocupa 12 bytes, sabemos que esta tiene que empezar en el byte número 36 (si empezamos a contar desde el 0).

Ahora, dentro de Miscellaneous, tenemos cinco sub-estructuras. Nos interesa la cuarta, que es donde están los IVs, si es un huevo o no y la habilidad. Se encuentran en el byte número 4 de Miscellaneous.

36 + 4 = 40. 40 + 32 (donde se encuentra toda esta sub-estructura dentro de la data total del pokémon) = 72.

Vale, nos vamos acercando. 72 en hexadecimal es 0x48.
0x0202402C + 0x48 = 0x02024074. Esta, amigo, es la localización de esta última sub-estructura en la RAM.

Leyendo más abajo, podemos ver que la sub-estructura tiene 32 bits (4 bytes) de longitud. La habilidad se gurada en el último bit de todos.

Por ende, el byte donde se guarda la habilidad es, en todo caso, 0x020240747, en su último bit concretamente.

Si el valor del bit es 0, tendrá la primera habilidad; si el valor es 1, tendrá la segunda.

Y ahora, presentamos los problemas. Estoy seguro que con ASM esto no tendrá mayor misterio. Pero yo no sé ASM, así que lo descartamos. XD

Aun así, CREO que con WBTO (write byte to offset, comando para modificar valores en la RAM) se podría hacer algo. Digo «creo» porque, como dije, no puedo comprobarlo ahora. En caso de poderse, debería usarse el comando antes del trainerbattle.

Ahora. Como bien dice el nombre, el comando modifica la RAM a nivel de bytes. Y ahora mismo desconozco cómo se podría cambiar tan solo el bit que queremos, si no es usando ASM.

Aaaasí que tienes varias opciones:
  1. Hacer que la habilidad que necesitas sea la primera y no la segunda, de manera que todos los Ninetales enemigos saldrían con esa habilidad. Una mala opción, pero sencilla. (Creo :V)
  2. Esperar a que alguien que sepa más que yo se disponga a ayudarte.
  3. Investigar por tu cuenta y disfrutar el RH en su máximo esplendor.

Yo cuando pueda pondré en prueba todo lo que dije, aunque no prometo nada :p

¡Saludos!

EDIT: @Turin Turambar, CREO que los datos se cargan antes de la batalla, pues me suena que había algún tutorial usando WBTO para Wildbattles. Pero tampoco me hagas mucho caso...
 
Última edición:

Chema

Very Friendly
ACTUALIZACIÖN: Encontré la forma de que un pokémon enemigo cumpla con la habilidad segundaria y, ADEMAS, la posibilidad de hacer que este posea puntos de esfuerzo, darle una naturaleza, definir el tipo e pokéball en el que será lanzado.

Pero la cosa es que no soy ASM mago, entonces, ¿hay alguien que me pueda ayudar a realizar dicho procedimiento?. Preferiblemente alguien que esté familiarizado con e ASM.

Para mas información les dejo los enlaces al tutorial original (está en ingés)

https://www.pokecommunity.com/showthread.php?t=307117
 
Estado
Cerrado para nuevas respuestas.
Arriba