Saludos, gente.
Trasteando algunas cosas el otro día me encontré con algo muy interesante: veamos los campos que el A-Map nos muestra al seleccionar (en la pestaña "Eventos") un script de gatillo.
Var number: Ahí ponemos la variable que usaremos para el script.
Var value: Ahí va el valor que debe tener la variable anterior para que el script de gatillo se ejecute.
Como sabemos, una variable almacena 2 bytes. Es decir, cualquier valor entero entre 0 y 65535 (0xFFFF). Por lo tanto, es lógico que A-Map nos de cuatro lugares para llenar en el campo "Var value", ¿no?
Sin embargo, lo que LU-HO (creador de A-Map) al parecer ignoraba por completo es que el juego no lee los 2 bytes. ¿Por qué? No tengo idea, pero la verdad es que no lo hace.
¿Cómo lo sé?
Todo empezó cuando intentaba ejecutar un script de gatillo si y sólo si la variable $40FF tenía valor $FFFF. Sin embargo, a pesar de hacer todo correctamente, el script simplemente no sucedía nunca.
¿Y cómo sé que no es un simple error mío?
Para verificar mis sospechas busqué la rutina ASM que carga el byte y lo compara con el valor de la variable. Tras verla, me quedó claro que solamente leía 1 byte, ya que la instrucción era ldrb (b = byte) en lugar de ldrh (h = halfword = 2 bytes).
¿Entonces estamos condenados a usar como condición para los scripts de gatillo valores menores o iguales a $FF (255)?
Nop, claro que no. Como ya dije, para cargar 2 bytes deberíamos usar la instrucción ASM ldrh en lugar de ldrb. Entonces, podemos lograr que nuestro ROM cargue ambos valores haciendo algo tan simple como modificando 2 dígitos en un editor hexadecimal.
¿Cómo? ¡DÍMELO YA!
Abrimos nuestro ROM con un editor hexadecimal (por ejemplo, HxD) y nos vamos al offset que corresponda:
Fire Red: 0x06DDA6
Ruby: 0x068DA2
Emerald: 0x09D072
En tal offset deberíamos ver: "21 7A" (o bien "7A21", según cómo tengan configurado el editor).
Simplemente lo convertimos en un "21 89" (o bien "8921").
Y listo, ahora ya pueden usar valores mayores a $FF como condición para un script de gatillo.
¿Y qué carajo hice?
Hicimos el siguiente cambio:
Espero que esto le sirva a alguien. Un saludo
Trasteando algunas cosas el otro día me encontré con algo muy interesante: veamos los campos que el A-Map nos muestra al seleccionar (en la pestaña "Eventos") un script de gatillo.
Para el que no lo sepa, los scripts de gatillo son las casillas de fondo verde que vemos en A-Map y tienen una S encima. Las he rodeado con un cuadrado rojo
Var number: Ahí ponemos la variable que usaremos para el script.
Var value: Ahí va el valor que debe tener la variable anterior para que el script de gatillo se ejecute.
Como sabemos, una variable almacena 2 bytes. Es decir, cualquier valor entero entre 0 y 65535 (0xFFFF). Por lo tanto, es lógico que A-Map nos de cuatro lugares para llenar en el campo "Var value", ¿no?
Sin embargo, lo que LU-HO (creador de A-Map) al parecer ignoraba por completo es que el juego no lee los 2 bytes. ¿Por qué? No tengo idea, pero la verdad es que no lo hace.
¿Cómo lo sé?
Todo empezó cuando intentaba ejecutar un script de gatillo si y sólo si la variable $40FF tenía valor $FFFF. Sin embargo, a pesar de hacer todo correctamente, el script simplemente no sucedía nunca.
¿Y cómo sé que no es un simple error mío?
Para verificar mis sospechas busqué la rutina ASM que carga el byte y lo compara con el valor de la variable. Tras verla, me quedó claro que solamente leía 1 byte, ya que la instrucción era ldrb (b = byte) en lugar de ldrh (h = halfword = 2 bytes).
¿Entonces estamos condenados a usar como condición para los scripts de gatillo valores menores o iguales a $FF (255)?
Nop, claro que no. Como ya dije, para cargar 2 bytes deberíamos usar la instrucción ASM ldrh en lugar de ldrb. Entonces, podemos lograr que nuestro ROM cargue ambos valores haciendo algo tan simple como modificando 2 dígitos en un editor hexadecimal.
¿Cómo? ¡DÍMELO YA!
Abrimos nuestro ROM con un editor hexadecimal (por ejemplo, HxD) y nos vamos al offset que corresponda:
Fire Red: 0x06DDA6
Ruby: 0x068DA2
Emerald: 0x09D072
En tal offset deberíamos ver: "21 7A" (o bien "7A21", según cómo tengan configurado el editor).
Simplemente lo convertimos en un "21 89" (o bien "8921").
Y listo, ahora ya pueden usar valores mayores a $FF como condición para un script de gatillo.
¿Y qué carajo hice?
Hicimos el siguiente cambio:
"ldrb r1, [r4, #8]" => "ldrh r1, [r4, #8]"
Espero que esto le sirva a alguien. Un saludo
Última edición: