[ASM] Checktype

Avisos


Like Tree21Gracias
Respuesta
 
Herramientas Desplegado
  #11  
22/11/2018
Predeterminado Respuesta: [ASM] Checktype
Dicho por Finrod Felagund Ver mensaje
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


Tipos Pokémon

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?
  #12  
22/11/2018
Predeterminado Re: Respuesta: [ASM] Checktype
Dicho por Saisar Ver mensaje
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:

XSE


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.



Red Alien


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.$$



Bueno, espero haberme explicado bien. Cualquier duda que tengas, amigo, me avisas
Gracias: Turambar y Saisar
VISCA CATALUNYA!
LLIBERTAT


"Lluitem pacíficament, perquè és l'essència de la llibertat. Dubtem com qualsevol persona, perquè és l'antídot a la temeritat. Parlem com a demòcrates, perquè és la clau de l'èxit. Confiem els uns amb els altres, perquè serà la derrota dels tirans"
  #13  
22/11/2018
Predeterminado Respuesta: Re: Respuesta: [ASM] Checktype
Dicho por EnamoratDeKatie Ver mensaje
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:

XSE


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.



Red Alien


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.$$



Bueno, espero haberme explicado bien. Cualquier duda que tengas, amigo, me avisas
Gracias amigo mejor explicado no puede estar!
  #14  
22/11/2018
Predeterminado Respuesta: [ASM] Checktype
Rojo Fuego, no la he testeado pero supongo que esta bien:

Spoiler


.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


Dicho por Saisar Ver mensaje
Como seria el script base para el checktype?
No se si funcione así:

Spoiler



#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 por Versekr Dark; 22/11/2018 a las 14:45
  #15  
22/11/2018
Predeterminado Re: Respuesta: [ASM] Checktype
Dicho por Versekr Dark Ver mensaje
No se si funcione así:

Spoiler



#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

XSE


Código:

#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.



Red Alien


Código:

#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.$$

VISCA CATALUNYA!
LLIBERTAT


"Lluitem pacíficament, perquè és l'essència de la llibertat. Dubtem com qualsevol persona, perquè és l'antídot a la temeritat. Parlem com a demòcrates, perquè és la clau de l'èxit. Confiem els uns amb els altres, perquè serà la derrota dels tirans"

Última edición por EnamoratDeKatie; 24/11/2018 a las 06:23
  #16  
22/11/2018
Predeterminado Respuesta: Re: Respuesta: [ASM] Checktype
Dicho por EnamoratDeKatie Ver mensaje
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

XSE


Código:

#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.



Red Alien


Código:

#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
}

Oh muchas gracias, no había entendido bien el como comparaba a los pokémon.
  #17  
22/11/2018
Predeterminado Re: [ASM] Checktype
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
  #18  
01/12/2018
Predeterminado 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!
Gracias: Turambar


ORGULLOSO DE NACHO, UN EXCELENTE TRABAJO Y AFORTUNADAMENTE PUEDO DECIR QUE TIENE MI GRANO DE ARENA!


¡GRACIAS A TODOS!


Respuesta

Herramientas
Desplegado

Permisos para publicar mensajes
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los BB code están Activado
Los Emoticones están Activado
El código [IMG] está Activado
El Código HTML está Desactivado
Trackbacks are Activado
Pingbacks are Activado
Refbacks are Desactivado



Extra
Estilo clásico
La franja horaria es GMT +1. Ahora son las 16:19.