Fixed key repeat delay/rate for game speed tweak (#406)

Removed AffectPlayback option.
This commit is contained in:
NovaRain
2021-09-06 07:52:41 +08:00
parent 0a8a28b80c
commit c5e226a279
3 changed files with 46 additions and 10 deletions
-3
View File
@@ -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
+2
View File
@@ -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
+43 -6
View File
@@ -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<long>(80 * multi);
fo::var::setInt(FO_VAR_GNW95_repeat_delay) = static_cast<long>(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);
}