28001-R&FR|_ASM_|_Msgbox_Efecto_"pensamientos"_y_efecto_default
#20
Javi4315♪ 13374
Iniciado por eing
Sí, puedes cambiar la variable.
Para ello asigna un script así:

#org 0xoffset
setvar 0xvar 0x1234
end

Entonces una vez compilado y asignado a un mini, procedemos a hablar con él.
Tras hablar con él, vamos en el emulador a cheats -> search cheats for cheats.
Se nos abrirá una ventania y pon que sea busqueda igual, y en formato 16 bits. Busca el valor 1234.

Entonces te saldrá una direccion o varias.
(Si son varias comprueba cual es la de la var, haciendo cambios con el visual viewer)
Una vez encontrada, ya solo hemos de cambiar los siguientes bytes de nuestra rutina. (Los que están en negrita, cambiarlos por la direccion de nuestra var, y acordarse de que sea permutado el offset).

09 B4 0D 48 00 88 00 28 0A D0 0C 48 0C 4B 03 80 0D 48 5F 23 03 70 09 BC 0D 49 40 18 02 BC 08 47 06 48 08 4B 03 80 08 48 00 23 03 70 09 BC 07 49 40 18 02 BC 08 47 C0 46 C0 70 03 02 00 00 00 04 61 61 00 00 60 7F 00 00 12 00 00 04 EC 1D 47 08 10 3A 9F 08


Como siempre, Fire Red fastidiando con la ram. A partir de la variable 0x8000 son estáticas, pero las demás (0x3800 - 0x7FFF) son dinámica (es decir, se mueven continuamente de sitio. Así que ese método no funciona porque las localizarás para ese momento exacto, pero se moverán y las perderás de nuevo.

Le he hecho una rutina a Sayer para arreglarlo:

.align 2
.thumb

push {r0-r3,lr}
ldr r0, .pointer
ldrh r1, [r0,#0x2]
ldrh r2, [r0]
ldr r0, =0x4FFF
ldr r3, =0x3800
sub r0, r0, r3
ldr r3, =0x2
mul r0, r3
add r2, r2, r0
ldr r3, =0x10000
mul r1, r3
add r0, r1, r2
pop {r0-r3,pc}

.pointer: .word 0x03005008


Lo que hace es localizar la variable que pongas en la parte que está en negrita (recuerdo, desde la 0x3800 hasta la 0x7FFF) y guardarla en r0. De ese modo, si se integra en la rutina de Eing, puedes usar la variable que quieras:

.align 2
.thumb

init:
push {r0,r3}
ldr r0, .pointer
ldrh r1, [r0,#0x2]
ldrh r2, [r0]
ldr r0, =0x4FFF
ldr r3, =0x3800
sub r0, r0, r3
ldr r3, =0x2
mul r0, r3
add r2, r2, r0
ldr r3, =0x10000
mul r1, r3
add r0, r1, r2
b main

main:
ldrh r0, [r0,#0x0]
cmp r0, #0x0
beq normal
ldr r0,.dispcnt
ldrh r3, .dispcntv
strh r3,[r0]
ldr r0, .textbox_pos
mov r3, #0x5f
strb r3,[r0]
pop {r0,r3}
ldr r1, .black_box
add r0,r0,r1
pop {r1}
bx r1

normal:
ldr r0,.dispcnt
ldrh r3, .dispcntvn
strh r3,[r0]
ldr r0, .textbox_pos
mov r3, #0x0
strb r3,[r0]
pop {r0,r3}
ldr r1, .normal_msgbox
add r0,r0,r1
pop {r1}
bx r1


.align 2
.dispcnt: .word 0x04000000
.dispcntv: .word 0x00006161
.dispcntvn: .word 0x00007f60
.textbox_pos: .word 0x04000012
.normal_msgbox: .word 0x08471dec
.black_box: .word 0x089F3A10
.pointer: .word 0x03005008


Compilada quedaría así:

09 B4 19 48 41 88 02 88 18 48 19 4B C0 1A 02 23 58 43 12 18 17 4B 59 43 88 18 FF E7 00 88 00 28 0A D0 0B 48 0B 4B 03 80 0C 48 5F 23 03 70 09 BC 0C 49 40 18 02 BC 08 47 05 48 07 4B 03 80 07 48 00 23 03 70 09 BC 06 49 40 18 02 BC 08 47 C0 46 00 00 00 04 61 61 00 00 60 7F 00 00 12 00 00 04 EC 1D 47 08 10 3A 9F 08 08 50 00 03 FF 4F 00 00 00 38 00 00 00 00 01 00

Si se busca al final de la rutina, estará el "FF4F" que corresponde a la variable 0x4FFF permutada. Se puede cambiar por la variable que se quiera siempre que sea segura para evitar problemas (permutada, claro).