Registrarse

[C] Consultar y modificar datos de pokémon

Kaiser de Emperana

Called in hand
Bueno, este tuto/aporte va a ser bastante pequeño. Es básicamente lo mismo que esto, pero más dinámico...

Con simplemente cambiar los valores de algunas variables y hacer un callasm van a poder ver y cambiar el valor de cualquier atributo de un pokemon (ev's, iv's, condición de estado, etc.). tal y como está ahora funciona en FR y Emerald, pero se puede adaptar a cualquier rom. Pero bueno, lo primero que tienen que hacer es insertar las funciones.
Así que descarguen esto:
- Funciones

Para insertarlo en su rom van a tener que haber instalado estas herramientas.

Una vez instaladas, extraigan el zip que deje antes. Y pongan su rom en la carpeta que apareció, con el nombre "BPRE0.gba"
Con un editor de texto que soporte codificación UTF8 (yo recomiendo notepad++) abran main.s y cambien el offset de la línea siguiente, por la dirección donde quieran insertar las funciones.
Código:
.org 0x08800000
Si usan emerald, en vez de llamar a su rom "BPRE0.gba" pónganle "BPEE0.gba".
Luego abran el archivo main.s y modifiquen esta línea:
Código:
.open "BPRE0.gba","build/rom.gba", 0x08000000
Y por último habran el archivo Makefile (de vuelta con notepad++) y cambien esta línea:
Código:
export ROM_CODE := BPRE
Abran cygwin y dirijanse a la carpeta extraída. Y ejecuten:
Código:
make
Debería de aparecer una carpeta "build" con un nuevo rom que tiene las funciones insertadas.
Y además debería haber aparecido un archivo "offsets.txt". Abranlo y busquen unas líneas como estas:
Código:
08800000 getdata
08800048 setdata
088000DC setnature
Estas son las funciones que vamos a llamar con callasm (no confundirse con getmondata y setmondata).

Ahora los scripts:

La función de consulta es "getdata" y en mi caso su offset es 0x8800000, ustedes usen su propio offset.
Esta función necesita que ustedes le den valor a las siguientes variables:
0x8004: la posición del equipo del pokemon con el que quieren trabajar.
0x800D: el dato que quieren pedir (miren la tabla que está unos spoiler más abajo)
0x8005: Esta variable, el 99% de las veces la van a querer dejar en 0. Lo que pasa es que las variables pueden almacenar hasta 2 bytes de memoria, pero hay algunos datos de los pokemon que ocupan 4 bytes, si ustedes quieren recibir los 2 bytes "de la izquierda" debería de poner esta variable en 1, si lo que les interesa son los 2 bytes de la derecha la deben de poner en 0. Cada vez que quieran leer un valor que ocupa 2 bytes o menos, deben ponerla en 0.
Una vez ejecuten el callasm el valor pedido se guardará en la variable 0x800D.

Así que veamos un ejemplo simple. Yo voy a aprovechar el special 0x9f de FR, que te deja elegir un pokemon y lo guarda en la variable 0x8004 (que conveniente...).
Vor a hacer un npc que te diga los IV's en ataque de un pokemon que elijas. El númeor que simboliza el ataque es 40 que es igual a 0x28. Por lo que mi script sería:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0x28 // pido los iv del ataque
setvar 0x8005 0x0 // porque pido un dato que solo ocupa 2 bytes
callasm 0x8800001 // y llamo a la función getdata
buffernumber 0x0 0x800d
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= Su ataque es de [buffer 1]
Y listo, con eso ya está, tienen un npc que mira los IV's de un pokemon y luego te los dice.

Ahora viene la parte interesante... Modificar datos. Esta función toma las siguientes variables:
0x8004: ídem consulta.
0x800D: ídem consulta.
0x8005: la variable 0x8005 ahora lo que hace es contener los 2 bytes de las derecha de que se van a escribir en el campo solicitado.
0x8006: esta variable contiene los dos bytes de la izquierda. Si se modifica algo que ocupe 2 o menos bytes, dejarla en 0.
Para los que no entiendan. Si la variable 0x8005 es igual a 0x1234 y la variable 0x8006 es igual a 0x5678, lo que se escribiría en el campo ingresado en 0x800D sería: 0x56781234.

¡Al ejemplo!
Supongamos que ahora queremos hacer un npc que cambie los iv de ataque de un pokemon que elijamos, por 31. Lo que deberíamos de hacer es lo siguiente:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0x28 // elijo los iv de ataque
setvar 0x8005 0x1f // 31...
setvar 0x8006 0x0 // porque ocupa menos de 2 bytes
callasm 0x8800049 // y llamo a la función setdata
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= He despertado su potencial...
Y bueno, con eso está, ya tienen una forma de hacer pokemon perfectos.

Esto es solo una copia de lo que está en el archivo "pokemon.h" de la carpeta "src/headers" del zip.
Estos son los valores que le tiene que dar a la variable 0x800D para modificar los diferentes atributos.
Código:
...
#define MON_DATA_PERSONALITY        0
#define MON_DATA_OT_ID              1
#define MON_DATA_NICKNAME           2
#define MON_DATA_LANGUAGE           3
#define MON_DATA_SANITY_BIT1        4
#define MON_DATA_SANITY_BIT2        5
#define MON_DATA_SANITY_BIT3        6
#define MON_DATA_OT_NAME            7
#define MON_DATA_MARKINGS           8
#define MON_DATA_CHECKSUM           9
#define MON_DATA_10                10
#define MON_DATA_SPECIES           11
#define MON_DATA_HELD_ITEM         12
#define MON_DATA_MOVE1             13
#define MON_DATA_MOVE2             14
#define MON_DATA_MOVE3             15
#define MON_DATA_MOVE4             16
#define MON_DATA_PP1               17
#define MON_DATA_PP2               18
#define MON_DATA_PP3               19
#define MON_DATA_PP4               20
#define MON_DATA_PP_BONUSES        21
#define MON_DATA_COOL              22
#define MON_DATA_BEAUTY            23
#define MON_DATA_CUTE              24
#define MON_DATA_EXP               25
#define MON_DATA_HP_EV             26
#define MON_DATA_ATK_EV            27
#define MON_DATA_DEF_EV            28
#define MON_DATA_SPD_EV            29
#define MON_DATA_SPATK_EV          30
#define MON_DATA_SPDEF_EV          31
#define MON_DATA_FRIENDSHIP        32
#define MON_DATA_SMART             33
#define MON_DATA_POKERUS           34
#define MON_DATA_MET_LOCATION      35
#define MON_DATA_MET_LEVEL         36
#define MON_DATA_MET_GAME          37
#define MON_DATA_POKEBALL          38
#define MON_DATA_HP_IV             39
#define MON_DATA_ATK_IV            40
#define MON_DATA_DEF_IV            41
#define MON_DATA_SPD_IV            42
#define MON_DATA_SPATK_IV          43
#define MON_DATA_SPDEF_IV          44
#define MON_DATA_IS_EGG            45
#define MON_DATA_ALT_ABILITY       46
#define MON_DATA_TOUGH             47
#define MON_DATA_SHEEN             48
#define MON_DATA_OT_GENDER         49
#define MON_DATA_COOL_RIBBON       50
#define MON_DATA_BEAUTY_RIBBON     51
#define MON_DATA_CUTE_RIBBON       52
#define MON_DATA_SMART_RIBBON      53
#define MON_DATA_TOUGH_RIBBON      54
#define MON_DATA_STATUS            55
#define MON_DATA_LEVEL             56
#define MON_DATA_HP                57
#define MON_DATA_MAX_HP            58
#define MON_DATA_ATK               59
#define MON_DATA_DEF               60
#define MON_DATA_SPD               61
#define MON_DATA_SPATK             62
#define MON_DATA_SPDEF             63
#define MON_DATA_MAIL              64
#define MON_DATA_SPECIES2          65
#define MON_DATA_IVS               66
#define MON_DATA_CHAMPION_RIBBON   67
#define MON_DATA_WINNING_RIBBON    68
#define MON_DATA_VICTORY_RIBBON    69
#define MON_DATA_ARTIST_RIBBON     70
#define MON_DATA_EFFORT_RIBBON     71
#define MON_DATA_GIFT_RIBBON_1     72
#define MON_DATA_GIFT_RIBBON_2     73
#define MON_DATA_GIFT_RIBBON_3     74
#define MON_DATA_GIFT_RIBBON_4     75
#define MON_DATA_GIFT_RIBBON_5     76
#define MON_DATA_GIFT_RIBBON_6     77
#define MON_DATA_GIFT_RIBBON_7     78
#define MON_DATA_FATEFUL_ENCOUNTER 79
#define MON_DATA_OBEDIENCE         80
#define MON_DATA_KNOWN_MOVES       81
#define MON_DATA_RIBBON_COUNT      82
#define MON_DATA_RIBBONS           83
#define MON_DATA_ATK2              84
#define MON_DATA_DEF2              85
#define MON_DATA_SPD2              86
#define MON_DATA_SPATK2            87
#define MON_DATA_SPDEF2            88
...

Las vriables que hay que settear para cambiar la naturaleza son:
0x8004: idem otras funciones.
0x800D: naturaleza que quiero poner al pokemon.
Código:
0 	Hardy
1 	Lonely
2 	Brave
3 	Adamant
4 	Naughty
5 	Bold
6 	Docile
7 	Relaxed
8 	Impish
9 	Lax
10 	Timid
11 	Hasty
12 	Serious
13 	Jolly
14 	Naive
15 	Modest
16 	Mild
17 	Quiet
18 	Bashful
19 	Rash
20 	Calm
21 	Gentle
22 	Sassy
23 	Careful
24 	Quirky

Un script simple que cambia la narutaleza a timida:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0xa // elijo la naturaleza que quiero
callasm 0x88000dd // y llamo a la función setnature
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= Ahora tu pokémon es tímido...
Cambiar la naturaleza deun pokemon ya creado no es tan simple, por el hecho de que hay que cambiar la misma sin cambiar las demás características involucradas al número de personalidad del pokemon. Yo me aseguré de que el pokemon:
- No cambie de sexo.
- No cambie de habilidad.

Pero los posibles efectos secundrios incluyen:
- Cambio del color de piel (shinies que se vuelven normales y viceversa).
- Movimiento de marcas de nacimiento (aka puntos de Spinda).
- Metamorphosis (Unown puede cambiar de letra).
- ¡Cambio del destino! (La evolución a la que está destinada Wurmple puede cambiar, una vez que haya evolucionado se queda como está).
- Cambio de tamaño (esa mecánica que nadie usa).
Para más info ver esto.

Y bueno eso sería todo... No se si se entendió del todo bien. Comenten cualquier cosa.
Todos las direcciones son sacadas de pokeagb y pokeemerald.

Ah, por si a alguien le interesa saber que clase de monstruosidad de código es el que forman estan funciones maravillosas, lo dejo acá:
Código:
void GetData()
{
	u32 ret;
	ret = GetMonData(&gPlayerParty[gSpecialVar_0x8004], gScriptResult, 0);
	if (!gSpecialVar_0x8005) {
		gScriptResult = (u16) ret;
	} else {
		gScriptResult = (u16) (ret >> 16);
	}
}

void SetData()
{
	u32 data;
	data = gSpecialVar_0x8005 + (gSpecialVar_0x8006 << 16); 
	SetMonData(&gPlayerParty[gSpecialVar_0x8004], gScriptResult, &data);
	CalculateMonStats(&gPlayerParty[gSpecialVar_0x8004]);
}
(¡Pero si es más corto que el script!)

Saludos.
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Yo creo que estaria bien que creases una cuenta en GitHub y fueses subiendo allí tus distintos repositorios, haria muchisimo mas facil el poder leer/revisar los distintos archivos y tal, tener que descargarlos como que dá un poco de pereza.

En cualquier caso, la idea suena fenomenal y el hecho de que se pueda usar con Pokémon Emerald me parece estupendo. La herramienta de JPAN permite añadir varios specials que permiten comprobar esta clase de cosas, pero creo que hasta ahora no ha habido un equivalente para Emerald, ya iba siendo hora.
 

Kaiser de Emperana

Called in hand
Seguí el consejo de Lunos y cree un repositorio. Va a ser más fácil actualizar así...

¿y como seria naturaleza definida?
Cambiar las naturalezas es un poco más complicado, porque dependen del valor de personalidad del pokemon. Actualicé el post principal con una función que te permite hacer eso.

No voy a hacer ninguna función que permita hacer un pokemon shiny. El cambiar este aspecto sin alterar los demás datos del pokemon es prácticamente (y en algunos casos hasta lo es) imposible por la cantidad de variables y limitaciones que hay tener en cuenta contar.
Si alguien le interesa investigar sobre el tema, ver lo que dejé al final del spoiler de ls naturalezas.
 

kakarotto

Leyenda de WaH
Puedo afirmar con rotundidad que funciona a la perfección en emerald. Solo añadir un pequeño dato y es que en emerald se usa el special 0xA2. Todo lo demas es el mismo script. Es un tuto bastante infravalorado y que puedes sacarle un jugo interesante con imaginacion. Todo mi apoyo, se nota que eres un autentico crack.
 

Ancer

Usuario de oro
Bueno, este tuto/aporte va a ser bastante pequeño. Es básicamente lo mismo que esto, pero más dinámico...

Con simplemente cambiar los valores de algunas variables y hacer un callasm van a poder ver y cambiar el valor de cualquier atributo de un pokemon (ev's, iv's, condición de estado, etc.). tal y como está ahora funciona en FR y Emerald, pero se puede adaptar a cualquier rom. Pero bueno, lo primero que tienen que hacer es insertar las funciones.
Así que descarguen esto:
- Funciones

Para insertarlo en su rom van a tener que haber instalado estas herramientas.

Una vez instaladas, extraigan el zip que deje antes. Y pongan su rom en la carpeta que apareció, con el nombre "BPRE0.gba"
Con un editor de texto que soporte codificación UTF8 (yo recomiendo notepad++) abran main.s y cambien el offset de la línea siguiente, por la dirección donde quieran insertar las funciones.
Código:
.org 0x08800000
Si usan emerald, en vez de llamar a su rom "BPRE0.gba" pónganle "BPEE0.gba".
Luego abran el archivo main.s y modifiquen esta línea:
Código:
.open "BPRE0.gba","build/rom.gba", 0x08000000
Y por último habran el archivo Makefile (de vuelta con notepad++) y cambien esta línea:
Código:
export ROM_CODE := BPRE
Abran cygwin y dirijanse a la carpeta extraída. Y ejecuten:
Código:
make
Debería de aparecer una carpeta "build" con un nuevo rom que tiene las funciones insertadas.
Y además debería haber aparecido un archivo "offsets.txt". Abranlo y busquen unas líneas como estas:
Código:
08800000 getdata
08800048 setdata
088000DC setnature
Estas son las funciones que vamos a llamar con callasm (no confundirse con getmondata y setmondata).

Ahora los scripts:

La función de consulta es "getdata" y en mi caso su offset es 0x8800000, ustedes usen su propio offset.
Esta función necesita que ustedes le den valor a las siguientes variables:
0x8004: la posición del equipo del pokemon con el que quieren trabajar.
0x800D: el dato que quieren pedir (miren la tabla que está unos spoiler más abajo)
0x8005: Esta variable, el 99% de las veces la van a querer dejar en 0. Lo que pasa es que las variables pueden almacenar hasta 2 bytes de memoria, pero hay algunos datos de los pokemon que ocupan 4 bytes, si ustedes quieren recibir los 2 bytes "de la izquierda" debería de poner esta variable en 1, si lo que les interesa son los 2 bytes de la derecha la deben de poner en 0. Cada vez que quieran leer un valor que ocupa 2 bytes o menos, deben ponerla en 0.
Una vez ejecuten el callasm el valor pedido se guardará en la variable 0x800D.

Así que veamos un ejemplo simple. Yo voy a aprovechar el special 0x9f de FR, que te deja elegir un pokemon y lo guarda en la variable 0x8004 (que conveniente...).
Vor a hacer un npc que te diga los IV's en ataque de un pokemon que elijas. El númeor que simboliza el ataque es 40 que es igual a 0x28. Por lo que mi script sería:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0x28 // pido los iv del ataque
setvar 0x8005 0x0 // porque pido un dato que solo ocupa 2 bytes
callasm 0x8800001 // y llamo a la función getdata
buffernumber 0x0 0x800d
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= Su ataque es de [buffer 1]
Y listo, con eso ya está, tienen un npc que mira los IV's de un pokemon y luego te los dice.

Ahora viene la parte interesante... Modificar datos. Esta función toma las siguientes variables:
0x8004: ídem consulta.
0x800D: ídem consulta.
0x8005: la variable 0x8005 ahora lo que hace es contener los 2 bytes de las derecha de que se van a escribir en el campo solicitado.
0x8006: esta variable contiene los dos bytes de la izquierda. Si se modifica algo que ocupe 2 o menos bytes, dejarla en 0.
Para los que no entiendan. Si la variable 0x8005 es igual a 0x1234 y la variable 0x8006 es igual a 0x5678, lo que se escribiría en el campo ingresado en 0x800D sería: 0x56781234.

¡Al ejemplo!
Supongamos que ahora queremos hacer un npc que cambie los iv de ataque de un pokemon que elijamos, por 31. Lo que deberíamos de hacer es lo siguiente:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0x28 // elijo los iv de ataque
setvar 0x8005 0x1f // 31...
setvar 0x8006 0x0 // porque ocupa menos de 2 bytes
callasm 0x8800049 // y llamo a la función setdata
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= He despertado su potencial...
Y bueno, con eso está, ya tienen una forma de hacer pokemon perfectos.

Esto es solo una copia de lo que está en el archivo "pokemon.h" de la carpeta "src/headers" del zip.
Estos son los valores que le tiene que dar a la variable 0x800D para modificar los diferentes atributos.
Código:
...
#define MON_DATA_PERSONALITY        0
#define MON_DATA_OT_ID              1
#define MON_DATA_NICKNAME           2
#define MON_DATA_LANGUAGE           3
#define MON_DATA_SANITY_BIT1        4
#define MON_DATA_SANITY_BIT2        5
#define MON_DATA_SANITY_BIT3        6
#define MON_DATA_OT_NAME            7
#define MON_DATA_MARKINGS           8
#define MON_DATA_CHECKSUM           9
#define MON_DATA_10                10
#define MON_DATA_SPECIES           11
#define MON_DATA_HELD_ITEM         12
#define MON_DATA_MOVE1             13
#define MON_DATA_MOVE2             14
#define MON_DATA_MOVE3             15
#define MON_DATA_MOVE4             16
#define MON_DATA_PP1               17
#define MON_DATA_PP2               18
#define MON_DATA_PP3               19
#define MON_DATA_PP4               20
#define MON_DATA_PP_BONUSES        21
#define MON_DATA_COOL              22
#define MON_DATA_BEAUTY            23
#define MON_DATA_CUTE              24
#define MON_DATA_EXP               25
#define MON_DATA_HP_EV             26
#define MON_DATA_ATK_EV            27
#define MON_DATA_DEF_EV            28
#define MON_DATA_SPD_EV            29
#define MON_DATA_SPATK_EV          30
#define MON_DATA_SPDEF_EV          31
#define MON_DATA_FRIENDSHIP        32
#define MON_DATA_SMART             33
#define MON_DATA_POKERUS           34
#define MON_DATA_MET_LOCATION      35
#define MON_DATA_MET_LEVEL         36
#define MON_DATA_MET_GAME          37
#define MON_DATA_POKEBALL          38
#define MON_DATA_HP_IV             39
#define MON_DATA_ATK_IV            40
#define MON_DATA_DEF_IV            41
#define MON_DATA_SPD_IV            42
#define MON_DATA_SPATK_IV          43
#define MON_DATA_SPDEF_IV          44
#define MON_DATA_IS_EGG            45
#define MON_DATA_ALT_ABILITY       46
#define MON_DATA_TOUGH             47
#define MON_DATA_SHEEN             48
#define MON_DATA_OT_GENDER         49
#define MON_DATA_COOL_RIBBON       50
#define MON_DATA_BEAUTY_RIBBON     51
#define MON_DATA_CUTE_RIBBON       52
#define MON_DATA_SMART_RIBBON      53
#define MON_DATA_TOUGH_RIBBON      54
#define MON_DATA_STATUS            55
#define MON_DATA_LEVEL             56
#define MON_DATA_HP                57
#define MON_DATA_MAX_HP            58
#define MON_DATA_ATK               59
#define MON_DATA_DEF               60
#define MON_DATA_SPD               61
#define MON_DATA_SPATK             62
#define MON_DATA_SPDEF             63
#define MON_DATA_MAIL              64
#define MON_DATA_SPECIES2          65
#define MON_DATA_IVS               66
#define MON_DATA_CHAMPION_RIBBON   67
#define MON_DATA_WINNING_RIBBON    68
#define MON_DATA_VICTORY_RIBBON    69
#define MON_DATA_ARTIST_RIBBON     70
#define MON_DATA_EFFORT_RIBBON     71
#define MON_DATA_GIFT_RIBBON_1     72
#define MON_DATA_GIFT_RIBBON_2     73
#define MON_DATA_GIFT_RIBBON_3     74
#define MON_DATA_GIFT_RIBBON_4     75
#define MON_DATA_GIFT_RIBBON_5     76
#define MON_DATA_GIFT_RIBBON_6     77
#define MON_DATA_GIFT_RIBBON_7     78
#define MON_DATA_FATEFUL_ENCOUNTER 79
#define MON_DATA_OBEDIENCE         80
#define MON_DATA_KNOWN_MOVES       81
#define MON_DATA_RIBBON_COUNT      82
#define MON_DATA_RIBBONS           83
#define MON_DATA_ATK2              84
#define MON_DATA_DEF2              85
#define MON_DATA_SPD2              86
#define MON_DATA_SPATK2            87
#define MON_DATA_SPDEF2            88
...

Las vriables que hay que settear para cambiar la naturaleza son:
0x8004: idem otras funciones.
0x800D: naturaleza que quiero poner al pokemon.
Código:
0 	Hardy
1 	Lonely
2 	Brave
3 	Adamant
4 	Naughty
5 	Bold
6 	Docile
7 	Relaxed
8 	Impish
9 	Lax
10 	Timid
11 	Hasty
12 	Serious
13 	Jolly
14 	Naive
15 	Modest
16 	Mild
17 	Quiet
18 	Bashful
19 	Rash
20 	Calm
21 	Gentle
22 	Sassy
23 	Careful
24 	Quirky

Un script simple que cambia la narutaleza a timida:
Código:
#dynamic 0x800000

#org @inicio
lock
special 0x9f // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
jumpif 0x1 @fin
setvar 0x800d 0xa // elijo la naturaleza que quiero
callasm 0x88000dd // y llamo a la función setnature
msgbox  @mensaje 0x6
release
end 

#org @fin
release
end

#org @mensaje
= Ahora tu pokémon es tímido...
Cambiar la naturaleza deun pokemon ya creado no es tan simple, por el hecho de que hay que cambiar la misma sin cambiar las demás características involucradas al número de personalidad del pokemon. Yo me aseguré de que el pokemon:
- No cambie de sexo.
- No cambie de habilidad.

Pero los posibles efectos secundrios incluyen:
- Cambio del color de piel (shinies que se vuelven normales y viceversa).
- Movimiento de marcas de nacimiento (aka puntos de Spinda).
- Metamorphosis (Unown puede cambiar de letra).
- ¡Cambio del destino! (La evolución a la que está destinada Wurmple puede cambiar, una vez que haya evolucionado se queda como está).
- Cambio de tamaño (esa mecánica que nadie usa).
Para más info ver esto.

Y bueno eso sería todo... No se si se entendió del todo bien. Comenten cualquier cosa.
Todos las direcciones son sacadas de pokeagb y pokeemerald.

Ah, por si a alguien le interesa saber que clase de monstruosidad de código es el que forman estan funciones maravillosas, lo dejo acá:
Código:
void GetData()
{
	u32 ret;
	ret = GetMonData(&gPlayerParty[gSpecialVar_0x8004], gScriptResult, 0);
	if (!gSpecialVar_0x8005) {
		gScriptResult = (u16) ret;
	} else {
		gScriptResult = (u16) (ret >> 16);
	}
}

void SetData()
{
	u32 data;
	data = gSpecialVar_0x8005 + (gSpecialVar_0x8006 << 16); 
	SetMonData(&gPlayerParty[gSpecialVar_0x8004], gScriptResult, &data);
	CalculateMonStats(&gPlayerParty[gSpecialVar_0x8004]);
}
(¡Pero si es más corto que el script!)

Saludos.
Hola tengo la duda con estos script (claro modificarlos seria necesario) pero en la parte de modificación de pokemon específicamente,si es que quiero que envés de un numero especifico (es decir 31)
Se podría poner que sume X cantidad?
ejemplo:
Si tengo un pokemon en 6 ivs de ataque y le doy x objeto se le ponga en 7 y si lo vuelvo a hacer se ponga en 8 y hací sucesivamente
 

Kaiser de Emperana

Called in hand
Re: Respuesta: Consultar y modificar datos de pokémon

Hola tengo la duda con estos script (claro modificarlos seria necesario) pero en la parte de modificación de pokemon específicamente,si es que quiero que envés de un numero especifico (es decir 31)
Se podría poner que sume X cantidad?
ejemplo:
Si tengo un pokemon en 6 ivs de ataque y le doy x objeto se le ponga en 7 y si lo vuelvo a hacer se ponga en 8 y hací sucesivamente
Lo que querés hacer, se puede lograr con los scripts. Como los valores se guardan en variables, primero tendrías que consultar el valor de los IVs. Si es igual a 31, no hacés nada. Si es menor a 31 le sumás 1 a la variable y cambias el valor de los IVs, por el nuevo.

---------------

Pero yo te recomendaía usar el hack de este tema. Agrega nuevos comandos de script que sirven para lo mismo de este tema, además otros comandos útiles.
 

Ryurs

Usuario de oro
He estado probando esto (insertándolo con éxito y sin complicaciones), y la verdad es que me funciona todo bien, los scripts para cambiar ivs y evs todo genial. Pero cuando utilizo el script para cambiar la naturaleza, el juego se queda pillado (hay que reiniciar) y obviamente, no cambia nada.

Para poneros un poquito en contexto:
- Utilizo una rom de fire red en inglés.
- Inserté las funciones en el offset 800000, por lo que las funciones que me salieron en el .txt fueron:
Código:
08800000 getdata
08800044 setdata
0880009C setnature
- Aquí dejo el script de prueba que utilizo (muy similar al del post principal, pero modificado para que pueda compilarlo el XSE):
Código:
#dynamic 0x810000

#org @inicio
lock
special 0x9F // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
if 0x4 goto @fin
setvar 0x800D 0xA // elijo la naturaleza tímida
callasm 0x880009D // y llamo a la función setnature
msgbox @mensaje 0x6
release
end

#org @fin
release
end

#org @mensaje
= Ahora tu pokémon es tímido...

¿Alguien que entienda de estas cosas me podría echar una mano? Cabe la posibilidad de que esta función ni siquiera funcione.
 

Versekr Dark

Usuario mítico
He estado probando esto (insertándolo con éxito y sin complicaciones), y la verdad es que me funciona todo bien, los scripts para cambiar ivs y evs todo genial. Pero cuando utilizo el script para cambiar la naturaleza, el juego se queda pillado (hay que reiniciar) y obviamente, no cambia nada.

Para poneros un poquito en contexto:
- Utilizo una rom de fire red en inglés.
- Inserté las funciones en el offset 800000, por lo que las funciones que me salieron en el .txt fueron:
Código:
08800000 getdata
08800044 setdata
0880009C setnature
- Aquí dejo el script de prueba que utilizo (muy similar al del post principal, pero modificado para que pueda compilarlo el XSE):
Código:
#dynamic 0x810000

#org @inicio
lock
special 0x9F // el jugador elige un pokemon y lo guarda en 0x8004
waitstate
compare 0x8004 0x7
if 0x4 goto @fin
setvar 0x800D 0xA // elijo la naturaleza tímida
callasm 0x880009D // y llamo a la función setnature
msgbox @mensaje 0x6
release
end

#org @fin
release
end

#org @mensaje
= Ahora tu pokémon es tímido...

¿Alguien que entienda de estas cosas me podría echar una mano? Cabe la posibilidad de que esta función ni siquiera funcione.
Te debio aparecer esto es tu rom, si no fue así el error podria ser al compilarlo:

B5 00 28 0C DA 0A 4B 18 40 0A 4C 18 21 00 F0 DC F8 08 31 08 00 18 21 00 F0 D7 F8 08 00 06 E0 03 4B 18 40 18 21 03 4B 00 F0 CE F8 08 00 10 BD 00 FF FF 7F 69 3B 1E 08 10 B5 0B 4B 19 88 0B 4B 1B 88 64 20 58 43 0A 4B C0 18 00 22 09 4B 00 F0 BB F8 09 4B 1B 88 00 2B 02 D1 03 4B 18 80 02 E0 00 0C 01 4B 18 80 10 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 C2 70 03 02 70 B5 82 B0 0D 4B 1B 88 1B 04 0D 4A 12 88 9B 18 01 93 0C 4B 19 88 0C 4E 30 88 64 25 68 43 0B 4C 00 19 01 AA 0A 4B 00 F0 91 F8 30 88 68 43 00 19 08 4B 00 F0 8B F8 02 B0 70 BD C0 46 C4 70 03 02 C2 70 03 02 D0 70 03 02 C0 70 03 02 84 42 02 02 7D 03 04 08 7D E4 03 08 F0 B5 47 46 80 B4 82 B0 2F 4B 1D 88 2F 4B 1B 88 98 46 64 26 43 46 73 43 2D 4E 9E 19 00 22 00 21 30 00 2C 4B 00 F0 66 F8 01 90 FF 24 04 40 FF F7 7D FF 07 00 32 23 5D 1B 19 21 20 00 26 4B 00 F0 59 F8 0B 04 1B 0C ED 18 AB 00 5B 19 1A 01 53 1B 1B 02 1D 19 21 4B 00 F0 4D F8 84 00 24 18 23 01 1C 1B 24 02 64 19 01 94 20 00 FF F7 5F FF 87 42 09 D0 C8 23 5B 01 9C 46 64 44 20 00 FF F7 56 FF 87 42 F6 D1 01 94 30 00 15 4B 00 F0 33 F8 01 AA 00 21 30 00 13 4B 00 F0 2D F8 30 00 12 4B 00 F0 29 F8 64 23 42 46 5A 43 13 00 09 4A D3 18 98 83 30 00 0E 4B 00 F0 1E F8 30 00 0D 4B 00 F0 1A F8 02 B0 04 BC 90 46 F0 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 69 3B 1E 08 C9 4E 04 08 1D F9 03 08 7D 03 04 08 E9 E3 03 08 F9 F8 03 08 7D E4 03 08 18 47 20 47
 

Ryurs

Usuario de oro
Te debio aparecer esto es tu rom, si no fue así el error podria ser al compilarlo:

B5 00 28 0C DA 0A 4B 18 40 0A 4C 18 21 00 F0 DC F8 08 31 08 00 18 21 00 F0 D7 F8 08 00 06 E0 03 4B 18 40 18 21 03 4B 00 F0 CE F8 08 00 10 BD 00 FF FF 7F 69 3B 1E 08 10 B5 0B 4B 19 88 0B 4B 1B 88 64 20 58 43 0A 4B C0 18 00 22 09 4B 00 F0 BB F8 09 4B 1B 88 00 2B 02 D1 03 4B 18 80 02 E0 00 0C 01 4B 18 80 10 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 C2 70 03 02 70 B5 82 B0 0D 4B 1B 88 1B 04 0D 4A 12 88 9B 18 01 93 0C 4B 19 88 0C 4E 30 88 64 25 68 43 0B 4C 00 19 01 AA 0A 4B 00 F0 91 F8 30 88 68 43 00 19 08 4B 00 F0 8B F8 02 B0 70 BD C0 46 C4 70 03 02 C2 70 03 02 D0 70 03 02 C0 70 03 02 84 42 02 02 7D 03 04 08 7D E4 03 08 F0 B5 47 46 80 B4 82 B0 2F 4B 1D 88 2F 4B 1B 88 98 46 64 26 43 46 73 43 2D 4E 9E 19 00 22 00 21 30 00 2C 4B 00 F0 66 F8 01 90 FF 24 04 40 FF F7 7D FF 07 00 32 23 5D 1B 19 21 20 00 26 4B 00 F0 59 F8 0B 04 1B 0C ED 18 AB 00 5B 19 1A 01 53 1B 1B 02 1D 19 21 4B 00 F0 4D F8 84 00 24 18 23 01 1C 1B 24 02 64 19 01 94 20 00 FF F7 5F FF 87 42 09 D0 C8 23 5B 01 9C 46 64 44 20 00 FF F7 56 FF 87 42 F6 D1 01 94 30 00 15 4B 00 F0 33 F8 01 AA 00 21 30 00 13 4B 00 F0 2D F8 30 00 12 4B 00 F0 29 F8 64 23 42 46 5A 43 13 00 09 4A D3 18 98 83 30 00 0E 4B 00 F0 1E F8 30 00 0D 4B 00 F0 1A F8 02 B0 04 BC 90 46 F0 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 69 3B 1E 08 C9 4E 04 08 1D F9 03 08 7D 03 04 08 E9 E3 03 08 F9 F8 03 08 7D E4 03 08 18 47 20 47
Pues no me sale el mismo código que a ti.

¿Has probado el script de cambiar la naturaleza y te funciona?

También deberías poner dónde se encuentran tus funciones, al igual que hice yo aquí:
Código:
08800000 getdata
08800044 setdata
0880009C setnature
Sino no podré hacer las pruebas. Gracias de antemano.
 

kakarotto

Leyenda de WaH
Obviamente el codigo no coincide porque él lo insertó en otro offset mientras que tú lo hiciste en el 0x0800000 por defecto. El código lo testeé en su día y funciona perfectamente, asi que asegurate de que sigues las instrucciones al pie de la letra.
 

Ryurs

Usuario de oro
Obviamente el codigo no coincide porque él lo insertó en otro offset mientras que tú lo hiciste en el 0x0800000 por defecto. El código lo testeé en su día y funciona perfectamente, asi que asegurate de que sigues las instrucciones al pie de la letra.
Aún así su código es más largo que el que me salió a mi, cuando supongo que no debería de ser así.

Cómo dije antes, a mi me funcionan bien las demás cosas de cambiar ivs y evs, pero lo de cambiar la naturaleza es en lo que falla. Al final lo he seguido al pie de la letra; es compilarlo y darle las órdenes correctas en el script.

EDITO: He utilizado el código que dejó Versekr y usado solo la parte que correspondería a la función setnature, y funciona.

Es como que a mi por alguna razón esa función me la hubiera compilado mal, pero no entiendo por qué.
 
Última edición:

kakarotto

Leyenda de WaH
Aún así su código es más largo que el que me salió a mi, cuando supongo que no debería de ser así.

Cómo dije antes, a mi me funcionan bien las demás cosas de cambiar ivs y evs, pero lo de cambiar la naturaleza es en lo que falla. Al final lo he seguido al pie de la letra; es compilarlo y darle las órdenes correctas en el script.

EDITO: He utilizado el código que dejó Versekr y usado solo la parte que correspondería a la función setnature, y funciona.

Es como que a mi por alguna razón esa función me la hubiera compilado mal, pero no entiendo por qué.
Funciona porque algo has hecho mal, claramente. Pero si has conseguido tu objetivo, me alegro. La plantilla es la misma que la de Kaiser?
 

Ryurs

Usuario de oro
Funciona porque algo has hecho mal, claramente. Pero si has conseguido tu objetivo, me alegro. La plantilla es la misma que la de Kaiser?
Igual no deberías dar tan por supuesto que he hecho algo mal, porque no tiene nada de complicado.

Sí, es su plantilla. A ver, yo me he descargado su repositorio, he pegado una rom de fire red limpia con el nombre "BPRE0.gba" en esa carpeta, me he asegurado de tener la línea bien en el archivo main.s para que me lo inserte en el offset 800000, y he compilado con el cygwin, insertándomelo bien y sin errores. Ten en cuenta, que las funciones "getdata" y "setdata" me las ha insertado bien, porque me funcionan, pero la función "setnature" no.

Cosas que yo creo que pueden haber pasado, que tú en tu día lo insertaste con una versión de devkitARM antigua y con la que este repositorio si funciona, y para versiones más actuales del mismo no funciona. Otra cosa puede ser que kaiser actualizara su repositorio con algo que rompió esa función y no se dio cuenta, no lo sé.

Tampoco sé si Versekr ha sacado el código ya compilado a día de hoy o lo tenía compilado de hace unos años con unas herramientas de aquellos años también.
 

kakarotto

Leyenda de WaH
Si eso fuese así, no te iría ninguna de las 3 funciones, no solo una. La verdad es un caso raro el tuyo. Es una rom virgen, version 1.0?
 

Versekr Dark

Usuario mítico
Obviamente el codigo no coincide porque él lo insertó en otro offset mientras que tú lo hiciste en el 0x0800000 por defecto. El código lo testeé en su día y funciona perfectamente, asi que asegurate de que sigues las instrucciones al pie de la letra.
A ver quiero que quede claro algo, el codigo sirve para cualquier lugar en la rom, así como si deciden ponerlo en 0xF00000 como en 0x800000, ya que lo unico que se usa es un call para llamar a la función esto no tiene punteros ni nada de eso, ahora el solo debe copiar los datos en su rom y llamar a el setdata getdata o setnature, ese código yo lo uso en mis roms y me sirve perfectamente.

El unico error que cometi no fue decirte donde empieza cada valor, aquí te lo pongo:

10 B5 00 28 0C DA 0A 4B 18 40 0A 4C 18 21 00 F0 DC F8 08 31 08 00 18 21 00 F0 D7 F8 08 00 06 E0 03 4B 18 40 18 21 03 4B 00 F0 CE F8 08 00 10 BD 00 FF FF 7F 69 3B 1E 08 10 B5 0B 4B 19 88 0B 4B 1B 88 64 20 58 43 0A 4B C0 18 00 22 09 4B 00 F0 BB F8 09 4B 1B 88 00 2B 02 D1 03 4B 18 80 02 E0 00 0C 01 4B 18 80 10 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 C2 70 03 02 70 B5 82 B0 0D 4B 1B 88 1B 04 0D 4A 12 88 9B 18 01 93 0C 4B 19 88 0C 4E 30 88 64 25 68 43 0B 4C 00 19 01 AA 0A 4B 00 F0 91 F8 30 88 68 43 00 19 08 4B 00 F0 8B F8 02 B0 70 BD C0 46 C4 70 03 02 C2 70 03 02 D0 70 03 02 C0 70 03 02 84 42 02 02 7D 03 04 08 7D E4 03 08 F0 B5 47 46 80 B4 82 B0 2F 4B 1D 88 2F 4B 1B 88 98 46 64 26 43 46 73 43 2D 4E 9E 19 00 22 00 21 30 00 2C 4B 00 F0 66 F8 01 90 FF 24 04 40 FF F7 7D FF 07 00 32 23 5D 1B 19 21 20 00 26 4B 00 F0 59 F8 0B 04 1B 0C ED 18 AB 00 5B 19 1A 01 53 1B 1B 02 1D 19 21 4B 00 F0 4D F8 84 00 24 18 23 01 1C 1B 24 02 64 19 01 94 20 00 FF F7 5F FF 87 42 09 D0 C8 23 5B 01 9C 46 64 44 20 00 FF F7 56 FF 87 42 F6 D1 01 94 30 00 15 4B 00 F0 33 F8 01 AA 00 21 30 00 13 4B 00 F0 2D F8 30 00 12 4B 00 F0 29 F8 64 23 42 46 5A 43 13 00 09 4A D3 18 98 83 30 00 0E 4B 00 F0 1E F8 30 00 0D 4B 00 F0 1A F8 02 B0 04 BC 90 46 F0 BD D0 70 03 02 C0 70 03 02 84 42 02 02 E9 FB 03 08 69 3B 1E 08 C9 4E 04 08 1D F9 03 08 7D 03 04 08 E9 E3 03 08 F9 F8 03 08 7D E4 03 08 18 47 20 47

Rojo getdata

Azul setdata

Verde setnature


Esto lo puedes poner en cualquier parte de la rom, obviamente que termine con 0, 4 ,8 o C y funcionara, lo he hecho muchas veces y nunca me da error.
 
Última edición:
Arriba