Registrarse

[Rutina] FR|ASM| GPS(S) - Get Pokémon Species (Slot)

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia


Get Pokémon Species (Slot)




¿Qué es el GPS(S)?

  • El Get Pokémon Species (GPS) es una rutina ASM desarrollada para Pokémon Fire Red 1.0 que permite averiguar la especie de un pokémon de tu equipo (ejemplos: Beedrill, Kakuna, Pikachu).
  • El Get Pokémon Species Slot (GPSS) es una rutina ASM desarrollada para Pokémon Fire Red 1.0 que permite averiguar si tienes un pokémon determinado en tu equipo y, en caso de que lo tengas, en qué posición está ubicado (ejemplo: ¿Tengo un Pikachu? Sí -> ¿En qué posición? 1)

¿Cómo funciona?

  • GPS
    1. Información
      Usa el desencriptador del ROM para averiguar la especie del pokémon que se encuentra en la posición X de tu equipo.
    2. ¿Toma parámetros? Sí
      Variable 0x8004: Posición del equipo que quieres analizar. 0x0 es el primer pokémon (posición 1) y 0x5 es el último (posición 6).
    3. ¿Devuelve parámetros? Sí
      Variable 0x8004:
      • 0x0 = El pokémon en esa posición no es el deseado.
      • 0x1= El pokémon en esa posición es el deseado.
  • GPSS
    1. Información
      Usa el desencriptador del ROM para averiguar la especie del primer pokémon del equipo y lo compara con la que hayas indicado. Si el pokémon no es de esa especie, prueba con el que está en la segunda posición y así sucesivamente hasta encontrarlo o verificar que ningún pokémon del equipo sea el que hayas indicado.
    2. ¿Toma parámetros? Sí
      Variable 0x8004: Especie del pokémon que quieras saber si tienes en el equipo. Es decir, su número en la pokédex nacional (ejemplos: Treecko=252, Seadra=117, Tangela=114).
    3. ¿Devuelve parámetros? Sí
      Variable 0x8004:
      • 0x0 = No tienes el pokémon en el equipo.
      • 0x1-0x6= El pokémon buscado está en esa posición.

Imágenes

  • GPS






  • GPSS






Scripts de Ejemplo

  • GPS
    Código:
    [PLAIN]
    #dynamic 0x800000
    #org @inicio
    lock
    faceplayer
    setvar 0x8004 0x1 'En la var 0x8004 aclaras el slot del equipo que quieras revisar
    callasm 0x08749CB1 'Offset de la rutina + 1
    compare 0x8004 0x75 'Número del pokémon en la dex nacional (0x75 = 117 = Seadra)
    if 0x1 goto @silotienesseadra 'Si ese es el valor comprueba que tiene el pokémon y va a @silotienesseadra
    compare 0x8004 0x72 'Si no es el poké anterior, reviso con otro (0x72 = 114 = Tangela)
    if 0x1 goto @silotienestangela 'Si ese es el valor comprueba que tienes el segundo pokémon y va a @silotienestangela
    msgbox @notienesninguno 0x6 'Mensaje de que no tienes los pokémons anteriores
    release
    end
    
    #org @silotienesseadra 'Viene aquí si se comprueba verdadero el primer if
    msgbox @tienesseadra 0x6 'Mensaje normal
    release
    end
    
    #org @silotienestangela 'Viene aquí si se comprueba falso el primer if y verdadero el segundo
    msgbox @tienestangela 0x6 'Mensaje normal
    release
    end
    
    #org @tienesseadra 'Mensaje de Seadra
    = Tienes un Seadra.
    
    #org @tienestangela 'Mensaje de Tangela
    = Tienes un Tangela.
    
    #org @notienesninguno 'Mensaje de que no tienes ninguno
    = No tienes ni un Seadra ni un\nTangela.
    [/PLAIN]
  • GPSS
    Código:
    [PLAIN]
    #dynamic 0x800000
    #org @inicio
    lock
    faceplayer
    setvar 0x8004 0x75 'Pongo en la var 8004 el número del pokémon en la dex nacional (0x75 = 117 = Seadra)
    callasm 0x08749CF1 'Offset de la rutina + 1
    compare 0x8004 0x0 'Si el valor de la var 0x8004 es 0, significa que no tienes el pokémon
    if 0x1 goto @notieneselpokemon 'Si el valor efectivamente es 0, te envía a @notieneselpokemon
    buffernumber 0x0 0x8004 'Caso contrario, guarda en un buffer el valor de la var 8004, que contiene el slot del equipo en el que está el pokémon (Seadra en este caso)
    msgbox @estaenlaposicion 0x6 'Mensaje normal
    release
    end
    
    #org @notieneselpokemon
    msgbox @nolotienes 0x6 'Mensaje de que no lo tienes
    release
    end
    
    #org @estaenlaposicion 'Mensaje de que tienes el pokémon
    = Seadra está en la posición [buffer1]
    
    #org @nolotienes 'Mensaje de que no lo tienes
    = No tienes un Seadra
    [/PLAIN]

Descarga

Los siguientes archivos rar contienen la/s rutina/s correspondientes en formato ".asm", ".bin" y ".txt" (con los bytes compilados), además del script de ejemplo que vieron arriba en formato ".rbc".


Rutinas

Por si alguien quiere las rutinas sin compilar y no quiere descargarlas, las dejo en spoiler.
Código:
[PLAIN]
.thumb
.align 2

main:
push {r0-r2,lr}
ldr r1, var_8004
ldrh r1, [r1]
mov r0, #100
mul r1, r0
ldr r0, party_offset
add r0, r1
mov r1, #0xB
ldr r2, poke_decrypt
bl call_r2
ldr r1, var_8004
strh r0, [r1]
pop {r0-r2,pc}

call_r2:
bx r2

.align 2
var_8004: .word 0x020370C0
party_offset: .word 0x02024284
poke_decrypt: .word 0x0803FBE9

[/PLAIN]

Código:
[PLAIN]
.thumb
.align 2

main:
 push {r0-r4,lr}
 mov r4, #0

loop:
 ldr r0, party_offset
 mov r1, #100
 mul r1, r4
 add r0, r1
 mov r1, #0xB
 bl call_r2
 ldr r1, var_8004
 ldrh r1, [r1]
 add r4, #1
 cmp r1, r0
 beq es_ese
 b no_es

es_ese:
 ldr r1, var_8004
 strh r4, [r1]
 b end

no_es:
 cmp r4, #6
 blo loop
 mov r4, #0
 ldr r1, var_8004
 strh r4, [r1]
 b end

call_r2:
 ldr r2, poke_decrypt
 bx r2

end:
 pop {r0-r4,pc}

.align 2
var_8004: .word 0x020370C0
party_offset: .word 0x02024284
poke_decrypt: .word 0x0803FBE9

[/PLAIN]

Agradecimientos

  • Bulbapedia: Offset del equipo pokémon y estructura de los datos
  • Linkandzelda: Offset de las variables dinámicas
  • Jambo51: Offset del desencriptador
  • @Aster : Conversando con él surgió la idea


 
Última edición:

CompuMax

Discord: CompuMax#0425
Miembro insignia
Excelente aporte!

De seguro muchos les sacarán provecho!

Por cierto ¿crees que exista o se pueda hacer por ASM o script que se verifique el TIPO de ataque o al menos el TIPO de pokémon que llevas en tu equipo?

Su función sería algo como:

- Para verificar que no poseas pokémon con ventajas de TIPO de pokémon o TIPO de ataque a la hora de enfrentar un gimnasio. Creo que será de gran ayuda para los que tenemos pensado crear hack rom largos de 3 o más regiones aumentando así la dificultad de los gimnasios.

Saludos y suerte con tus proyectos!

:)
 

jiangzhengwenjz

Usuario mítico
glad to see more asm hackers here!
what can be improved is that you can delete the .thumb and .align 2 at the very beginning, and you never need to push and pop r0-r3 when you write a function
 

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
Por cierto ¿crees que exista o se pueda hacer por ASM o script que se verifique el TIPO de ataque o al menos el TIPO de pokémon que llevas en tu equipo?
Sí, es completamente posible... Podría ser mi próximo aporte, ya veremos ;)
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Re: Respuesta: FR|ASM| GPS(S) - Get Pokémon Species (Slot)

Pues estaré muy atento ya que me vendría como anillo al dedo.

Me gustaría implementar eso en mi hack rom.

Gracias nuevamente por tus excelentes aportes!

Saludos!
 

FEL!X

ᴛᴜ ᴀᴍɪɢᴏ ᴇʟ ᴇsᴘᴀᴅᴀᴄʜíɴ
Usuario de Oro
Así que una rutina para averiguar la especie de un pokémon de tu equipo y otra para la ubicación de un pokémon buscado en el equipo ¡Woow! ¡Jodidamente genial! ¡Me será mucho más útil que hacerlo por otros métodos!

¡Genial aporte! Me gusta que hayas simplificado los scripts mediante el uso de una rutina y que a su vez hayas hecho que dichas rutinas devuelvan un valor. Se nota que le has dado amor a éste aporte, gracias por haberlo facilitado todo. Un aporte muy bien presentado y explicado, te doy repu y mucho amor.

¡Gran trabajo BLAx! Eh...uh..ehem quiero decir...¡Blaz!

Te llevas un gran abrazo amigo ;)
 
Última edición:

Bugrhak

A long time ago I used to call myself "Subzero".
Aportazo colega,con estas dos rutinas se pueden hacer cosas muy buenas, y se puede ser creativo, entre ambas rutinas mi favorita es la de GPSS, con estas se pueden inventar misiones en plan que tengas que atrapar a "X" pokemon para entrar a un gimnasio, o cosas así.
Además de gustarme las rutinas, me gusta lo bien presentado que está el post, todo perfe, todo hecho con mucha dedicación, felicidades :blush:

Buen aporte de "Aeseeme" si señor!!!

Salu2 :awesome:
 

Eddie

U Got Woomy
El tuto mas guapo y a su vez mas insignifacante que he visto,dios!!!!!

Esta para dar +1000000000 panes navideños y todo gracias a Papa Noel Franco.

Excelente tuto recientemente olvidado.
 

MetalKaktus

A la luz del quinto día, mira al este
Miembro insignia
No tenía yo visto este aporte tuyo. Pues es realmetne una rutina bastnate sencilla de hacer pero no por eso le resta su valor. Puedes jugar de muchas maneras con ella.

Te insto a que expliques tus rutinas de modo que otros puedan aprender de ellas ;)

A ver que es lo próximo que nos traes amigo.
 

Jon.

Usuario mítico
Mierda, esto hace unos 2 años me hubiera sacado un gran problema (aunque lo subiste hace 2 años, lo veo recién ahora y me dan ganas de volver a las pistas) jajajaa
Genial esto franquito, gracias!
 
Arriba