From 15cee173fc232e7eba1bda99bc01d5d4aacce600 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Aug 2023 04:50:02 +0200 Subject: [PATCH] Let cnc-ddraw create a new ddraw.ini if it doesn't exist --- config/ConfigFormUnit.cpp | 26 ++++++++++++++++++++++++++ inc/config.h | 1 + src/config.c | 6 +----- src/dllmain.c | 3 +++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 40cabe4..012499f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -541,6 +541,31 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { + /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ + if (!FileExists(".\\ddraw.ini")) { + + SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); + + HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + + if (ddraw) { + + void (WINAPI* dd_create)(void*, void**, void*); + + dd_create = + (void (WINAPI*)(void*, void**, void*)) + GetProcAddress(ddraw, "DirectDrawCreate"); + + if (dd_create) { + + void *buf; + dd_create(NULL, &buf, NULL); + } + + FreeLibrary(ddraw); + } + } + auto *ini = new TIniFile(".\\ddraw.ini"); ApplyTranslation(ini); @@ -860,6 +885,7 @@ void TConfigForm::SaveSettings() void __fastcall TConfigForm::FormActivate(TObject *Sender) { + /* Detect wine (Linux/macOS) and create the needed dll override */ if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) return; diff --git a/inc/config.h b/inc/config.h index 1b40a22..44b6939 100644 --- a/inc/config.h +++ b/inc/config.h @@ -20,6 +20,7 @@ typedef struct CNCDDRAWCONFIG extern CNCDDRAWCONFIG g_config; +void cfg_init(); void cfg_load(); void cfg_save(); diff --git a/src/config.c b/src/config.c index 8972a48..5d5bcf4 100644 --- a/src/config.c +++ b/src/config.c @@ -901,10 +901,6 @@ static void cfg_create_ini() "adjmouse=true\n" "fixchilds=1\n" "\n" - "; Septerra Core\n" - "[septerra]\n" - "hook=2\n" - "\n" "; Sim Copter\n" "[SimCopter]\n" "renderer=opengl\n" @@ -1058,7 +1054,7 @@ static void cfg_create_ini() } } -static void cfg_init() +void cfg_init() { /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) diff --git a/src/dllmain.c b/src/dllmain.c index 13832a1..ef60f1d 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -22,6 +22,9 @@ HMODULE g_ddraw_module; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + return TRUE; + switch (dwReason) { case DLL_PROCESS_ATTACH: