Acimut
Profesional de WaH
Hola, soy yo otra vez, trayendo aportes para la ROM española!
En esta ocasión les enseñaré cómo mostrar los IV en el menú de datos del pokémon para Rojo Fuego en español.
La ventaja contra el EV-IV Display Screen de jiangzhengwenjz (que espero pronto tenga el permiso para traerlo a la ROM española), es que podemos revisar rápidamente los IVs no sólo de nuestro equipo pokémon, sino de los pokémon guardados en la PC (revisando un viejo .SAV encontré en la PC unos agradables descubrimientos, y otros no tan buenos). La desventaja ovbiamente es que no podemos ver los EVs con este método.
Primero que todo, los créditos por las rutinas son para:
El creador original de la rutina: DoesntKnowHowToPlay
Fuente
Y a Froosty por ajustar la rutina al menu datos de pokémon estilo BW.
Fuente
Lo que nesitaremos:
Nameless Sprite Editor (NSE)
Un edito Hexadecimal (yo uso HxD)
Un compilador de rutinas ASM (thumb)
Una imágen bmp de 128x32 píxeles a 16 colores (les dejo unas aquí para que usen o modifiquen a gusto)
Una ROM Rojo Fuego en español BPRS
Character Maker Pro (opcional)
Primero veamos unos ejemplos de cómo podría verse:
#PASO 1
Ahora necesitan escoger una de las siguientes opciones para representar los IVs:
1: quiero ver los IVs en letras porque molan...
2: quiero ver los IVs en números porque son más exactos...
esto es importante, ya que depende de la elección usarán una rutina u otra. (en realidad es la misma rutina con una pequeña modificación)
Ya teniendo una idea de qué es lo que quieren, pueden usar las imágenes que les traigo (son basadas en las que encontré en los post originales), para que los personalicen si lo desean, con Character Maker Pro o su editor de imágenes preferido, asegurándose de que la paleta sea Colores 15-bits y se guarde como imágen BMP de 16 colores; o pueden usarlas tal cual las dejé.
Por si lo preguntan, el espacio que utiliza cada representación de IV es de 16x8 píxeles. El orden se pueden guiar de una imagen con numeritos.
Nota: La paleta que se usa son las mismas para los tipos, así que pueden jugar a cambiar el color de las letras o números como gusten pero preferiblemente no cambien la paleta a menos que sepan bien por qué lo hacen.
#PASO 2 insertar imagen
Ahora lo que haremos es insertar la imágen que elegimos en un espacio vacío de la ROM, se nesecitarán 2048 bytes de espacio (800 bytes en Hexadecimal). Para esto, en NSE cargamos nuestra ROM española, arrastramos el sprite al NSE (imágen de 128x32 píxeles a 16 colores) y procedemos a insertarla en la ROM poniendo un offset con espacio libre (pueden usar la lupa que les señalo con una flecha). Para este ejemplo usaré el offset 0xEC4104. No olviden anotar el offset que pusieron ya que lo necesitaremos para las rutinas.
#PASO 3 ASM
Llegados a este punto imagino que ya insertaron la imagen en la ROM, lo que nos lleva a ver qué escogieron para representar los IVs.
Bien, si escogieron la primera opcion, representar los IVs en letras, se habrán fijado que sólo usamos la mitad de la imagen, es decir, 16 espacios.
Por el contrario, si escogieron la segunda opción, representar los IVs en números, se habrán fijado que usamos todos los 32 espacios disponibles.
Por el bien de este tutorial, vamos a discriminar las rutinas ASM de la siguiente manera:
Si usamos 16 espacios = rutina asm 16.
Si usamos 32 espacios = rutina asm 32.
Antes de continuar, en cualquiera de las siguientes rutinas es necesario hacer el siguiente cambio antes de compilar: casi al final de la rutina, remplazar las X de 0x08XXXXXX por el offset donde guardaste la imágen. En mi caso, 0x08EC4104
Ahora sí, compilamos la rutina que necesitamos.
Rutina asm 16
Rutina asm 32
"He instalado el menú de datos de pokémon estilo BW que he encontrado aquí"
No hay problema, gracias a Froosty de pokeco tenemos las rutinas listas:
Rutina asm BW 16
Rutina asm BW 32
Ahora, con ayuda de un editor hexadecimal, inserte la rutina ya compilada en un espacio libre de la ROM, específicamente en un offset alieado (terminado en 0, 4, 8 o C) y anota el offset donde lo pusiste.
Para este ejemplo yo la puse después de la imágen, en 0xEC490C
#PASO 4 Cambios en la ROM
Con ayuda de un editor hexadecimal, realiza los siguientes cambios en la ROM:
En el offset 0x137db8 poner:
00 49 08 47 YY YY YY YY
donde YY YY YY YY es el puntero a la rutina +1.
En mi caso puse la rutina en 0xEC490C +1 = 0xEC490D, mi puntero queda 0D 49 EC 08.
En el offset 0x137dac poner:
01 20 03 E0
Listo!
"¿cuál es la diferencia entre una rutina y la otra?"
A diferencia de la rutina que representa los IVs con 16 espacios, la de 32 no lleva la línea lsr; y en las rutinas para el menú pokémon estilo BW, son las coordenadas.
Si ya has terminado el tutorial y, si por alguna razón quieres probar un nuevo estilo que has obtenido o creado, mientras la imágen tenga las mismas dimensiones a 16 colores, la pueden insertar con NSE sobreescribiendo la imágen anterior usando el mismo offset, deseleccionando la casilla "Auto-abort if data is too big". Si la imágen corresponde al funcionamiento de la misma rutina, no habrá ningún problema. Por otro lado, si la imágen que insertaron necesita cambiar la rutina, deberás hacerlo; y si fué necesario poner la rutina en otro lugar, no olvides ir a 0x137dbc y cambiar el puntero a la nueva rutina.
Aclaración: las imágenes que subo aquí para representar los IVs, las he hecho desde cero basadas en las publicaciones originales. Dado el caso sean idénticas a las que alguien más ha hecho antes, por favor hacermelo saber para dar el respectivo crédito.
En esta ocasión les enseñaré cómo mostrar los IV en el menú de datos del pokémon para Rojo Fuego en español.
La ventaja contra el EV-IV Display Screen de jiangzhengwenjz (que espero pronto tenga el permiso para traerlo a la ROM española), es que podemos revisar rápidamente los IVs no sólo de nuestro equipo pokémon, sino de los pokémon guardados en la PC (revisando un viejo .SAV encontré en la PC unos agradables descubrimientos, y otros no tan buenos). La desventaja ovbiamente es que no podemos ver los EVs con este método.
Primero que todo, los créditos por las rutinas son para:
El creador original de la rutina: DoesntKnowHowToPlay
Fuente
Y a Froosty por ajustar la rutina al menu datos de pokémon estilo BW.
Fuente
Lo que nesitaremos:
Nameless Sprite Editor (NSE)
Un edito Hexadecimal (yo uso HxD)
Un compilador de rutinas ASM (thumb)
Una imágen bmp de 128x32 píxeles a 16 colores (les dejo unas aquí para que usen o modifiquen a gusto)
Una ROM Rojo Fuego en español BPRS
Character Maker Pro (opcional)
Primero veamos unos ejemplos de cómo podría verse:
#PASO 1
Ahora necesitan escoger una de las siguientes opciones para representar los IVs:
1: quiero ver los IVs en letras porque molan...
2: quiero ver los IVs en números porque son más exactos...
esto es importante, ya que depende de la elección usarán una rutina u otra. (en realidad es la misma rutina con una pequeña modificación)
Ya teniendo una idea de qué es lo que quieren, pueden usar las imágenes que les traigo (son basadas en las que encontré en los post originales), para que los personalicen si lo desean, con Character Maker Pro o su editor de imágenes preferido, asegurándose de que la paleta sea Colores 15-bits y se guarde como imágen BMP de 16 colores; o pueden usarlas tal cual las dejé.
Por si lo preguntan, el espacio que utiliza cada representación de IV es de 16x8 píxeles. El orden se pueden guiar de una imagen con numeritos.
Nota: La paleta que se usa son las mismas para los tipos, así que pueden jugar a cambiar el color de las letras o números como gusten pero preferiblemente no cambien la paleta a menos que sepan bien por qué lo hacen.
#PASO 2 insertar imagen
Ahora lo que haremos es insertar la imágen que elegimos en un espacio vacío de la ROM, se nesecitarán 2048 bytes de espacio (800 bytes en Hexadecimal). Para esto, en NSE cargamos nuestra ROM española, arrastramos el sprite al NSE (imágen de 128x32 píxeles a 16 colores) y procedemos a insertarla en la ROM poniendo un offset con espacio libre (pueden usar la lupa que les señalo con una flecha). Para este ejemplo usaré el offset 0xEC4104. No olviden anotar el offset que pusieron ya que lo necesitaremos para las rutinas.
#PASO 3 ASM
Llegados a este punto imagino que ya insertaron la imagen en la ROM, lo que nos lleva a ver qué escogieron para representar los IVs.
Bien, si escogieron la primera opcion, representar los IVs en letras, se habrán fijado que sólo usamos la mitad de la imagen, es decir, 16 espacios.
Por el contrario, si escogieron la segunda opción, representar los IVs en números, se habrán fijado que usamos todos los 32 espacios disponibles.
Por el bien de este tutorial, vamos a discriminar las rutinas ASM de la siguiente manera:
Si usamos 16 espacios = rutina asm 16.
Si usamos 32 espacios = rutina asm 32.
Antes de continuar, en cualquiera de las siguientes rutinas es necesario hacer el siguiente cambio antes de compilar: casi al final de la rutina, remplazar las X de 0x08XXXXXX por el offset donde guardaste la imágen. En mi caso, 0x08EC4104
Ahora sí, compilamos la rutina que necesitamos.
Rutina asm 16
Código:
cmp r0, #0x0
beq Abort
cmp r0, #0x3
bgt Abort
cmp r0, #0x1
bne StandardAbort
b Start
Abort:
ldr r1, .AbortAddr
bx r1
StandardAbort:
ldr r1, .StandardAbortAddr
bx r1
.align 2
.AbortAddr: .word 0x08137dc5
.StandardAbortAddr: .word 0x08137dc1
Start:
ldr r0, .ActiveMonPtr
ldr r1, .ActiveOffset
ldr r0, [r0, #0x0]
add r6, r0, r1
add sp, #-0x18
HPIV:
mov r0, r6
mov r1, #0x27
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x6
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
AtkIV:
mov r0, r6
mov r1, #0x28
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x17
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
DefIV:
mov r0, r6
mov r1, #0x29
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x24
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SAtkIV:
mov r0, r6
mov r1, #0x2B
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x31
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SDefIV:
mov r0, r6
mov r1, #0x2C
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x3E
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SpeedIV:
mov r0, r6
mov r1, #0x2A
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x4B
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
add sp, #0x18
b Abort
GraphicHandler:
ldr r4, .HandlerAddr
bx r4
Decrypter:
ldr r2, .DecrypterAddr
bx r2
.align 2
.GraphicAddr: .word 0x08XXXXXX
.HandlerAddr: .word 0x0800415d
.ActiveMonPtr: .word 0x0203b140
.ActiveOffset: .word 0x00003290
.MonIndex: .word 0x0203b16c
.DecrypterAddr: .word 0x0803fad5
Rutina asm 32
Código:
cmp r0, #0x0
beq Abort
cmp r0, #0x3
bgt Abort
cmp r0, #0x1
bne StandardAbort
b Start
Abort:
ldr r1, .AbortAddr
bx r1
StandardAbort:
ldr r1, .StandardAbortAddr
bx r1
.align 2
.AbortAddr: .word 0x08137dc5
.StandardAbortAddr: .word 0x08137dc1
Start:
ldr r0, .ActiveMonPtr
ldr r1, .ActiveOffset
ldr r0, [r0, #0x0]
add r6, r0, r1
add sp, #-0x18
HPIV:
mov r0, r6
mov r1, #0x27
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x6
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
AtkIV:
mov r0, r6
mov r1, #0x28
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x17
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
DefIV:
mov r0, r6
mov r1, #0x29
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x24
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SAtkIV:
mov r0, r6
mov r1, #0x2B
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x31
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SDefIV:
mov r0, r6
mov r1, #0x2C
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x3E
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SpeedIV:
mov r0, r6
mov r1, #0x2A
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0xC
str r2, [sp, #0x8]
mov r1, #0x4B
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
add sp, #0x18
b Abort
GraphicHandler:
ldr r4, .HandlerAddr
bx r4
Decrypter:
ldr r2, .DecrypterAddr
bx r2
.align 2
.GraphicAddr: .word 0x08XXXXXX
.HandlerAddr: .word 0x0800415d
.ActiveMonPtr: .word 0x0203b140
.ActiveOffset: .word 0x00003290
.MonIndex: .word 0x0203b16c
.DecrypterAddr: .word 0x0803fad5
"He instalado el menú de datos de pokémon estilo BW que he encontrado aquí"
No hay problema, gracias a Froosty de pokeco tenemos las rutinas listas:
Rutina asm BW 16
Código:
cmp r0, #0x0
beq Abort
cmp r0, #0x3
bgt Abort
cmp r0, #0x1
bne StandardAbort
b Start
Abort:
ldr r1, .AbortAddr
bx r1
StandardAbort:
ldr r1, .StandardAbortAddr
bx r1
.align 2
.AbortAddr: .word 0x08137dc5
.StandardAbortAddr: .word 0x08137dc1
Start:
ldr r0, .ActiveMonPtr
ldr r1, .ActiveOffset
ldr r0, [r0, #0x0]
add r6, r0, r1
add sp, #-0x18
HPIV:
mov r0, r6
mov r1, #0x27
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x2
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
AtkIV:
mov r0, r6
mov r1, #0x28
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x16
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
DefIV:
mov r0, r6
mov r1, #0x29
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x22
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SAtkIV:
mov r0, r6
mov r1, #0x2B
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x2E
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SDefIV:
mov r0, r6
mov r1, #0x2C
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x3A
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SpeedIV:
mov r0, r6
mov r1, #0x2A
bl Decrypter
mov r5, r0
lsr r5, r5, #0x1
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x46
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
add sp, #0x18
b Abort
GraphicHandler:
ldr r4, .HandlerAddr
bx r4
Decrypter:
ldr r2, .DecrypterAddr
bx r2
.align 2
.GraphicAddr: .word 0x08XXXXXX
.HandlerAddr: .word 0x0800415d
.ActiveMonPtr: .word 0x0203b140
.ActiveOffset: .word 0x00003290
.MonIndex: .word 0x0203b16c
.DecrypterAddr: .word 0x0803fad5
Rutina asm BW 32
Código:
cmp r0, #0x0
beq Abort
cmp r0, #0x3
bgt Abort
cmp r0, #0x1
bne StandardAbort
b Start
Abort:
ldr r1, .AbortAddr
bx r1
StandardAbort:
ldr r1, .StandardAbortAddr
bx r1
.align 2
.AbortAddr: .word 0x08137dc5
.StandardAbortAddr: .word 0x08137dc1
Start:
ldr r0, .ActiveMonPtr
ldr r1, .ActiveOffset
ldr r0, [r0, #0x0]
add r6, r0, r1
add sp, #-0x18
HPIV:
mov r0, r6
mov r1, #0x27
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x2
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
AtkIV:
mov r0, r6
mov r1, #0x28
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x16
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
DefIV:
mov r0, r6
mov r1, #0x29
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x22
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SAtkIV:
mov r0, r6
mov r1, #0x2B
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x2E
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SDefIV:
mov r0, r6
mov r1, #0x2C
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x3A
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
SpeedIV:
mov r0, r6
mov r1, #0x2A
bl Decrypter
mov r5, r0
mov r0, #0x40
mul r5, r0, r5
mov r1, #0x80
str r1, [sp, #0x0]
str r1, [sp, #0x4]
#x, y position
mov r2, #0x29
str r2, [sp, #0x8]
mov r1, #0x46
str r1, [sp, #0xc]
#x, y size
mov r2, #0x10
str r2, [sp, #0x10]
mov r1, #0x8
str r1, [sp, #0x14]
mov r0, #0x3
ldr r1, .GraphicAddr
add r1, r5
mov r2, #0x0
mov r3, #0x0
bl GraphicHandler
add sp, #0x18
b Abort
GraphicHandler:
ldr r4, .HandlerAddr
bx r4
Decrypter:
ldr r2, .DecrypterAddr
bx r2
.align 2
.GraphicAddr: .word 0x08XXXXXX
.HandlerAddr: .word 0x0800415d
.ActiveMonPtr: .word 0x0203b140
.ActiveOffset: .word 0x00003290
.MonIndex: .word 0x0203b16c
.DecrypterAddr: .word 0x0803fad5
Ahora, con ayuda de un editor hexadecimal, inserte la rutina ya compilada en un espacio libre de la ROM, específicamente en un offset alieado (terminado en 0, 4, 8 o C) y anota el offset donde lo pusiste.
Para este ejemplo yo la puse después de la imágen, en 0xEC490C
#PASO 4 Cambios en la ROM
Con ayuda de un editor hexadecimal, realiza los siguientes cambios en la ROM:
En el offset 0x137db8 poner:
00 49 08 47 YY YY YY YY
donde YY YY YY YY es el puntero a la rutina +1.
En mi caso puse la rutina en 0xEC490C +1 = 0xEC490D, mi puntero queda 0D 49 EC 08.
En el offset 0x137dac poner:
01 20 03 E0
Listo!
"¿cuál es la diferencia entre una rutina y la otra?"
A diferencia de la rutina que representa los IVs con 16 espacios, la de 32 no lleva la línea lsr; y en las rutinas para el menú pokémon estilo BW, son las coordenadas.
Si ya has terminado el tutorial y, si por alguna razón quieres probar un nuevo estilo que has obtenido o creado, mientras la imágen tenga las mismas dimensiones a 16 colores, la pueden insertar con NSE sobreescribiendo la imágen anterior usando el mismo offset, deseleccionando la casilla "Auto-abort if data is too big". Si la imágen corresponde al funcionamiento de la misma rutina, no habrá ningún problema. Por otro lado, si la imágen que insertaron necesita cambiar la rutina, deberás hacerlo; y si fué necesario poner la rutina en otro lugar, no olvides ir a 0x137dbc y cambiar el puntero a la nueva rutina.
Aclaración: las imágenes que subo aquí para representar los IVs, las he hecho desde cero basadas en las publicaciones originales. Dado el caso sean idénticas a las que alguien más ha hecho antes, por favor hacermelo saber para dar el respectivo crédito.
Última edición: