Registrarse

[ASM] FR, E | Wonder Trade

Lunos

Enfrentando a La Organización
Miembro insignia
Holi.
Ultimamente he estado trabajando en un script de Wonder Trade tras ver el que posteó el usuario Harlee Quinn en PokeCommunity justo aqui. Como tiene algunos fallos serios que imposibilitan su uso en proyectos serios, decidí compartir el mio.
Sin mas que decir, empecemos.

Requisitos:
-ROM de Pokémon Fire Red (USA) v1.0 o de Pokémon Emerald (USA).
-Editor de texto y editor hexadecimal de su preferencia (como siempre, yo usaré Notepad & HxD)
-Advance Map y XSE, obviamente

Instrucciones:
1) Copiamos y pegamos la siguiente Rutina ASM compilada en un offset que tenga espacio vacio dentro de nuestra ROM dependiendo de la ROM que estén modificando.

Fire Red:
Código:
FF B5 00 25 11 4E 0F 4F 3C 78 02 2C 18 DB 33 88 A3 42 15 D2 62 1E 3A 70 01 33 E2 1A 64 25 6A 43 52 08 6B 43 08 4F F8 18 41 1B 0B DF 6C 43 3F 19 7F 1B 00 20 19 22 01 25 01 C7 01 3A 00 2A FB D1 35 82 FF BD 29 40 02 02 84 42 02 02 C0 70 03 02

Emerald:
Código:
FF B5 00 25 11 4E 0F 4F 3C 78 02 2C 18 DB 33 88 A3 42 15 D2 62 1E 3A 70 01 33 E2 1A 64 25 6A 43 52 08 6B 43 08 4F F8 18 41 1B 0B DF 6C 43 3F 19 7F 1B 00 20 19 22 01 25 01 C7 01 3A 00 2A FB D1 35 82 FF BD E9 44 02 02 EC 44 02 02 E0 75 03 02

Como a mi me gusta apostarle a lo seguro, sugiero poner la rutina en un offset que termine en 0, 4, 8 o C. Yo la puse en 71A250.

2) Vayanse a Advance Map, elijan el mapa que les apetezca, añadan un NPC y denle este script:

Fire Red:
Código:
[center]#dynamic 0x71BBA0
#org @#start
faceplayer
lockall
msgbox @#String1 0x5
compare 0x800D 0x1
if 0x1 goto @#snippet1
msgbox @#String2 0x6
releaseall
end

#org @#snippet1
countpokemon
compare LASTRESULT 0x1
if 0x1 goto @#snippet7
msgbox @#String3 0x6
special 0x9F
waitstate
special2 0x8003 0x147
compare 0x8003 0x19c
if 0x1 goto @#snippet8
compare 0x8004 0x6
if 0x4 goto @#snippet3
goto @#snippet4

#org @#snippet3
msgbox @#String2 0x6
releaseall
end

#org @#snippet4
random 0x19C
compare 0x800D 0x0
if 0x1 goto @#snippet4
compare 0x800D 0xFB
if 0x3 goto @#snippet5
compare 0x800D 0x115
if 0x4 goto @#snippet5
goto @#snippet4

#org @#snippet5
copyvar 0x8000 0x800D
bufferpokemon 0x0 0x8000
showpokepic 0x8000 0xA 0x3
waitcry
[B][COLOR="red"]callasm 0x8FFFFFF+1[/COLOR][/B]
givepokemon 0x8000 0x5 0x0 0x0 0x0 0x0
pause 0x13
fanfare 0x13E
msgbox @#String5 0x4
waitfanfare
closeonkeypress
hidepokepic
msgbox @#String6 0x5
compare 0x800D 0x1
if 0x1 call @#snippet6
msgbox @#String2 0x6
releaseall
end

#org @#snippet6
countpokemon
subvar 0x800D 0x1
copyvar 0x8004 0x800D
fadescreen 0x1
special 0x9E
waitstate
return

#org @#snippet7
msgbox @#String7 0x6
releaseall
end

#org @#snippet8
msgbox @#String8 0x6
releaseall
end

#org @#String1
= Wanna wonder trade?

#org @#String2
= Come back anytime.

#org @#String3
= Select the Pokémon you wanna trade.

#org @#String5
= [player] got a [buffer1]!

#org @#String6
= Wanna give it a nickname?

#org @#String7
= Sorry, you need two Pokémon\nto use the Wonder Trade.\pCome back anytime.

#org @#String8
= I'm sorry, you cannot trade\na Pokémon Egg using the\lWonder Trade System.\pCome back anytime.[/center]

Emerald:
Código:
[center]`#freespace 0xFF
#dynamic 0x71BBA0

#org @#start
faceplayer
lockall
msgbox @#String1 0x5
compare 0x800D 0x1
if 0x1 goto @#snippet1
msgbox @#String2 0x6
releaseall
end

#org @#snippet1
countpokemon
compare LASTRESULT 0x1
if 0x1 goto @#snippet7
msgbox @#String3 0x6
special 0xA2
waitstate
special2 0x8003 0x149
compare 0x8003 0x19c
if 0x1 goto @#snippet8
compare 0x8004 0x6
if 0x4 goto @#snippet3
goto @#snippet4

#org @#snippet3
msgbox @#String2 0x6
releaseall
end

#org @#snippet4
random 0x19C
compare 0x800D 0x0
if 0x1 goto @#snippet4
compare 0x800D 0xFB
if 0x3 goto @#snippet5
compare 0x800D 0x115
if 0x4 goto @#snippet5
goto @#snippet4

#org @#snippet5
copyvar 0x8000 0x800D
bufferpokemon 0x0 0x8000
cry 0x8000 0x0
showpokepic 0x8000 0xA 0x3
waitcry
[B][COLOR="Red"]callasm 0x8FFFFFF+1[/COLOR][/B]
givepokemon 0x8000 0x5 0x0 0x0 0x0 0x0
pause 0x13
fanfare 0x13E
msgbox @#String5 0x4
waitfanfare
closeonkeypress
hidepokepic
msgbox @#String6 0x5
compare 0x800D 0x1
if 0x1 call @#snippet6
msgbox @#String2 0x6
releaseall
end

#org @#snippet6
countpokemon
subvar 0x800D 0x1
copyvar 0x8004 0x800D
fadescreen 0x1
special 0xA1
waitstate
return

#org @#Snippet7
msgbox @#String7 0x6
releaseall
end

#org @#snippet8
msgbox @#String8 0x6
releaseall
end

#org @#String1
= Wanna wonder trade?

#org @#String2
= Come back anytime.

#org @#String3
= Select the Pokémon you wanna trade.

#org @#String5
= [player] got a [buffer1]!

#org @#String6
= Wanna give it a nickname?

#org @#String7
= Sorry, you need two Pokémon\nto use the Wonder Trade.\pCome back anytime.

#org @#String8
= I'm sorry, you cannot trade\na Pokémon Egg using the\lWonder Trade System.\pCome back anytime.[/center]
Nota: FFFFFF+1 = Offset donde insertaron la rutina compilada, +1.

3) A Probar.

Notas Relevantes
-Este script no es mas que una base, si tú quieres añadir una función o cambiar X parte por Y motivo, eres libre de hacerlo.

-El Wonder Trade como tal, puede evolucionar a Pokémon como Machoke, Haunter, Kadabra y Graveler. Por defecto no es posible forzar una evolución de esa forma con los comandos que ofrece XSE, pero afortunadamente hay Rutinas ASM como esta para Fire Red que permiten hacerlo.

-El usuario @♠Subzero♠ hizo su propia modificación justo aqui, en caso de que alguien esté interesado en sus cambios personales.

Creditos
-Harlee Quinn de PokeCommunity, pues su script me inspiró para hacer el mio.
-Bela de PokeCommunity, pues él me enseñó a comprobar la posibilidad de que el Jugador cancele el special 0x9F.
-HackMew por todos sus aportes a la Comunidad de ROM Hacking Pokémon.
-@Dani_SR_17 por haberme indicado una forma de optimizar el filtro en "@snippet4".
-@BluRose por ayudarme a comprender un error increiblemente estupido que estaba cometiendo.
- @♠Subzero♠ por haber dado una buena sugerencia a tener en cuenta en caso de usar el script (ver "Notas Relevantes").
-Tester Anonimo de Pokémon Shiny Gold Sigma por haber notado que los Huevos Pokémon eran intercambiables.
-LuHo por haber creado Advance Map.

Aqui una muestra del resultado en Fire Red.


Aqui una muestra del resultado en Emerald.


Y eso fue todo.​
 
Última edición:

Volk

Antiguamente SouL o SoulOfBandit
Respuesta: FR | Scripting | Wonder Trade

Jajaja literalmente me sera MUY util!
Cuando veía al gordo Rangu hacer el reto prodigioso me preguntaba como hacerlo en GBA, pero eso lo pensé hace mucho y quedo en el olvido, ahora que trajiste esto me volvieron las ganas de hacerlo :) se agradece mucho el tutorial ;)
 

JorgeLaxe

Noob del ROMhacking y aficionado al RPGMaking
Respuesta: FR | Scripting | Wonder Trade

Que interesante...
Estoy deseando probarlo!
 
M

Miembro eliminado 28262

Invitado
Respuesta: FR | Scripting | Wonder Trade

No no no y no
El script es muy bestia XD
Deberías mejorarlo, prueba a usar el método para dar cualquier pokemon aleatoriamente que puso Káiser de Emperana en el tutorial de Areku.

PD: Me hiciste recordar algo que me dijo @eing hace tiempo.. :dodgy:

06/08/2016 - permalinkeing
5 bytes no te ahorras, te ahorras más. (Solo el primer msgbox ya son 5 )
Y para ser un buen programador, SIEMPRE repito SIEMPRE tu código ha de ser lo mas limpio, claro y complejo posible.

Mientras tanto, eres un simio que aporrea el teclado y por suerte o por magia o porque hacer scripts basura es muy simple funciona lo que haces.
 

MichaKing

Grafista avanzado
Respuesta: FR | Scripting | Wonder Trade

Guau! A pesar de lo que dijo Seich (Que en realidad sí es bastante largo...), es un Script bastante útil y que puede dar rienda suelta a nuestra imaginación para implementar nuevas mecánicas (Véase una Especie de "Rifa" o Cambio al Azar sin más). En serio se agrade esta especie de aportes, y más gente como yo que le quiere dar bastante jugabilidad y mecánicas divertidas a su hack.

-¡Gracias por todo Lunos! :D
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: FR | Scripting | Wonder Trade

Deberías mejorarlo, prueba a usar el método para dar cualquier pokemon aleatoriamente que puso Káiser de Emperana en el tutorial de Areku.
El metodo para dar cualquier Pokémon aleatoriamente en este script que escribí, se resume en:
random 0x19C
bufferpokemon 0x0 LASTRESULT
givepokemon LASTRESULT 0x5 0x0 0x0 0x0 0x0

Lo que añadí en #org @snippet4 es un filtro para que el comando se ejecute de nuevo si el resultado del random es el Pokémon #000 o uno de los espacios entre Celebi y Treecko.

Si se te ocurre alguna optimización que pueda aplicarle al script, avisame e intentaré emplearlo.
 

Dani_SR_17

¡Pokémon LionHeart!
Respuesta: FR | Scripting | Wonder Trade

El metodo para dar cualquier Pokémon aleatoriamente en este script que escribí, se resume en:
random 0x19C
bufferpokemon 0x0 LASTRESULT
givepokemon LASTRESULT 0x5 0x0 0x0 0x0 0x0

Lo que añadí en #org @snippet4 es un filtro para que el comando se ejecute de nuevo si el resultado del random es el Pokémon #000 o uno de los espacios entre Celebi y Treecko.

Si se te ocurre alguna optimización que pueda aplicarle al script, avisame e intentaré emplearlo.

A ver, no me he mirado con demasiado detalle el script porque no me interesa, pero he leído esta parte de los comentarios y comento.
Si se puede hacer mucho más optimizado.
Es decir, simplemente tienes que poner:

Código:
#org @snippet4
random 0x19C
compare 0x800D 0x0
if 0x1 goto @snippet4
compare 0x800D 0x(Nº Celebi)
if 0x3 goto @parteabajao
compare 0x800D 0x(Nº Treecko)
if 0x4 goto @parteabajao
goto @snipet4


#org @parteabajo
bufferpokemon 0x0 0x800D
...
Sin tener ni idea de como va el script acabo de ventilarme sencillamente muchísimas lineas de código.
Recuerda que no solo existe el "if 0x1".

Cualquier duda dímelo al perfil, no es plan de petar el post.

PD: Podrías decir que la rutina no es necesaria, se puede hacer con comandos de la rom.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: FR | Scripting | Wonder Trade

A ver, no me he mirado con demasiado detalle el script porque no me interesa, pero he leído esta parte de los comentarios y comento.
Si se puede hacer mucho más optimizado.
Es decir, simplemente tienes que poner:

Código:
compare 0x800D 0x(Nº Celebi)
if 0x3 goto @parteabajao
compare 0x800D 0x(Nº Treecko)
if 0x4 goto @parteabajao
goto @snipet4


#org @parteabajo
bufferpokemon 0x0 0x800D
...
Sin tener ni idea de como va el script acabo de ventilarme sencillamente muchísimas lineas de código.
Recuerda que no solo existe el "if 0x1".

Cualquier duda dímelo al perfil, no es plan de petar el post.

PD: Podrías decir que la rutina no es necesaria, se puede hacer con comandos de la rom.
¿Tomar un Pokémon del Jugador mediante comandos propios de la ROM? Los unicos comandos al respecto sobre los que pude encontrar información fueron los que sirven para depositar al Pokémon en la Guarderia, en eso no estoy interesado.

Dicho eso, muchas gracias por tu sugerencia Dani.
Ya la incorporé al script en el post principal y he añadido los creditos pertinentes :)
 

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: FR | Scripting | Wonder Trade

Tal y como dice Dani quitar Pokémon del jugador es posible solo con los comandos del rom. ¿No me crees? ¿Como hace si no en viejo de la guardería para quitarte el pokémon para cuidarlo? A parte de eso. con los comandos, specials y demás que trae el ROM. También puedes "destruir", es decir borrarlo de la RAM.

Hay un tuto posteado por Javi4315♪, take Pokémon .
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: FR | Scripting | Wonder Trade

♠Subzero♠;397682 dijo:
Tal y como dice Dani quitar Pokémon del jugador es posible solo con los comandos del rom. ¿No me crees? ¿Como hace si no en viejo de la guardería para quitarte el pokémon para cuidarlo?
Como dije, no me interesa que el Pokémon que el Jugador intercambie vaya a la guarderia, eso es lo que hacen el "special 0x176" y "cmdc3 0x2F".

♠Subzero♠;397682 dijo:
con los comandos, specials y demás que trae el ROM. También puedes "destruir", es decir borrarlo de la RAM.
En eso si estaria interesado, entonces. Veré como me va, gracias por la sugerencia.

♠Subzero♠;397682 dijo:
Hay un tuto posteado por Javi4315♪, take Pokémon .
Lo que mencioné arriba es justamente lo que él hace, toma a tu Pokémon y lo pone en la guarderia.
A mi no me gustaria que el Jugador pueda recuperar al Pokémon que intercambió yendo a ella, por eso opté por la rutina de HackMew.
 
Última edición:

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: FR | Scripting | Wonder Trade

Lunos dijo:
Como dije, no me interesa que el Pokémon que el Jugador intercambie vaya a la guarderia, eso es lo que hacen el "special 0x176" y "cmdc3 0x2F".
Examiné muy por arriba el script de la guardería, y por lo que vi, me atrevo a decir que ese es el primer paso antes de destruir al pokémon; hacer que vaya a la guardería.
Por la siguiente razón:

No hay un comando o special que nos permita destruir Pokémon que se encuentran en el equipo del jugador, y si lo hay lo desconozco.
Por lo tanto, primero hay que quitarle el Pokémon al jugador, el resto es historia conocida supongo.
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: FR | Scripting | Wonder Trade

♠Subzero♠;397685 dijo:
Examiné muy por arriba el script de la guardería, y por lo que vi, me atrevo a decir que ese es el primer paso antes de destruir al pokémon; hacer que vaya a la guardería.
Es una posibilidad, sin lugar a dudas. El tema es que yo estoy buscando y leyendo un poco por aqui y por allá, pero no veo demasiada información para aprender el como llevar a cabo tu sugerencia de destruir al Pokémon depositado en la guarderia que se encuentra en la RAM.

EDITO: De hecho, llegué a preguntar en el Discord de PokeCommunity y parece que la unica forma de modificar datos que fueron añadidos en la RAM es mediante ASM, lo que significa que no existe forma de remover totalmente un Pokémon con los scripts que brinda XSE y que la ROM posee.

Aun asi, agradezco el intento de sugerencia, he leido varias cosas que nunca antes me habian interesado.

ON: Probaré el script en Emerald con correcciones menores. Si funciona correctamente, editaré el post principal correspondientemente.
EDITO2: Añadida la rutina compilada para Pokémon Emerald y el script de Wonder Trade adaptado a Emerald al post principal.
 
Última edición:

Katherine

Omnipresente
Miembro de honor
Respuesta: Re: FR | Scripting | Wonder Trade

Error 13 callasm ;/
Veo venir que has copiado el callasm 0x8FFFFFF+1 con el +1. Debes sumarle tú el uno, no dejarlo tal cual, al igual que también debes cambiar la dirección FFFFFF por donde tú hayas insertado la rutina.
 

Aight

Profesional de WaH
Re: Respuesta: Re: FR | Scripting | Wonder Trade

Veo venir que has copiado el callasm 0x8FFFFFF+1 con el +1. Debes sumarle tú el uno, no dejarlo tal cual, al igual que también debes cambiar la dirección FFFFFF por donde tú hayas insertado la rutina.
gracias, depois que falo com o personagem, eu viro o personagem que falei > https://imgur.com/a/V86fp
mas depois entro numa casa e saio e volta ao normal. tem como resolver isso ?

gracias, después de que hablo con el personaje, veo al personaje que he hablado> https://imgur.com/a/V86fp
pero luego entro en una casa y salgo y vuelve a la normalidad. ¿tiene que resolver esto?
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Respuesta: Re: FR | Scripting | Wonder Trade

gracias, depois que falo com o personagem, eu viro o personagem que falei > https://imgur.com/a/V86fp
mas depois entro numa casa e saio e volta ao normal. tem como resolver isso ?

gracias, después de que hablo con el personaje, veo al personaje que he hablado> https://imgur.com/a/V86fp
pero luego entro en una casa y salgo y vuelve a la normalidad. ¿tiene que resolver esto?
Antes de implementar el Wonder Trade, ¿haz hecho algun otro cambio en tu ROM? ¿Has cambiado algunos tiles u OWs, por ejemplo?

Ademas de eso, ¿podrias abrir tu ROM en un emulador de GBA y decirme si en la introducción, salta la palabra "Presents" con letras verdes o no?


Si salen, significa que estás utilizando una ROM de Pokémon Fire Red v1.1, y ese es un problema.
 

Aight

Profesional de WaH
Re: Respuesta: Re: Respuesta: Re: FR | Scripting | Wonder Trade

Antes de implementar el Wonder Trade, ¿haz hecho algun otro cambio en tu ROM? ¿Has cambiado algunos tiles u OWs, por ejemplo?

Ademas de eso, ¿podrias abrir tu ROM en un emulador de GBA y decirme si en la introducción, salta la palabra "Presents" con letras verdes o no?


Si salen, significa que estás utilizando una ROM de Pokémon Fire Red v1.1, y ese es un problema.
gracias, he arreglado ya, ¿tiene cómo poner un nivel mínimo de pokémon para cambiar?
 

Lunos

Enfrentando a La Organización
Miembro insignia
Respuesta: Re: Respuesta: Re: Respuesta: Re: FR | Scripting | Wonder Trade

gracias, he arreglado ya, ¿tiene cómo poner un nivel mínimo de pokémon para cambiar?
De ser posible, seguramente se necesite una Rutina ASM.
Yo busqué un poco y desafortunadamente no pude encontrar nada.
 

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: Re: Respuesta: Re: Respuesta: Re: FR | Scripting | Wonder Trade

Curioseando tu script (el de fire red, que es el que mas me interesa XD), @Lunos, se me ocurrieron un par de cosas para "mejorarlo" un poco, pero antes de ahondar en ese asunto, me gustaría mencionar dos cosas:

1- En tu script, hay unas lineas que resultan innecesarias (mas abajo las detallo).
2- Para aquellos que quieran usar el script en Rojo Fuego (ESP), decir que la rutina que elimina el Pokémon, es 100% funcional en dicha ROM.


Estas son las lineas que no es necesario que estén en el script:

Código:
#dynamic 0x71BBA0

#org @start
faceplayer
lockall
msgbox @#String1 0x5
compare 0x800D 0x1
if 0x1 goto @snippet1
msgbox @#String2 0x6
releaseall
end

#org @snippet1
[COLOR="RED"]countpokemon
compare 0x800D 0x6
if 0x1 goto @snippet2[/COLOR]
msgbox @#String3 0x6
special 0x9F
waitstate
compare 0x8004 0x6
if 0x4 goto @snippet3
goto @snippet4

[COLOR="RED"]#org @snippet2
msgbox @#String4 0x6
releaseall
end[/COLOR]

#org @snippet3
msgbox @#String2 0x6
releaseall
end

#org @snippet4
random 0x19C
compare 0x800D 0x0
if 0x1 goto @snippet4
compare 0x800D 0xFB
if 0x3 goto @snippet5
compare 0x800D 0x115
if 0x4 goto @snippet5
goto @snippet4

#org @snippet5
bufferpokemon 0x0 0x800D
showpokepic 0x800D 0xA 0x3
waitcry
givepokemon 0x800D 0x5 0x0 0x0 0x0 0x0
callasm 0x8FFFFFF+1
pause 0x13
fanfare 0x13E
msgbox @#String5 0x4
waitfanfare
closeonkeypress
hidepokepic
msgbox @#String6 0x5
compare 0x800D 0x1
if 0x1 call @snippet6
msgbox @#String2 0x6
releaseall
end

#org @snippet6
countpokemon
subvar 0x800D 0x1
copyvar 0x8004 0x800D
fadescreen 0x1
special 0x9E
waitstate
return

#org @#String1
= Wanna wonder trade?

#org @#String2
= Come back anytime.

#org @#String3
= Select the Pokémon you wanna trade.
[COLOR="RED"]
#org @#String4
= I'm sorry, your team is full.\nCome back later.[/COLOR]

#org @#String5
= [player] got a [buffer1]!

#org @#String6
= Wanna give it a nickname?

¿Por qué están demás?
Pues, ahí estas comprobando si el equipo del prota está completo. Sabiendo que este es un script de intercambio, no tiene mucho sentido ya que no importa si el equipo está lleno dado que cuando des un pokémon, vas a quedar con un espacio libre el cual va a ser llenado por el pokémon que recibirás. ¿Lo pillas?
Por cierto, no lo resalté en el script, pero es más acertado poner el callasm antes del givepokemon y no después (sobre todo si borras las lineas que te he marcado).
Además, te comento que tras el special 0x9E, tienes que poner lock y faceplayer, puesto que luego de salir de la pantalla de poner mote, el mini con el que estas hablando se "libera" de estos dos últimos comandos. Tenlo en cuenta si el NPC con que vas a hablar está caminando.

Ahora bien, las "mejoras" que le hice son las siguientes:

1- En tu script, existe una pequeña probabilidad de que el Pokémon que entregas, y el Pokémon que recibes, sean de la misma especie (por ejemplo, entregas un charizard, y recibes un charizard ¿Pa' ke quieres cambiarlo si vas a recibir uno igual?). Pues he añadido un par de lineas para que eso jamás pueda pasar.

2- ¿Que tal si no te gusta el Pokémon que vas a recibir?
En cuanto a eso, añadí la "opción" de que se pueda cancelar el intercambio.

Se me han ocurrido más cosas que añadirle, pero me parece ya mucho, y puede que el intercambio "prodigioso" quede muy "sobrecargado". Aunque, una opción que no estaría mal agregar es la de verificar si el pokémon que se obtiene luego del random, es uno de los que evolucionan mediante intercambio para así, hacerlo evolucionar.


Sin más que decir, dejo mi versión del script con todo lo que he dicho que le he agregado.

Código:
#dynamic 0x71BBA0
#org @inicio
lock
faceplayer
pause 0x14
applymovement LASTTALKED @move1
waitmovement 0x0
msgbox @msg1 MSG_YESNO
compare LASTRESULT 0x1
if 0x1 goto @snippet1
msgbox @msg8 MSG_NORMAL
release
end

#org @snippet1
msgbox @msg3 MSG_NORMAL
special 0x9F
waitstate
lockall
faceplayer
compare 0x8004 0x6
if 0x4 goto @snippet2
goto @snippet3

#org @snippet2
msgbox @msg8 MSG_NORMAL
release
end

#org @snippet3
random 0x19C
comparevars 0x8004 LASTRESULT
if 0x1 goto @snippet3
compare LASTRESULT 0x0
if 0x1 goto @snippet3
compare LASTRESULT 0xFB
if 0x3 goto @snippet4
compare LASTRESULT 0x115
if 0x4 goto @snippet4
goto @snippet3

#org @snippet4
bufferpartypokemon 0x1 0x8004
copyvar 0x8000 LASTRESULT
bufferpokemon 0x0 0x8000
showpokepic 0x8000 0xA 0x3
msgbox @msg4 MSG_YESNO
compare LASTRESULT 0x0
if 0x1 goto @snippet5
callasm 0xFFFFFF+1
givepokemon 0x8000 0x5 0x0 0x0 0x0 0x0
pause 0x13
fanfare 0x13E
msgbox @msg5 MSG_KEEPOPEN
waitfanfare
closeonkeypress
hidepokepic
msgbox @msg6 MSG_YESNO
compare LASTRESULT 0x1
if 0x1 call @snippet6
msgbox @msg2 MSG_NORMAL
release
end

#org @snippet5
hidepokepic
msgbox @msg7 MSG_YESNO
compare LASTRESULT 0x0
if 0x1 goto @snippet7
goto @snippet8

#org @snippet6
countpokemon
subvar LASTRESULT 0x1
copyvar 0x8004 LASTRESULT
fadescreen 0x1
special 0x9E
waitstate
lock
faceplayer
return

#org @snippet7
msgbox @msg8 MSG_NORMAL
release
end

#org @snippet8
msgbox @msg9 MSG_YESNO
compare LASTRESULT 0x1
if 0x1 goto @snippet1
goto @snippet3

#org @msg1
= ¿Quieres intercambiar un POKéMON?

#org @msg2
= ¡Vuelve cuando quieras!

#org @msg3
= Elige el POKéMON para\nintercambiar.

#org @msg4
= Entonces, ¿quieres cambiar tu\n[buffer2] por mi [buffer1]?

#org @msg5
= [player] obtuvo un [buffer1].

#org @msg6
= ¿Quieres ponerle un mote a\n[buffer1]?

#org @msg7
= ¿Quieres probar de nuevo?

#org @msg8
= Vale, ya veo...

#org @msg9
= ¡Excelente, buena decisión!\p¿Quieres elegir otro de tus\nPOKéMON para intercambiar?

#org @move1
#raw 0x62
#raw 0xFE


La diferencia no es mucha con respecto a tu script, pero el resultado es uno un poco más completo.
Igualmente, creo que a este tipo de scripts se le puede sacar mucho mas provecho.




De ser posible, seguramente se necesite una Rutina ASM.
Yo busqué un poco y desafortunadamente no pude encontrar nada.
Si se quiere establecer un nivel mínimo para el Pokémon que va a dar el jugador, no es necesario ASM. Con los comandos del ROM se puede perfectamente.
concretamente, usarías la dirección de una variable dinámica (RAM), donde pones tu el nivel. Y, usando la dirección RAM de dicha variable, comparas el nivel (también "vía RAM") de cierto slot dentro del equipo.

Te dejo las direcciones RAM de donde se almacena el nivel de cada Pokémon dentro del equipo (en orden para no liarnos XD)


Slot 1:
0x20242D8

Slot 2:
0x202433C

Slot 3:
0x20243A0

Slot 4:
0x2024404

Slot 5:
0x2024468

Slot 6:
0x20244CC

Y si se quiere que el Pokémon que recibas tenga el mismo nivel que el Pokémon que das, ahí tendrás que combinar lo visto arriba, con lo que tu detallas en →este← tutorial.


♠Un saludo!♠
 
Última edición:

Lunos

Enfrentando a La Organización
Miembro insignia
Re: Respuesta: FR y EM | Scripting | Wonder Trade

♠Subzero♠;399337 dijo:
¿Por qué están demás?
Pues, ahí estas comprobando si el equipo del prota está completo. Sabiendo que este es un script de intercambio, no tiene mucho sentido ya que no importa si el equipo está lleno dado que cuando des un pokémon, vas a quedar con un espacio libre el cual va a ser llenado por el pokémon que recibirás. ¿Lo pillas?

Por cierto, no lo resalté en el script, pero es más acertado poner el callasm antes del givepokemon y no después (sobre todo si borras las lineas que te he marcado).
El callasm no funciona correctamente antes del givepokemon, por eso puse la comprobación del equipo de el Jugador. Eres libre de probarlo tú mismo, ponte 6 Pokémon y activa el script, perderás uno de tus Pokémon.

♠Subzero♠;399337 dijo:
1- En tu script, existe una pequeña probabilidad de que el Pokémon que entregas, y el Pokémon que recibes, sean de la misma especie (por ejemplo, entregas un charizard, y recibes un charizard ¿Pa' ke quieres cambiarlo si vas a recibir uno igual?). Pues he añadido un par de lineas para que eso jamás pueda pasar.
Rechazado, el punto del Intercambio Prodigioso es que el resultado sea aleatorio. Vos entregás un Pokémon y recibís uno a cambio sin saber cual Pokémon será. Cabe mencionar que no solo es logico que exista la posibilidad de recibir exactamente el mismo Pokémon que entregaste puesto que de nuevo, el intercambio es aleatorio, si no que tambien ocurre como tal en Pokémon X/Y (y recordemos que la función en X/Y es de Jugador a Jugador, no de Jugador a IA).

♠Subzero♠;399337 dijo:
2- ¿Que tal si no te gusta el Pokémon que vas a recibir?
En cuanto a eso, añadí la "opción" de que se pueda cancelar el intercambio.
Rechazado. Vos entregás un Pokémon y recibís uno a cambio sin saber cual Pokémon será, ese es el punto.

♠Subzero♠;399337 dijo:
una opción que no estaría mal agregar es la de verificar si el pokémon que se obtiene luego del random, es uno de los que evolucionan mediante intercambio para así, hacerlo evolucionar.
Esa si es una buena idea que no consideré, el tema está en que tendria que insertar otra rutina mas (la de forzar una evolución que posteó @jiangzhengwenjz justo aqui) y está el hecho de que quien quiera usar mi script, siempre lo puede expandir si lo vé necesario. Lo añadiré como una nota relevante al post principal.

♠Subzero♠;399337 dijo:
Además, te comento que tras el special 0x9E, tienes que poner lock y faceplayer, puesto que luego de salir de la pantalla de poner mote, el mini con el que estas hablando se "libera" de estos dos últimos comandos. Tenlo en cuenta si el NPC con que vas a hablar está caminando.
Como tal, la base que creé es lo suficientemente solida por si sola, quien decida usarla siempre puede encargarse de añadir ese tipo de detalles.

EDITO:
♠Subzero♠;399337 dijo:
Si se quiere establecer un nivel mínimo para el Pokémon que va a dar el jugador, no es necesario ASM. Con los comandos del ROM se puede perfectamente.
concretamente, usarías la dirección de una variable dinámica (RAM), donde pones tu el nivel. Y, usando la dirección RAM de dicha variable, comparas el nivel (también "vía RAM") de cierto slot dentro del equipo.

Te dejo las direcciones RAM de donde se almacena el nivel de cada Pokémon dentro del equipo (en orden para no liarnos XD)


Slot 1:
0x20242D8

Slot 2:
0x202433C

Slot 3:
0x20243A0

Slot 4:
0x2024404

Slot 5:
0x2024468

Slot 6:
0x20244CC

Y si se quiere que el Pokémon que recibas tenga el mismo nivel que el Pokémon que das, ahí tendrás que combinar lo visto arriba, con lo que tu detallas en →este← tutorial.


♠Un saludo!♠
A quien deberias estar citando es a @Aight, por cierto. La función de Intercambio Prodigioso no tiene un requisito de nivel por lo que yo no pienso implementar uno en mi base, y tampoco me gusta la idea de todas formas.
 
Última edición:
Arriba