From c5e226a2795e25eb6406bc3534afe47d114796c2 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Mon, 6 Sep 2021 07:52:41 +0800 Subject: [PATCH] Fixed key repeat delay/rate for game speed tweak (#406) Removed AffectPlayback option. --- artifacts/ddraw.ini | 3 -- sfall/FalloutEngine/VariableOffsets.h | 4 ++- sfall/Modules/SpeedPatch.cpp | 49 +++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/artifacts/ddraw.ini b/artifacts/ddraw.ini index dd34aa07..c5a91864 100644 --- a/artifacts/ddraw.ini +++ b/artifacts/ddraw.ini @@ -44,9 +44,6 @@ SpeedMulti9=900 ;The initial speed at game startup SpeedMultiInitial=100 -;Set to 1 to also affect the playback speed of MVE video files without an audio track -AffectPlayback=0 - ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [Graphics] ;Set to 0 for 8 bit fullscreen diff --git a/sfall/FalloutEngine/VariableOffsets.h b/sfall/FalloutEngine/VariableOffsets.h index 62eaa8c1..65333d29 100644 --- a/sfall/FalloutEngine/VariableOffsets.h +++ b/sfall/FalloutEngine/VariableOffsets.h @@ -49,7 +49,7 @@ #define FO_VAR_crnt_func 0x664508 #define FO_VAR_cur_id 0x51C7D4 #define FO_VAR_curr_anim_set 0x51071C -#define FO_VAR_curr_anim_counter 0x56C7DC +#define FO_VAR_curr_anim_counter 0x56C7DC #define FO_VAR_curr_font_num 0x51E3B0 #define FO_VAR_curr_pc_stat 0x6681AC #define FO_VAR_curr_stack 0x59E96C @@ -118,6 +118,8 @@ #define FO_VAR_gmovie_played_list 0x596C78 #define FO_VAR_GNW_win_init_flag 0x51E3E0 #define FO_VAR_GNW95_isActive 0x51E444 +#define FO_VAR_GNW95_repeat_delay 0x51E240 +#define FO_VAR_GNW95_repeat_rate 0x51E23C #define FO_VAR_GNWWin 0x5195B8 #define FO_VAR_gsound_background_fade 0x518E40 #define FO_VAR_gsound_initialized 0x518E30 diff --git a/sfall/Modules/SpeedPatch.cpp b/sfall/Modules/SpeedPatch.cpp index 434c3362..eb3982c5 100644 --- a/sfall/Modules/SpeedPatch.cpp +++ b/sfall/Modules/SpeedPatch.cpp @@ -30,13 +30,27 @@ namespace sfall static const DWORD offsets[] = { // GetTickCount calls - 0x4C9375, 0x4C93E8, 0x4C93C0, 0x4FE01E, - 0x4C9384, 0x4C9D2E, 0x4C8D34, + 0x4C9375, // get_time_ + 0x4C93E8, // elapsed_time_ + 0x4C93C0, // block_for_tocks_ + 0x4C9384, // pause_for_tocks_ + 0x4FE01E, // unused??? + 0x4C9D2E, // GNW95_process_message_ + 0x4C8D34, // GNW_do_bk_process_ + // Delayed GetTickCount calls 0x4FDF64, + // timeGetTime calls - 0x4A3179, 0x4A325D, 0x4F482B, 0x4FE036, - 0x4F4E53, 0x4F5542, 0x4F56CC, 0x4F59C6, // for mve +// 0x4A3179, // init_random_ (unused) +// 0x4A325D, // timer_read_ +// 0x4F482B, // unused + 0x4FE036, // unused??? + + // for MVE +// 0x4F4E53, // syncWait_ +// 0x4F5542, // syncInit_ +// 0x4F56CC, 0x4F59C6, // MVE_syncSync_ }; static DWORD getLocalTimeOffs; @@ -65,6 +79,21 @@ static struct SpeedCfg { static int modKey[2]; static int toggleKey; +static bool defaultDelay = true; + +static void SetKeyboardDefaultDelay() { + if (defaultDelay) return; + defaultDelay = true; + fo::var::setInt(FO_VAR_GNW95_repeat_rate) = 80; + fo::var::setInt(FO_VAR_GNW95_repeat_delay) = 500; +} + +static void SetKeyboardDelay() { + fo::var::setInt(FO_VAR_GNW95_repeat_rate) = static_cast(80 * multi); + fo::var::setInt(FO_VAR_GNW95_repeat_delay) = static_cast(500 * multi); + defaultDelay = false; +} + static DWORD __stdcall FakeGetTickCount() { // Keyboard control if (modKey[0] && (KeyDown(modKey[0]) || (modKey[1] && KeyDown(modKey[1])))) { @@ -79,6 +108,7 @@ static DWORD __stdcall FakeGetTickCount() { int key = speed[i].key; if (key && KeyDown(key)) { multi = speed[i].multiplier; + SetKeyboardDelay(); break; } } @@ -98,11 +128,16 @@ static DWORD __stdcall FakeGetTickCount() { lastTickCount = newTickCount; // Multiply the tick count difference by the multiplier - if (enabled && !slideShow && !(GetLoopFlags() & (LoopFlag::INVENTORY | LoopFlag::INTFACEUSE | LoopFlag::INTFACELOOT | LoopFlag::DIALOG))) { + long mode = GetLoopFlags(); + if (enabled && (!mode || (mode & (LoopFlag::WORLDMAP | LoopFlag::PCOMBAT | LoopFlag::COMBAT))) && !slideShow) { elapsed *= multi; elapsed += tickCountFraction; tickCountFraction = modf(elapsed, &elapsed); + if (defaultDelay) SetKeyboardDelay(); + } else { + SetKeyboardDefaultDelay(); } + sfallTickCount += (DWORD)elapsed; return sfallTickCount; @@ -182,7 +217,8 @@ void SpeedPatch::init() { getLocalTimeOffs = (DWORD)&FakeGetLocalTime; int size = sizeof(offsets) / 4; - if (IniReader::GetConfigInt("Speed", "AffectPlayback", 0) == 0) size -= 4; + // Affect the playback speed of MVE video files without an audio track + //if (IniReader::GetConfigInt("Speed", "AffectPlayback", 0) == 0) size -= 4; for (int i = 0; i < size; i++) { SafeWrite32(offsets[i], (DWORD)&getTickCountOffs); @@ -190,6 +226,7 @@ void SpeedPatch::init() { SafeWrite32(0x4FDF58, (DWORD)&getLocalTimeOffs); HookCall(0x4A433E, scripts_check_state_hook); + SetKeyboardDelay(); TimerInit(); dlogr(" Done", DL_INIT); }