From bdb5675459d3aadb2433a660553eb95ba62df89d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Nov 2018 20:39:45 +0100 Subject: [PATCH] make maxgameticks working via surface unlock for atomic bomberman --- inc/main.h | 2 +- src/main.c | 12 ++++++++++-- src/settings.c | 3 +++ src/surface.c | 7 +++++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/inc/main.h b/inc/main.h index 4872a08..430d9d4 100644 --- a/inc/main.h +++ b/inc/main.h @@ -32,7 +32,7 @@ extern BOOL ShowDriverWarning; extern RECT WindowRect; BOOL detect_cutscene(); -void LimitGameTicks(); +void LimitGameTicks(BOOL isBltOrFlip); DWORD WINAPI render_main(void); DWORD WINAPI render_soft_main(void); diff --git a/src/main.c b/src/main.c index 18cb65a..13e4d3b 100644 --- a/src/main.c +++ b/src/main.c @@ -133,18 +133,26 @@ BOOL detect_cutscene() return FALSE; } -void LimitGameTicks() +void LimitGameTicks(BOOL isBltOrFlip) { static DWORD nextGameTick; + static DWORD lastBltOrFlipTick; if (!nextGameTick) { nextGameTick = timeGetTime(); return; } - nextGameTick += ddraw->ticklength; + DWORD tickCount = timeGetTime(); + if (isBltOrFlip) + lastBltOrFlipTick = tickCount; + else if (lastBltOrFlipTick + ddraw->ticklength >= tickCount) + return; + + nextGameTick += ddraw->ticklength; int sleepTime = nextGameTick - tickCount; + if (sleepTime <= 0 || sleepTime > ddraw->ticklength) nextGameTick = tickCount; else diff --git a/src/settings.c b/src/settings.c index 82e7a91..3aa812d 100644 --- a/src/settings.c +++ b/src/settings.c @@ -240,6 +240,9 @@ static void CreateSettingsIni() "noactivateapp=true\n" "maxgameticks=60\n" "\n" + "[BM]\n" + "maxgameticks=60\n" + "\n" , fh); fclose(fh); diff --git a/src/surface.c b/src/surface.c index d1cc818..fe623c8 100644 --- a/src/surface.c +++ b/src/surface.c @@ -200,7 +200,7 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR } if (ddraw->ticklength > 0) - LimitGameTicks(); + LimitGameTicks(TRUE); } return DD_OK; @@ -369,7 +369,7 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS } if (ddraw->ticklength > 0) - LimitGameTicks(); + LimitGameTicks(TRUE); } return DD_OK; @@ -604,6 +604,9 @@ HRESULT __stdcall ddraw_surface_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRe { InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE); ReleaseSemaphore(ddraw->render.sem, 1, NULL); + + if (ddraw->ticklength > 0) + LimitGameTicks(FALSE); } return DD_OK;