tuts_gba
Thread Id: 10516
Thread Name: GBA | Scripting | Manipulando el Safari
#0
Sonicarvalho 17082
Solo para que conste, he actualizado los códigos para leer los datos encriptados de los pokemon en RUBY!
Después de 13 horas trabajando en mis Databases, mas de 200 rutinas encontradas y descompiladas en Ruby/Firered/Emerald, estoy mucho feliz xD. Tan feliz que decidí pegar en una delas y enseñar a vosotros unos trucos!
Pues como ahora soy un miembro POSITRON, y he entrado recientemente, esta 'knowledge' es dedicada al grupo. Será mi primera contribución!

Pues si! Que empiece la magia!

Manipulando el Safari


Este tuto es compatible con Ruby(U)/FireRed(U)/Emerald(U)

Entonces, cual es el objetivo de este tutorial?


Ideas para aplicar en Hacks con este tutorial:


En primer lugar, unas informaciones acerca del Safari:
En Ruby:


En Firered:


En Emerald:


-----------------------------------------


Cambiar el numero de bolas que se pueden usar en SAFARI!

Esa es la parte mas fácil del tutorial!
Los offsets--
Ruby:0C81CA
FireRed:0A0ED2
Emerald:0FC0E6

En esos offsets deben ver un 0x1E (30-Decimal)! Eso es el numero de bolas que recibes en el inicio del Safari.
Pero se quieres cambiar en el juego, durante el 'GamePlay' ( o Run-Time, como los programadores dicen) entonces haz un WriteByteToOffset a los offsets
Ruby:02038808
Firered:02039994
Emerald:0203A04C

------------------------------------------



Cambiar el numero de pasos que podemos dar!


Pues esta parte exige ASM o no, dependiendo del caso!
Offsets-
Ruby:0C81D0
Firered:0A0ED8
Emerald:0FC0EC

Atencion: Esta parte es ASM!
En esos offsets deberéis ver el siguiente (en un Disassembler) en las versiones:
Ruby:
Mov r2, #0xFA
lsl r2, r2, #0x1

Firered:
Mov r2, #0x96
Lsl r2, r2, 0x2

Emerald:
Mov r2, #0xFA
lsl r2, r2, #0x1

El comando LSL es, simplificando, una multiplicación! Pero una multiplicación especial, usando una formula, y= X * 2^n. Dado eso, y=1,2,4,8,...

En los casos de Ruby Y Emerald, la rutina esta multiplicando ese 0xFA por 2^1 (= 2), que da 1F4 (500 pasos en decimal)
Entonces si quiero 300 pasos, convierto a HEX, 0x12C, y divido por 2, que da 150 pasos en decimal y 0x96 en HEX entonces iría al offset donde esta el 0xFA y sustituiría por 0x96. Así solo nos daban 300 pasos para el Safari.

Para el Firered es cuasi el mismo, solo que esa instrucción es Lsl r2, r2, #0x2.
Entonces, aplicando la formula, queda y= X * 2^2.
2^2=4

Entonces la rutina esta multiplicando los pasos por 4. Así que si fueran 300 pasos, entonces se dividía 300 por 4, convertía en HEX y sustituía en ese offset.

------------------------------------------



Cambiar el numero de pasos MÁXIMO aparece en el Menu de FireRed que podemos dar!


Usando la técnica de los pasos multiplicados por 4, alteren en este offset para el máximo que quieren:
FireRed: 06EEA8

------------------------------------------



Cambiar el Script que termina el safari para nuestros gustos!


No hay mucho que les decir ahora... Simplemente vos voy a dar los offsets y vos explico las partes importantes del script.

Ruby:
Repuntear: 0C8238
Script Offset: 1C3448
Script:

'---------------
#org 0x1C3448
lockall
sound 0x49
preparemsg 0x81C34E4 '"Ding-dong! Time's up!\nYour SAFARI..."
waitmsg
waitkeypress
releaseall
goto 0x81C341B

'---------------
#org 0x1C341B
setvar 0x40A4 0x1
special 0xCE
warp 0x17 0x0 0xFF 0x2 0x5
waitstate
end


'---------
' Strings
'---------
#org 0x1C34E4
= Ding-dong! Time's up!\nYour SAFARI Game is over.


Firered:
Repuntear: 0A0F38
Script Offset: 1BFBC5
Script:

'---------------
#org 0x1BFBC5
lockall
sound 0x42
msgbox 0x81BFC1B MSG_KEEPOPEN '"PA: Ding-dong!\pTime's up!\pPA: Yo..."
goto 0x81BFB98

'---------------
#org 0x1BFB98
setvar 0x406E 0x1
special 0xCE
warp 0xB 0x0 0xFF 0x4 0x1
waitstate
end


'---------
' Strings
'---------
#org 0x1BFC1B
= PA: Ding-dong!\pTime's up!\pPA: Your SAFARI GAME is over!


Emerald:
Repuntear: 0FC17C
Script Offset: 2A4B8A
Script:

'---------------
#org 0x2A4B8A
lockall
sound 0x49
preparemsg 0x82A4C26 '"Ding-dong! Time's up!\nYour SAFARI..."
waitmsg
waitkeypress
releaseall
goto 0x82A4B5D

'---------------
#org 0x2A4B5D
setvar 0x40A4 0x1
special 0xD1
warp 0x17 0x0 0xFF 0x2 0x5
waitstate
end


'---------
' Strings
'---------
#org 0x2A4C26
= Ding-dong! Time's up!\nYour SAFARI Game is over.


El importante en estos scripts son los specials 0xCE y 0xD1 , que son usados para terminar los efectos de safari zone, y los warps, que definen donde vas a parar después del safari terminar.
Es claro que puedes hacer-les cambios, como un checkvar o checkflag para que el safari termine de una manera diferente, para encajar en tu evento especial o algo así.
Esta parte del script es toda vuestra y de vuestra imaginación! Hagan los cambios que mas desearen, chicos!

-------------------------------



Verificar el numero de pokemons que ha sido capturado desde que el Safari esta activo!


En primero lugar, esto solo es posible en Emerald. No en Ruby y Firered!
Esto es porque la rutina en Ruby y Firered es demasiado simples, y no contiene el código necesario para contar los pokemons atrapados. Y no, no es posible inserta-lo porque tendrían que se hacer modificaciones en el Battle System.

Entonces, cuando atrapas un pokemon en safari, el juego añade 1 a el offset
Emerald:0203A050

Para checkarmos, vamos a hacer un copybyte de el offset 0203A050 para el offset de una variable 80xx. Offsets aquí!

----------------------------------



Verificar el numero de Bolas restantes!


Eso es básicamente la misma técnica de CopyByte para una Variable 80xx.
Offsets:
Ruby:02038808
Firered:02039994
Emerald:0203A04C

Offsets de las variables aquí!


----------------------------------



Verificar el numero de Pasos restantes!


Otra vez, la técnica CopyByte para una Variable 80xx.
Offsets:
Ruby:0203880A
Firered:02039996
Emerald:0203A04E

Offsets de las variables aquí!

-----------------------------------


Cambiar el Script que termina el safari por falta de bolas para nuestros gustos!


Mil perdones por no haber postado esto porque esta es la manera mas probable de se terminar un SAFARI: Falta de bolas!
Pero hay dos maneras de terminar con falta de bolas:
[list=1]
  • Una es en batalla, cuando fallas en atrapar el pokemon, usando tu ultima bola.
  • La otra es en campo, cuando consigues atrapar un pokemon usando tu ultima bola
  • [/list]

    Voy a empezar por la manera mas dificil, la da batalla!
    Cuando pierdes todas las bolas intentando atrapar un pokemon en una batalla y no consigues, aparece la mensaje siguiente (EN LA BATALLA, no fuera):
    Ruby, Emerald, Firered:
    "ANNOUNCER: You're out of SAFARI BALLS! Game Over!"

    Y luego apareces en la Entrada de Safari (dentro de casa).
    Porque acontece esto? Es simple: La batalla hace con que el script responsable por esto actúe como un Script de NIVEL 03!
    Esa es una información muy importante que he descubierto hoy investigando las rutinas del SAFARI. Significa que para conseguirnos un Script que se ejecute luego mal la batalla termine, tendremos que tener UN SCRIPT DE NIVEL 02 en el mapa!!!!
    Pero sin mas atrasos, los scripts--

    Ruby:
    Repuntear: 0C828C
    Script Offset: 1C340A
    Script:

    '---------------
    #org 0x1C340A
    setvar 0x40A4 0x1
    special 0xCE
    warp3d 0x17 0x0 0xFF 0x2 0x5
    end


    Firered:
    Repuntear: 0A0F8C
    Script Offset: 1BFB87
    Script:

    '---------------
    #org 0x1BFB87
    setvar 0x406E 0x3
    special 0xCE
    warp3 0xB 0x0 0xFF 0x4 0x1
    end


    Emerald:
    Repuntear: 0FC1F8
    Script Offset: 2A4B4C
    Script:

    '---------------
    #org 0x2A4B4C
    setvar 0x40A4 0x1
    special 0xD1
    warp3 0x17 0x0 0xFF 0x2 0x5
    end


    Ahora vos voy a explicar que hacer ahora.
    Eses scripts son ejecutados como Scripts de nivel 03, luego despues de la batalla (en la parte negra). Asi que deben retirar el WARP
    y modificar la variable para una que active un script de nivel 02 que tienen el mapa, para que puedan ejecutar vuestro proprio script asi que terminan una batalla sien bolas.
    Pero no es todo. Para que no haya efecto de WARP, deben poner 4 00's en los offsets--
    Ruby:0C8276
    Firered:0A0F76
    Emerald:0FC1E4
    ----
    Ahora la manera en OverWorld.
    Si acabas atrapando un pokemon con tu ultima bola, la batalla acaba bien, y un script es ejecutado al 'OverWorld Level' (como si fuera un script de nivel 02).

    Solo tendréis que cambiarlo a vuestros gustos:
    Ruby:
    Repuntear: 0C82B4
    Script Offset: 1C3459
    Script:

    '---------------
    #org 0x1C3459
    lockall
    sound 0x49
    preparemsg 0x81C3514 '"You've run out of SAFARI BALLS.\nY..."
    waitmsg
    waitkeypress
    releaseall
    goto 0x81C341B

    '---------------
    #org 0x1C341B
    setvar 0x40A4 0x1
    special 0xCE
    warp 0x17 0x0 0xFF 0x2 0x5
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x1C3514
    = You've run out of SAFARI BALLS.\nYour SAFARI Game is over.



    Firered:
    Repuntear: 0A0FB4
    Script Offset: 1BFBD7
    Script:

    '---------------
    #org 0x1BFBD7
    lockall
    sound 0x42
    msgbox 0x81BFC53 MSG_KEEPOPEN '"PA: Ding-dong!\pYou are out of SAF..."
    goto 0x81BFB98

    '---------------
    #org 0x1BFB98
    setvar 0x406E 0x1
    special 0xCE
    warp 0xB 0x0 0xFF 0x4 0x1
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x1BFC53
    = PA: Ding-dong!\pYou are out of SAFARI BALLS!\pPA: Your SAFARI GAME is over!



    Emerald:
    Repuntear: 0FC220
    Script Offset: 2A4B9B
    Script:

    '---------------
    #org 0x2A4B9B
    lockall
    sound 0x49
    preparemsg 0x82A4C56 '"You've run out of SAFARI BALLS.\nY..."
    waitmsg
    waitkeypress
    releaseall
    goto 0x82A4B5D

    '---------------
    #org 0x2A4B5D
    setvar 0x40A4 0x1
    special 0xD1
    warp 0x17 0x0 0xFF 0x2 0x5
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x2A4C56
    = You've run out of SAFARI BALLS.\nYour SAFARI Game is over.


    Así que cambien lo que quieren a los scripts!

    ------------------------------------------------


    Cambiar el script de RETIRE para que podamos EJECUTAR SCRIPTS POR EL MENU!!


    En primero lugar, hay algunos problemas con esto, entonces esto solo puede ser usado en un curto periodo de tiempo
    [list=1]
  • El menú RETIRE apaga el menu SAVE, entonces no se puede grabar el Juego
  • Aparece en el lado izquierdo el numero de bolas restantes (y en Firered el numero de pasos restantes)
  • Solo aparece el menú RETIRE cuando la flag del Safari esta activa y como saben, cuando esta activa las wildbattles se tornan Safari Wild Battles!
  • [/list]

    PERO, yo tengo soluciones para algunos de estos problemas!
    [list=1]
  • En el script que se va ejecutar por el MENU, añaden una caja de opciones y despues hacen una con SAVE, usando los specials de los pokecentros (Link Battle,Trade,etc)
  • No se que hacer a esta, pero PIENSO que tengo solucion para FireRed... No lo sé.
  • Puedo tentar check'ar con otra flag el menu, pero si el menu RETIRE y esa parte están en el mismo código,entonces nada hecho :/
  • [/list]

    Entonces, si quieren usar eso mismo con esos problemas, aquí están los offsets:
    Ruby:
    Repuntear: 0C8248
    Script Offset: 1C342D
    Script:

    '---------------
    #org 0x1C342D
    lockall
    msgbox 0x81C34B2 MSG_YESNO '"Would you like to exit the SAFARI ..."
    compare LASTRESULT 0x1
    if 0x1 goto 0x81C3443
    releaseall
    end

    '---------------
    #org 0x1C3443
    goto 0x81C341B

    '---------------
    #org 0x1C341B
    setvar 0x40A4 0x1
    special 0xCE
    warp 0x17 0x0 0xFF 0x2 0x5
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x1C34B2
    = Would you like to exit the SAFARI ZONE\nright now?



    Firered:
    Repuntear: 0A0F48
    Script Offset: 1BFBAA
    Script:

    '---------------
    #org 0x1BFBAA
    lockall
    msgbox 0x81BFBE9 MSG_YESNO '"Would you like to exit the SAFARI\..."
    compare LASTRESULT 0x1
    if 0x1 goto 0x81BFBC0
    releaseall
    end

    '---------------
    #org 0x1BFBC0
    goto 0x81BFB98

    '---------------
    #org 0x1BFB98
    setvar 0x406E 0x1
    special 0xCE
    warp 0xB 0x0 0xFF 0x4 0x1
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x1BFBE9
    = Would you like to exit the SAFARI\nZONE right now?



    Emerald:
    Repuntear: 0FC18C
    Script Offset: 2A4B6F
    Script:

    '---------------
    #org 0x2A4B6F
    lockall
    msgbox 0x82A4BF4 MSG_YESNO '"Would you like to exit the SAFARI\..."
    compare LASTRESULT 0x1
    if 0x1 goto 0x82A4B85
    releaseall
    end

    '---------------
    #org 0x2A4B85
    goto 0x82A4B5D

    '---------------
    #org 0x2A4B5D
    setvar 0x40A4 0x1
    special 0xD1
    warp 0x17 0x0 0xFF 0x2 0x5
    waitstate
    end


    '---------
    ' Strings
    '---------
    #org 0x2A4BF4
    = Would you like to exit the SAFARI\nZONE right now?


    Bien, cambien como mas vos encanta chicos!


    ----------------------------------------------------------------------------------------------------
    Quizá haga una herramienta para esto ;)
    Bueno, por ahora es todo! Espero tener ayudado con este Gigante Tutorial acerca del safari.
    Esto todo ha sido descubierto con ASM, solo para que perciban el poder de ASM!

    Tutorial made by me, Sonicarvalho Aka D.Ray!
    Do not copy without permission!
    Give credits if used!
    -------------------------------------
    Tutorial hecho por me, Sonicarvalho Aka D.Ray!
    No copiar sin autorización!
    Dar créditos si es usado!
    #1
    Javi4315♪ 13374
    Oh, que gran aporte.

    Se me ocurren algunas cosas que hacer con esto... xD

    Bueno, respecto al tutorial, está muy bien redactado, bien organizado y la información que contiene es inmejorable para el caso xD

    Bueno, espero que sigas haciendo grandes aportes como estos ;D
    #2
    Gershel 12314
    ¡Eres un gran ASM Hacker, o como quieras nombrarte!
    Llevas bastantes aportes geniales en el foro, y este no es menos. Con toda esta información se pueden crear muchísimas aplicaciones muy novedosas!
    Es un gran aporte con una información muy organizada y con una explicación adaptada a todos los niveles de comprensión :D Has hecho un gran trabajo investigando y sacando a la luz tanta información.
    Muchísimas gracias! Sigue aportando así de bien!
    Saludos!
    #3
    Hackun 12904
    Gran investigación. Te felicito y te agradezco que la compartas con el pueblo.
    Saludos.
    #4
    JV Works 12391
    TE PASASTE!! Es genial lo que se puede descubrir con Asm no?

    De verdad es un placer tener a tan buen Asm-Hacker en positron, sinceramente a mi me sirves de motivacion para seguir investigando :D

    Así que... SIGAMOS CON EL AUGE DE LA INVESTIGACIÓN ROM HACKING! :awesome:
    #5
    CKaktus 27497
    ¡OMG!
    Amigo,muchísimas gracias,Apartir de ahora te llamaré ASManíaco (?)
    El otro día estuve investigando y hice que para capturar Pokémon en el safari te prestaran un pokemon y se si debilita ya no mas safari xD hasta he hecho que la Safariball sea una Masterball,bueno,voy a parar xD
    Se agradece...Muchas gracias!
    #6
    Sonicarvalho 17082
    Iniciado por Mew2?

    Oh, que gran aporte.

    Se me ocurren algunas cosas que hacer con esto... xD

    Bueno, respecto al tutorial, está muy bien redactado, bien organizado y la información que contiene es inmejorable para el caso xD

    Bueno, espero que sigas haciendo grandes aportes como estos ;D

    Pues, al respecto de inmejorable, estas muy equivocado! :D Voy a actualizar este tut orial con cosas inimaginables, puedes creer!

    Iniciado por Gershel

    ¡Eres un gran ASM Hacker, o como quieras nombrarte!
    Llevas bastantes aportes geniales en el foro, y este no es menos. Con toda esta información se pueden crear muchísimas aplicaciones muy novedosas!
    Es un gran aporte con una información muy organizada y con una explicación adaptada a todos los niveles de comprensión :D Has hecho un gran trabajo investigando y sacando a la luz tanta información.
    Muchísimas gracias! Sigue aportando así de bien!
    Saludos!

    Muchas gracias a uno de los mejores reporteros de WAH ;)
    Pues, hago los posibles para llevar WAH al topo. También estoy unido a vosotros para un cambio en WAH! Y voy sacar mas información!

    Iniciado por Trollfiuld

    Gran investigación. Te felicito y te agradezco que la compartas con el pueblo.
    Saludos.

    Gracias ;)

    Iniciado por Mariofan

    TE PASASTE!! Es genial lo que se puede descubrir con Asm no?

    De verdad es un placer tener a tan buen Asm-Hacker en positron, sinceramente a mi me sirves de motivacion para seguir investigando :D

    Así que... SIGAMOS CON EL AUGE DE LA INVESTIGACIÓN ROM HACKING! :awesome:

    Y tengo muchos mas trucos en mi cartola...
    Pues la verdad es que yo entre para POSITRON no solo para aportar, pero también porque soy tu fan! xD El positron worldmap master me encantó! xD Tenemos que hablar en MSN sobre unas cositas ;)
    Si, SIGAMOS CON EL AUGE DE LA INVESTIGACIÓN ROM HACKING!! :furia:

    Iniciado por Comandante Kaktus

    ¡OMG!
    Amigo,muchísimas gracias,Apartir de ahora te llamaré ASManíaco (?)
    El otro día estuve investigando y hice que para capturar Pokémon en el safari te prestaran un pokemon y se si debilita ya no mas safari xD hasta he hecho que la Safariball sea una Masterball,bueno,voy a parar xD
    Se agradece...Muchas gracias!

    Haha ASManíaco, muy bueno :XD:
    Buena sorte en tus investigaciones!
    ------------------------
    Bueno ahora, 'drumrole please'!

    Mientras investigando mas el Safari, he logrado unos cuantos factos muy impresionantes.
    Podemos EJECUTAR SCRIPTS POR EL MENU!!!
    Podemos hacer un SCRIPT EJECUTAR-SE CADA VEZ QUE SE DA UN PASO!!

    En un o dos dias, voy a postar cómo HACERLO!!!!

    Saludos de Sonicarvalho
    aka D.Ray!!
    #7
    Gut_Bro 14808
    Ooo lala!

    Muy bien ^^ Que gran aporte, OMFG! xD
    Quisiera ver un tutorial para extraer rutinas o para ir navegando sin perderse en la RAM ^^

    Eso de un Script cada paso me serviría muchísisisisimo para mi Hack :O
    Y por si se te acaban las ideas, podrías despistarnos con "eliminar el sistema de ayuda en FR" ese que sale con L ó R, me molesta xD

    Excelente tutorial, excelente redacción y excelente aporte. Felicidades! ^^
    #8
    Sonicarvalho 17082
    Iniciado por Gut_Troll

    Ooo lala!

    Muy bien ^^ Que gran aporte, OMFG! xD
    Quisiera ver un tutorial para extraer rutinas o para ir navegando sin perderse en la RAM ^^

    Eso de un Script cada paso me serviría muchísisisisimo para mi Hack :O
    Y por si se te acaban las ideas, podrías despistarnos con "eliminar el sistema de ayuda en FR" ese que sale con L ó R, me molesta xD

    Excelente tutorial, excelente redacción y excelente aporte. Felicidades! ^^


    Muchas gracias Gut!!! :D
    Eso de retirar el HELP Menu es mas complicado, pero es posible hacerlo. Un día de estos hago eso.
    El Script a cada paso tiene que quedar para otro tópico y día, que yo hoy estoy exhausto xD
    -------------------------------

    BIG UPDATE!! TÓPICO ACTUALIZADO!