Registrarse

[ASM] Comprobar si un Pokémon es shiny

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Checkshiny

Este tutorial será algo breve pero no por eso menos interesante. El día de hoy implementaremos en nuestra ROM una especie de comando nuevo, que dado el Pokemon seleccionado del equipo nos mostrará si es shiny o no, devolviendo a una variable un 0 o un 1.

La rutina es la siguiente:

Código:
.text
.align 2
.thumb

main:
	push {r0-r2, lr}
	ldr r0, =0x02024284
	ldr r1, =(0x020370B8+8)
	ldrh r1, [r1]
	cmp r1, #6
	bcs no_shiny
	mov r2, #100
	mul r1, r2
	add r0, r1
	ldrh r1, [r0,#6]
	ldrh r2, [r0,#4] 
	eor r2, r1
	ldrh r1, [r0,#2]
	eor r2, r1
	ldrh r1, [r0]
	eor r2, r1
	ldr r1, =0x020370B8
	cmp r2, #8
	bcs no_shiny
	mov r0, #1

end:
	strh r0, [r1]
	pop {r0-r2, pc}

no_shiny:
	mov r0, #0
	b end
Rutina compilada:

Código:
07 B5 0B 48 0B 49 09 88 06 29 0F D2 64 22 51 43 40 18 C1 88 82 88 4A 40 41 88 4A 40 01 88 4A 40 05 49 08 2A 02 D2 01 20 08 80 07 BD 00 20 FB E7 84 42 02 02 C0 70 03 02 B8 70 03 02
Sus parámetros son los siguientes:

Parametros de entrada:

Variable 0x8004: Posición del Pokemon a analizar (0 para el primero y sucesivamente)

Parametros de salida:

Variable 0x8001: 0 para no shiny 1 para shiny
Y eso es todo, la verdad es que es un sistema sencillo de usar, como la rutina no es mía no podré mostraros los pasos a seguir para haberla conseguido.

Créditos a @Kate, AliKate por la rutina.

Si hay dudas no dudeis en preguntar sin miedo ;)
 

ElTitoAleRoms

Comerciante
Respuesta: [ASM] Checkshiny

Duda, ¿Por que cuando pongo el checkshiny y intento entrar al rom se me bugea y el rom se daña?
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Re: Respuesta: [ASM] Checkshiny

Duda, ¿Por que cuando pongo el checkshiny y intento entrar al rom se me bugea y el rom se daña?
No soy adivino. Pero he dado por hecho que la gente sabe insertar rutinas. Recuerda insertarla en un offset que termine en 0, 4, 8 o C. Y que al haber el callasm debes sumar uno al offset donde está guardado.

Intentar entrar desde donde? Especifica tu duda por favor.

Has probado a compilar tu mismo la rutina? Por si acaso.

No se que más decir, a mi si me funciona. Prueba con una ROM limpia si no lo estabas haciendo.
 

ElTitoAleRoms

Comerciante
Respuesta: Re: Respuesta: [ASM] Checkshiny

No soy adivino. Pero he dado por hecho que la gente sabe insertar rutinas. Recuerda insertarla en un offset que termine en 0, 4, 8 o C. Y que al haber el callasm debes sumar uno al offset donde está guardado.

Intentar entrar desde donde? Especifica tu duda por favor.

Has probado a compilar tu mismo la rutina? Por si acaso.

No se que más decir, a mi si me funciona. Prueba con una ROM limpia si no lo estabas haciendo.
Gracias. Era por que estaba en una rom con una parte del mapa Bugeada. Ya me funciona!
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
Re: [ASM] Checkshiny

Aprovecho que este tema ha salido por alguna duda a añadir el funcionamiento de la rutina, que me he puesto a mirar y ahora lo entiendo.

Un algoritmo apropiado para ella sería algo así:

Hace la operacion lógica Xor (eor, explusive or) entre tres valores de la ram referente a los datos del pokemon la primera vez que este aparece.

(TrainerID xor SecretID) xor (PersonalityValue31..16 xor PersonalityValue15..0)

Es decir, el ID de entrenador, el ID secreto, los primeros 16 bits del PID del poke y los ultimos 16 bits del PID de poke.

Una vez hecha la operacion comprueba si el valor es menor de 8. Si es así el pokemon será shiny.

La tabla de la verdad de un Xor (en este caso de dos variables booleanas):

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

Fuera del rom hacking el xor es de gran utilidad (calcular bits de paridad, sumas binarias...)
 
Arriba