Registrarse

[Scripting] Script de "Takepokemon" v2.0

Javi4315

Babyface
Miembro de honor
¡Ir a la versión 2.0!
___________________________
¿Qué tal? Bueno pues vengo a traerles un pequeño tutorial sobre cómo hacer un script de takepokemon (por llamarlo así, ya que consiste en dar uno de nuestros pokémon). Pero antes de comenzar la explicación, pondré un video mostrando el script (disculpen por la baja calidad del video xD):



Bien, empecemos con la explicación. Esta tarde he entrado en wah y he visto qué había nuevo. En el foro de dudas, me he encontrado con un tema en el que se preguntaba si existía un comando contrario al givepokémon (es decir, que en vez de darte un pokémon, te lo quite), a lo que Eing ha respondido:

Para quitar los pokémon del equipo, puedes hacerlo de dos formas, una usando ASM, que si no sabes no te recomendaria hacerla, y la otra es usando el script de la guardería, pero a tu estilo, es decir en sí solo copia la sintáxis del script.
Y, aunque esto ya lo sabía (lo que pasa es que nunca me había dado por investigar el script de la guardería), hoy me he dispuesto a hacerlo. Así que he abierto el script de la guardería y me he encontrado con esto:

'-----------------------
#org 0x1BF398
special 0x187
compare LASTRESULT 0x2
if 0x1 goto 0x81A7AE0
lock
faceplayer
showmoney 0x0 0x0 0x0
special2 LASTRESULT 0x178
compare LASTRESULT 0x1
if 0x1 goto 0x81BF46E
msgbox 0x819DD66 '"I run the DAY-CARE service.\pWould ..."
callstd 0x5
compare LASTRESULT 0x1
if 0x1 goto 0x81BF3DD
msgbox 0x819DDB2 '"Come again."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1A7AE0
release
end

'-----------------------
#org 0x1BF46E
setvar 0x8004 0x0
special2 LASTRESULT 0x179
compare LASTRESULT 0x0
if 0x5 call 0x81BF4AA
compare LASTRESULT 0x0
if 0x1 call 0x81BF4B3
special 0x177
msgbox 0x819DE80 '"You owe me [$][buffer2] for the ret..."
callstd 0x5
compare LASTRESULT 0x1
if 0x1 goto 0x81BF4BC
goto 0x81BF444
end

'-----------------------
#org 0x1BF3DD
special2 LASTRESULT 0x84
compare LASTRESULT 0x1
if 0x1 goto 0x81BF452
msgbox 0x819DDBE '"Which POKéMON should I raise?"
callstd 0x4
fadescreen 0x1
hidemoney 0x0 0x0
special 0xBC
waitstate
showmoney 0x0 0x0 0x0
compare 0x8004 0x6
if 0x4 goto 0x81BF444
special2 LASTRESULT 0x85
compare LASTRESULT 0x0
if 0x1 goto 0x81BF460
special2 0x8005 0xBA
msgbox 0x819DDF9 '"Fine, I'll look after your\n[buffer..."
callstd 0x4
checksound
cry 0x8005 0x0
msgbox 0x819DE24 '"Come see me in a while."
callstd 0x4
waitcry
special 0x176
cmdC3 0x2F
goto 0x81BF541
end


'-----------------------
#org 0x1BF541
hidemoney 0x0 0x0
release
end

'-----------------------
#org 0x1BF4AA
msgbox 0x819DF56 '"Your [buffer1] has grown a lot.\nYe..."
callstd 0x4
return

'-----------------------
#org 0x1BF4B3
msgbox 0x819DE3C '"You're back already?\pYour [buffer1..."
callstd 0x4
return

'-----------------------
#org 0x1BF4BC
special2 LASTRESULT 0x83
compare LASTRESULT 0x6
if 0x1 goto 0x81BF533
special2 LASTRESULT 0xC5
compare LASTRESULT 0x1
if 0x1 goto 0x81BF4EA
msgbox 0x819E001 '"You don't have enough money."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1BF444
msgbox 0x819DDDC '"Fine.\nCome anytime you like."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1BF452
msgbox 0x819DEF5 '"Oh? You only have one POKéMON\nwith..."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1BF460
msgbox 0x819DF1D '"If you leave me that POKéMON,\nwhat..."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1BF533
msgbox 0x819DFC2 '"You can't take this POKéMON back\ni..."
callstd 0x4
goto 0x81BF541
end

'-----------------------
#org 0x1BF4EA
setvar 0x8004 0x0
special2 LASTRESULT 0x17A
special 0xC6
updatemoney 0x0 0x0 0x0
copyvar 0x8008 LASTRESULT
countpokemon
subvar LASTRESULT 0x1
bufferpokemon2 0x0 LASTRESULT
copyvar LASTRESULT 0x8008
msgbox 0x819DEAF '"Thank you!\nHere's your POKéMON."
callstd 0x4
textcolor 0x3
checksound
cry LASTRESULT 0x0
msgbox 0x819DECF '"[player] got [buffer1] back\nfrom t..."
callstd 0x4
call 0x81A6675
waitcry
goto 0x81BF541
end

'-----------------------
#org 0x1A6675
copyvar 0x8012 0x8013
return


'---------
' Strings
'---------
#org 0x19DD66
= I run the DAY-CARE service.\pWould you like me to raise one of\nyour POKéMON?

#org 0x19DDB2
= Come again.

#org 0x19DE80
= You owe me [$][buffer2] for the return\nof this POKéMON.

#org 0x19DDBE
= Which POKéMON should I raise?

#org 0x19DDF9
= Fine, I'll look after your\n[buffer1] for a while.

#org 0x19DE24
= Come see me in a while.

#org 0x19DF56
= Your [buffer1] has grown a lot.\nYes, quite a lot, I'd say.\pLet me see[.]\nBy level, it's grown by [buffer2].\pAren't I great?

#org 0x19DE3C
= You're back already?\pYour [buffer1] needs to spend\nsome more time with me.

#org 0x19E001
= You don't have enough money.

#org 0x19DDDC
= Fine.\nCome anytime you like.

#org 0x19DEF5
= Oh? You only have one POKéMON\nwith you.

#org 0x19DF1D
= If you leave me that POKéMON,\nwhat will you battle with?

#org 0x19DFC2
= You can't take this POKéMON back\nif you've got no room for it.

#org 0x19DEAF
= Thank you!\nHere's your POKéMON.

#org 0x19DECF
= [player] got [buffer1] back\nfrom the DAY-CARE MAN.

Un script un tanto largo xD, aun así me he puesto a leer y he identificado la parte que realmente nos interesa (está en negrita). Esa parte es simplemente la que tenemos que manipular para hacer nuestro script. Así que aquí dejo el script y su pequeña explicación para XSE y para pokescript:

#org 0xOFFSET
lock
faceplayer

msgbox 0xOFFSET > Lo que te dice antes de entregar el pokémon.
callstd 0x6
fadescreen 0x1 > Simplemente para que quede bien xD.
special 0xBC > Este especial hará que entremos al menú pokémon para entregarlo.
waitstate > Se usa después de algunos specials y en este lo usaremos.
compare 0x8004 0x6 > Comprueba si hemos salido del menú pokémon.
if 0x4 goto 0xOFFSET > Si salen del menú pokemon, les eviará al offset indicado.
special2 0x8005 0xBA - Comprueba cuál a sido el pokémon elegido.
msgbox 0xOFFSET > Lo que te dice cuando entregas el pokémon.
callstd 0x6
special 0x176 > Con este comando haremos que se entregue el pokemon (creo xD).
cmdC3 0x2F > Lo mismo que el de arriba (no estoy muy seguro pero creo que son complementarios)
release
end

No tengo actualizado el XSE xD.

#org $comienzo
lock
faceplayer
message $1
$1 1 = (Lo que te dice antes de dar el pokémon)
fadescreen 1
special 0xBC
lock (Creo que pokescript no reconoce el comando waitstate, así que ponemos lock y una vez compilado, lo remplazamos con XSE).
compare 0x8004 0x6
if 0x4 goto $offset
special2 0x8005 0xBA
message $2
$2 1 = (Lo que te dirá después de dárselo).
boxset 6
special 0x176
lock
lock (Creo que pokescript no reconoce el comando cmdC3 0x2F, así que hacemos lo mismo que con el waitstate, pero sustituyendo los dos lock)
release
end

No explico los comandos porque ya los he explicado en el de XSE.

Ese sería el cuerpo del script, pero podéis jugar con los comandos para hacer un script más complejo.

Bueno, creo que está bien explicado y es un tutorial interesante (aunque haya gente que sepa hacerlo xD). Así que espero que os guste y si tienen alguna duda o problema no duden en preguntar.

Por cierto, pueden hacer que se muestre el nombre del pokémon que vayan a entregar usando [buffer1] (como si utilizaran [rival] para que se muestre el nombre del rival)

IMPORTANTE: Se me había olvidado decirlo, sólo lo he probado en fire red, no sé si en ruby funcionará. De todas formas pronto lo comprobaré.
 

Gut_Bro

Mega desarrollador
RE: Script de "Takepokemon" (XSE y Pokéscript)

Orale!!

Muy bueno, y útil, te doy un + por el trabajo tan bueno :awesome:
De seguro le va a servir a muchos, y bueno, en FR hay 2 guarderías una bajo ciudad celeste y la otra en la isla quarta, así no se 'desperdiciaría' la segunda guardería xD.

¡Muy bueno, me gustó!:)
 
RE: Script de "Takepokemon" (XSE y Pokéscript)

men este script convinado con un give o otros comandos seria un gran script algo como una especie de torneo donde pierdes un pokemon si pierdes una batalla o ganas uno poke si ganas la batalla seria genial un script asi :awesome: el lio serai hacerlo a la perfeccion '¬¬ ;) gracias men te lo mereses
 
RE: Script de "Takepokemon" (XSE y Pokéscript)

Gran descubrimiento, tío.:heart:

Te mereces un Gracias +1 y REPU+1. :D

Sigue así.:D
 
RE: Script de "Takepokemon" (XSE y Pokéscript)

demasiado bueo y util ese script\
muy pero muy bueno
me sera de ayuda en mi hack rom
ejej
tengo una idet
jaja
graccias man
+gracias en e rimer post
:heart: me encano ese script
jejeje
 

H.B.P

Emperador Kaktiácero
Miembro de honor
RE: Script de "Takepokemon" (XSE y Pokéscript)

Una excelente investigación, aunque ya había visto este método en Pokecommunity, pero igualmente está bien. He apreciado unos diversos comandos, entre ellos, un subvar, tengo la corazonada de que se podría borrar el Pokémon con la combinación apropiada, tal vez me ponga a investigar el comando yo también.

Saludos.
 

Javi4315

Babyface
Miembro de honor
RE: Script de "Takepokemon" (XSE y Pokéscript)

Dark_Moltres dijo:
Una excelente investigación, aunque ya había visto este método en Pokecommunity, pero igualmente está bien. He apreciado unos diversos comandos, entre ellos, un subvar, tengo la corazonada de que se podría borrar el Pokémon con la combinación apropiada, tal vez me ponga a investigar el comando yo también.

Saludos.
¿Un subvar? Supuestamente eso de borrar el pokémon debería estar aquí (creo yo), que es cuando te entrega el pokemon:

#org 0x1BF4EA
setvar 0x8004 0x0
special2 LASTRESULT 0x17A
special 0xC6
updatemoney 0x0 0x0 0x0
copyvar 0x8008 LASTRESULT
countpokemon
subvar LASTRESULT 0x1
bufferpokemon2 0x0 LASTRESULT
copyvar LASTRESULT 0x8008
msgbox 0x819DEAF '"Thank you!\nHere's your POKéMON."
callstd 0x4
textcolor 0x3
checksound
cry LASTRESULT 0x0
msgbox 0x819DECF '"[player] got [buffer1] back\nfrom t..."
callstd 0x4
call 0x81A6675
waitcry
goto 0x81BF541
end

La verdad es que esa parte no la miré, sólo me centré en la parte en la que tú das el pokémon. Si no estoy muy ocupado mañana y tengo ganas xD quizás lo mire. De todas formas, si lo averiguas, pues lo posteas :p

Saludos!!
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
RE: Script de "Takepokemon" (XSE y Pokéscript)

Creo que el pollito El boo el Capitán Pollo se refería a esto:
http://www.pokecommunity.com/showthread.php?t=206138
:awesome:
 

Javi4315

Babyface
Miembro de honor
RE: Script de "Takepokemon" (XSE y Pokéscript)

Solución para Ruby
___________________________
Bueno, hace algún tiempo surgió la duda de si se podía entregar un pokémon específico. Efectivemente, se puede (¿Qué cómo lo sé? Bueno, ¿Si no lo supiera vendría a explicar cómo se hace? xDD).

Creí que la mejor forma de hacerlo era combinando el script de la guardería (más concretamente el del anterior takepokémon) y el de algún tradeo del juego original. Eso me llevó a investigarlo y bueno, fui haciendo cambios, pruebas, etc, hasta que al final llegué a una conclusión: No se necesita para nada el script del tradeo.

Sí, porque, investigando el script del tradeo pude darme cuenta de que tan sólo se necesita un poco de... emm... ¿Astucia? (No se me ocurre otra cosa ahora mismo xD) para modificar un poco el anterior script (el del takepokémon) haciendo uso de unas variables y bueno, dió resultado.

Pero bueno, vamos a verlo más a fondo.

¿Tienes 1 minuto y 18 segundos?

Si dispones de ese tiempo, entonces échale un ojo al video de demostración:



El script

Código:
#org @comienzo
lock
faceplayer
setvar 0x4060 0x19     => Escogemos una variable y guardamos el valor del pokémon (ver *1)
msgbox @1 MSG_YESNO     => Nos pregunta si queremos darle el pokémon (no necesario) 
compare LASTRESULT 0x1     => Comprueba el resultado del MSG_YESNO
if 0x1 goto @continuar     => Si hemos dicho "Yes" va a @continuar
msgbox @2 MSG_NORMAL     => Lo que dice si elegimos "No"
release
end

#org @continuar
fadescreen 0x1
special 0xBC     => Abre el menú pokémon
waitstate
compare 0x8004 0x6     => Comprueba si hemos salido del menú o pulsado "B"
if 0x4 goto @salir     => Si hemos hecho lo anterior, va a @salir
special2 0x8005 0xBA     => Comprueba cual es el pokémon elegido
copyvar 0x4061 0x8005     => Elegimos una variable y guardamos el valor de la 8005 (ver *2)
bufferpokemon 0x0 0x8005     => Guarda el nombre del pokémon en [buffer1]
comparevars 0x4060 0x4061     => Compara si ambas variables tienen el mismo valor (ver *3)
if 0x1 goto @dar     => Si tienen el mismo valor va a @dar
msgbox @3 MSG_NORMAL      => Lo que nos dice si es otro Pokémon
release
end

#org @salir
msgbox @4 MSG_NORMAL     => Lo que nos dice habíamos pulsado B o salido del menú
release
end

#org @dar
msgbox @5 MSG_NORMAL     => Lo que dice si damos el pokémon especificado
special 0x176
cmdc3 0x2F     => Este comando y el de arriba nos quitan al pokémon del menú
release
end

#org @1
= [player], recuerdas que prometiste\ndarme un PIKACHU ¿Verdad?\pBueno, ¿Has venido a dármelo?

#org @2
= Bueno, vale, pero ya sabes que me\nlo tienes que dar.

#org @3
= Jeje, eso es un [buffer1], no un\nPIKACHU.

#org @4
= ¿No me lo vas a dar?\pBueno, lo que quieras, pero ya\nsabes que me lo debes.

#org @5
= ¡Un Pikachu!\pGracias, [player], sabes que me\nencantan los PIKACHU.
Bueno, ahora explicaré algunas cosas:

*1. Hay que elegir una varible que se pueda utilizar (preferentemente de la 0x40FF hacia atrás). Yo he escogido la variable 0x4060 a la que le he asignado el valor 0x19 ¿Por qué? Porque pikachu tiene el número 25, que en hexadecimal es el 19. Entonces, lo que debemos hacer es guardar en la varible a nuestro pokémon.

*2. Ahora elegimos otra variable, en mi caso, la 0x4061. Lo que debemos hacer es copiar el valor de la variable 0x8005 a nuestra nueva variable. Esto lo hacemos porque la varible 0x8005 acaba de comprobar cuál es el pokémon elegido, entonces nos da la posibilidad de escribir su valor en otra variable para que no perdamos dicha información.

*3. Muy bien, ahora tenemos guardado el valor hexadecimal del pokémon que queremos que se entregue en una variable (0x4060) y el valor del pokémon que hemos entregado en otra (0x4061). Entonces, lo único que hay que hacer ahora es comparar ambas variables con el comando "comparevars" de XSE. Si resulta que ambas variables tienen el mismo valor ¿Qué pasa? Pues que habremos entregado el pokémon que queríamos que fuese entregado.

¡Y ya está!

Bueno, pues eso es todo. Supongo que estará bien explicado xD. No obstante, si tenéis cualquier duda, problema, sugerencia, etc, no dudéis en postear ;D

Saludos!!

PD: Cosarara, eso es ASM ¿No? xD.
PD2: Perdón por la mala calidad del video...
 
RE: [Pokémon específico] Script de "Takepokemon" v2.0

HOMBRE MUCHISIMAS GRACIAS JAVI:furia: !!!!!! Parece que mi duda te llevo a encontrar algo muchisimo mejor !!!! te agradesco y a probarlo en mi room !!!! :D
 

Gut_Bro

Mega desarrollador
RE: [Pokémon específico] Script de "Takepokemon" v2.0

¡Qué ingenio el tuyo!

Me sorprendes y me vuelves a sorprender, hombre! deberías aportarles ideas para los nuevos juegos o algo asi jajaja :D
 

Javi4315

Babyface
Miembro de honor
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Simplemente quiero decir que se puede hacer en ruby y el script es exactamente el mismo (casi). En ruby hay un problema de que al entrar al menú queda inutilizado el efecto del "lock", no sé por qué, pero me imagino que poniendo algunos lockalls en los lugares apropiados se arreglará. No voy a entrar en eso porque se sale del tutorial.

Bueno, lo único que hay que hacer para que funcione en ruby es cambiar un comando. El "special 0x176" por "special 0xBB" y debería funcionar perfectamente.
 
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Gracias Javi4315♪ esto sin duda es algo lo cual muchos encontraban como un obstáculo para seguir su historia al pie de la letra, incluyéndome XD, la ¿mala calidad del video? eso no importa lo que importa es la calidad del scrip, me agrada que no sea en ASM (no se mucho de esto) Así que GRACIAS.

SuerT
 

RedMort

Aprendiendo Decomp
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Me va perfectamente en ruby.
Solo una cosa, lo edite porque quiero que te quite directamente cierto pokemon, no que elijas tu, entonces lo deje asi:

Código:
#dynamic 0x800000

#org @comienzo
lock
faceplayer
setvar 0x40DD 0x9B
msgbox @5 MSG_NORMAL
special 0xBB
cmdc3 0x2F
setvar 0x40DC 0x9B
special 0xBB
cmdc3 0x2F
release
end

#org @5
= Dame tu cyndaquil!
Porque quiero quitarle 2 cyndaquils, pero lo que me ocurre es que me quita los 2 primeros pokes de mi equipo, sea cuales sean.
¿Que comando me falta para que me quite solo los cyndaquils? :S
 

Javi4315

Babyface
Miembro de honor
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Me va perfectamente en ruby.
Solo una cosa, lo edite porque quiero que te quite directamente cierto pokemon, no que elijas tu, entonces lo deje asi:

Código:
#dynamic 0x800000

#org @comienzo
lock
faceplayer
setvar 0x40DD 0x9B
msgbox @5 MSG_NORMAL
special 0xBB
cmdc3 0x2F
setvar 0x40DC 0x9B
special 0xBB
cmdc3 0x2F
release
end

#org @5
= Dame tu cyndaquil!
Porque quiero quitarle 2 cyndaquils, pero lo que me ocurre es que me quita los 2 primeros pokes de mi equipo, sea cuales sean.
¿Que comando me falta para que me quite solo los cyndaquils? :S
El problema radica en cómo determinar la posición del Cyndaquil en el equipo. Es decir, de la otra forma se determina porque tú lo eliges, pero de otra forma ¿Cómo conseguimos hacer eso? Quizás puedas tratar de comprobar cada pokémon del equipo y en caso de que sea Cyndaquil eliminarlo. Pero ahora mismo no sabría cómo comprobar eso sin abrir el menú...
 

RedMort

Aprendiendo Decomp
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

te refieres a hacer bufferpartypokemon para comprobar si tienes a cyndaquil y ponerle el takepokemon al if 0x1?
Lo probare, si me sale ya edito :)
 

Ryuzaki-sama

Te voy a comer >:D
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Este script es mejor si el Si o no porque puede simular un robo.
El team rocket no te pregunta si te puede robar los pokemon, jajaja.
Me gusta el Script talvez lo use.
 

Donelem

6 millones de dolores
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Gracias por el tutorial :)
 

Javi4315

Babyface
Miembro de honor
Respuesta: [Pokémon específico] Script de "Takepokemon" v2.0

Este script es mejor si el Si o no porque puede simular un robo.
El team rocket no te pregunta si te puede robar los pokemon, jajaja.
Me gusta el Script talvez lo use.
Supongo que sabrás que el yes/no lo puedes quitar ¿Verdad? xDD
De todas formas es difícil simular un robo, tienes que seleccionar al pokémon, con lo cual, si lo quieres hacer sin seleccionarlo, la cosa se complica. Pero bueno, es cuestión de estudiarlo y se encuentra la solución.
 

squirtlemon

Pokémon Mytíc ®
Re: GBA | Scripting | [Pokémon específico] Script de "Takepokemon" v2.0

Haaaaa es mucho que procesar! el scrip me ha encantado, es justo lo que andaba nesecitando para mi hack muchas gracias por conpartirlo XD
 
Arriba