Author Id: 17082 Author Name: Sonicarvalho Post Content: 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? [list] [*]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) [/list] Ideas para aplicar en Hacks con este tutorial: [list] [*]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 [/list] En primer lugar, unas informaciones acerca del Safari: En Ruby: [list] [*]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 [/list] En Firered: [list] [*]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 [/list] En Emerald: [list] [*]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 [/list] ----------------------------------------- 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 [url=http://wahackforo.com/t-Aporte-Los-offsets-en-la-RAM-de-las-variables-80xx-en-Ruby-FireRed-Emerald]aquí[/url]! ---------------------------------- 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 [url=http://wahackforo.com/t-Aporte-Los-offsets-en-la-RAM-de-las-variables-80xx-en-Ruby-FireRed-Emerald]aquí[/url]! ---------------------------------- 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 [url=http://wahackforo.com/t-Aporte-Los-offsets-en-la-RAM-de-las-variables-80xx-en-Ruby-FireRed-Emerald]aquí[/url]! ----------------------------------- 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!