Registrarse

[Otros] E | Checkpokemon a traves del Special 0xA2

Lunos

Enfrentando a La Organización
Miembro insignia
Hola.
¿Quieres aprender a escribir scripts donde le tengas que pedir X o Y especie Pokémon al Jugador?
¿Te quieres montar un laburo de noticias Pokémon como el jefacho de Pueblo Sosiego?
Pues vamos allá.

Tanto Pokémon FireRed como Pokémon Emerald tienen funciones de codigo especiales, llamados "special", que permiten ejecutar funcionalidades dentro de un script de campo/overworld, que no cubran sus distintos comandos de scripting (faceplayer, lock, etc).
Entre tantos de estos "special", hay 2 en particular que podemos usar para nuestro beneficio.

El primero es el special 0xA2, que es el special 0x9F en Pokémon FireRed.
Este special abre la pantalla de Equipo Pokémon permitiendole al Jugador elegir un Pokémon de su equipo.
El valor del slot donde se encuentre ese Pokémon (va de 0 a 5), se guarda dentro de la variable 0x8004.

El segundo es el special 0x149, que en Pokémon FireRed es el special 0x147.
Lo que hace es obtener el numero de la especie del Pokémon en el slot al que apunta la variable 0x8004.
Por defecto la información no se guarda en ningun sitio, por lo que hay que usar el comando special2.
Este comando tiene una nombre mas bonito en los decomps, specialvar.
¿Por qué? Porque el comando ejecuta un special y guarda el resultado en una variable a elección.
Sencillo y entendible, como muchas otras cosas en el lado de los decomps.

Entonces, ¿que podemos hacer con esto?
Lo dicho, escribir un script para pedirle al Jugador elegir un Pokémon de una especie especifica.
Si el Jugador tiene un Pokémon de dicha especie, pues... hagan lo que se les cante.
Le pueden regalarle un objeto, dinero, darle las gracias, etc.

El script es sencillo, sencillo.
Esta es la versión para Pokémon Emerald
#dynamic 0x71BBA0

#org @start
lock
msgbox @1 0x5
compare LASTRESULT 0x1
if 0x0 goto @end
special 0xA2 // Elige a un Pokémon
waitstate
compare 0x8004 0x6
if 0x4 goto @end
special2 0x800d 0x149
compare 0x800d 280 // Comprueba si el Pokémon seleccionado es Torchic
if 0x1 goto @youhaveone
msgbox @2 0x6
release
end

#org @end
release
end

#org @youhaveone
msgbox @3 0x6
release
end

#org @1
= ¿Tienes un TORCHIC?

#org @2
= Aww[.] pues no[.]

#org @3
= Si tienes! Si que tienes!

Y la versión para Pokémon FireRed seria practicamente igual.
#dynamic 0x71BBA0

#org @start
lock
msgbox @1 0x5
compare LASTRESULT 0x1
if 0x0 goto @end
special 0x9F // Elige a un Pokémon
waitstate
compare 0x8004 0x6
if 0x4 goto @end
special2 0x800d 0x147
compare 0x800d 4 // Comprueba si el Pokémon seleccionado es Charmander
if 0x1 goto @youhaveone
msgbox @2 0x6
release
end

#org @end
release
end

#org @youhaveone
msgbox @3 0x6
release
end

#org @1
= ¿Tienes un CHARMANDER?\n¡Muestrame uno!

#org @2
= Aww[.] ese no es un CHARMANDER[.]

#org @3
= ¡Yaay!

Y eso es todo.

Post Original:
Holi. Encontré esta rutina mientras intentaba ayudar a un amigo y pensé en traerla hasta aca.
Como siempre vamos a empezar por lo mas importante, los creditos.
La rutina original fue hecha por Kleenexfeu de PokeCommunity justo aqui y posteriormente corregida por Squeetz de PokeCommunity en el Discord de la comunidad.
Todos los creditos van para ellos.
Dicho eso, comencemos.

Requisitos:
-ROM de Pokémon Emerald (USA)
-Editor Hexadecimal de nuestra preferencia (Como siempre, yo usaré HxD)
-Opcionalmente necesitarán el Assembler de HackMew al que pueden encontrar justo aqui o cualquier equivalente si quieren compilar la rutina manualmente, la cual pueden encontrar justo aqui.

Procedimiento:
1) Copiamos la rutina que mencioné antes una vez compilada:
Código:
FF B5 11 4E 0E 48 04 78 00 2C 16 D0 33 88 00 2B 13 D0 0F 48 64 21 0B 4F 3E 78 71 43 40 18 FF B4 0B 21 0A 4A 00 F0 0A F8 81 46 FF BC 99 45 01 D1 01 26 00 E0 00 26 04 4F 3E 80 FF BD 97 46 C0 46 E9 44 02 02 E0 75 03 02 E2 75 03 02 19 A5 06 08 EC 44 02 02
Y la ponemos en un espacio vacio, en mi caso yo la puse en el offset 0xE3CF80.

2) Escribimos nuestro script con las siguientes especificaciones:
Código:
[CENTER]#org @ inicio
setvar 0x8005 0xIDDeNuestroPokémonEnHex
special 0xA2
waitstate
callasm 0x08OffsetDondeInsertamosLaRutina+1
compare 0x8005 0x1
if 0x1...[/CENTER]
Para leer una explicación de cada comando, haz click aqui.

3) Compilamos y probamos.

Aqui está el script que escribí y aqui mi resultado:


Y eso fue todo.

EDITO: Los hastebin podrian morir en algun momento, teniendo eso en cuenta copié sus contenidos en .txt individuales a los cuales pueden descargar justo aqui.
 
Última edición:

kakarotto

Leyenda de WaH
Re: Em | Scripting | Checkpokemon a traves del Special 0xA2

Parece mas util de lo que parece pero tengo una duda, podrias usar esta rutina para hacer una especie de torneo y no te deje usar legendarios o tiene q ir de la mano con el special?
 

Lunos

Enfrentando a La Organización
Miembro insignia
Re: Em | Scripting | Checkpokemon a traves del Special 0xA2

Parece mas util de lo que parece pero tengo una duda, podrias usar esta rutina para hacer una especie de torneo y no te deje usar legendarios o tiene q ir de la mano con el special?
Si o si debe ir acompañado por el special 0xA2, por lo que tengo entendido.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Revivo este tema como reviví uno en PokeCommunity para clarificar que en verdad no se necesita de ninguna rutina ASM para esto.
Ademas del special 0xA2, que es el special 0x9F de FireRed, ambos juegos tienen un special para obtener la especie del Pokémon en el slot del equipo Pokémon al que apunte la variable 0x8004.
Aquí hay un pequeño script que escribí para ayudar a alguien en el Discord de PokeCommunity y que postee en sus foros:
Código:
#dynamic 0x71BBA0

#org @start
lock
msgbox @1 0x5
compare LASTRESULT 0x1
if 0x0 goto @end
special 0xA2 // Elige a un Pokémon
waitstate
compare 0x8004 0x6
if 0x4 goto @end
special2 0x800d 0x149
compare 0x800d 280 // Comprueba si el Pokémon seleccionado es Torchic
if 0x1 goto @youhaveone
msgbox @2 0x6
release
end

#org @end
release
end

#org @youhaveone
msgbox @3 0x6
release
end

#org @1
= ¿Tienes un TORCHIC?

#org @2
= Aww[.] pues no[.]

#org @3
= Si tienes! Si que tienes!
Resultado (pero en Ingles):


El equivalente para FireRed seria:
Código:
#dynamic 0x71BBA0

#org @start
lock
msgbox @1 0x5
compare LASTRESULT 0x1
if 0x0 goto @end
special 0x9F // Elige a un Pokémon
waitstate
compare 0x8004 0x6
if 0x4 goto @end
special2 0x800d 0x147
compare 0x800d 4 // Comprueba si el Pokémon seleccionado es Charmander
if 0x1 goto @youhaveone
msgbox @2 0x6
release
end

#org @end
release
end

#org @youhaveone
msgbox @3 0x6
release
end

#org @1
= ¿Tienes un CHARMANDER?\n¡Muestrame uno!

#org @2
= Aww[.] ese no es un CHARMANDER[.]

#org @3
= ¡Yaay!

Mas tarde actualizo el primer post.
 
Arriba