Registrarse

Scripts de gatillo y condición mayor a $FF: ¿Hemos vivido engañados todas nuestras vidas?

Estado
Cerrado para nuevas respuestas.

Fran Agustín

Si el sol besa tus ojos, ni cuenta te das.
Miembro insignia
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.

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:

Xabier2012

Usuario mítico
Muy buena esa. Muy buena.

edit: Realmente todo puede ser culpa de LU-HO, pero bueno, realmente yo no utilizo vars con valores muy altos.
 
Última edición:

Gold

Porrero a tiempo parcial
Miembro insignia
Creí que ya leía los dos bytes, ya que el documento sobre comandos de scripts de DavidJcobb menciona que, efectivamente, las variables almacenan 0xFFFF y las variables ocultas 0xFFFFFF. Gracias por el aporte.
 

Sayer301!

UnityLord!
Miembro de honor
Incredible, a estas alturas y descubriendo algo tan simple como eso, Franco sos un grande!

No es algo que me esperase para nada, y la verdad que me ha dejado a cuadros que nadie lo hubiese probado antes. definitivamente la tecnología inversa es demasiado complicada, pasaros todos a Unity!!
 

Cheve

MoonLover~
Miembro de honor
Jajaja! Rly nigga? Are you fukking kidding me? wadafack broh!
_____

Me cago en todo lo cagable! Tantos años viviendo una mentira!

¡Aportazo!
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Nunca es tarde para aprender nuevas cosas.

Tengo que aprender ASM si o si.

:D
 

~4n1ma~

Baneado
Nu maa :v are you fucking kidding me? xdxd
Eso no me lo esperaba xdxd

Aportazo! :v

PD:Te odio Corbitto :'v
 
Última edición:
Estado
Cerrado para nuevas respuestas.
Arriba