From 8ba61859655cf11fb7ff00ef0b7e04c1c7349ca7 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Fri, 2 Nov 2018 02:21:16 +0100
Subject: [PATCH] fix for carmageddon 2

---
 inc/main.h     | 7 ++++++-
 src/main.c     | 9 +++++++++
 src/settings.c | 5 +++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/inc/main.h b/inc/main.h
index 5b015cf..10afbfc 100644
--- a/inc/main.h
+++ b/inc/main.h
@@ -133,7 +133,12 @@ struct IDirectDrawImplVtbl
     HRESULT(__stdcall *Initialize)(IDirectDrawImpl *, GUID *);
     HRESULT(__stdcall *RestoreDisplayMode)(IDirectDrawImpl *);
     HRESULT(__stdcall *SetCooperativeLevel)(IDirectDrawImpl *, HWND, DWORD);
-    HRESULT(__stdcall *SetDisplayMode)(IDirectDrawImpl *, DWORD, DWORD,DWORD);
+    union
+    {
+        HRESULT(__stdcall *SetDisplayMode1)(IDirectDrawImpl *, DWORD, DWORD, DWORD);
+        HRESULT(__stdcall *SetDisplayMode2)(IDirectDrawImpl *, DWORD, DWORD, DWORD, DWORD, DWORD);
+    };
+    
     HRESULT(__stdcall *WaitForVerticalBlank)(IDirectDrawImpl *, DWORD, HANDLE);
 };
 
diff --git a/src/main.c b/src/main.c
index ebb9ab6..6d3a94f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <d3d9.h>
+#include <InitGuid.h>
 #include "ddraw.h"
 #include "main.h"
 #include "opengl.h"
@@ -623,6 +624,11 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD
     return DD_OK;
 }
 
+HRESULT __stdcall ddraw_SetDisplayMode2(IDirectDrawImpl *This, DWORD width, DWORD height, DWORD bpp, DWORD refreshRate, DWORD flags)
+{
+    return ddraw_SetDisplayMode(This, width, height, bpp);
+}
+
 // LastSetWindowPosTick = Workaround for a wine+gnome bug where each SetWindowPos call triggers a WA_INACTIVE message
 DWORD LastSetWindowPosTick;
 
@@ -1174,6 +1180,9 @@ HRESULT __stdcall ddraw_QueryInterface(IDirectDrawImpl *This, REFIID riid, void
 {
     printf("DirectDraw::QueryInterface(This=%p, riid=%08X, obj=%p)\n", This, (unsigned int)riid, obj);
 
+    if (riid && !IsEqualGUID(&IID_IDirectDraw, riid))
+        This->lpVtbl->SetDisplayMode2 = ddraw_SetDisplayMode2;
+
     *obj = This;
 
     return S_OK;
diff --git a/src/settings.c b/src/settings.c
index b8b4848..2bda55b 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -228,6 +228,11 @@ static void CreateSettingsIni()
             "[battlegrounds_x1]\n"
             "hidemouse=false\n"
             "\n"
+            "[Carma2_SW]\n"
+            "renderer=opengl\n"
+            "noactivateapp=true\n"
+            "maxgameticks=60\n"
+            "\n"
 
             , fh);
         fclose(fh);