Registrarse

[ASM] Checktype

Annatar

A la luz del quinto día, mira al este
Checktype

Hoy os traigo otra pequeña rutina que de seguro para más de uno le es útil. Ni más ni menos que analizar si un determinado Pokémon de nuestro equipo es de un tipo que nosotros escojamos.

Esta rutina comprueba tanto el primer tipo como el segundo.

La rutina para Fire Red:

Código:
.text
.align 2
.thumb

main:
	push {r0-r2, lr}
	mov r1, #0x64
	ldr r0, var_8004
	ldrh r0, [r0]
	mul r0, r0, r1
	ldr r1, pokemondata
	add r0, r0, r1               ;aquí está el offset de la RAM de los datos del Pokemon que hayamos escogido
	mov r1, #0xB
	ldr r2, pokedecrypt
	bl linker                      ;tenemos la especie del Pokemon para poder buscarlo en la tabla
	mov r1, #0x1C
	mul r0, r0, r1
	ldr r1, tablestart
	sub r1, r1, #0x1C
	add r0, r0, r1              ;offset del primer tipo del Pokemon que hemos elegido
	mov r2, r0
	ldrb r0, [r0]
	ldr r1, var_8005
	ldrh r1, [r1]
	cmp r0, r1                  ;compara el primer tipo con el tipo que hemos definido en la variable 8005
	beq label
	mov r0, r2
	add r0, r0, #0x1
	ldrb r0, [r0]
	ldr r1, var_8005          ;ahora compara el segundo tipo
	ldrh r1, [r1]
	cmp r0, r1
	beq label
	mov r0, #0x0
	ldr r1, var_8005
	strh r0, [r1]                ;si el Tipo no coincide guardamos en la variable 8005 un 0
	b end

label:
	mov r0, #0x1
	ldr r1, var_8005
	strh r0, [r1]               ;de lo contrario guardamos un 1
	b end

linker:
	bx r2

end:
	pop {r0-r2, pc}
	


.align 2
	var_8004:	.word 0x020370C0
	var_8005:	.word 0x020370C2
	tablestart:	.word 0x082547A6
	pokemondata:	.word 0x02024284
	pokedecrypt:	.word 0x0803FBE9
Créditos a @Heavy Metal Kaktus por la rutina.

Voy a explicar los offsets que he usado para que aquel que entienda un mínimo de ASM pueda sustituir los offsets y hacer la rutina para otras ROM bases.

var_8004: es simplemente la variable que he usado para especificar la posición del Pokemon a analizar.

var_8005: sirve para especificar el tipo a checkear y te devuelve el resultado.

pokemondata: es el offset de la RAM de los datos del primer Pokemon de tu equipo, ahí está su PID, sus HP...

pokedecrypt: es una función, os recomiendo el post de @EnamoratDeKatie para encontrar el offset para otras ROMs. https://whackahack.com/foro/t-57964/e-fr-recopilacion-offsets-frecuentes-en-rutinas-asm

tablestart: es el offset de la ROM de los datos referentes a los tipos de Bulbasaur, ocupando cada tipo un byte (en total un half word). No entraré más en detalle. Pero sabed que aquí va el offset del primer pokemon de todos, de su primer tipo más bien.
La rutina compilada para Fire Red:

Código:
07 B5 64 21 12 48 00 88 48 43 14 49 40 18 0B 21 13 4A 00 F0 1A F8 1C 21 48 43 0F 49 1C 39 40 18 02 1C 00 78 0B 49 09 88 88 42 0A D0 10 1C 01 30 00 78 08 49 09 88 88 42 03 D0 00 20 05 49 08 80 04 E0 01 20 03 49 08 80 00 E0 10 47 07 BD C0 46 C0 70 03 02 C2 70 03 02 A6 47 25 08 84 42 02 02 E9 FB 03 08
Parámetros de entrada

Variable 0x8004: Posición de Pokémon a analizar (nótese que el primero es 0)

Variable 0x8005: Tipo Pokemon

Parámetros de salida

Variable 0x8005: 0 si el Pokemon no es de ese tipo, 1 si lo es
NORMAL 0x0
FIGHT 0x1
FLYING 0x2
POISON 0x3
GROUND 0x4
ROCK 0x5
BUG 0x6
GHOST 0x7
STEEL 0x8
??? 0x9
FIRE 0xA
WATER 0xB
GRASS 0xC
ELECTR 0xD
PSYCHC 0xE
ICE 0xF
DRAGON 0x10
DARK 0x11

Código:
#dynamic 0x800000

#org @start
setvar 0x8004 5 'Quiero saber si el último poke de mi equipo...
setvar 0x8005 0xC '... es de tipo planta
callasm 0x08800001 'Aquí pongo el offset en que inserté la rutina, sumándole 1
compare 0x8005 1
if 5 goto @noestipoplanta
msgbox @mensajetipoplanta 6 'Esto se ejecuta si es tipo planta
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6 'Esto se ejecuta si no es tipo planta
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.

Código:
#dyn 0x800000

#org @main
setvar 0x8004 0 'Reviso si el primer poke de mi equipo...
setvar 0x8005 0 '... es de tipo normal
callasm 0x800001 'Este es el offset en el que inserté la rutina, sumándole 1
if (0x8005==1) {
    loadptr @mensajetiponormal 'Esto se ejecuta si el poke es de tipo normal
    callstd 6
    end
}
else {
    loadptr @mensajenotiponormal 'Esto se ejecuta si el poke no es de tipo normal
    callstd 6
    end
}

#org @mensajetiponormal
= Es tipo normal.$$

#org @mensajenotiponormal
= Tu pokémon no es de\n
= tipo
= normal.$$

Esto es todo por hoy. Espero que os sirva ;)
 
Última edición:

Navy_

No me arrepiento de nada
Que interesante y fácil de usarla, solo tengo una duda solo funciona para Fr?
No vendría mal un ejemplo de script...


Gracias por traer este tipo de rutinas acompañan bien a la hora de scriptear^^
 

Annatar

A la luz del quinto día, mira al este
La rutina sólo funciona para Fire Red. Pues los offsets on los de Fire Red. Los offsets de las variables y los datos del pokemon en el equipo se cuales son para ruby y emerald. La tabla de los tipos es fácil de conseguir.

Pero desconozco donde está el offset de la función pokedecrypt. Si alguien la encuentra haré la rutina para ruby y emerald.
 

A3rdnaRH

Dua ruma ni kuri ga me noque na ne

darkeon75

ROM Hacker
Respuesta: [ASM] Checktype

¡Llevo 2 meses buscando algo así!

¿Cómo se puede cambiar las variables que usa la rutina?

Es que en mi juego ya tengo tu otra rutina que controla los Ps de los Pokémon y usa esas mismas variables.
 

Annatar

A la luz del quinto día, mira al este
En la rutina verás en la parte de abajo donde pone var_8004 y var_8005. A si derecha verás un offset para cada uno. Esos offsets son los que debes cambiar. Simplemente busca el offset que he puesto por los de variables que puedas usar.

Otra opción es usar un copyvar para hacer un backup de tus variables en otras variables. Y una vez hecho todo que hace esta rutina, devuelve los valores a donde estaban antes.
 

Saisar

Hago lo que puedo para ayudar a los demás ;)
Respuesta: [ASM] Checktype

Checktype

Hoy os traigo otra pequeña rutina que de seguro para más de uno le es útil. Ni más ni menos que analizar si un determinado Pokémon de nuestro equipo es de un tipo que nosotros escojamos.

Esta rutina comprueba tanto el primer tipo como el segundo.

La rutina:

Código:
.text
.align 2
.thumb

main:
	push {r0-r2, lr}
	mov r1, #0x64
	ldr r0, var_8004
	ldrh r0, [r0]
	mul r0, r0, r1
	ldr r1, pokemondata
	add r0, r0, r1
	mov r1, #0xB
	ldr r2, pokedecrypt
	bl linker
	mov r1, #0x1C
	mul r0, r0, r1
	ldr r1, tablestart
	sub r1, r1, #0x1C
	add r0, r0, r1
	mov r2, r0
	ldrb r0, [r0]
	ldr r1, var_8005
	ldrh r1, [r1]
	cmp r0, r1
	beq label
	mov r0, r2
	add r0, r0, #0x1
	ldrb r0, [r0]
	ldr r1, var_8005
	ldrh r1, [r1]
	cmp r0, r1
	beq label
	mov r0, #0x0
	ldr r1, var_8005
	strh r0, [r1]
	b end

label:
	mov r0, #0x1
	ldr r1, var_8005
	strh r0, [r1]
	b end

linker:
	bx r2

end:
	pop {r0-r2, pc}
	


.align 2
	var_8004:	.word 0x020370C0
	var_8005:	.word 0x020370C2
	tablestart:	.word 0x082547A6
	pokemondata:	.word 0x02024284
	pokedecrypt:	.word 0x0803FBE9
Créditos a @Heavy Metal Kaktus por la rutina.

La rutina compilada:

Código:
07 B5 64 21 12 48 00 88 48 43 14 49 40 18 0B 21 13 4A 00 F0 1A F8 1C 21 48 43 0F 49 1C 39 40 18 02 1C 00 78 0B 49 09 88 88 42 0A D0 10 1C 01 30 00 78 08 49 09 88 88 42 03 D0 00 20 05 49 08 80 04 E0 01 20 03 49 08 80 00 E0 10 47 07 BD C0 46 C0 70 03 02 C2 70 03 02 A6 47 25 08 84 42 02 02 E9 FB 03 08


NORMAL 0x0
FIGHT 0x1
FLYING 0x2
POISON 0x3
GROUND 0x4
ROCK 0x5
BUG 0x6
GHOST 0x7
STEEL 0x8
??? 0x9
FIRE 0xA
WATER 0xB
GRASS 0xC
ELECTR 0xD
PSYCHC 0xE
ICE 0xF
DRAGON 0x10
DARK 0x11

Esto es todo por hoy. Espero que os sirva ;)
Como seria el script base para el checktype?
 

Fran Agustín

L'amor està en l'aire
Re: Respuesta: [ASM] Checktype

Como seria el script base para el checktype?
Buenas amigui. Presta atención a la parte en que menciona los parámetros de entrada y de salida.
Tienes que:
  1. Cargar en la variable $8004 la posición del pokémon dentro del equipo (0-5).
  2. Cargar en la variable $8005 el tipo que quieres saber si ese pokémon tiene.
  3. Ejecutar la rutina.
  4. Revisar el valor que hay en la variable $8005.
    • Si es un 0, el pokémon no es de ese tipo.
    • Si es 1, el pokémon es de ese tipo.

Dicho esto, te dejo un ejemplo básico de script:
Código:
[SCRIPT]
#dynamic 0x800000

#org @start
setvar 0x8004 5 'Quiero saber si el último poke de mi equipo...
setvar 0x8005 0xC '... es de tipo planta
callasm 0x08800001 'Aquí pongo el offset en que inserté la rutina, sumándole 1
compare 0x8005 1
if 5 goto @noestipoplanta
msgbox @mensajetipoplanta 6 'Esto se ejecuta si es tipo planta
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6 'Esto se ejecuta si no es tipo planta
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
[/SCRIPT]

Código:
[SCRIPT]
#dyn 0x800000

#org @main
setvar 0x8004 0 'Reviso si el primer poke de mi equipo...
setvar 0x8005 0 '... es de tipo normal
callasm 0x800001 'Este es el offset en el que inserté la rutina, sumándole 1
if (0x8005==1) {
    loadptr @mensajetiponormal 'Esto se ejecuta si el poke es de tipo normal
    callstd 6
    end
}
else {
    loadptr @mensajenotiponormal 'Esto se ejecuta si el poke no es de tipo normal
    callstd 6
    end
}

#org @mensajetiponormal
= Es tipo normal.$$

#org @mensajenotiponormal
= Tu pokémon no es de\n
= tipo
= normal.$$
[/SCRIPT]

Bueno, espero haberme explicado bien. Cualquier duda que tengas, amigo, me avisas ;)
 

Saisar

Hago lo que puedo para ayudar a los demás ;)
Respuesta: Re: Respuesta: [ASM] Checktype

Buenas amigui. Presta atención a la parte en que menciona los parámetros de entrada y de salida.
Tienes que:
  1. Cargar en la variable $8004 la posición del pokémon dentro del equipo (0-5).
  2. Cargar en la variable $8005 el tipo que quieres saber si ese pokémon tiene.
  3. Ejecutar la rutina.
  4. Revisar el valor que hay en la variable $8005.
    • Si es un 0, el pokémon no es de ese tipo.
    • Si es 1, el pokémon es de ese tipo.

Dicho esto, te dejo un ejemplo básico de script:
Código:
[SCRIPT]
#dynamic 0x800000

#org @start
setvar 0x8004 5 'Quiero saber si el último poke de mi equipo...
setvar 0x8005 0xC '... es de tipo planta
callasm 0x08800001 'Aquí pongo el offset en que inserté la rutina, sumándole 1
compare 0x8005 1
if 5 goto @noestipoplanta
msgbox @mensajetipoplanta 6 'Esto se ejecuta si es tipo planta
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6 'Esto se ejecuta si no es tipo planta
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
[/SCRIPT]

Código:
[SCRIPT]
#dyn 0x800000

#org @main
setvar 0x8004 0 'Reviso si el primer poke de mi equipo...
setvar 0x8005 0 '... es de tipo normal
callasm 0x800001 'Este es el offset en el que inserté la rutina, sumándole 1
if (0x8005==1) {
    loadptr @mensajetiponormal 'Esto se ejecuta si el poke es de tipo normal
    callstd 6
    end
}
else {
    loadptr @mensajenotiponormal 'Esto se ejecuta si el poke no es de tipo normal
    callstd 6
    end
}

#org @mensajetiponormal
= Es tipo normal.$$

#org @mensajenotiponormal
= Tu pokémon no es de\n
= tipo
= normal.$$
[/SCRIPT]

Bueno, espero haberme explicado bien. Cualquier duda que tengas, amigo, me avisas ;)
Gracias amigo mejor explicado no puede estar!:awesome:
 

Versekr Dark

Usuario de Platino
Respuesta: [ASM] Checktype

Rojo Fuego, no la he testeado pero supongo que esta bien:

.text
.align 2
.thumb

main:
push {r0-r2, lr}
mov r1, #0x64
ldr r0, var_8004
ldrh r0, [r0]
mul r0, r0, r1
ldr r1, pokemondata
add r0, r0, r1
mov r1, #0xB
ldr r2, pokedecrypt
bl linker
mov r1, #0x1C
mul r0, r0, r1
ldr r1, tablestart
sub r1, r1, #0x1C
add r0, r0, r1
mov r2, r0
ldrb r0, [r0]
ldr r1, var_8005
ldrh r1, [r1]
cmp r0, r1
beq label
mov r0, r2
add r0, r0, #0x1
ldrb r0, [r0]
ldr r1, var_8005
ldrh r1, [r1]
cmp r0, r1
beq label
mov r0, #0x0
ldr r1, var_8005
strh r0, [r1]
b end

label:
mov r0, #0x1
ldr r1, var_8005
strh r0, [r1]
b end

linker:
bx r2

end:
pop {r0-r2, pc}



.align 2
var_8004: .word 0x02036FAC
var_8005: .word 0x02036FAE
tablestart: .word 0x0824FF6E - Modifica si has expandido la tabla tanto en Fire Red como Rojo Fuego
pokemondata: .word 0x020241F4
pokedecrypt: .word 0x0803FAD5

Como seria el script base para el checktype?
No se si funcione así:

#dynamic 0x800000

#org @start
countpokemon
compare 0x800D 0x6
if 0x1 goto @continue5
countpokemon
compare 0x800D 0x5
if 0x1 goto @continue4
countpokemon
compare 0x800D 0x4
if 0x1 goto @continue3
countpokemon
compare 0x800D 0x3
if 0x1 goto @continue2
countpokemon
compare 0x800D 0x2
if 0x1 goto @continue1
countpokemon
compare 0x800D 0x1
if 0x1 goto @continue0
release
end

#org @continue0
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue1
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue2
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue3
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue4
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue5
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6 'Esto se ejecuta si no es tipo planta
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
 
Última edición:

Fran Agustín

L'amor està en l'aire
Re: Respuesta: [ASM] Checktype

No se si funcione así:

#dynamic 0x800000

#org @start
countpokemon
compare 0x800D 0x6
if 0x1 goto @continue5
countpokemon
compare 0x800D 0x5
if 0x1 goto @continue4
countpokemon
compare 0x800D 0x4
if 0x1 goto @continue3
countpokemon
compare 0x800D 0x3
if 0x1 goto @continue2
countpokemon
compare 0x800D 0x2
if 0x1 goto @continue1
countpokemon
compare 0x800D 0x1
if 0x1 goto @continue0
release
end

#org @continue0
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue1
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue2
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue3
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue4
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @continue5
setvar 0x8004 0x0
setvar 0x8005 0xC
callasm 0x08800001
compare 0x8005 1
if 0x5 goto @noestipoplanta
msgbox @mensajetipoplanta 0x6
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6 'Esto se ejecuta si no es tipo planta
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
Buenas amigo. ¿Qué es lo que has querido hacer ahí? No lo entiendo bien :/

Fíjate que independientemente de la cantidad de pokes que tengas, ejecutas exactamente lo mismo.
Deberías aprender un poco más sobre optimización, emplear calls y demás.

¿Querías que revisara siempre el último pokémon en tu equipo? Eso es muy sencillo. Hagamos esto:
  1. Contemos los pokes que hay en el equipo.
  2. Restémosle uno para obtener el índice del último poke.
  3. Pongamos en la variable 0x8004 este valor y en la 0x8005 el valor del tipo que queremos comparar.
  4. Llamemos a la rutina.
  5. Revisemos el valor de la variable 0x8005.

Dejo por aquí un script de ejemplo
Código:
[SCRIPT]
#dynamic 0x800000

#org @start
countpokemon 'Guarda en la variable 0x800D la cantidas de pokes en el equipo
subvar 0x800D 1 'Le resta uno para saber el índice del último poke
copyvar 0x8004 0x800D 'Copia el valor a la variable que usa la rutina
setvar 0x8005 0xC 'Tipo planta
callasm 0x08800001 'Offset de la rutina + 1
compare 0x8005 1
if 5 goto @noestipoplanta
msgbox @mensajetipoplanta 6
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
[/SCRIPT]

Código:
[SCRIPT]
#dyn 0x800000
#org @start
countpokemon 'Cuenta la cantidad de pokes que hay en el equipo
subvar 0x800D 1 'Resta uno para tener el índice del último poke
copyvar 0x8004 0x800D 'Pasa el valor a la variable que usa la rutina
setvar 0x8005 0xC 'Tipo planta
callasm 0x08800001 'Offset de la rutina + 1
if (0x8005 == 1) {
    loadptr @mensajetipoplanta
    callstd 6
    end
}
else {
    loadptr @mensajenotipoplanta
    callstd 6
    end
}

#org @mensajetipoplanta
= Es tipo planta.$$

#org @mensajenotipoplanta
= No es tipo planta.$$
[/SCRIPT]
 
Última edición:

Versekr Dark

Usuario de Platino
Respuesta: Re: Respuesta: [ASM] Checktype

Buenas amigo. ¿Qué es lo que has querido hacer ahí? No lo entiendo bien :/

Fíjate que independientemente de la cantidad de pokes que tengas, ejecutas exactamente lo mismo.
Deberías aprender un poco más sobre optimización, emplear calls y demás.

¿Querías que revisara siempre el último pokémon en tu equipo? Eso es muy sencillo. Hagamos esto:
  1. Contemos los pokes que hay en el equipo.
  2. Restémosle uno para obtener el índice del último poke.
  3. Pongamos en la variable 0x8004 este valor y en la 0x8005 el valor del tipo que queremos comparar.
  4. Llamemos a la rutina.
  5. Revisemos el valor de la variable 0x8005.

Dejo por aquí un script de ejemplo
Código:
[SCRIPT]
#dynamic 0x800000

#org @start
countpokemon 'Guarda en la variable 0x800D la cantidas de pokes en el equipo
subvar 0x800D 1 'Le resta uno para saber el índice del último poke
copyvar 0x8004 0x800D 'Copia el valor a la variable que usa la rutina
setvar 0x8005 0xC 'Tipo planta
callasm 0x08800001 'Offset de la rutina + 1
compare 0x8005 1
if 5 goto @noestipoplanta
msgbox @mensajetipoplanta 6
end

#org @noestipoplanta
msgbox @mensajenotipoplanta 6
end

#org @mensajetipoplanta
= Es tipo planta.

#org @mensajenotipoplanta
= No es tipo planta.
[/SCRIPT]

Código:
[SCRIPT]
#dyn 0x800000
#org @start
countpokemon 'Cuenta la cantidad de pokes que hay en el equipo
subvar 0x800D 1 'Resta uno para tener el índice del último poke
copyvar 0x8004 0x800D 'Pasa el valor a la variable que usa la rutina
setvar 0x8005 0xC 'Tipo planta
callasm 0x08800001 'Offset de la rutina + 1
if (0x8005 == 1) {
    loadptr @mensajetipoplanta
    callstd 6
    end
}
else {
    loadptr @mensajenotipoplanta
    callstd 6
    end
}
[/SCRIPT]
Oh muchas gracias, no había entendido bien el como comparaba a los pokémon.
 

Annatar

A la luz del quinto día, mira al este
Creo que el tutorial está explicado debidamente pero veo que hay ciertas dudas sobre su uso, si no se tienen conceptos básicos de scripting.

He añadido el script de @EnamoratDeKatie para ello.

De paso, explico los offsets de la rutina.

var_8004: .word 0x020370C0 la variable número 8004
var_8005: .word 0x020370C2 la variable número 8005
tablestart: .word 0x082547A6 es el punto en el que aparecen el primer y segundo tipo de bulbasaur, ocupando dos bytes. 1C bytes más adelante están los de Ivysaur.
pokemondata: .word 0x02024284 los datos de la RAM del primer pokemon de tu equipo
pokedecrypt: .word 0x0803FBE9 una funcion, sin mas
 

Naren Jr.

Puto amo
Usuario de Platino
Respuesta: [ASM] Checktype

Uffff men te sobras @lros Tar-Minyatur cuando te volviste tan pro? uno se pierde un tiempo y ya te vuelves todo un experto.

Me encantan este tipo de cosas, dan mucha facilidad a la hora de hacer eventos especiales en cuanto a que si tienes "x" Pokémon activa cierto tipo de evento, sin duda algunas ya la he incorporado en mi hack.

Muchas gracias!
 
Arriba