diff --git a/inc/main.h b/inc/main.h index 17e11d5..a758061 100644 --- a/inc/main.h +++ b/inc/main.h @@ -85,6 +85,7 @@ typedef struct IDirectDrawImpl struct { int maxfps; + BOOL forcefps; int width; int height; int bpp; diff --git a/src/render.c b/src/render.c index a4d3249..4c7959f 100644 --- a/src/render.c +++ b/src/render.c @@ -565,7 +565,8 @@ static void Render() else if (ddraw->bpp == 16) glEnable(GL_TEXTURE_2D); - while (UseOpenGL && ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED) + while (UseOpenGL && ddraw->render.run && + (ddraw->render.forcefps || WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)) { #if _DEBUG DrawFrameInfoStart(); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 4dd47c4..afaf35d 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -302,7 +302,8 @@ DWORD WINAPI render_d3d9_main(void) DWORD tickEnd = 0; BOOL needsUpdate = FALSE; - while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, 200) != WAIT_FAILED) + while (ddraw->render.run && + (ddraw->render.forcefps || WaitForSingleObject(ddraw->render.sem, 200) != WAIT_FAILED)) { #if _DEBUG DrawFrameInfoStart(); diff --git a/src/render_soft.c b/src/render_soft.c index e09a480..b6c2895 100644 --- a/src/render_soft.c +++ b/src/render_soft.c @@ -61,7 +61,8 @@ DWORD WINAPI render_soft_main(void) ddraw->fpsLimiter.ticklength = len + (ddraw->accurateTimers ? 0.5f : 0.0f); } - while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED) + while (ddraw->render.run && + (ddraw->render.forcefps || WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)) { #if _DEBUG DrawFrameInfoStart(); diff --git a/src/settings.c b/src/settings.c index 21c54da..52768e9 100644 --- a/src/settings.c +++ b/src/settings.c @@ -55,6 +55,9 @@ void Settings_Load() ddraw->render.maxfps = GetInt("maxfps", 125); + if (ddraw->render.maxfps) + ddraw->render.forcefps = GetBool("forcefps", FALSE); + if (ddraw->accurateTimers || ddraw->vsync) ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL); //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency @@ -283,6 +286,10 @@ static void CreateSettingsIni() "; Note: Can be used to fix issues related to new features added by cnc-ddraw such as windowed mode or stretching\n" "hook=1\n" "\n" + "; Force consistent FPS (Requires 'maxfps=' to be set to a value other than 0)\n" + "; Note: Fixes flickering cursor issues in C&C games\n" + "forcefps=false\n" + "\n" "\n" "\n" "; ### Game specific settings ###\n" @@ -298,10 +305,20 @@ static void CreateSettingsIni() "; Command & Conquer Gold\n" "[C&C95]\n" "maxgameticks=120\n" + "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert\n" "[ra95]\n" "maxgameticks=120\n" + "maxfps=60\n" + "forcefps=true\n" + "\n" + "; Command & Conquer: Red Alert\n" + "[ra95p]\n" + "maxgameticks=120\n" + "maxfps=60\n" + "forcefps=true\n" "\n" "; Age of Empires\n" "[empires]\n" @@ -365,54 +382,63 @@ static void CreateSettingsIni() "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Tiberian Sun Demo\n" "[SUN]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Tiberian Sun - CnCNet\n" "[ts-spawn]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[ra2]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[Red Alert 2]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge\n" "[gamemd]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?\n" "[ra2md]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet\n" "[gamemd-spawn]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS\n" "[Yuri's Revenge]\n" "noactivateapp=true\n" "handlemouse=false\n" "maxfps=60\n" + "forcefps=true\n" "\n" , fh);