mirror of
https://github.com/Ultra-NX/UltraNX.git
synced 2026-04-11 20:53:19 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1680930c2 | ||
|
|
c22f86a4fd | ||
|
|
f2b154837e | ||
|
|
8d1b443f87 | ||
|
|
6e1a0aaa55 | ||
|
|
5ed824306d |
16
README.md
16
README.md
@ -8,7 +8,7 @@
|
||||
|
||||
### Ultra - это функциональная кастомная прошивка для Nintendo Switch, с упором в разгон и улучшенный пользовательский опыт.
|
||||
|
||||
### [UltraNX 2.7|R3](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R3) Поддерживает все HOS до 21.2.0 включительно (21.2.0 в Safe Mode)
|
||||
### [UltraNX 2.8|RC2](https://github.com/Ultra-NX/UltraNX/releases/tag/2.8-RC1) Поддерживает все HOS до 22.1.0 включительно (22.1.0 в Safe Mode)
|
||||
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@
|
||||
* [Status Monitor](https://github.com/ppkantorski/Status-Monitor-Overlay) - Форк Status Monitor от kantorski.
|
||||
* [Tetris](https://github.com/ppkantorski/Tetris-Overlay) - Та самая игра в виде оверлея. Работает только на последних версиях Ultrahand.
|
||||
* [MasterVolume](https://github.com/averne/MasterVolume) - Регулировка глобальной громкости, позволяет поднять громкость выше максимума. Использовать аккуратно!
|
||||
* [NX-FanControl](https://github.com/Insektaure/NX-FanControl) - Модуль для ручной регулировки оборотов кулера. Изменения применяются сразу, модуль смотрит на температуру SOC а не Skin, как Атмосфера.
|
||||
* [NX-FanControl](https://github.com/Insektaure/NX-FanControl) + [NX-FanControl Overlay Fork](https://github.com/ppkantorski/NX-FanControl) - Модуль для ручной регулировки оборотов кулера. Изменения применяются сразу, модуль смотрит на температуру SOC а не Skin, как Атмосфера.
|
||||
* [BT Audio](https://github.com/masagrator/BT_Audio-ovl) - Оверлей, позволяющий быстро отключаться\подключаться к bluetooth-гарнитуре.
|
||||
* [Fizeau](https://github.com/averne/Fizeau) - Модуль для изменения цветового профиля экрана.
|
||||
* [sys-tune](https://github.com/HookedBehemoth/sys-tune) - Оверлей-музыкальный плеер, работает в фоне.
|
||||
@ -124,13 +124,13 @@
|
||||
```
|
||||
СБП (Т-Банк): +79168089980
|
||||
|
||||
Альфа : 2200152336577997
|
||||
Т-Банк : 2200700170486970
|
||||
Сбер : 2202200513345833
|
||||
Альфа: 2200152336577997
|
||||
Т-Банк: 2200700170486970
|
||||
Сбер: 2202200513345833
|
||||
|
||||
TON: UQA9My51bkGZHbYhbdRZfp6B60N7VJfsnKl0sakgw9YhAPct
|
||||
BTC: 18K6NN8NEavvMJL5Do3VTyJbL8NeZPHo93
|
||||
USDT TRC20: TUZ5szAmRsnvBuC4rFB8RaAoCbN6Ucy4sL
|
||||
TON: UQC9p9jHJHLVnm4uXJDoH4GQ76golzgKnG-bEExO2QsotCV5
|
||||
BTC: bc1q407f2fv3nsdy86y6njfx8updhxfmuwx49erhal
|
||||
USDT TRC20: TUZ5szAmRsnvBuC4rFB8RaAoCbN6Ucy4sL
|
||||
```
|
||||
|
||||
### Т-Банк QR
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
#
|
||||
### Ultra is a functional custom firmware for Nintendo Switch, with a focus on overclocking and an improved user experience.
|
||||
|
||||
### [UltraNX 2.7|R3](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R3) Supports all HOS up to and including 21.2.0 (21.2.0 in Safe Mode)
|
||||
### [UltraNX 2.8|RC2](https://github.com/Ultra-NX/UltraNX/releases/tag/2.8-RC1) Supports all HOS up to and including 22.1.0 (22.1.0 in Safe Mode)
|
||||
|
||||
|
||||
|
||||
@ -78,7 +78,7 @@
|
||||
* [Status Monitor](https://github.com/ppkantorski/Status-Monitor-Overlay) - Status Monitor fork from kantorski.
|
||||
* [Tetris](https://github.com/ppkantorski/Tetris-Overlay/) - "That" game in the form of an overlay. Works only on the latest versions of Ultrahand.
|
||||
* [MasterVolume](https://github.com/averne/MasterVolume) - Global volume control, allows you to raise the volume above the maximum. Use with care!
|
||||
* [NX-FanControl](https://github.com/Insektaure/NX-FanControl) - Module for manually adjusting the speed of the cooler. The changes are applied immediately, the module works from SOC temperature and not Skin temperature like Atmosphere.
|
||||
* [NX-FanControl](https://github.com/Insektaure/NX-FanControl) + [NX-FanControl Overlay Fork](https://github.com/ppkantorski/NX-FanControl) - Module for manually adjusting the speed of the cooler. The changes are applied immediately, the module works from SOC temperature and not Skin temperature like Atmosphere.
|
||||
* [BT Audio](https://github.com/masagrator/BT_Audio-ovl) - An overlay that allows you to quickly disconnect\connect to a bluetooth headset.
|
||||
* [Fizeau](https://github.com/averne/Fizeau) - Module for changing the screen color profile.
|
||||
* [sys-tune](https://github.com/HookedBehemoth/sys-tune) - Overlay music player, works in background.
|
||||
@ -116,7 +116,7 @@ Listed below are the licenses of those programs that have been modified specific
|
||||
If you like the project and you have a desire to support me with a penny - I will be very grateful.
|
||||
I have no other income at the moment, so any monetary help is very valuable to me.
|
||||
```
|
||||
TON: UQA9My51bkGZHbYhbdRZfp6B60N7VJfsnKl0sakgw9YhAPct
|
||||
BTC: 18K6NN8NEavvMJL5Do3VTyJbL8NeZPHo93
|
||||
USDT TRC20: TUZ5szAmRsnvBuC4rFB8RaAoCbN6Ucy4sL
|
||||
TON: UQC9p9jHJHLVnm4uXJDoH4GQ76golzgKnG-bEExO2QsotCV5
|
||||
BTC: bc1q407f2fv3nsdy86y6njfx8updhxfmuwx49erhal
|
||||
USDT TRC20: TUZ5szAmRsnvBuC4rFB8RaAoCbN6Ucy4sL
|
||||
```
|
||||
@ -0,0 +1,36 @@
|
||||
# レッド・デッド・リデンプション 1.0.6-1.0.7
|
||||
# BID: 005CB235608DCEDD
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_target
|
||||
value_type: float
|
||||
default_value: 31.415926
|
||||
evaluate: "0.94247778 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: code
|
||||
name: getDrTarget
|
||||
instructions: [
|
||||
[adrp, x20, $dr_frametime_target],
|
||||
[ldr, s2, [x20, $dr_frametime_target]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# REF: 22 BC 22 1E 21 93 45 BD
|
||||
# sagRenderer::UpdateDynamicResolutionScaling()
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x139521C
|
||||
instructions: [
|
||||
[bl, _getDrTarget()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# rage::grcDevice::sm_FrameLock
|
||||
# I guess just in case?
|
||||
## REF: 6A 19 01 B9 EA 17 9F 1A, ADRP X21 + STR below it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x20DAA20]
|
||||
value_type: uint32
|
||||
value: VSYNC_TARGET
|
||||
@ -0,0 +1,26 @@
|
||||
# Fuga: Melodies of Steel 1.1.8
|
||||
# BID: 55C51FEEAA71E42D
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x67285B8, 0x7B8]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x5F60428, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x6728E88, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,75 @@
|
||||
# 無双アビス 1.8.0
|
||||
# BID: 7FB0CED6B8B51B80
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 50
|
||||
evaluate: "1.5 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 40
|
||||
evaluate: "1.2 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# REF: 09 49 A8 52 21 01 27 1E 00 20 21 1E
|
||||
# Use FPS Target instead of vsync value for Dynamic Resolution max delta
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEAC0
|
||||
instructions: [
|
||||
[adrp, x1, 0x1272000],
|
||||
[ldr, s1, [x1, 0xE30]]
|
||||
]
|
||||
# Redirect DR Targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEB64
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target1],
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEB74
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# REF: 00 00 F0 42 78 00 00 00 00 00 F0 42 04 00 00 00
|
||||
# FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E3C]
|
||||
value_type: uint32
|
||||
value: "120 / FPS_LOCK_TARGET"
|
||||
# Prevent from setting it as 0, otherwise game crashes
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0x1272E3C]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint32
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x1272E3C]
|
||||
value_type: uint32
|
||||
value: 1
|
||||
# Others
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E30]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E34]
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E38]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
@ -0,0 +1,75 @@
|
||||
# 無双アビス 1.7.0
|
||||
# BID: E09BC148192342B1
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 50
|
||||
evaluate: "1.5 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 40
|
||||
evaluate: "1.2 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# REF: 09 49 A8 52 21 01 27 1E 00 20 21 1E
|
||||
# Use FPS Target instead of vsync value for Dynamic Resolution max delta
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBDC0
|
||||
instructions: [
|
||||
[adrp, x1, 0x126D000],
|
||||
[ldr, s1, [x1, 0xE30]]
|
||||
]
|
||||
# Redirect DR Targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBE64
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target1],
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBE74
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# REF: 00 00 F0 42 78 00 00 00 00 00 F0 42 04 00 00 00
|
||||
# FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE3C]
|
||||
value_type: uint32
|
||||
value: "120 / FPS_LOCK_TARGET"
|
||||
# Prevent from setting it as 0, otherwise game crashes
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0x126DE3C]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint32
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x126DE3C]
|
||||
value_type: uint32
|
||||
value: 1
|
||||
# Others
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE30]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE34]
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE38]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
@ -0,0 +1,25 @@
|
||||
# Remorse: The List 1.2
|
||||
# BID: 8019D7D61A81AF2B
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x6D09F48, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x6D378D8, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x653B7D8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,23 @@
|
||||
# Tales of Berseria Remastered `US` 1.0.4
|
||||
# BID: 290D5939C6671566
|
||||
# Known issue: Using barrier devices may not be triggering animation for any other FPS targets than 30, 50, 60, 100, 120.
|
||||
# Known issue: Opening gate may not happen if you use any other FPS than 30, 60 or 120.
|
||||
# Solution: when animation doesn't want to progress, change FPS Target to 30, 60 or 120.
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
## REF: 08 69 69 b8 69 ea 41 b9 28 01 08 0b, second result
|
||||
## Look to which address points ldr w8,[x8, x9, LSL #0x0], this is the interval speed. Substract 4 from offset to get vsync interval and our offset we need to put.
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x44D07A6C]
|
||||
value_type: uint32
|
||||
value: [0, 1]
|
||||
# Speed Factor
|
||||
## REF: 00 01 3f d6 00 00 22 1e 28 11 91 52 08 91 a7 72
|
||||
## Find first BLR X8 above search result (ignore BLR X8 in result), then find LDR X8, [X23, #offset]. X23 + offset is our address
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x44A926C0, -4]
|
||||
value_type: float
|
||||
value: "60 / FPS_TARGET"
|
||||
@ -0,0 +1,20 @@
|
||||
# Tales of Berseria Remastered `US` 1.0.2
|
||||
# BID: F4DB705AA11D45F3
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
## REF: 08 01 40 f9 08 01 09 8b
|
||||
## X8 from ADD X8, X8, X9, this is the address of vsync interval. 0x4 is interval speed
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x44D039BC]
|
||||
value_type: uint32
|
||||
value: [0, 1]
|
||||
# Speed Factor
|
||||
## REF: 00 01 3f d6 00 00 22 1e 28 11 91 52 08 91 a7 72
|
||||
## Find first BLR X8 above search result (ignore BLR X8 in result), then find LDR X8, [X23, #offset]. X23 + offset is our address
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x44a8e680, -4]
|
||||
value_type: float
|
||||
value: "60 / FPS_TARGET"
|
||||
@ -0,0 +1,11 @@
|
||||
# Tomb Raider: Definitive Edition 1.0.2
|
||||
# BID: AD288DAF31DEEDFD
|
||||
|
||||
ALL_FPS:
|
||||
# Dynamic Resolution Frametime Target
|
||||
# REF: Search for function that has 4A 1C 80 D2 2A 1C C0 F2, then search instruction with 0x42055555 in that function, it should be written to 2 addresses inside main. Ignore closer address.
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1C32A58]
|
||||
value_type: float
|
||||
value: FRAMETIME_TARGET
|
||||
@ -0,0 +1,11 @@
|
||||
# Tomb Raider: Definitive Edition 1.0.3
|
||||
# BID: F5C3661E4631499D
|
||||
|
||||
ALL_FPS:
|
||||
# Dynamic Resolution Frametime Target
|
||||
# REF: Search for function that has 4A 1C 80 D2 2A 1C C0 F2, then search instruction with 0x42055555 in that function, it should be written to 2 addresses inside main. Ignore closer address.
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1C314D8]
|
||||
value_type: float
|
||||
value: FRAMETIME_TARGET
|
||||
@ -1,23 +1,23 @@
|
||||
# SWORD ART ONLINE Fractured Daydream EUR 1.5.2.0
|
||||
# BID: 2EEE840599DC7021
|
||||
# Wildkeepers Rising 1.01
|
||||
# BID: D91CFC777B9A6E94
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8676768, 0]
|
||||
address: [MAIN, 0x8098330, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86B12E0, 0]
|
||||
address: [MAIN, 0x80D9808, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EB0F88, 0]
|
||||
address: [MAIN, 0x70C3290, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
@ -0,0 +1,25 @@
|
||||
# ソードアート・オンライン フラクチュアード デイドリーム 1.6.0.0
|
||||
# BID: 1A6C27F8DCFE45CB
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86BE728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86F92D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EF8F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# ソードアート・オンライン フラクチュアード デイドリーム 1.6.1.0
|
||||
# BID: 99252F8F7EE61A81
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86AD728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86E82D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EE7F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,16 @@
|
||||
# Phantom Brave: The Lost Hero 1.24
|
||||
# BID: 5CBE310E8D25E740
|
||||
|
||||
ALL_FPS:
|
||||
# Adjust DR FPS target
|
||||
## REF: Nmpl::Core::CSingleton<Nmpl::Gra::CGraMgr>::s_singleton + 0x0, this gives us an address to first function of Nmpl::Gra::CGraMgr vtable in NmplDLL.nro that we need to edit
|
||||
## Then we search in that NRO Nmpl::Core::System::CPerformCnt::frameRate_ and substract them to get final offset
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0xE67160, 0, -0x75A5C0]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint64
|
||||
compare_value: 0x3442AB8D51FBBA4D # BID of NRO
|
||||
address: [MAIN, 0xE67160, 0, 0xE4FCC]
|
||||
value_type: int32
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,10 @@
|
||||
# DreadOut Remastered Collection 1.0.3
|
||||
# BID: 1C0DA03A066F5B51
|
||||
|
||||
ALL_FPS:
|
||||
# REF: DynamicResolution::.cctor
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3EAE640, 0, 0xB8, 8]
|
||||
value_type: double
|
||||
value: [FPS_TARGET, FRAMETIME_TARGET]
|
||||
@ -0,0 +1,12 @@
|
||||
# Atelier Resleriana: The Red Alchemist & the White Guardian 1.4b
|
||||
# BID: 5E6F9D0C5161586B
|
||||
|
||||
ALL_FPS:
|
||||
# MagicaCloth2.MagicaManager_TypeInfo
|
||||
## REF: 00 10 2e 1e 01 e4 00 2f 00 21 20 1e, first result, second ADRP+ADD in function
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7791FE8, 0xB8, 0, 0x10, 0x20, 0x10]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET + 5"
|
||||
@ -0,0 +1,11 @@
|
||||
# Atelier Resleriana: The Red Alchemist & the White Guardian 1.4a
|
||||
# BID: B87B6963DF4DA555
|
||||
|
||||
ALL_FPS:
|
||||
# MagicaCloth2.MagicaManager_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x778FFD0, 0xB8, 0, 0x10, 0x20, 0x10]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET + 5"
|
||||
@ -0,0 +1,19 @@
|
||||
# 옥토패스 트래블러 0 1.0.4
|
||||
# BID: C7C4E3FE091EB9A0
|
||||
|
||||
ALL_FPS:
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x6C516E8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7C738E0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# Conarium 1.0.47
|
||||
# BID: 61BE54905F0EC450
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5F412A0, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5F6BDC8, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x57A37E8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지8 REMAKE 1.1.2
|
||||
# BID: B69833AF0E07CE82
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1F906DC
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x88B380
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지8 REMAKE 1.1.0
|
||||
# BID: C7C39A0A301587DB
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1F906DC
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x88B380
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지8 REMAKE 1.1.1
|
||||
# BID: FC3A9F0C03C5A198
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1F906DC
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x88B380
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지 8 리메이크 with 파워업키트 1.1.1
|
||||
# BID: 7A45096D29701241
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x234A3EC
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xACE970
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지 8 리메이크 with 파워업키트 1.1.0
|
||||
# BID: A5B280E0651240A8
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x234AE0C
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xACEFC0
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,58 @@
|
||||
# 삼국지 8 리메이크 with 파워업키트 1.1.2
|
||||
# BID: B8722FBDFD482D37
|
||||
# Cursor speed is tied to framerate
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: game_speed2
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: code
|
||||
name: fpsLock
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock, REF: A8 EA 00 B9 08 00 40 B9, LDR W8, [X0]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x234C19C
|
||||
instructions: [
|
||||
[bl, _fpsLock()]
|
||||
]
|
||||
# Redirect game speed, REF: 08 31 9F 9A 20 79 68 BC 68 6E 41 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xACFD80
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,17 @@
|
||||
# Bendy and the Dark Revival 1.6.4s
|
||||
# BID: E917F319E4233FCD
|
||||
|
||||
ALL_FPS:
|
||||
# PSH.DynamicResolution.DynamicResolutionController_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3970680, 0xB8, 0]
|
||||
address_unsafe: true
|
||||
value_type: double
|
||||
value: [FPS_TARGET, FRAMETIME_TARGET]
|
||||
# UnityEngine.Time::fixedDeltaTime
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3D43700, 0x48]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
@ -0,0 +1,34 @@
|
||||
# 超次元游汐 戰機少女 Sisters vs Sisters 1.0.0
|
||||
# BID: 3514446FD50DCF95
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 33.33
|
||||
evaluate: "TruncDec(FRAMETIME_TARGET, 2)"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 28.57
|
||||
evaluate: "TruncDec(1000 / (FPS_TARGET + 5), 2)"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR timing range
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x3DC5770
|
||||
instructions: [
|
||||
[adrp, x8, $dr_target1],
|
||||
[ldr, s1, [x8, $dr_target1]],
|
||||
[nop]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x3DC57DC
|
||||
instructions: [
|
||||
[adrp, x8, $dr_target2],
|
||||
[ldr, s1, [x8, $dr_target2]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,25 @@
|
||||
# Rune Factory: Guardians of Azuma US 1.1.3
|
||||
# BID: 02F0B93D14038350
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8F63D40, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8F9D470, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7F7C6E8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,10 @@
|
||||
# Little Orpheus 1.0.2
|
||||
# BID: 1D5A1DA51CA68238
|
||||
|
||||
ALL_FPS:
|
||||
# REF: Search with Edizon double 33, at offset -8 it should be float 0.6
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3A8BD30, 0x2F0, 0x500]
|
||||
value_type: double
|
||||
value: "FRAMETIME_TARGET - (1/3)"
|
||||
@ -1,4 +1,4 @@
|
||||
# Divinity Original Sin 2 1.0.10-1.0.11
|
||||
# Divinity Original Sin 2 1.0.10-1.0.12
|
||||
# BID: 4979B200D53BB282
|
||||
# Game is using double buffer, buffers are not allocated in loop.
|
||||
# So it's not possible to get stable FPS lock between 30 and 60 without changing refresh rate.
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
# Expeditions: A Mudrunner Game 1.20.0.0-1.21.0.0
|
||||
# BID: 4012D8204AD172B4
|
||||
# REF: 01 04 0C 5E 00 10 2E 1E
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1784FA0
|
||||
instructions: [
|
||||
[adrp, x13, $dr_target],
|
||||
[ldr, s2, [x13, $dr_target]]
|
||||
]
|
||||
@ -0,0 +1,20 @@
|
||||
# Expeditions: A Mudrunner Game 1.22.0.0
|
||||
# BID: 53FE298D76C0E507
|
||||
# REF: 01 04 0C 5E 00 10 2E 1E
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1789100
|
||||
instructions: [
|
||||
[adrp, x13, $dr_target],
|
||||
[ldr, s2, [x13, $dr_target]]
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
# Expeditions: A Mudrunner Game 1.23.0.0
|
||||
# BID: 9B1B0DA68BEAA765
|
||||
# REF: 01 04 0C 5E 00 10 2E 1E
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1789470
|
||||
instructions: [
|
||||
[adrp, x13, $dr_target],
|
||||
[ldr, s2, [x13, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,25 @@
|
||||
# Ragtag Adventurers 1.1.5.6
|
||||
# BID: D560C3C55CD23811
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5B7C530, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1) - 0.1", "TruncDec(FRAMETIME_TARGET, 1) - 0.1"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5BA1098, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x533B880, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,31 @@
|
||||
# DRAGON BALL: Sparking! ZERO 2.0.75
|
||||
# BID: DBE58459690BA338
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9A6DA20, 0x9C4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
# bAllowMultiThreadedAnimationUpdate |= 4
|
||||
# bOptimizeAnimBlueprintMemberVariableAccess |= 2
|
||||
# bCanBlueprintsTickByDefault |= 1
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9A6EFF0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9277B68, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# Rune Factory: Guardians of Azuma 1.1.3
|
||||
# BID: 02F0B93D14038350
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8F63D40, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8F9D470, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7F7C6E8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,74 @@
|
||||
# 테일즈 오브 엑실리아 리마스터 1.0.3
|
||||
# BID: 7220F3213BED164A
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: patch_running
|
||||
value_type: uint8
|
||||
default_value: 0
|
||||
-
|
||||
type: code
|
||||
name: applyCustomSpeed
|
||||
instructions: [
|
||||
[adrp, x4, $patch_running],
|
||||
[ldrb, w4, [x4, $patch_running]],
|
||||
[cbnz, w4, :goto1],
|
||||
[stp, s0, s1, [x8, 0x6C]],
|
||||
:goto1, [ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Block updating game speed
|
||||
## REF: 00 85 0d 2d
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2450394
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x28F5CAC
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2B30B44
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Game Speed
|
||||
## REF: Global_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x82DF380, 0xB8, 0x6C]
|
||||
value_type: float
|
||||
value: [FPS_TARGET, "60 / FPS_TARGET"]
|
||||
# Just in case, dunno if they are used for anything, but all of them were set to target strictly 30 FPS
|
||||
# UnityEngine.Time::maximumDeltaTime
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9FE9DB8, 0x100]
|
||||
value_type: float
|
||||
value: [0.066666666, 0.066666666]
|
||||
# UnityEngine.Time::fixedDeltaTime
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9FE9DB8, 0x48]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
# UnityEngine.Application::targetFrameRate
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x84FC2F0]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: compare
|
||||
compare_address: [VARIABLE, patch_running]
|
||||
compare_type: "=="
|
||||
compare_value: 0
|
||||
address: [VARIABLE, patch_running]
|
||||
value: 1
|
||||
@ -0,0 +1,19 @@
|
||||
# VARLET `Asia` 1.0.1
|
||||
# BID: 23E535E2967725BD
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9019488, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7FFAEE8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,19 @@
|
||||
# VARLET `Asia` 1.1.0
|
||||
# BID: 56CB246F5724B3CC
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x901B488, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7FFCEE8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,26 @@
|
||||
# Fuga: Melodies of Steel 2 1.5.2
|
||||
# BID: 2C45FAC26500CBAD
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7315498, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x6B1AF58, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7315DB8, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,23 @@
|
||||
# 테일즈 오브 베르세리아 리마스터 / 緋夜傳奇 Remastered 1.0.4
|
||||
# BID: 290D5939C6671566
|
||||
# Known issue: Using barrier devices may not be triggering animation for any other FPS targets than 30, 50, 60, 100, 120.
|
||||
# Known issue: Opening gate may not happen if you use any other FPS than 30, 60 or 120.
|
||||
# Solution: when animation doesn't want to progress, change FPS Target to 30, 60 or 120.
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
## REF: 08 69 69 b8 69 ea 41 b9 28 01 08 0b, second result
|
||||
## Look to which address points ldr w8,[x8, x9, LSL #0x0], this is the interval speed. Substract 4 from offset to get vsync interval and our offset we need to put.
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x44D07A6C]
|
||||
value_type: uint32
|
||||
value: [0, 1]
|
||||
# Speed Factor
|
||||
## REF: 00 01 3f d6 00 00 22 1e 28 11 91 52 08 91 a7 72
|
||||
## Find first BLR X8 above search result (ignore BLR X8 in result), then find LDR X8, [X23, #offset]. X23 + offset is our address
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x44A926C0, -4]
|
||||
value_type: float
|
||||
value: "60 / FPS_TARGET"
|
||||
@ -0,0 +1,20 @@
|
||||
# 테일즈 오브 베르세리아 리마스터 / 緋夜傳奇 Remastered 1.0.2
|
||||
# BID: F4DB705AA11D45F3
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
## REF: 08 01 40 f9 08 01 09 8b
|
||||
## X8 from ADD X8, X8, X9, this is the address of vsync interval. 0x4 is interval speed
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x44D039BC]
|
||||
value_type: uint32
|
||||
value: [0, 1]
|
||||
# Speed Factor
|
||||
## REF: 00 01 3f d6 00 00 22 1e 28 11 91 52 08 91 a7 72
|
||||
## Find first BLR X8 above search result (ignore BLR X8 in result), then find LDR X8, [X23, #offset]. X23 + offset is our address
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x44a8e680, -4]
|
||||
value_type: float
|
||||
value: "60 / FPS_TARGET"
|
||||
@ -0,0 +1,71 @@
|
||||
# DOOM `West` 1.4.1
|
||||
# BID: C638A0730217792B
|
||||
|
||||
ALL_FPS:
|
||||
# rs_460Threshold (default is 0.285)
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x593E52C]
|
||||
value_type: float
|
||||
value: 1
|
||||
# rs_raiseMilliseconds
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x593E9EC]
|
||||
value_type: float
|
||||
value: "0.966 * FRAMETIME_TARGET"
|
||||
# rs_dropMilliseconds
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x593E954]
|
||||
value_type: float
|
||||
value: "0.99 * FRAMETIME_TARGET"
|
||||
# com_adaptiveTickMaxHz (default is 30)
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x66B3F50]
|
||||
value_type: int32
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x66B3F54]
|
||||
value_type: float
|
||||
value: FPS_TARGET
|
||||
# com_adaptiveTickMinHz (default is 30)
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x66B3EB8]
|
||||
value_type: uint32
|
||||
value: 15
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x66B3EBC]
|
||||
value_type: float
|
||||
value: 15
|
||||
# With some update devs broke some cutscenes, they apply fixed speed for them. Removing this fixed speed causes myriads of weird issues, that's why I'm locking those cutscenes to 30 FPS.
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x7377D64]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint8
|
||||
compare_value: 0
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x7377D64]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint8
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x593E9EC]
|
||||
value_type: float
|
||||
value: 32.2
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x7377D64]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint8
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x593E954]
|
||||
value_type: float
|
||||
value: 33
|
||||
@ -0,0 +1,37 @@
|
||||
# 모두의 골프 월드 / 全民高爾夫 環球之旅 1.1.7
|
||||
# BID: 7B51DC4B113F4F52
|
||||
# Changed frametime target value math formula because default one sucks at 60 FPS target
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_max
|
||||
value_type: double
|
||||
default_value: 40
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_min
|
||||
value_type: double
|
||||
default_value: 33.3333333333
|
||||
evaluate: "(0.9 * FRAMETIME_TARGET) - 6"
|
||||
MASTER_WRITE:
|
||||
# REF: 0a 00 a4 d2 8a 08 e8 f2 41 01 67 9e
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x39E4938
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_max],
|
||||
[ldr, d1, [x10, $dr_frametime_max]],
|
||||
[nop]
|
||||
]
|
||||
# REF: 00 0d 40 fd 0a 00 b8 d2
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x39E4A0C
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_min],
|
||||
[ldr, d1, [x10, $dr_frametime_min]],
|
||||
[nop],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,25 @@
|
||||
# Beyond Hanwell 1.0
|
||||
# BID: D3C96553221659B0
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7885300, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x78BF860, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x689F6E8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,350 @@
|
||||
# Xenoblade Chronicles X: Definitive Edition 2.0.0
|
||||
# BID: EC4ED46BBC4A9EBB
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: last_tick
|
||||
value_type: uint64
|
||||
default_value: 0
|
||||
-
|
||||
type: variable
|
||||
name: frame_target
|
||||
value_type: uint32
|
||||
default_value: 33333333
|
||||
evaluate: "FRAMETIME_TARGET * 1000000"
|
||||
-
|
||||
type: variable
|
||||
name: speed_factor
|
||||
value_type: float
|
||||
default_value: 1.0
|
||||
-
|
||||
type: variable
|
||||
name: current_fps
|
||||
value_type: float
|
||||
default_value: 30.0
|
||||
-
|
||||
type: variable
|
||||
name: current_frametime
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1 / FPS_TARGET"
|
||||
-
|
||||
type: const
|
||||
name: nanoseconds_in_sec
|
||||
value: 1000000000
|
||||
-
|
||||
type: const
|
||||
name: max_delta
|
||||
value: 66666666
|
||||
-
|
||||
type: variable
|
||||
name: microseconds_in_sec
|
||||
value_type: double
|
||||
default_value: 1000000.0
|
||||
-
|
||||
type: code
|
||||
name: dynamicSpeed
|
||||
instructions: [
|
||||
[stp, x29, x30, [sp, -16], "!"],
|
||||
[mov, x29, sp],
|
||||
[blr, x8],
|
||||
[mrs, x0, cntpct_el0],
|
||||
[adrp, x8, $last_tick],
|
||||
[ldr, x7, [x8, $last_tick]],
|
||||
[str, x0, [x8, $last_tick]],
|
||||
[cbz, x7, :goto1],
|
||||
[sub, x0, x0, x7],
|
||||
[bl, _convertTickToTimeSpan()],
|
||||
[adrp, x8, $frame_target],
|
||||
[ldr, w1, [x8, $frame_target]],
|
||||
[cmp, x1, x0],
|
||||
[b.lt, :goto2],
|
||||
[mov, x0, x1],
|
||||
:goto2, [mov, x1, $max_delta],
|
||||
[movk, x1, $max_delta, 16],
|
||||
[cmp, x1, x0],
|
||||
[b.gt, :goto3],
|
||||
[mov, x0, x1],
|
||||
:goto3, [ucvtf, d0, x0],
|
||||
[adrp, x0, $microseconds_in_sec],
|
||||
[ldr, d1, [x0, $microseconds_in_sec]],
|
||||
[fdiv, d0, d0, d1],
|
||||
[mov, x0, 1000],
|
||||
[ucvtf, d1, x0],
|
||||
[fdiv, d1, d1, d0],
|
||||
[adrp, x0, $current_fps],
|
||||
[fcvt, s1, d1],
|
||||
[str, s1, [x0, $current_fps]],
|
||||
[fmov, s2, 30.0],
|
||||
[fdiv, s2, s2, s1],
|
||||
[adrp, x0, $speed_factor],
|
||||
[str, s2, [x0, $speed_factor]],
|
||||
[mov, x1, 1000],
|
||||
[ucvtf, d1, x1],
|
||||
[fdiv, d1, d0, d1],
|
||||
[fcvt, s1, d1],
|
||||
[adrp, x0, $current_frametime],
|
||||
[str, s1, [x0, $current_frametime]],
|
||||
:goto1, [ldp, x29, x30, [sp], 16],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: battleFix
|
||||
instructions: [
|
||||
[adrp, x9, $speed_factor],
|
||||
[ldr, s0, [x9, $speed_factor]],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: cameraRotationFix
|
||||
instructions: [
|
||||
[adrp, x8, $speed_factor],
|
||||
[ldr, s8, [x8, $speed_factor]],
|
||||
[fmul, s0, s8, s0],
|
||||
[fcmp, s0, 0.0],
|
||||
[b.ge, :goto1],
|
||||
[fneg, s0, s0],
|
||||
[fsqrt, s0, s0],
|
||||
[fneg, s0, s0],
|
||||
[ret],
|
||||
:goto1, [fsqrt, s0, s0],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: fnSiteFix
|
||||
instructions: [
|
||||
[ldr, s0, [x19, 0xd0]],
|
||||
[adrp, x0, $speed_factor],
|
||||
[ldr, s1, [x0, $speed_factor]],
|
||||
[fmul, s0, s0, s1],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: longJumpFix
|
||||
instructions: [
|
||||
[fmov, s11, 30.0],
|
||||
[fadd, s11, s11, s11],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: qteFix
|
||||
instructions: [
|
||||
[adrp, x20, $speed_factor],
|
||||
[ldr, s1, [x20, $speed_factor]],
|
||||
[ldr, s2, [x19, 0x120]],
|
||||
[fmul, s1, s2, s1],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: fogSpeedFix
|
||||
instructions: [
|
||||
[fsqrt, s2, s2],
|
||||
[fmadd, s0, s1, s2, s0],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: overdriveFix
|
||||
instructions: [
|
||||
[adrp, x0, $current_frametime],
|
||||
[ldr, s0, [x0, $current_frametime]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Dynamic speed mod for stuff like UI, lipsync, grass and rain
|
||||
## Redirect nvnQueuePresentTexture call to code cave at MAIN+0x1735050
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x95EED8
|
||||
instructions: [
|
||||
[bl, _dynamicSpeed()]
|
||||
]
|
||||
## Function 1 to speed factor // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x286968
|
||||
instructions: [
|
||||
[adrp, x21, $speed_factor],
|
||||
[ldr, x0, [x8, 0xe18]],
|
||||
[ldr, s10, [x21, $speed_factor]]
|
||||
]
|
||||
## Function 3 to speed factor // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA16F00
|
||||
instructions: [
|
||||
[adrp, x0, $speed_factor],
|
||||
[ldr, s8, [x0, $speed_factor]]
|
||||
]
|
||||
## Function 4 to FPS // UI Speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA1F060
|
||||
instructions: [
|
||||
[adrp, x0, $current_fps],
|
||||
[fmov, s0, w8],
|
||||
[ldr, s0, [x0, $current_fps]]
|
||||
]
|
||||
## Function 5 to FPS // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2672DC
|
||||
instructions: [
|
||||
[adrp, x0, $current_fps],
|
||||
[fmov, s0, w8],
|
||||
[ldrh, w8, [x19, 0x68]],
|
||||
[ldr, s5, [x0, $current_fps]]
|
||||
]
|
||||
## Function 6 to FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x26DB70
|
||||
instructions: [
|
||||
[adrp, x0, $current_fps],
|
||||
[ldr, s0, [x0, $current_fps]],
|
||||
[fcvtzu, w0, s0],
|
||||
[mov, w9, 6],
|
||||
[udiv, w8, w0, w9]
|
||||
]
|
||||
## Function 7 to Frametime in s // Gameplay + cutscene speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E2924
|
||||
instructions: [
|
||||
[adrp, x9, $current_frametime]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E2938
|
||||
instructions: [
|
||||
[ldr, s0, [x9, $current_frametime]]
|
||||
]
|
||||
# Adjust various elements related to fighting
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E8F48
|
||||
instructions: [
|
||||
[bl, _battleFix()]
|
||||
]
|
||||
## Fix gun speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x30FACC
|
||||
instructions: [
|
||||
[nop]
|
||||
]
|
||||
# Redirect DR Target to MAIN+0x47BEF00
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x13A90B4
|
||||
instructions: [
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, s0, [x8, $dr_target]]
|
||||
]
|
||||
## Connect function 1
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E17A0
|
||||
instructions: [
|
||||
[bl, _cameraRotationFix()]
|
||||
]
|
||||
## Connect function 2
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E17B0
|
||||
instructions: [
|
||||
[ldp, q1, q0, [x29, -0x60]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E17BC
|
||||
instructions: [
|
||||
[bl, _cameraRotationFix()]
|
||||
]
|
||||
# Adjust Field Action gauge bar speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE5E00
|
||||
instructions: [
|
||||
[adrp, x0, $speed_factor],
|
||||
[adrp, x9, 0x1d54000],
|
||||
[ldr, s8, [x0, $speed_factor]]
|
||||
]
|
||||
## Fix for FN Site
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE5858
|
||||
instructions: [
|
||||
[bl, _fnSiteFix()]
|
||||
]
|
||||
# Fix long jump when not running
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x23EF70
|
||||
instructions: [
|
||||
[bl, _longJumpFix()]
|
||||
]
|
||||
# Adjust QTE Speed
|
||||
## Connect function
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x5C6280
|
||||
instructions: [
|
||||
[bl, _qteFix()]
|
||||
]
|
||||
# Fix fog speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x296AE0
|
||||
instructions: [
|
||||
[adrp, x8, $speed_factor],
|
||||
[ldr, s2, [x8, $speed_factor]],
|
||||
[bl, _fogSpeedFix()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x676D4
|
||||
instructions: [
|
||||
[bl, _overdriveFix()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# ref: 00 01 00 b9 2a 01 00 b9 c0 03 5f d6
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x1D943A0]
|
||||
value_type: int32
|
||||
value: [1, 1]
|
||||
# Lock game to 30 FPS when complex/prerendered cutscene is played
|
||||
## Adjusts DR target
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x1FEFAF4]
|
||||
compare_value_type: uint32
|
||||
compare_type: ">"
|
||||
compare_value: 2
|
||||
address: [VARIABLE, dr_target]
|
||||
value_type: float
|
||||
value: 0.03333333333
|
||||
## Force OS to run at 60 Hz with interval 2
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x1FEFAF4]
|
||||
compare_value_type: uint32
|
||||
compare_type: ">"
|
||||
compare_value: 2
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
# SWORD ART ONLINE Fractured Daydream EUR 1.6.0.0
|
||||
# BID: 1A6C27F8DCFE45CB
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86BE728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86F92D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EF8F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# SWORD ART ONLINE Fractured Daydream EUR 1.6.1.0
|
||||
# BID: 99252F8F7EE61A81
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86AD728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86E82D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EE7F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,13 @@
|
||||
# EA SPORTS FC 26 1.83.c362
|
||||
# BID: 26E63D318FF5B831
|
||||
|
||||
ALL_FPS:
|
||||
# Internal FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC67B718, 8]
|
||||
value_type: double
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,13 @@
|
||||
# EA SPORTS FC 26 1.82.4264
|
||||
# BID: EDE4F70074EC37C7
|
||||
|
||||
ALL_FPS:
|
||||
# Internal FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC667718, 8]
|
||||
value_type: double
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,13 @@
|
||||
# EA SPORTS FC 26 1.85.374e
|
||||
# BID: F8D172BD397ED5DD
|
||||
|
||||
ALL_FPS:
|
||||
# Internal FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC692698, 8]
|
||||
value_type: double
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# 드래곤 퀘스트 VII Reimagined / 勇者鬥惡龍 VII Reimagined 1.1.0
|
||||
# BID: AB06020960EDD828
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7F1BE78, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7F41918, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x77430D8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,12 @@
|
||||
# 紅の錬金術士と白の守護者 ~レスレリアーナのアトリエ~ 1.4b
|
||||
# BID: 2B08D49BD9504E41
|
||||
|
||||
ALL_FPS:
|
||||
# MagicaCloth2.MagicaManager_TypeInfo
|
||||
## REF: 00 10 2e 1e 01 e4 00 2f 00 21 20 1e, first result, second ADRP+ADD in function
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7791FE8, 0xB8, 0, 0x10, 0x20, 0x10]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET + 5"
|
||||
@ -0,0 +1,34 @@
|
||||
# DRAGON BALL Z: KARAKOT + A NEW POWER AWAKENS SET 1.70
|
||||
# BID: E99DFFA39354B606
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate in cutscenes to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9D02558, 0x810]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47 in cutscenes, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
# bAllowMultiThreadedAnimationUpdate |= 4
|
||||
# bOptimizeAnimBlueprintMemberVariableAccess |= 2
|
||||
# bCanBlueprintsTickByDefault |= 1
|
||||
value: 7
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9CCD498, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9D02E08, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x916F698, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
@ -0,0 +1,19 @@
|
||||
# Octopath Traveler 0 1.0.4
|
||||
# BID: 57C918F08B505771
|
||||
|
||||
ALL_FPS:
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x6C4F6E8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7C718E0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,19 @@
|
||||
# Octopath Traveler 0 1.0.5
|
||||
# BID: 9FE60A212CFF9B9A
|
||||
|
||||
ALL_FPS:
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x6C516E8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7C738E0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,57 @@
|
||||
# NieR:Automata The End of YoRHa Edition US/EU 1.0.3
|
||||
# BID: 3C10EC35C5EF4C36
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_bad
|
||||
value_type: float
|
||||
default_value: 45
|
||||
evaluate: "1.35 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_optimal
|
||||
value_type: float
|
||||
default_value: 32.01
|
||||
evaluate: "0.9603 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_good
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR timings
|
||||
## REF: 8C 46 A8 52 83 01 27 1E
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF434
|
||||
instructions: [
|
||||
[adrp, x12, $dr_target_bad],
|
||||
[ldr, s3, [x12, $dr_target_bad]]
|
||||
]
|
||||
## REF: AC 47 81 52 0C 40 A8 72, first result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF484
|
||||
instructions: [
|
||||
[adrp, x12, $dr_target_optimal],
|
||||
[ldr, w12, [x12, $dr_target_optimal]]
|
||||
]
|
||||
## REF: AC 47 81 52 0C 40 A8 72, second result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF4D4
|
||||
instructions: [
|
||||
[fcsel, s3, s4, s0, gt],
|
||||
[adrp, x12, $dr_target_optimal],
|
||||
[ldr, s0, [x12, $dr_target_optimal]],
|
||||
[adrp, x12, $dr_target_good]
|
||||
]
|
||||
## REF: 00 D0 27 1E 60 20 20 1E
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF4F8
|
||||
instructions: [
|
||||
[ldr, s0, [x12, $dr_target_good]]
|
||||
]
|
||||
@ -22,6 +22,7 @@ DECLARATIONS:
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR timings
|
||||
## REF: 8C 46 A8 52 83 01 27 1E
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF3E4
|
||||
@ -29,6 +30,7 @@ MASTER_WRITE:
|
||||
[adrp, x12, $dr_target_bad],
|
||||
[ldr, s3, [x12, $dr_target_bad]]
|
||||
]
|
||||
## REF: AC 47 81 52 0C 40 A8 72, first result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF434
|
||||
@ -36,6 +38,7 @@ MASTER_WRITE:
|
||||
[adrp, x12, $dr_target_optimal],
|
||||
[ldr, w12, [x12, $dr_target_optimal]]
|
||||
]
|
||||
## REF: AC 47 81 52 0C 40 A8 72, second result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF484
|
||||
@ -45,10 +48,10 @@ MASTER_WRITE:
|
||||
[ldr, s0, [x12, $dr_target_optimal]],
|
||||
[adrp, x12, $dr_target_good]
|
||||
]
|
||||
## REF: 00 D0 27 1E 60 20 20 1E
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF4A8
|
||||
instructions: [
|
||||
[ldr, s0, [x12, $dr_target_good]]
|
||||
]
|
||||
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
# テイルズ オブ エクシリア リマスター 1.0.3
|
||||
# BID: 89D7333B5443950F
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: patch_running
|
||||
value_type: uint8
|
||||
default_value: 0
|
||||
-
|
||||
type: code
|
||||
name: applyCustomSpeed
|
||||
instructions: [
|
||||
[adrp, x4, $patch_running],
|
||||
[ldrb, w4, [x4, $patch_running]],
|
||||
[cbnz, w4, :goto1],
|
||||
[stp, s0, s1, [x8, 0x6C]],
|
||||
:goto1, [ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Block updating game speed
|
||||
## REF: 00 85 0d 2d
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2450394
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x28F5A8C
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2B30924
|
||||
instructions: [
|
||||
[bl, _applyCustomSpeed()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Game Speed
|
||||
## REF: Global_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x82DF380, 0xB8, 0x6C]
|
||||
value_type: float
|
||||
value: [FPS_TARGET, "60 / FPS_TARGET"]
|
||||
# Just in case, dunno if they are used for anything, but all of them were set to target strictly 30 FPS
|
||||
# UnityEngine.Time::maximumDeltaTime
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9FE9DB8, 0x100]
|
||||
value_type: float
|
||||
value: [0.066666666, 0.066666666]
|
||||
# UnityEngine.Time::fixedDeltaTime
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9FE9DB8, 0x48]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
# UnityEngine.Application::targetFrameRate
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x84FC2E8]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: compare
|
||||
compare_address: [VARIABLE, patch_running]
|
||||
compare_type: "=="
|
||||
compare_value: 0
|
||||
address: [VARIABLE, patch_running]
|
||||
value: 1
|
||||
@ -0,0 +1,25 @@
|
||||
# Upin & Ipin Universe 1.0.3
|
||||
# BID: 97EBD09FA8327AFB
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9304098, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x933F5C0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x8320EE8, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,75 @@
|
||||
# WARRIORS: Abyss 1.8.0
|
||||
# BID: 7FB0CED6B8B51B80
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 50
|
||||
evaluate: "1.5 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 40
|
||||
evaluate: "1.2 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# REF: 09 49 A8 52 21 01 27 1E 00 20 21 1E
|
||||
# Use FPS Target instead of vsync value for Dynamic Resolution max delta
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEAC0
|
||||
instructions: [
|
||||
[adrp, x1, 0x1272000],
|
||||
[ldr, s1, [x1, 0xE30]]
|
||||
]
|
||||
# Redirect DR Targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEB64
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target1],
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EEB74
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# REF: 00 00 F0 42 78 00 00 00 00 00 F0 42 04 00 00 00
|
||||
# FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E3C]
|
||||
value_type: uint32
|
||||
value: "120 / FPS_LOCK_TARGET"
|
||||
# Prevent from setting it as 0, otherwise game crashes
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0x1272E3C]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint32
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x1272E3C]
|
||||
value_type: uint32
|
||||
value: 1
|
||||
# Others
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E30]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E34]
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1272E38]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
@ -0,0 +1,75 @@
|
||||
# WARRIORS: Abyss 1.7.0
|
||||
# BID: E09BC148192342B1
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 50
|
||||
evaluate: "1.5 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 40
|
||||
evaluate: "1.2 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# REF: 09 49 A8 52 21 01 27 1E 00 20 21 1E
|
||||
# Use FPS Target instead of vsync value for Dynamic Resolution max delta
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBDC0
|
||||
instructions: [
|
||||
[adrp, x1, 0x126D000],
|
||||
[ldr, s1, [x1, 0xE30]]
|
||||
]
|
||||
# Redirect DR Targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBE64
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target1],
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x8EBE74
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# REF: 00 00 F0 42 78 00 00 00 00 00 F0 42 04 00 00 00
|
||||
# FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE3C]
|
||||
value_type: uint32
|
||||
value: "120 / FPS_LOCK_TARGET"
|
||||
# Prevent from setting it as 0, otherwise game crashes
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0x126DE3C]
|
||||
compare_type: "=="
|
||||
compare_value_type: uint32
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x126DE3C]
|
||||
value_type: uint32
|
||||
value: 1
|
||||
# Others
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE30]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE34]
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x126DE38]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
@ -0,0 +1,10 @@
|
||||
# Tamagotchi Plaza 1.0.7
|
||||
# BID: C3B9D57C911B17C1
|
||||
|
||||
ALL_FPS:
|
||||
# UnityEngine.Rendering.OnDemandRendering_TypeInfo
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x6C7C7F0, 0xB8, 0]
|
||||
value_type: int32
|
||||
value: -1
|
||||
@ -0,0 +1,19 @@
|
||||
# Little Nightmares III 1.0.5
|
||||
# BID: 59B2891BAB23B8AE
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7CB4E48, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x74C0210, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,10 @@
|
||||
# Becastled 1.5
|
||||
# BID: A91CF6368FE718E6
|
||||
|
||||
ALL_FPS:
|
||||
# DynamicResolution_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xA099BF0, 0xB8, 0, 0x58]
|
||||
value_type: float
|
||||
value: "0.96 * FRAMETIME_TARGET"
|
||||
@ -0,0 +1,10 @@
|
||||
# Becastled 1.6
|
||||
# BID: FCFAE709261C279C
|
||||
|
||||
ALL_FPS:
|
||||
# DynamicResolution_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xA09CE00, 0xB8, 0, 0x58]
|
||||
value_type: float
|
||||
value: "0.96 * FRAMETIME_TARGET"
|
||||
@ -0,0 +1,25 @@
|
||||
# Formula Legends 1.0.11
|
||||
# BID: 863E4EEF043F6720
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x83BCF68, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x73D8EE8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x83F8780, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# Formula Legends 1.0.13
|
||||
# BID: B1140CA4CFDD5B4D
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8403F68, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x741FEE8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x843F780, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# Formula Legends 1.0.14
|
||||
# BID: B164D111A971694E
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8414F68, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7430EE8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8450780, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# Forgive me Father 2 1.1.2
|
||||
# BID: 2E7E48804429CB75
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8058DE8, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8093260, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7099970, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,60 @@
|
||||
# 삼국지14 with 파워업키트 1.0.10
|
||||
# BID: C00AA2EBF01D3A48
|
||||
# Cursor speed is tied to framerate, main menu animations speed is not adjusted properly in range from 35 to 55 FPS
|
||||
|
||||
DECLARATIONS:
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock2
|
||||
value_type: uint32
|
||||
default_value: 60
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect adjusting game speed to FPS Lock, REF: 20 79 68 BC 01 10 2E 1E 00 D8 21 7E, replace ADRP+ADD above
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB8EB08
|
||||
instructions: [
|
||||
[adrp, x9, $fps_lock],
|
||||
[add, x9, x9, $fps_lock]
|
||||
]
|
||||
# Redirect FPS Lock, REF: C8 32 40 B9 E8 C2 00 B9, below replace LDR W8, [X0] + B
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x89668C
|
||||
instructions: [
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, w8, [x8, $fps_lock]]
|
||||
]
|
||||
# Redirect game speed to MAIN + 0x2B92808, REF: 00 28 21 1E 00 A0 00 BD C0 03 5F D6, replace beginning of function
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1112670
|
||||
instructions: [
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s0, [x0, 0xa0]],
|
||||
[ldr, s1, [x8, $game_speed]]
|
||||
]
|
||||
ALL_FPS:
|
||||
- # Adjust max delta for menus, 0 - 30 FPS, 1 - 60 FPS, REF: 20 79 68 BC 01 10 2E 1E 00 D8 21 7E, ADRP X8 + LDR W8 above
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x254DDF0]
|
||||
value_type: uint32
|
||||
value: "FPS_TARGET / 60"
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# SWORD ART ONLINE Fractured Daydream US 1.6.0.0
|
||||
# BID: 1A6C27F8DCFE45CB
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86BE728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86F92D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EF8F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,25 @@
|
||||
# SWORD ART ONLINE Fractured Daydream US 1.6.1.0
|
||||
# BID: 99252F8F7EE61A81
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86AD728, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x86E82D0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7EE7F88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,19 @@
|
||||
# The Hundred Line -Last Defense Academy- US 1.2.0
|
||||
# BID: D4A7205845845BCA
|
||||
# Last found function with REF: FD 7B BE A9 F3 0B 00 F9 FD 03 00 91 E0 03 01 2A stores some code related to playing above 60 FPS. Look at it if someone will have an issue playing above 60 FPS.
|
||||
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# REF: 1B 41 00 00
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC97D18]
|
||||
value_type: uint32
|
||||
value: FRAMETIME_TARGET * 1000
|
||||
# Unknown value, but set in the same function as FPS lock, so it may be important
|
||||
# REF: 3C 00 00 00 01 00 00 00 00 00 00 00
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC97CE4]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,19 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 2.1.0
|
||||
# BID: 16DF2D999C7ADAD7
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xAF9C938, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9F7C728, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,19 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 2.1.2
|
||||
# BID: 26CE9F3CC0393826
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xAFA0938, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9F80728, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,19 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 2.0.4
|
||||
# BID: 56AA31E3C9DFB585
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xB590938, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xA570728, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,37 @@
|
||||
# みんなのGOLF WORLD 1.1.7
|
||||
# BID: 913B4D56415E96FF
|
||||
# Changed frametime target value math formula because default one sucks at 60 FPS target
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_max
|
||||
value_type: double
|
||||
default_value: 40
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_min
|
||||
value_type: double
|
||||
default_value: 33.3333333333
|
||||
evaluate: "(0.9 * FRAMETIME_TARGET) - 6"
|
||||
MASTER_WRITE:
|
||||
# REF: 0a 00 a4 d2 8a 08 e8 f2 41 01 67 9e
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x39E48A8
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_max],
|
||||
[ldr, d1, [x10, $dr_frametime_max]],
|
||||
[nop]
|
||||
]
|
||||
-
|
||||
# REF: 00 0d 40 fd 0a 00 b8 d2
|
||||
type: asm_a64
|
||||
main_offset: 0x39E497C
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_min],
|
||||
[ldr, d1, [x10, $dr_frametime_min]],
|
||||
[nop],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,10 @@
|
||||
# NINJA GAIDEN: Ragebound 1.0.7
|
||||
# BID: 5CBAF9E303664284
|
||||
|
||||
ALL_FPS:
|
||||
# UnityEngine.Time::fixedDeltaTime
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x613A2C0, 0x48]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
@ -1,4 +1,4 @@
|
||||
# Red Dead Redemption 1.0.4-1.0.6
|
||||
# Red Dead Redemption 1.0.4-1.0.7
|
||||
# BID: 37531419DA7654EC
|
||||
|
||||
DECLARATIONS:
|
||||
@ -32,4 +32,5 @@ ALL_FPS:
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x20DBA20]
|
||||
value_type: uint32
|
||||
value: VSYNC_TARGET
|
||||
|
||||
value: VSYNC_TARGET
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
# ソニックフォース 新価格版 1.3.0
|
||||
# BID: 972D8BF172E86C18
|
||||
# Game speed is tied to framerate
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
## REF: E8 37 00 B9 E8 03 1F 32
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xAD414C
|
||||
instructions: [
|
||||
[mov, w8, 3]
|
||||
]
|
||||
# Block switching back to 30 FPS mode on loading screens
|
||||
## REF: 08 10 40 F9 48 00 00 B4, replace STR
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6173F8
|
||||
instructions: [
|
||||
[nop]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Switch to 60 FPS Mode
|
||||
## REF: 7F 7E 07 A9 6A A2 01 A9, ADRP + LDR below
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x1CAC518, 0x28, 0x20, 0x14]
|
||||
value_type: uint32
|
||||
value: 1
|
||||
# FPS target
|
||||
## REF: 00 1D 40 BD 01 D0 37 1E, ADRP + LDR above it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1C38C28, 0x1C]
|
||||
value_type: float
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1C38C28, 0x14C]
|
||||
value_type: float
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,19 @@
|
||||
# HUNDRED LINE -最終防衛学園- 1.2.0
|
||||
# BID: D4A7205845845BCA
|
||||
# Last found function with REF: FD 7B BE A9 F3 0B 00 F9 FD 03 00 91 E0 03 01 2A stores some code related to playing above 60 FPS. Look at it if someone will have an issue playing above 60 FPS.
|
||||
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# REF: 1B 41 00 00
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC97D18]
|
||||
value_type: uint32
|
||||
value: FRAMETIME_TARGET * 1000
|
||||
# Unknown value, but set in the same function as FPS lock, so it may be important
|
||||
# REF: 3C 00 00 00 01 00 00 00 00 00 00 00
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC97CE4]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,15 @@
|
||||
# The Long Dark 2.51.170901
|
||||
# BID: 99349B456BEA3469
|
||||
|
||||
ALL_FPS:
|
||||
# TLD.Rendering.DynamicResolutionHelper_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7886928, 0xB8, 0x48]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7886928, 0xB8, 0x50]
|
||||
value_type: double
|
||||
value: FRAMETIME_TARGET
|
||||
@ -0,0 +1,15 @@
|
||||
# The Long Dark: Tales from the Far Territory 2.51.170901
|
||||
# BID: 8CBC566AED7F1095
|
||||
|
||||
ALL_FPS:
|
||||
# TLD.Rendering.DynamicResolutionHelper_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x73B7A90, 0xB8, 0x48]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x73B7A90, 0xB8, 0x50]
|
||||
value_type: double
|
||||
value: FRAMETIME_TARGET
|
||||
@ -0,0 +1,10 @@
|
||||
# The Legend of Heroes: Trails beyond the Horizon 1.0.6
|
||||
# BID: 11D7F970861DFA66
|
||||
|
||||
ALL_FPS:
|
||||
# REF: C1 03 80 52 09 35 00 B9, first ADRP + ADD above it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9FBEA0, 0x34]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,10 @@
|
||||
# The Legend of Heroes: Trails beyond the Horizon 1.0.5
|
||||
# BID: A8C6A84FBCF08724
|
||||
|
||||
ALL_FPS:
|
||||
# REF: C1 03 80 52 09 35 00 B9, first ADRP + ADD above it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9FBEA0, 0x34]
|
||||
value_type: uint32
|
||||
value: FPS_TARGET
|
||||
@ -0,0 +1,18 @@
|
||||
# 룬 팩토리 5 / 符文工廠5 1.1.2
|
||||
# BID: 082815456F5BD744
|
||||
# Cutscenes don't use Dynamic Resolution
|
||||
|
||||
ALL_FPS:
|
||||
# Dynamic Resolution Frame Target Max in ms (default is 38, so resolution is a priority over framerate)
|
||||
## REF: Method$SingletonMonoBehaviour<SkyStudioTimeManager>.CheckInstance()
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5ED5E58, 0x738, 0x70, 0x38]
|
||||
value_type: float
|
||||
value: "TruncDec(FRAMETIME_TARGET, 1)"
|
||||
# Dynamic Resolution Frame Target Min in ms (default is 33)
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5ED5E58, 0x738, 0x70, 0x3C]
|
||||
value_type: float
|
||||
value: "FRAMETIME_TARGET - 1.5"
|
||||
@ -0,0 +1,167 @@
|
||||
# The Legend of Zelda: Breath of the Wild 1.9.0
|
||||
# BID: CD57B23FA4BBAD65
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 1.0
|
||||
-
|
||||
type: variable
|
||||
name: min_delta
|
||||
value_type: float
|
||||
default_value: 1.0
|
||||
evaluate: 30 / FPS_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: dr_factor
|
||||
value_type: float
|
||||
default_value: 100.0
|
||||
evaluate: (FPS_TARGET / 30) * 100
|
||||
-
|
||||
type: variable
|
||||
name: frame_tick
|
||||
value_type: uint64
|
||||
default_value: 0
|
||||
-
|
||||
type: const
|
||||
name: default_frame_nanoseconds
|
||||
value: 33333333
|
||||
-
|
||||
type: code
|
||||
name: dynamicSpeed
|
||||
instructions: [
|
||||
[stp, x29, x30, [sp, -16], "!"],
|
||||
[mov, x29, sp],
|
||||
[blr, x8],
|
||||
[mrs, x2, cntpct_el0],
|
||||
[adrp, x8, $frame_tick],
|
||||
[ldr, x1, [x8, $frame_tick]],
|
||||
[cmp, x1, xzr],
|
||||
[str, x2, [x8, $frame_tick]],
|
||||
[b.eq, :goto4],
|
||||
[sub, x0, x2, x1],
|
||||
[bl, _convertTickToTimeSpan()],
|
||||
[ucvtf, s0, x0],
|
||||
[mov, w0, $default_frame_nanoseconds],
|
||||
[movk, w0, $default_frame_nanoseconds, 16],
|
||||
[ucvtf, s1, w0],
|
||||
[fdiv, s0, s0, s1],
|
||||
[fmov, s1, 2.0],
|
||||
[fcmp, s0, s1],
|
||||
[b.lt, :goto2],
|
||||
[fmov, s0, s1],
|
||||
:goto2, [adrp, x8, $min_delta],
|
||||
[ldr, s1, [x8, $min_delta]],
|
||||
[fcmp, s0, s1],
|
||||
[b.gt, :goto3],
|
||||
[fmov, s0, s1],
|
||||
:goto3, [adrp, x8, $game_speed],
|
||||
[str, s0, [x8, $game_speed]],
|
||||
:goto4, [ldp, x29, x30, [sp], 16],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: variable
|
||||
name: cutscene_state
|
||||
value_type: uint8
|
||||
default_value: 1
|
||||
-
|
||||
type: code
|
||||
name: signalCutscene
|
||||
instructions: [
|
||||
[adrp, x7, $cutscene_state],
|
||||
[strb, w1, [x7, $cutscene_state]],
|
||||
[b, 0xD0B208] # Update this to jump to address replaced via "Signal Cutscenes playing"
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
## REF: 61 F6 42 39
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE93DC8
|
||||
instructions: [
|
||||
[mov, w1, 1]
|
||||
]
|
||||
# Change pointer of time factor for DR calculations to $dr_factor
|
||||
## REF: 01 01 27 1E 08 59 A8 52 03 08 21 1E, replace hardcoded 100.0 float
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x12670A4
|
||||
instructions: [
|
||||
[adrp, x8, $dr_factor],
|
||||
[fmul, s3, s0, s1],
|
||||
[ldr, s1, [x8, $dr_factor]]
|
||||
]
|
||||
# Dynamic speed
|
||||
## Replace nvnQueuePresentTexture call to code cave _dynamicSpeed()
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE9AB7C
|
||||
instructions: [
|
||||
[bl, _dynamicSpeed()]
|
||||
]
|
||||
## Patch game speed function to use speed from $game_speed
|
||||
## REF: 00 3C 40 BD 00 40 00 BD, replace CBZ W8 after it
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x151D448
|
||||
instructions: [
|
||||
[b, +12]
|
||||
]
|
||||
## REF: 01 01 23 1E 28 00 80 52 42 D8 21 7E, replace FDIV + FMUL after that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x151D46C
|
||||
instructions: [
|
||||
[adrp, x9, $game_speed],
|
||||
[ldr, s1, [x9, $game_speed]]
|
||||
]
|
||||
## Patch UI speed function to use speeed from $game_speed
|
||||
## REF: 01 10 2C 1E E0 03 1F 2A
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1280ED8
|
||||
instructions: [
|
||||
[adrp, x7, $game_speed]
|
||||
]
|
||||
## REF: 00 08 21 1E 00 21 0B BD
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1280EE4
|
||||
instructions: [
|
||||
[ldr, s0, [x7, $game_speed]]
|
||||
]
|
||||
# Signal Cutscenes playing
|
||||
## REF: A8 00 80 52 E0 03 13 AA 68 C2 01 F8, second BL after that, before second BL you should have MOV X0, X19 + MOV W1, 1
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xD13910
|
||||
instructions: [
|
||||
[bl, _signalCutscene()]
|
||||
]
|
||||
## REF: 03 1C 40 92 80 82 17 91 E1 03 15 AA, second BL after that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xD140D0
|
||||
instructions: [
|
||||
[bl, _signalCutscene()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Scrolling speed
|
||||
## REF: 68 16 41 B9 D8 22 D5 1A
|
||||
## ADRP + LDR above it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1DAD0E0]
|
||||
value_type: float
|
||||
value: "30 / FPS_TARGET"
|
||||
# Prerendered cutscenes must be played at 30 FPS
|
||||
-
|
||||
type: compare
|
||||
compare_address: [VARIABLE, cutscene_state]
|
||||
compare_type: "=="
|
||||
compare_value: 0
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
@ -0,0 +1,37 @@
|
||||
# EVERYBODY'S GOLF: Hot Shots US 1.1.7
|
||||
# BID: EB39450B8BEE080B
|
||||
# Changed frametime target value math formula because default one sucks at 60 FPS target
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_max
|
||||
value_type: double
|
||||
default_value: 40
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_frametime_min
|
||||
value_type: double
|
||||
default_value: 33.3333333333
|
||||
evaluate: "(0.9 * FRAMETIME_TARGET) - 6"
|
||||
MASTER_WRITE:
|
||||
# REF: 0a 00 a4 d2 8a 08 e8 f2 41 01 67 9e
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x39E4928
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_max],
|
||||
[ldr, d1, [x10, $dr_frametime_max]],
|
||||
[nop]
|
||||
]
|
||||
# REF: 00 0d 40 fd 0a 00 b8 d2
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x39E49FC
|
||||
instructions: [
|
||||
[adrp, x10, $dr_frametime_min],
|
||||
[ldr, d1, [x10, $dr_frametime_min]],
|
||||
[nop],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,41 @@
|
||||
# DARQ Ultimate Edition 1.0.3
|
||||
# BID: C57C698B73E75F7E
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: frametime_target
|
||||
value_type: double
|
||||
default_value: 33.333332061767578
|
||||
evaluate: "FRAMETIME_TARGET - 1.0" # Default value is FRAMETIME_TARGET, but it has issues with reaching 60 FPS
|
||||
-
|
||||
type: code
|
||||
name: getFrametimeTarget1
|
||||
instructions: [
|
||||
[adrp, x8, $frametime_target],
|
||||
[ldr, d9, [x8, $frametime_target]],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: getFrametimeTarget2
|
||||
instructions: [
|
||||
[adrp, x8, $frametime_target],
|
||||
[ldr, d1, [x8, $frametime_target]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# REF: 69 26 40 fd
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17FE28C
|
||||
instructions: [
|
||||
[bl, _getFrametimeTarget1()]
|
||||
]
|
||||
# REF: 61 26 40 fd 00 20 61 1e
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17FE2B8
|
||||
instructions: [
|
||||
[bl, _getFrametimeTarget2()]
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
# No Man's Sky 6.20.0
|
||||
# BID: 19EC806A902017D6
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: FPS_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
# REF: 08 4E A8 52 00 01 27 1E 48 8F A8 52, ADRP + ADD + LDR above that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2085970
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s0, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
# No Man's Sky 6.23.0
|
||||
# BID: 68F13E3406FBAD29
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: FPS_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
# REF: 08 4E A8 52 00 01 27 1E 48 8F A8 52, ADRP + ADD + LDR above that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x208C840
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s0, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
# No Man's Sky 6.24.0
|
||||
# BID: 6A0B389924A77A0B
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: FPS_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
# REF: 08 4E A8 52 00 01 27 1E 48 8F A8 52, ADRP + ADD + LDR above that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x208E1D0
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s0, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,21 @@
|
||||
# No Man's Sky 6.18.0
|
||||
# BID: 8A002EA3F5547393
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: FPS_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
# REF: 08 4E A8 52 00 01 27 1E 48 8F A8 52, ADRP + ADD + LDR above that
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1F9BC40
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s0, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
@ -0,0 +1,12 @@
|
||||
# 옛날 옛적에 괴혼 / 從前從前有個塊魂 1.0.4
|
||||
# BID: F7B9323BE62441F3
|
||||
|
||||
ALL_FPS:
|
||||
# Dynamic Resolution
|
||||
## REF: App.KatamariSin.AppSupport_TypeInfo
|
||||
## REF: 89 07 80 D2 20 04 00 0F, ADRP X20 above it + LDR below it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x8F86948, 0xB8, 0x18]
|
||||
value_type: double
|
||||
value: "0.9 * FRAMETIME_TARGET"
|
||||
@ -0,0 +1,25 @@
|
||||
# Trover Saves the Universe 1.0.0.1
|
||||
# BID: 9D4553105795CD81
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x542B2D8, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5455528, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x48C0D38, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
@ -0,0 +1,12 @@
|
||||
# Don't Starve Together 1.27.0
|
||||
# BID: AED0F6D2983D00D8
|
||||
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# REF: Find instruction 36 D9 34 F8, use X9 to find main offset
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x91E448, 0, 0x320]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
@ -0,0 +1,12 @@
|
||||
# Don't Starve Together 1.26.0
|
||||
# BID: C6F5D7298E0DA0B4
|
||||
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# REF: Find instruction 36 D9 34 F8, use X9 to find main offset
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x91E448, 0, 0x320]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
@ -0,0 +1,12 @@
|
||||
# Don't Starve Together 1.25.0
|
||||
# BID: DB55B89141DFD415
|
||||
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
# REF: Find instruction 36 D9 34 F8, use X9 to find main offset
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x91C448, 0, 0x320]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user