# Xenoblade Chronicles 3 2.2.0/2.2.1 # BID: 82D187FE9EF9BE92 unsafeCheck: false MASTER_WRITE: # Redirect DR frametime target reading to .bss code cave [MAIN, 0x236AB00] - type: asm_a64 main_offset: 0x124F518 instructions: [ [adrp, x8, 0x236a000], [ldr, s0, [x8, 0xb00]] ] # Original DR frametime target - type: bytes main_offset: 0x236AB00 value_type: float value: - 0.0166666666 # Fix crash when gathering big amount of ether for > 30 FPS - # Code cave at 0x1295DA0 type: asm_a64 main_offset: 0x67360 instructions: [ [bl, 0x1295da0] ] - # Push fixed 1/30 float to game speed pointer late enough to not affect it type: asm_a64 main_offset: 0x1295DA0 instructions: [ [ldr, x21, [x0]], [fmov, s1, 1.0], [fmov, s2, 30.0], [fdiv, s1, s1, s2], [str, s1, [x21, 0x214]], [ret] ] ALL_FPS: # vsync - type: evaluate_write address: [MAIN, 0x1B42DB0] value_type: int32 value: [VSYNC_TARGET, VSYNC_TARGET] # DR Timing (relative to vsync) - type: evaluate_write address: [MAIN, 0x236AB00] value_type: float value: "((1 / FPS_TARGET) / VSYNC_TARGET) * 0.78" # UI speed - type: evaluate_write address: [MAIN, 0x1BA1A90, 128] value_type: float value: "1 / FPS_TARGET" - type: compare compare_address: [MAIN, 0x1BA1A98] compare_type: "!=" compare_value_type: int8 compare_value: 0 address: [MAIN, 0x1B42DB0] value_type: int32 value: [2, 2] - type: evaluate_compare compare_address: [MAIN, 0x1BA1A98] compare_type: "!=" compare_value_type: int8 compare_value: 0 address: [MAIN, 0x236AB00] value_type: float value: "((1 / 30) / 2) * 0.78" - type: evaluate_compare compare_address: [MAIN, 0x1BA1A98] compare_type: "!=" compare_value_type: int8 compare_value: 0 address: [MAIN, 0x1BA1A90, 128] value_type: float value: "1 / 30" - type: compare compare_address: [MAIN, 0x1BA1A98] compare_type: "!=" compare_value_type: int8 compare_value: 0 address: [MAIN] value_type: refresh_rate value: 30