MENU PERSONALIZADO
Primero quiero que sepan que me voy a basar en el parche A porque es que mejor encontré para explicar pero si saben trabajar con uno ya sabrán trabajar con el otro.
Segundo no soy de hacer tutoriales pq no me explico muy bien ,pero tratare de ser lo mejor entendible posible.
Tercero lo mejor que pueden hacer es darle este tuto a alguien con esperencia para que lo estudie y tal vez puede explicarlo mejor que yo y ensenarles más cosas de la que yo puedo .
Cuarto lo que voy hacer no es un tuto en si sino explicarles las cosas que no se les explican en ese tuto que para muchos tal vez sea fácil pero para otros por lo que note le es bastante difícil aunque también tengo reconocer que me expreso muy mal.
Quinto no pienso dedicarme a realizar tutoriales por lo que pueden criticar este si quieren no hay problema yo solo los trato de ayudar un poco.
Lo que quiero explicar es como trabajar todas las cosas del parche como imágenes, rutina,etc
Lo primero que deben tener son sus imágenes Las cuales deben tener como todos saben 16 colores (Cosas de GBA aunque me gusta ya que es un buen reto el introducir buenos gráfico con esa limitación)
Les voy a dar una muestra de mis imágenes para que Tengan una idea y si las quieren usar me las pueden pedir y ya.
Empezando para introducir las imágenes en el juego yo uso NSE 2.0 pero pueden usar unlz GBA
Bueno lo que yo hago para ahorarme tiempo o bueno lo que hice pq es la primera vez que hago esto es hacer mis imágenes en 240x160
En fin 240 ancho y 160 de alto para los que no saben el pq esta es la medida de la pantalla de GBA en fin editan sus imágenes en este tamaño y suponen que así mismo es como c vera en el juego.
En fin tienen que crear todas las imagines Sin menú pokemon y sin pokemon como también las que si lo tienen.
Pq es esto?
Bueno creo yo no c que si aun no tienes el menú pokemon se vería mal estéticamente que apareciera un apartado con dicha opción.
Después de crear todas las imagines aunque creo que ya muchos la tienen o las pueden descargar no c, las insertan en el juego en espacio libre y anotan el offset de cada imagen.
Ya con los offset de cada imagen lo que hacen es insertar la paleta de sus imágenes que creo que es la misma paleta para todas a no ser que hagan otro método.
No les voy a enseñar como indexar imágenes pq creo que ya todos saben pero si alguien no sabe solo dejan su imagen a 16 colores y el primer color de la paleta que sea el del fondo para que el ROM lo tome como que es transparente.
Una vez que tengan los offset de las imágenes lo que van hacer es que par que entienda mejor permuten los offset.
Por ejempló si una imagen está en el offset 0x80 00 00 lo que hacen es voltearlo
Quedaría así
00 00 80
Y de paso le agregan un 08 al final ósea asi
00 00 80 08
Ahora el orden de la tabla es muy lógico solo deben razonar un poco.
La primera imagen debe ser la que no tiene ni pokedex ni pokemon y seguido la que selecciona la mochila, trainer card, save, opciones.
00 00 72 08 40 D9 73 08 E0 03 72 08 40 D9 73 08 B0 07 72 08 40 D9 73 08 90 0B 72 08 40 D9 73 08 70 0F 72 08 40 D9 73 08 40 13 72 08 40 D9 73 08 70 17 72 08 40 D9 73 08 A0 1B 72 08 40 D9 73 08 E0 1F 72 08 40 D9 73 08 20 24 72 08 40 D9 73 08 60 28 72 08 40 D9 73 08 90 2C 72 08 40 D9 73 08 30 31 72 08 40 D9 73 08 D0 35 72 08 40 D9 73 08 80 3A 72 08 40 D9 73 08 30 3F 72 08 40 D9 73 08 D0 43 72 08 40 D9 73 08 80 48 72 08 40 D9 73 08 20 4D 72 08 40 D9 73 08 C0 51 72 08 40 D9 73 08 70 56 72 08 40 D9 73 08 20 5B 72 08 40 D9 73 08 D0 5F 72 08 40 D9 73 08 80 64 72 08 40 D9 73 08 30 69 72 08 40 D9 73 08
Esta es la tabla del parche 1
Que trabaja de esta forma
XX XX XX 08 YY YY YY 08
Lo del 08 es pq nos referimos a que es un pointer de la ROM por lo que lo único que deben saber es que obligatorio si no funciona.
XX XX XX: es la imagen
YY YY YY : es la paleta
Entonces pondrán los offset permutados de cada imagen y acontinuacion la de la paleta que si c fijan es la misma paleta en toda la tabla ya que se supone que todas las imágenes tengan los mismo colores.
(A se me olvidaba por si usan paint para estas cosas mejor usen el de XP ya que el de 7,8 etc. No trabaja muy bien con las paletas)
Ahora el orden exacto de la tabla este
*.Imagen sin el menú pokemon y sin pokedex mas paleta
1.Imagen seleccionado Mochila mas paleta
2. Imagen seleccionado trainer card mas paleta
3. Imagen seleccionado save mas paleta
4. Imagen seleccionado options mas paleta
*.Imagen con el menú pokemon sin al pokedex mas paleta
1. Imagen seleccionado Pokemon mas paleta
2. Imagen seleccionado Mochila mas paleta
3. Imagen seleccionado trainer card mas paleta
4. Imagen seleccionado save mas paleta
5. Imagen seleccionado options mas paleta
*Imagen con todas las opciones mas paleta
1. Imagen seleccionado Pkedex mas paleta
2. Imagen seleccionado Pokemon mas paleta
3. Imagen seleccionado Mochila mas paleta
4. Imagen seleccionado trainer card mas paleta
5. Imagen seleccionado save mas paleta
6. Imagen seleccionado options mas paleta
Creo que no puedo explicarlo mejor.
Y su tabal quedara igual que la de arriba.
Ahora después de eso vamos a revisar la rutina del parche.
Hay tres rutinas que son mejor ni modificarlas pq de que no hace falta no lo hace pero bueno si alguien quieres revisarlas toda suya.
La que modificaremos es la que muestra la imagen.
.equiv table_location, 0x0873f600 (offset donde se encuentra tu tabla)
.thumb
push {r4-r5,lr}
sub sp, sp, #0x18
mov r1, #0
mov r2, #0
mov r3, #0
mov r0, #30 (ancho de las imágenes)
str r0, [sp]
mov r0, #20 (largo de las imágenes)
str r0, [sp, #4]
mov r0, #0xd
str r0, [sp, #8]
mov r0, #0x40
str r0, [sp, #0xc]
add r0, sp, #0x10
ldr r4, =0x810FE51
bl bx_r4
add r0, sp, #0x10
ldr r4, =0x8003CE5
bl bx_r4
ldr r4, =0x2039990
strb r0, [r4]
ldr r4, =0x8003FA1
bl bx_r4
ldr r0, =0x20370C0
ldrh r0, [r0]
ldr r1, =table_location
lsl r0, r0, #3
add r0, r0, r1
ldr r5, [r0, #4]
ldr r0, [r0]
ldr r1, =0x6008800
swi 0x12
mov r0, r5
mov r1, #0xd0
mov r2, #0x20
ldr r4, =0x80703A9
bl bx_r4
mov r0, #0
ldr r4, =0x80020BD
bl bx_r4
add sp, sp, #0x18
pop {r4-r5, pc}
bx_r4: bx r4
Como pueden ver les deje unos apartados entre () para que que sepan que son.
En equiv table_location, 0x0873f600
Lo que hacen es poner el offset de su tabla que este caso en el parche es
0x0873f600 pero ustedes pondrán el suyo.
En mov r0, #30 lo que hacen es poner el ancho de su tabla y en mov r0, #20 colocan el largo para menos complicaciones 30y20 que son las que tiene este ejemplo es igual 240x160 por lo que no hace falta que lo toquen si me hacen caso
Y de paso ya en esta rutina están las posiciones xy para que se vean en el medio por lo que no hace falta explicar eso y eso es lo que deben cambiar de la rutina.
Vamos a pasar a lo mas complejo se puede decir que no lo es tanto cuando lo entienden.
No pienso informarles mucho acerca de eso ya que deben haber tutos sobre esto en el foro
.
Comparefarbytetobyte
Que es este comando?
Bueno lo que hace es comparar el valor de un dato de la RAM el que ha implementado alguna vez el DNS con sepmaptile no les será ningún problema entender, los parámetros son los siguientes .
Comparefarbytetobyte 0x4000130 0x0
If 0x1 goto @pointer
Haber si me explico a lo que me refiero en la RAM para que entiendan mejor hay un sitio donde se encuentra la asignación a tleclas o botones como quieran llamarlo ,el offset 0x4000130 es respectivamente donde están esas funciones , 0x0 es la tecla que le asignamos y lo del if goto y eso ya den saber que es.
Las teclas son estas.
ARRIBA-BF
ABAJO-7F
IZQUIERDA-DF
DERECHA-EF
A-FE
B-FD
SELECT-FB
START-F7
Para entendernos mejor
Si yo pongo
Comparefarbytetobyte 0x4000130 0xF7
If 0x1 goto @pointer
Lo que hago es que si pulso start se dirigía a un pointer en concreto.
El script que se usa en este parche trabaja de esta manera
Para que?
Mejor comprensión todavía.
Imaginense que abrimos el menú de las imágenes que les mostré en especial para que lo entiendan mejor la imagen que tiene pokedex y pokemon y todo.
Lo que hacemos con esto es si damos derecha vamos a la imagen de pokemon si damos abajo vamos a la imagen de trainer card si tocamos B salimos si damos A entramos en la trainer card.
Creo que mejor no puedo explicarlo.
Bueno en si el script usa unos comando llamando a la rutina pero como lo que me hacía falta lo encontré no me puse a revisar tanto la rutina.
Estos comando hacen lo mismo que el comparebytetobyte 0x4000130 pero con otros comando así que si los cambiamos por los comparebytetobyte haríamos lo mismo que ellos.
La script deben tenerlo o bueno deben tener el offset de el pero como quiera les voy a ensenar el script y se los explico pero por favor bastante paciencia les pido en esta parte.
El comienzo del script es este.
#dynamic 0x900000
'---------------
#org @start
lock
callasm 0x806F541
compare 0x406E 0x2
if 0x1 goto @snippet1
checkflag 0x829
if 0x1 goto @snippet2
checkflag 0x828
if 0x1 goto @snippet3
setvar 0x8004 0x0
callasm 0x873F8D1
goto @snippet4
bueno si se fijan lo que hace esta parte es revisar si tienes ciertas condiciones para ensenar una imagen otra por ejemplo si se fijan hay un checkflag 0x828 que lo que hace es revisar si tenemos dicha flag activada para ensenarnos una imagen de nuestro menú (esa es la flag de activación del menú pokemon )por lo que si tenemos la flag activada nos ensenara la imagen del menú que tiene el menú pokemon lo mismo es con la flag 0x829 que revisa si tenemos la pokedex y si es asi nos envía a la imagen donde esta la pokedex y todas las demás .
en fin el menú personalizado puede tener todos los apartados que quieras mientras le hagas las imágenes y insertes los códigos que lo llaman como por ejemplo pueden hacer una imagen que tenga un icono con unos tenis y si le otorgas la flag que activa las zapatillas tendrán las zapatillas en su menú por lo que todo es imaginación, pura imaginación como puede ser la bici etc.
Esto no es bueno tocarlo ya que esta bien hecho lo que pueden hacer es agregarle cosas como les acabo de explicar.
Ahora para no liarlos y entiendan bien voy a coger un ejemplo y creo que así van a entender en totalidad su script.
checkflag 0x829
if 0x1 goto @snippet2
Aquí como dije el esta revisando si tenemos la flag que activa la pokedex y nos dice que si es asi no enviara al pointer @snippet2
#org @snippet2
setvar 0x8004 0xB
callasm 0x873F8D1
goto @snippet6
este es el el @snippet2 que lo que hace es activar una rutina que sería mostrar una imagen en dicho caso la que tiene la pokedex y nos envía al pointer @snippet6
#org @snippet6
sound 0x5
callasm 0x873F991
pause 0x1
setvar 0x8004 0xC
callasm 0x873F8D1
waitkeypress
compare 0x8000 0x1
if 0x1 goto @snippet13
compare 0x8000 0x10
if 0x1 goto @snippet14
compare 0x8000 0x20
if 0x1 goto @snippet15
compare 0x8000 0x2
if 0x1 goto @snippet12
compare 0x8000 0x8
if 0x1 goto @snippet12
goto @snippet6
este es el @snippet6 aquí es donde van a tener que realizarles cambios al script.
Se los voy a traducir y así de esta manera entenderán como realizar su propio script o modificar el mismo.
Los primeros parámetros es bueno dejárselo ya que lo que hacen es reproducir un sonido que seria el de cada vez que presionamos algo en el menú.
Después del waitkeyprees que lo que hace es esperar a que pulsemos una tecla lo que haremos será modificar la rutina.
Al parecer a la variable 8000 fue a la que esta rutina se le asignaron las teclas pero como les dije usaremos el comparefarbytetobyte.
compare 0x8000 0x1
if 0x1 goto @snippet13
en esta parte lo que nos dice es que si la variable tiene el valor 1 nos envía a un pointer.
Pues bueno el valor uno a dicha variable representa que pulsamos la tecla A que sería aceptar o como quieran decirle entonces seria los mismo que pusierieramso esto.
Comparefarbytetobyte 0x4000130 0xFE
If 0x1 goto @snipppet13
El Snippet13 es donde está en este script la opción de entrar al menú pokemon .
Les voy a dejar una muestra del script que use para que lo comprendan mejor explicando la parte de la imagen si tienen la pokedex.
#org @snippet6
sound 0x5
callasm 0x873F991
pause 0x1
setvar 0x8004 0xC
callasm 0x873F8D1
waitkeypress
comparefarbytetobyte 0x4000130 0xFE
if 0x1 goto @snippet13
comparefarbytetobyte 0x4000130 0x7f
if 0x1 goto @snippet27
comparefarbytetobyte 0x4000130 0xEF
if 0x1 goto @snippet14
compare 0x8000 0x2
if 0x1 goto @snippet12
compare 0x8000 0x8
if 0x1 goto @snippet12
goto @snippet6
Bueno aquí como ven lo que hice fue que le dije si pulso A abro la Pokedex , si doy derecha selecciono Pokemon, y si voy abajo selecciono mochila.
Deben preguntarse como se a que @snippet se le asigna una opción bueno lo mejor que pueden hacer es seguir leyendo el script pero de paso para que no pasen tanto trabajo les diré de este script para que es cada @snippet y así la pueden estudiar mejor y al final les daré un ejemplo para que me entiendan.
Les recuerdo ante todo que si no saben muy bien lo que hacen el #org start mejor ni lo toquen.
Estos son los snippet que llaman a las opciones en si como por ejemplo el que nos abre la mochila.
@snippet13(Nos abre la pokedex)
@snippet16(nos abre el menú pokemon)
@snippet12(es la dirección que nos cierra el menú por lo que deberían asignarle a esta dirección las tecla START y B)
@snippet9(es la mochila en si en fin si dicen que al pulsar una tecla se dirija a esta dirección se nos abriría la mochila)
@snippet22(es la trainer card si le asignamos una tecla a esta dirección si la pulsamos nos abrirá la trainer card)
@snippet37(lo que hace es que nos habre la opción de guardar)
@snippet46(nos habré la opciones)
Ahora les daré los snippet de las direcciones donde se nos abrirán las imágenes pero del menú que no tiene ni la opción de pokedex ni la de pokemon.
@snippet5 (es el que llama a la imagen de mochila )
@snippet10(nos lleva la imagen donde seleccionamos a la Trainer card )
@snippet23(nos lleva a la imagen de salvar )
@snippet38(nos dirige a la imagen donde seleccionamos opciones )
Ahora les dare los del menú que tiene la opción pokemon.
@snippet7(nos lleva a la imagen seleccionado al icono de pokemon)
@snippet17(nos lleva a la imagen seleccionando la mochila)
@snippet31(nos lleva a la imagen de la trainer card)
@snippet33(nos lleva a la imagen de salvar)
@snippet18(nos lleva a la imagen de opciones )
Y por ultimo aquí están los del menú cuando y tienes la pokedex.
@snippet6(imagen seleccionando pokedex)
@snippet14(imagen seleccionando el icono pokemon)
@snippet27(imagen seleccionando a la mochila)
@snippet41(imagen seleccionado a la trainer card)
@snippet29(imagen seleccionando al icono de salvar)
@snippet15(imagen seleccionando las opciones)
Por ejemplo si queremos que nos lleve tocando la flecha derecha a seleccionar la mochila usamos el comparebytetobyte y le decimos que si tocamos derecha nos envie al pointer de la imagen y si le decimos que si pusamos START nos habrá la mochila iwual creo que si estudian un poco mas profundo esto lo entenderán mejor .
Así que lo mejor que pueden hacer es revisar el script y perfeccionarlo .
La rutina que muestra el script en ese foro te la dan también en el archivo donde está la descarga para introducirla manualmente y lo único que tienen que hacer es antes de implementarla es darle el offset de donde se encuentra el script.
O simplemente Si van a usar el parche ubican su script en el offset del anterior.
El menú B es el mejor para este trabajo ya que tienes más opciones que pueden modificar y si no em equivoco hay unas de las dos rutinas que probe que daba como un parpadeo medio raro pero como al final lo que hice fue implementar una mezcla de las dos no se cual era ya eso les toca averiguarlo pero solamente si la estudian bastante yo no me demore mucho en comprender el script ya que no es difícil y si entiendes una parte del script nada mas entenderán absolutamente todo el script de esa manera
Me acabo de dar cuenta de una cosa la rutina que trabaja con el parche A hace un parpadeo así que mejor trabajen con la B y por favor denle esto a alguien que sea bueno en script y así les explica mejor y pueden llegar hacer grandes cosas de verdad quisiera ayudarlos más pero es que explicando estoy fatal tal vez si alguien me manda como hacer un tutorial en si puede ser que haga mejores cosas