Registrarse

[Otros] E | Exp. All

Lunos

Enfrentando a La Organización
Miembro insignia
Holi. El dia de hoy les presento dos maneras de implementar el efecto Exp. All.
¿Que es el Exp. All? Pues es un objeto introducido en Pokémon R/B que, al tenerlo en la mochila, le otorga puntos de experiencia a los Pokémon que tengamos en el equipo. El efecto fue cambiado posteriormente en la segunda generación pero mas o menos volvió a su estado original con la salida de Pokémon X/Y para la Nintendo 3DS.
Ese es el efecto que hoy les enseñaré a implementar en sus ROMs de Pokémon Emerald.

Esto lo haremos asi, habrán dos versiones, una que utiliza ASM y otra que no.
Elijan la que mas les guste.

Antes de empezar tocan los creditos- Hoy van para @BluRose por haber compartido el metodo sin ASM justo aqui y para @Samu por haber hecho una versión que usa ASM, que la posteó justo aqui.
Dicho eso, empecemos.

Versión Sin ASM
Requisitos:
-ROM de Pokémon Emerald (USA).
-Editor hexadecimal a preferencia (como siempre, yo usaré HxD)

Instrucciones:
1) Abriremos nuestra ROM de Pokémon Emerald en nuestro editor hexadecimal y haremos los siguientes cambios:
*En el offset 4A4BE escribiremos "02 21"
*En el offset 4A594 escribiremos "01 22"
*En el offset 4A634 escribiremos "01 20"

2) Guardamos y probamos.

Aqui una muestra del resultado


Aclaración:
Al ser esto una especie de port, esta implementación tiene los mismos inconvenientes que los cambios de byte para Fire Red, los mas notables siendo que los huevos pokémon pueden ganar experiencia, subir niveles y aprender ataques, y que no necesitas tener el Exp. Share para que el efecto actue.

Versión Con ASM
Requisitos:
-ROM de Pokémon Emerald
-Editor hexadecimal a preferencia (como siempre, yo usaré HxD)
-Editor de texto a preferencia (como siempre, yo usaré Notepad)
-El Compilador de HackMew

Instrucciones:
1) Copiaremos la siguiente rutina ASM y la pegaremos en un archivo de texto:
Código:
.thumb
.align 2

/****** NEW GEN EXP SHARE + EGG EXP FIX *******
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x0804A4BE y escribe los bytes "02 21"
- Ve a 0x0804A634 y escribe los bytes "01 20"
- Ve a 0x0804A58A y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0809D790 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (no uses la 0x8000,
	.word 0x020275D6 + (0x800[X] * 2)	@el juego la utiliza al inicializar combates dobles
is_egg_party:
	.word 0x020244EC + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x0804A592 + 1				@Dirección de retorno a la rutina
2) En las Lineas 83 y 87 modificaremos [XXX] y [X].
-[XXX] lo reemplazaremos por una flag vacia (yo usaré 200)
-[X] lo reemplazaremos por un numero a placer excepto el 0 (yo usaré el 2).

3) Descargamos y extraemos el compilador de HackMew el cual enlacé ahi arriba

4) Guardamos el archivo de texto dentro de la carpeta del compilador con un nombre sencillo de recordar y procedemos a hacer Shift + Click Derecho > Abrir Ventana de Comandos Aqui en algun espacio vacio dentro de la carpeta

5) En la ventana escribiremos: thumb (nombredelarchivo).txt y presionamos Enter.
Ejemplo: thumb expall.txt
Esto creará un archivo .bin con el mismo nombre que tiene nuestro archivo de texto.
Esa es la rutina ASM compilada.

6) Abrimos el archivo .bin con nuestro editor hexadecimal favorito y pulsamos Ctrl+A/E (seleccionar todo) y Ctrl+C (copiar)

7) Ahora abriremos nuestra ROM de Pokémon Emerald, iremos a un offset con espacio vacio dentro de nuestra ROM y pulsaremos Ctrl+B.
Como siempre digo, mas vale prevenir que lamentar. Les sugiero usar un offset que termine en 0, 4, 8 o C. Yo usaré el E3CF80.

8) Aun en nuestro editor hexadecimal, haremos las siguientes modificaciones:
-En el offset 04A4BE escribiremos: 02 21
-En el offset 04A634 escribiremos: 01 20
-En el offset 04A58A escribiremos: C0 46 00 4A 10 47 XX XX XX 08 04 BC
Nota: XX XX XX = Offset donde pusimos la rutina ASM durante el Paso 7, convertido en un pointer, +1.
Ejemplo: Como dije, yo dejé la rutina en E3CF80. E3CF80+1=E3CF81. Y si pasamos eso a pointer, queda 81 CF E3 08

9) Guardar y probar.

Aqui el resultado:

Y eso fue todo.​
 
Última edición:

Samu

Miembro insignia
Miembro insignia
Re: Em | Otros | El Exp. All Barato

Estoy casi seguro de que puedes evitar que los huevos ganen experiencia tirando un hook a una pequeña rutina, pero lo estoy diciendo sin mirar ninguna de las funciones relacionadas.

A mi sinceramente esto no me interesa mucho (ya que es una feature que no me gustó nada en los juegos nuevos), pero si alguien está muy interesado y no sabe como hacerlo..... pues podría intentar mirarlo.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Em | Otros | El Exp. All Barato

Estoy casi seguro de que puedes evitar que los huevos ganen experiencia tirando un hook a una pequeña rutina, pero lo estoy diciendo sin mirar ninguna de las funciones relacionadas.

A mi sinceramente esto no me interesa mucho (ya que es una feature que no me gustó nada en los juegos nuevos), pero si alguien está muy interesado y no sabe como hacerlo..... pues podría intentar mirarlo.
A mi honestamente me interesa.
Yo he empezado a usar esta función en ciertos ROM Hacks que estoy revisitando y es como un regalo caido del cielo
 

Fran

Profesional de WaH
Re: Em | Otros | El Exp. All Barato

¡Qué grande! @BlurRose Te amo <3. Hace mucho que no hablamos eh.
Bueno, interesante aporte. Los futuros RH ya podrán hackear en E como si fuera FR. Estoy seguro de que muchos van a usar esto. Gracias por traerlo Lunos.
 

Samu

Miembro insignia
Miembro insignia
Re: Em | Otros | El Exp. All Barato

Bueno, pues ni fin de semana ni pollas. Aquí lo tenéis.

Con esta rutina podéis utilizar el exp share tipo "nueva generación?" sin que los huevos ganen exp. He metido un flag en la rutina para que podáis utilizar el que vosotros queráis para activar-desactivar la rutina con scripts o asociando el flag a un obj clave que hagáis vosotros.

Las instrucciones están dentro de la propia rutina.
Código:
.thumb
.align 2

/****** NEW GEN EXP SHARE + EGG EXP FIX *******
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x0804A4BE y escribe los bytes "02 21"
- Ve a 0x0804A634 y escribe los bytes "01 20"
- Ve a 0x0804A58A y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0809D790 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (no uses la 0x8000,
	.word 0x020275D6 + (0x800[X] * 2)	@el juego la utiliza al inicializar combates dobles
is_egg_party:
	.word 0x020244EC + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x0804A592 + 1				@Dirección de retorno a la rutina
A ver si os sirve. Ah y por cierto @Lunos, si quiere subirlo a pokeco puedes hacerlo sin problemas, aunque puede que hicieses bien en traducir los comentarios o en quitarlos xD.
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Em | Otros | El Exp. All Barato

Maestro, la intenté utilizar antes de postearla en PokeCommunity, pero no pude.
1) Reemplacé "[XXX]" por "200" y "0x800[X]" por "0x4000" (Flag 0x200 y Var 0x4000)
2) Inserté la rutina compilada en E3CF80
3) Fui a 04A4BE y escribí "02 21"
4) Fui a 04A634 y escribí "01 20"
5) Fui a 04A58A y escribí "C0 46 00 4A 10 47 81 CF E3 08 04 BC"

Luego escribí este sencillo script para prender y apagar la Flag 0x200 facilmente, pero a la hora de hacer mis pruebitas me encuentro con que el juego se congela tras cada batalla, justo antes de que mi Pokémon obtenga puntos de experiencia.


Por si las moscas, antes de la Var 0x4000 probé con la 0x8001, mismo resultado.
Me temo que, o metí la pata, o no funciona.
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Maestro, la intenté utilizar antes de postearla en PokeCommunity, pero no pude.
1) Reemplacé "[XXX]" por "200" y "0x800[X]" por "0x4000" (Flag 0x200 y Var 0x4000)
2) Inserté la rutina compilada en E3CF80
3) Fui a 04A4BE y escribí "02 21"
4) Fui a 04A634 y escribí "01 20"
5) Fui a 04A58A y escribí "C0 46 00 4A 10 47 81 CF E3 08 04 BC"

Luego escribí este sencillo script para prender y apagar la Flag 0x200 facilmente, pero a la hora de hacer mis pruebitas me encuentro con que el juego se congela tras cada batalla, justo antes de que mi Pokémon obtenga puntos de experiencia.


Por si las moscas, antes de la Var 0x4000 probé con la 0x8001, mismo resultado.
Me temo que, o metí la pata, o no funciona.
Normal que no funcionase xD, se me había olvidado poner el linker para ejecutar la subrutina del flag y puse la dirección de fred xDD. Cosas que tiene depurar la rutina sin el flag y meterlo todo después sin probarlo.

PD: Debes utilizar variables temporales del rago 0x8001-0x800X, las variables 0x40XX no se resetean al apagar el juego. (podrías usarlas, pero la dirección de esas variables no se calcula con esa fórmula que he puesto yo).
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Normal que no funcionase xD, se me había olvidado poner el linker para ejecutar la subrutina del flag y puse la dirección de fred xDD. Cosas que tiene depurar la rutina sin el flag y meterlo todo después sin probarlo.

PD: Debes utilizar variables temporales del rago 0x8001-0x800X, las variables 0x40XX no se resetean al apagar el juego. (podrías usarlas, pero la dirección de esas variables no se calcula con esa fórmula que he puesto yo).
El motivo por el que usé la 0x4000 es justamente porque es una variable temporal, pero si ademas de usar una temporal tiene que si o si ser una que esté rondando los 8000, pues nada, tocará usar una de esas xD

Probaré la rutina ahora que está corregida y edito cuando tenga los resultados.

EDITO: Pues parece que ya funciona bien. Lo primero que noté es que siempre que la Flag 0x200 esté activada, tengas el Exp. Share o no, el efecto se activa. ¿Se podria hacer que la rutina no solo compruebe el estado de la flag, si no que tambien compruebe si el objeto en cuestión está en la mochila del Jugador? Yo creo que eso le añadiria un poco mas de fidelidad.
El scripting clasico tiene el comando "checkitem", imagino que eso es solo un atajo a la función real, tal y como el resto de macros que hizo Hackmew para XSE.
 
Última edición:

Samu

Miembro insignia
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

El motivo por el que usé la 0x4000 es justamente porque es una variable temporal, pero si ademas de usar una temporal tiene que si o si ser una que esté rondando los 8000, pues nada, tocará usar una de esas xD

Probaré la rutina ahora que está corregida y edito cuando tenga los resultados.

EDITO: Pues parece que ya funciona bien. Lo primero que noté es que siempre que la Flag 0x200 esté activada, tengas el Exp. Share o no, el efecto se activa. ¿Se podria hacer que la rutina no solo compruebe el estado de la flag, si no que tambien compruebe si el objeto en cuestión está en la mochila del Jugador? Yo creo que eso le añadiria un poco mas de fidelidad.
El scripting clasico tiene el comando "checkitem", imagino que eso es solo un atajo a la función real, tal y como el resto de macros que hizo Hackmew para XSE.
Creo que es mejor dejar la función tal y como está la verdad. Se puede crear un objeto clave nuevo que tenga la skin del repartir experiencia, y que al usarlo llame a un script que active el flag. Si hago eso mediante ASM vas a necesitar activar el flag mediante un evento externo, pero no vas a poder desactivarlo cuando quieras. Con el objeto eso no ocurre.

En cuanto a las variables, puedes usar la que quieras como ya te dije (se guarden en el sav o no). Simplemente, lo que no puedes hacer, es calcular la dirección de la variable 4000 con la fórmula que deje. Si tienes la dirección, pues perfecto.
PD: Lo he comprobado por si acaso, pero la variable 0x4000 no es temporal, la información que contiene se guarda en el .sav. (Y Aunque no debería ocurrir nada por usar este tipo de variables, recomendaría no hacerlo por motivos de "seguridad", no vaya a ser que modifiques el valor de la variable con algo y se guarde la modificación).


Para editar el item, utilizar el gen3tools. El offset del script va en "Field Script"
 
Última edición:
Respuesta: Re: Em | Otros | El Exp. All Barato

Bueno, pues ni fin de semana ni pollas. Aquí lo tenéis.

Con esta rutina podéis utilizar el exp share tipo "nueva generación?" sin que los huevos ganen exp. He metido un flag en la rutina para que podáis utilizar el que vosotros queráis para activar-desactivar la rutina con scripts o asociando el flag a un obj clave que hagáis vosotros.

Las instrucciones están dentro de la propia rutina.
Código:
.thumb
.align 2

/****** NEW GEN EXP SHARE + EGG EXP FIX *******
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x0804A4BE y escribe los bytes "02 21"
- Ve a 0x0804A634 y escribe los bytes "01 20"
- Ve a 0x0804A58A y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0809D790 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (no uses la 0x8000,
	.word 0x020275D6 + (0x800[X] * 2)	@el juego la utiliza al inicializar combates dobles
is_egg_party:
	.word 0x020244EC + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x0804A592 + 1				@Dirección de retorno a la rutina
A ver si os sirve. Ah y por cierto @Lunos, si quiere subirlo a pokeco puedes hacerlo sin problemas, aunque puede que hicieses bien en traducir los comentarios o en quitarlos xD.
Can you port this for Fire Red?
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Can you port this for Fire Red?
I've already done it, just have to debug the code. Will post it later today (fingers crossed).

Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x08021C3A y escribe los bytes "02 21"
- Ve a 0x08021D70 y escribe los bytes "01 20"
- Ve a 0x08021CC6 y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0806E6D0 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (8000-800C)
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x08021CD0 + 1				@Dirección de retorno a la rutina
Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
The following changes in the rom are needed:
- Go to 0x08021C3A and overwrite with "02 21".
- Go to 0x08021D70 and write "01 20".
- Go to 0x08021CC6 and write the following:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC"
where [XX+1 XX XX 08] is the reverse pointer +1 
to the offset of this routine.
************************************************
Is important to note that you HAVE TO choose the flag you
wanna use to toggle on/off the routine.
In the same way, you also have to choose a temp variable
for this routine to store a control value. (it will actually count
the current pokemon slot its checking)
************************************************
************************************************
************************************************
Credits to BluRose & Lunos          *********************
& Samu (lmao almost forgot myself)  ******************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:			   [MENTION=31666]will[/MENTION] check the flag value, return it to r0 and compare it
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		        @If flag is set (0x1) routine is "on", otherwise is "off"
	bne routine_off
	pop {r0-r2}	
	
main:
   [MENTION=31902]Che[/MENTION]cks the team slot to check and stores it into a temp variable
	push {r3-r6}
	ldr r6, slot_var		        @Loads the slot in r3
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			  
	ldrb r4, [r4, r5]		        @Loads in r4 the pointer to the team_slot "egg_byte"
	cmp r4, #0x6                    @if byte value is 0x6 -> pokemon is an egg
	beq pokemonIsEgg
	mov r2, #0x1                    @otherwise set r0 to 0x1 (will gain exp)
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@sets r2 to 0x0 (will not gain exp)
	
update_slot:				@updates and reset slot value.
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@"original instructions"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Choose the flag number
flag_routine:
	.word 0x0806E6D0 +1				@Routine that returns flag value to r0
slot_var: 								@choose a temp variable
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@"eggByte" of first pokemon slot
return_dir:
	.word 0x08021CD0 + 1				@routine return direction

Ok, there you have it.


Por cierto, @Lunos te recomendaría poner las dos rutinas en el post principal y cambiar el nombre del post. De esa manera quedará todo completo (ya que hay gente que podría no mirar los comentarios) y de paso le facilitas la tarea al "pringado" de turno al que le toque actualizar el índice de tutoriales xD.
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

I've already done it, just have to debug the code. Will post it later today (fingers crossed).

Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x08021C3A y escribe los bytes "02 21"
- Ve a 0x08021D70 y escribe los bytes "01 20"
- Ve a 0x08021CC6 y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0806E6D0 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (8000-800C)
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x08021CD0 + 1				@Dirección de retorno a la rutina
Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
The following changes in the rom are needed:
- Go to 0x08021C3A and overwrite with "02 21".
- Go to 0x08021D70 and write "01 20".
- Go to 0x08021CC6 and write the following:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC"
where [XX+1 XX XX 08] is the reverse pointer +1 
to the offset of this routine.
************************************************
Is important to note that you HAVE TO choose the flag you
wanna use to toggle on/off the routine.
In the same way, you also have to choose a temp variable
for this routine to store a control value. (it will actually count
the current pokemon slot its checking)
************************************************
************************************************
************************************************
Credits to BluRose & Lunos          *********************
& Samu (lmao almost forgot myself)  ******************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:			   [MENTION=31666]will[/MENTION] check the flag value, return it to r0 and compare it
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		        @If flag is set (0x1) routine is "on", otherwise is "off"
	bne routine_off
	pop {r0-r2}	
	
main:
   [MENTION=31902]Che[/MENTION]cks the team slot to check and stores it into a temp variable
	push {r3-r6}
	ldr r6, slot_var		        @Loads the slot in r3
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			  
	ldrb r4, [r4, r5]		        @Loads in r4 the pointer to the team_slot "egg_byte"
	cmp r4, #0x6                    @if byte value is 0x6 -> pokemon is an egg
	beq pokemonIsEgg
	mov r2, #0x1                    @otherwise set r0 to 0x1 (will gain exp)
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@sets r2 to 0x0 (will not gain exp)
	
update_slot:				@updates and reset slot value.
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@"original instructions"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Choose the flag number
flag_routine:
	.word 0x0806E6D0 +1				@Routine that returns flag value to r0
slot_var: 								@choose a temp variable
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@"eggByte" of first pokemon slot
return_dir:
	.word 0x08021CD0 + 1				@routine return direction

Ok, there you have it.


Por cierto, @Lunos te recomendaría poner las dos rutinas en el post principal y cambiar el nombre del post. De esa manera quedará todo completo (ya que hay gente que podría no mirar los comentarios) y de paso le facilitas la tarea al "pringado" de turno al que le toque actualizar el índice de tutoriales xD.
Pueees.. hecho.
Hubiese preferido hacer un tema nuevo sinceramente, pero eh, que más da.
 
Respuesta: Em | Otros | Exp. All

hola! he buscado por mucho tiempo el post en el cual hablen acerca de este hack del exp share. , pues a mi no me gusta usarlo cuando juego, estoy jugando en especifico un hack room de versekrdark el cual se llama super red fire y en el esta este hack para que todos los pokes obtengan exp por igual... por lo que me gustaria saber si esque me pueden ayudar a revertir esto, pues no hay forma de desactivarlo en el juego pues cuando le doy a usar al item aparece la frase de oak "no puedes usar esto aqui" o algo asi xd.

si me pudiesen ayudar estaria infinitamente agradecido pues es el unico que no modifica exageradamente el juego y que incluye megaevoluciones....

EDIT: Logre quitar el hack luego de investigar mucho por el foro xd perdon si moleste al unirme solo para preguntar esto kadsj
 
Última edición:

Ancer

Usuario de oro
Respuesta: Em | Otros | Exp. All

esto esta a otro nivel pos lleva como 1 o 2 años con la versión con los "errores"
de verdad es de agradecer
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

I've already done it, just have to debug the code. Will post it later today (fingers crossed).

Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x08021C3A y escribe los bytes "02 21"
- Ve a 0x08021D70 y escribe los bytes "01 20"
- Ve a 0x08021CC6 y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0806E6D0 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (8000-800C)
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x08021CD0 + 1				@Dirección de retorno a la rutina
Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
The following changes in the rom are needed:
- Go to 0x08021C3A and overwrite with "02 21".
- Go to 0x08021D70 and write "01 20".
- Go to 0x08021CC6 and write the following:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC"
where [XX+1 XX XX 08] is the reverse pointer +1 
to the offset of this routine.
************************************************
Is important to note that you HAVE TO choose the flag you
wanna use to toggle on/off the routine.
In the same way, you also have to choose a temp variable
for this routine to store a control value. (it will actually count
the current pokemon slot its checking)
************************************************
************************************************
************************************************
Credits to BluRose & Lunos          *********************
& Samu (lmao almost forgot myself)  ******************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:			   [MENTION=31666]will[/MENTION] check the flag value, return it to r0 and compare it
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		        @If flag is set (0x1) routine is "on", otherwise is "off"
	bne routine_off
	pop {r0-r2}	
	
main:
   [MENTION=31902]Che[/MENTION]cks the team slot to check and stores it into a temp variable
	push {r3-r6}
	ldr r6, slot_var		        @Loads the slot in r3
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			  
	ldrb r4, [r4, r5]		        @Loads in r4 the pointer to the team_slot "egg_byte"
	cmp r4, #0x6                    @if byte value is 0x6 -> pokemon is an egg
	beq pokemonIsEgg
	mov r2, #0x1                    @otherwise set r0 to 0x1 (will gain exp)
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@sets r2 to 0x0 (will not gain exp)
	
update_slot:				@updates and reset slot value.
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@"original instructions"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Choose the flag number
flag_routine:
	.word 0x0806E6D0 +1				@Routine that returns flag value to r0
slot_var: 								@choose a temp variable
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@"eggByte" of first pokemon slot
return_dir:
	.word 0x08021CD0 + 1				@routine return direction

Ok, there you have it.


Por cierto, @Lunos te recomendaría poner las dos rutinas en el post principal y cambiar el nombre del post. De esa manera quedará todo completo (ya que hay gente que podría no mirar los comentarios) y de paso le facilitas la tarea al "pringado" de turno al que le toque actualizar el índice de tutoriales xD.
He probado la rutina de FR pero no parece funcionar muy bien. El juego se reinicia al ganar una batalla justo antes de decir la experiencia ganada. Lo he probado en mi hack y una rom limpia. Mismo error en ambos.
 

Samu

Miembro insignia
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Gooby;430768 dijo:
He probado la rutina de FR pero no parece funcionar muy bien. El juego se reinicia al ganar una batalla justo antes de decir la experiencia ganada. Lo he probado en mi hack y una rom limpia. Mismo error en ambos.
He estado un rato probando a insertar la rutina en un rom limpio de fred y mirando en el debugger de No$gba, siento decirte que todo funciona correctamente xD, tanto cuando está activada como cuando está desactivada la flag. No he conseguido hacer que se me cuelgue.

Te recomendaría revisar que has realizado todos los pasos que se describen en los comentarios correctamente, que no se te haya olvidado sumar uno en el reverse pointer a la rutina y que la misma comience en un offset alineado en 4 bytes (0, 4, 8 o C).

Esto supongo que ya lo has tenido en cuenta, pero si por algún casual estás trabajando en un rom de 'rojo fuego' la rutina no va a funcionar.
 

Versekr Dark

Usuario mítico
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Gooby;430768 dijo:
He probado la rutina de FR pero no parece funcionar muy bien. El juego se reinicia al ganar una batalla justo antes de decir la experiencia ganada. Lo he probado en mi hack y una rom limpia. Mismo error en ambos.
El error te da por que no quitas todos los espacios de los dialogos nuevos, al final debe aparecerte esto

28 68 01 1C 53 31 08 78 07 B4 11 48 11 4A 0E B4 00 F0 1D F8 0E BC 01 28 15 D1 07 BC 78 B4 0E 4E 33 78 0E 4C 64 25 5D 43 64 5D 06 2C 01 D0 01 22 00 E0 00 22 01 33 06 2B 00 D1 00 23 33 80 78 BC 04 B4 07 4A 10 47 07 BC 01 22 02 40 F8 E7 10 47 00 02 00 00 D1 E6 06 08 D0 70 03 02 97 42 02 02 D1 1C 02 08

Flag

Variable

A mi me daba el mismo error pero cuando samu me lo paso compilado descubrí que si no quitas todos los espacios no compila correctamente y por ende no queda bien la rutina, si al final de lo que pusiste no aparece eso, nada mas ponlo y funcionara.

Rutina Rojo Fuego:

/****** NEW GEN EXP SHARE + EGG EXP FIX *******
************** FRED VERSION ********************
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x08021BAA y escribe los bytes "02 21"
- Ve a 0x08021CE0 y escribe los bytes "01 20"
- Ve a 0x08021C36 y escribe lo siguiente:
"C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC"
siendo [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

.align 2
.thumb

no_crash:
ldr r0, [r5]
mov r1, r0
add r1, #0x53
ldrb r0, [r1]

flag_check:
push {r0-r2}
ldr r0, flag_number
ldr r2, flag_routine
push {r1-r3}
bl linker
pop {r1-r3}
cmp r0, #0x1
bne routine_off
pop {r0-r2}

main:
push {r3-r6}
ldr r6, slot_var
ldrb r3, [r6]
ldr r4, is_egg_party
mov r5, #0x64
mul r5, r5, r3
ldrb r4, [r4, r5]
cmp r4, #0x6
beq pokemonIsEgg
mov r2, #0x1
b update_slot

pokemonIsEgg:
mov r2, #0x0

update_slot:
add r3, #0x1
cmp r3, #0x6
bne end
mov r3, #0x0

end:
strh r3, [r6]
pop {r3-r6}

return:
push {r2}
ldr r2, return_dir
bx r2

routine_off:
pop {r0-r2}
mov r2, #0x1
and r2, r0
b return

linker:
bx r2

.align 2
flag_number:
.word 0x00000200
flag_routine:
.word 0x0806E708 +1
slot_var:
.word 0x0202703C + (0x800C * 2)
is_egg_party:
.word 0x020241F4 + 0x13
return_dir:
.word 0x08021C40 + 1

 
Última edición:

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: Em | Otros | Exp. All

Oh que espectáculo, deberían también añadir el de @Versekr Dark a la parte principal y cambiar el titulo del post como GBA | Otros | Exp. All ya que se contiene para varias versiones y por lo que veo funciona sin ningún problema.

No soy muy fan de este tipo de cosas, a duras penas tengo el ganar experiencia luego de capturar, quizás lo use, no sé, pero he decir que @Samu es Dios<3
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

I've already done it, just have to debug the code. Will post it later today (fingers crossed).

Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
Es necesario realizar las siguientes ediciones en el rom:
- Ve a 0x08021C3A y escribe los bytes "02 21"
- Ve a 0x08021D70 y escribe los bytes "01 20"
- Ve a 0x08021CC6 y escribe lo siguiente:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC" 
 siendo  [XX+1 XX XX 08] el pointer permutado a esta rutina
************************************************
Es también importante recalcar que debéis escoger el flag que
vais a utilizar para activar/desactivar la rutina.
De la misma forma debéis escoger una variable que utilizará 
está rutina para almacenar un valor de control.
************************************************
************************************************
************************************************
Créditos a BluRose & Lunos *********************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:				@Se encarga de comprobar si hemos activado el flag
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		@Compara el flag con 0x1 (activado)
	bne routine_off
	pop {r0-r2}	
	
main:
	@Comprobar el slot y guardarlo en una variable.
	push {r3-r6}
	ldr r6, slot_var		@Carga en r3 el slot del pokemon
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			@Calcula las posiciones a avanzar
	ldrb r4, [r4, r5]		@Carga en r4 el byte egg/not
	cmp r4, #0x6
	beq pokemonIsEgg
	mov r2, #0x1
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@Establece r2 en 0 (no ganará exp)
	
update_slot:				@Actualiza y resetea el valor del slot
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@Ejecuta las instrucciones "originales"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Elige el numero del flag
flag_routine:
	.word 0x0806E6D0 +1				@Rutina que checkea el flag
slot_var: 								@Escoge una variable temporal (8000-800C)
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@Byte que comprueba si es un huevo
return_dir:
	.word 0x08021CD0 + 1				@Dirección de retorno a la rutina
Código:
.align 2
.thumb

/****** NEW GEN EXP SHARE + EGG EXP FIX  *******
************** FRED VERSION ********************
The following changes in the rom are needed:
- Go to 0x08021C3A and overwrite with "02 21".
- Go to 0x08021D70 and write "01 20".
- Go to 0x08021CC6 and write the following:
 "C0 46 00 4A 10 47 [XX+1 XX XX 08] 04 BC"
where [XX+1 XX XX 08] is the reverse pointer +1 
to the offset of this routine.
************************************************
Is important to note that you HAVE TO choose the flag you
wanna use to toggle on/off the routine.
In the same way, you also have to choose a temp variable
for this routine to store a control value. (it will actually count
the current pokemon slot its checking)
************************************************
************************************************
************************************************
Credits to BluRose & Lunos          *********************
& Samu (lmao almost forgot myself)  ******************
************************************************
************************************************/

no_crash:
	ldr r0, [r5]
	mov r1, r0
	add r1, #0x53
	ldrb r0, [r1]
	
flag_check:			   [MENTION=31666]will[/MENTION] check the flag value, return it to r0 and compare it
	push {r0-r2}
	ldr r0, flag_number
	ldr r2, flag_routine
	push {r1-r3}
	bl linker
	pop {r1-r3}
	cmp r0, #0x1		        @If flag is set (0x1) routine is "on", otherwise is "off"
	bne routine_off
	pop {r0-r2}	
	
main:
   [MENTION=31902]Che[/MENTION]cks the team slot to check and stores it into a temp variable
	push {r3-r6}
	ldr r6, slot_var		        @Loads the slot in r3
	ldrb r3, [r6]
	ldr r4, is_egg_party	
	mov r5, #0x64			
	mul r5, r5, r3			  
	ldrb r4, [r4, r5]		        @Loads in r4 the pointer to the team_slot "egg_byte"
	cmp r4, #0x6                    @if byte value is 0x6 -> pokemon is an egg
	beq pokemonIsEgg
	mov r2, #0x1                    @otherwise set r0 to 0x1 (will gain exp)
	b update_slot
	
pokemonIsEgg:
	mov r2, #0x0			@sets r2 to 0x0 (will not gain exp)
	
update_slot:				@updates and reset slot value.
	add r3, #0x1
	cmp r3, #0x6
	bne end
	mov r3, #0x0
	
end:
	strh r3, [r6]
	pop {r3-r6}
	
return:
	push {r2}
	ldr r2, return_dir
	bx r2
	
routine_off:				@"original instructions"
	pop {r0-r2}
	mov r2, #0x1
	and r2, r0
	b return

linker:
	bx r2
	
.align 2
flag_number:
	.word 0x00000[XXX] 					@Choose the flag number
flag_routine:
	.word 0x0806E6D0 +1				@Routine that returns flag value to r0
slot_var: 								@choose a temp variable
	.word 0x020270B8 + (0x800[X] * 2)	
is_egg_party:
	.word 0x02024284 + 0x13				@"eggByte" of first pokemon slot
return_dir:
	.word 0x08021CD0 + 1				@routine return direction

Ok, there you have it.


Por cierto, @Lunos te recomendaría poner las dos rutinas en el post principal y cambiar el nombre del post. De esa manera quedará todo completo (ya que hay gente que podría no mirar los comentarios) y de paso le facilitas la tarea al "pringado" de turno al que le toque actualizar el índice de tutoriales xD.
Vuelvo a quotear.
Mucha gente estuvo probando mi hack con el exp. Share que has puesto. Pero men han reportado lo siguiente:

- La cantidad de experiencia ganada es menor a la que debería ganar un Pokémon. Esté encendido o no, incluso iniciando el juego la ganancia de experiencia es muy baja (Por vencer un rattata nivel 2 mi cyndaquil gana solo 8 exp cuando debería ser 24 más o menos)
- Loa huevos tambien ganan experiencia.

Lo demás funciona de maravilla. Me gusta que se active a voluntad.
 

Versekr Dark

Usuario mítico
Respuesta: Re: Respuesta: Re: Em | Otros | El Exp. All Barato

Vuelvo a quotear.
Mucha gente estuvo probando mi hack con el exp. Share que has puesto. Pero men han reportado lo siguiente:

- La cantidad de experiencia ganada es menor a la que debería ganar un Pokémon. Esté encendido o no, incluso iniciando el juego la ganancia de experiencia es muy baja (Por vencer un rattata nivel 2 mi cyndaquil gana solo 8 exp cuando debería ser 24 más o menos)
- Loa huevos tambien ganan experiencia.

Lo demás funciona de maravilla. Me gusta que se active a voluntad.
Se activa a voluntad con la flag que pones.

Solo activala y desactivala según quieras mediante un script.
 
Arriba