14802-Números_aleatórios_\[FR]
#1
Sonicarvalho 17082
Rutina: FireRed
0806A5DC
0806A5DC @ =============== S U B R O U T I N E =======================================
0806A5DC
0806A5DC
0806A5DC s8F_get_random_val: @ DATA XREF: ROM:0815FBF0o
0806A5DC PUSH {R4,R5,LR}
0806A5DE BL script_read_halfword
0806A5E2 LSLS R0, R0, #0x10
0806A5E4 LSRS R0, R0, #0x10
0806A5E6 BL var_load
0806A5EA MOVS R4, R0
0806A5EC LSLS R4, R4, #0x10
0806A5EE LSRS R4, R4, #0x10
0806A5F0 LDR R5, =var_800D
0806A5F2 BL rand
0806A5F6 LSLS R0, R0, #0x10
0806A5F8 LSRS R0, R0, #0x10
0806A5FA MOVS R1, R4
0806A5FC BL modulo
0806A600 STRH R0, [R5]
0806A602 MOVS R0, #0
0806A604 POP {R4,R5}
0806A606 POP {R1}
0806A608 BX R1
0806A608 @ End of function s8F_get_random_val
0806A608

Bien, pienso que no necesito explicarte mucho, cierto?

El comando empieza grabando el valor especificado por el scripter en R1.
Después, utilizando el PRNG del juego, graba un valor cualquier (aleatorio) en R0, lo cual después utiliza para hacer un MODULO (porque como sabes, el valor del PNRG es un valor de 16bit (2 bytes).

Osea, sí, funciona así. El argumento puede ser un numero normal (hasta 0x3FFF) o una variable (0x4000->...)

Saludos, alguna duda pregunta!