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?
- Cambiar el numero de Bolas que podemos usar en safari!(HEX)
- Cambiar el numero de pasos que podemos dar!(ASM/HEX)
- Cambiar el Script que termina el safari para nuestros gustos!(SCRIPTS)
- Verificar el numero de pokemons que ha sido capturado desde que el Safari esta activo!NO POSIBLE EN RUBY Y FIRERED!(SCRIPTS)
- Verificar el numero de Bolas restantes!(SCRIPTS)
- Verificar el numero de Pasos restantes!(SCRIPTS)
- Cambiar el numero de pasos MÁXIMO que aparece en el menu de FireRed (HEX)
- Cambiar el Script que termina el safari por falta de bolas en la batalla(en caso de fallares una captura con 1 bola restante) y en campo(en caso de atrapares el pokemon con tu ultima bola) para nuestros gustos!(SCRIPTS)
- Cambiar el script de RETIRE para que podamos EJECUTAR SCRIPTS POR EL MENU!!(SCRIPTS)
Ideas para aplicar en Hacks con este tutorial:
- Aplicar el Bug Contest de las versiones Gold/Silver, utilizando un check para verificar el numero de pokemons atrapados desde el inicio del safari. (EMERALD ONLY)
- Un minigame que tienes que llegar a un hogar dando el minimos de pasos necesarios (Ej:Deoxys event)
- Mas alguna cosa que de cierto os acordareis! xD
En primer lugar, unas informaciones acerca del Safari:
En Ruby:
- La flag del safari es 0x82C
- El special que activa el safari es el 'special 0xCD'
- El special que para el safari es el 'Special 0xCE'
- El numero de pasos predefinidos es 0x1F4 (500-decimal)
- El numero de bolas predefinidas es 0x1E (30-decimal)
- En ruby NO HAY un contador de pokemons capturados desde que se empeció el safari
En Firered:
- La flag del safari es 0x800
- El special que activa el safari es el 'special 0xCD'
- El special que para el safari es el 'Special 0xCE'
- El numero de pasos predefinidos es 0x258 (600-decimal)
- El numero de bolas predefinidas es 0x1E (30-decimal)
- En FireRed NO HAY un contador de pokemons capturados desde que se empeció el safari
En Emerald:
- La flag del safari es 0x88C
- El special que activa el safari es el 'special 0xD0'
- El special que para el safari es el 'Special 0xD1'
- El numero de pasos predefinidos es 0x1F4 (500-decimal)
- El numero de bolas predefinidas es 0x1E (30-decimal)
- En emerald HAY un contador de pokemons capturados desde que se empeció el safari
-----------------------------------------
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]
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]
PERO, yo tengo soluciones para algunos de estos problemas!
[list=1]
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!