From 3aed2239abba3c7d902777607229ba70f43cf7cd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 24 Sep 2020 10:29:18 +0200 Subject: [PATCH] #29 Sierra's City Building series support (Caesar III, Pharaoh and Zeus) --- inc/main.h | 1 + src/main.c | 17 ++++++++++++++++- src/settings.c | 22 ++++++++++++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/inc/main.h b/inc/main.h index 35475db..8405ac8 100644 --- a/inc/main.h +++ b/inc/main.h @@ -132,6 +132,7 @@ typedef struct IDirectDrawImpl BOOL accurateTimers; BOOL resizable; BOOL ddrawrefcount0; + BOOL forcewmmove; BOOL bnetActive; BOOL bnetWasFullscreen; BOOL bnetWasUpscaled; diff --git a/src/main.c b/src/main.c index 6b61895..edc3ce0 100644 --- a/src/main.c +++ b/src/main.c @@ -513,7 +513,7 @@ HRESULT __stdcall ddraw_GetCaps(IDirectDrawImpl *This, LPDDCAPS lpDDDriverCaps, HRESULT __stdcall ddraw_GetDisplayMode(IDirectDrawImpl *This, LPDDSURFACEDESC a) { printf("??? DirectDraw::GetDisplayMode(This=%p, ...)\n", This); - return DD_OK; + return DDERR_UNSUPPORTEDMODE; } HRESULT __stdcall ddraw_GetFourCCCodes(IDirectDrawImpl *This, LPDWORD a, LPDWORD b) @@ -957,6 +957,9 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD This->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)This->renderer, NULL, 0, NULL); } + if (ddraw->forcewmmove) + PostMessageA(ddraw->hWnd, WM_MOVE, 0, MAKELPARAM(-32000, -32000)); + return DD_OK; } @@ -1376,6 +1379,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (!ddraw->handlemouse) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + if (ddraw->forcewmmove) + { + lParam = 0; + break; + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } @@ -1779,7 +1788,13 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This) } if (This->renderer == render_d3d9_main) + { Direct3D9_Release(); + } + else if (!ddraw->windowed) + { + ChangeDisplaySettings(&This->mode, 0); + } } if(This->render.hDC) diff --git a/src/settings.c b/src/settings.c index 2a6d386..8dabff5 100644 --- a/src/settings.c +++ b/src/settings.c @@ -44,6 +44,7 @@ void Settings_Load() ddraw->accurateTimers = GetBool("accuratetimers", FALSE); ddraw->resizable = GetBool("resizable", TRUE); ddraw->ddrawrefcount0 = GetBool("ddrawrefcount0", FALSE); // Twisted Metal 2 DirectDraw Error hack + ddraw->forcewmmove = GetBool("forcewmmove", FALSE); // Sierra Caesar III, Pharaoh, and Zeus hack WindowRect.right = GetInt("width", 0); WindowRect.bottom = GetInt("height", 0); @@ -274,10 +275,6 @@ static void CreateSettingsIni() "; Note: This option only works for games that draw their own cursor and it must be disabled for all other games\n" "handlemouse=true\n" "\n" - "; Use Waitable Timer Objects rather than timeGetTime+Sleep to limit FPS/Ticks/Flip\n" - "; Note: To workaround tearing/stuttering problems, set maxfps 1 lower than screen refresh rate (59 for flip games)\n" - "accuratetimers=false\n" - "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "singlecpu=true\n" "\n" @@ -450,6 +447,23 @@ static void CreateSettingsIni() "handlemouse=false\n" "ddrawrefcount0=true\n" "\n" + "; Caesar III\n" + "[c3]\n" + "handlemouse=false\n" + "forcewmmove=true\n" + "\n" + "; Pharaoh\n" + "[Pharaoh]\n" + "handlemouse=false\n" + "forcewmmove=true\n" + "\n" + "; Master of Olympus - Zeus\n" + "[Zeus]\n" + "handlemouse=false\n" + "forcewmmove=true\n" + "renderer=gdi\n" + "hook=2\n" + "\n" , fh); fclose(fh);