diff --git a/artifacts/ddraw.ini b/artifacts/ddraw.ini index c2f6cbc0..4f3a874c 100644 --- a/artifacts/ddraw.ini +++ b/artifacts/ddraw.ini @@ -61,6 +61,7 @@ SpeedMultiInitial=100 ;A DX9 mode is required for any graphics related script extender functions to work (i.e. fullscreen shaders) ;Modes 1, 2 and 3 are no longer supported ;If using the hi-res patch by Mash, this option will always be read from the main ddraw.ini file +;Note: When using an external DirectDraw wrapper (ddraw.dll file in \wrapper\), DX9 mode will not be available Mode=0 ;If using a DX9 mode, this changes the resolution diff --git a/sfall/HRP/Init.cpp b/sfall/HRP/Init.cpp index 7eec701b..1e4bb99e 100644 --- a/sfall/HRP/Init.cpp +++ b/sfall/HRP/Init.cpp @@ -217,14 +217,14 @@ void Setting::init(const char* exeFileName, std::string &cmdline) { // Read High Resolution config - int windowed = (sf::IniReader::GetInt("Main", "WINDOWED", 0, f2ResIni) != 0) ? 1 : 0; + int windowed = (!sf::extWrapper && sf::IniReader::GetInt("Main", "WINDOWED", 0, f2ResIni) != 0) ? 1 : 0; if (windowed && sf::IniReader::GetInt("Main", "WINDOWED_FULLSCREEN", 0, f2ResIni)) { windowed += 1; SCR_WIDTH = GetSystemMetrics(SM_CXSCREEN); SCR_HEIGHT = GetSystemMetrics(SM_CYSCREEN); } - int gMode = sf::IniReader::GetInt("Main", "GRAPHICS_MODE", 2, f2ResIni); + int gMode = sf::IniReader::GetInt("Main", "GRAPHICS_MODE", 0, f2ResIni); if (gMode < 0 || gMode > 2) gMode = 2; if (gMode <= 1) sf::Graphics::mode = 1 + windowed; // DD7: 1 or 2/3 (vanilla) if (gMode == 2) sf::Graphics::mode = 4 + windowed; // DX9: 4 or 5/6 (sfall) diff --git a/sfall/Modules/Graphics.cpp b/sfall/Modules/Graphics.cpp index 9cf81b4a..98d46ff5 100644 --- a/sfall/Modules/Graphics.cpp +++ b/sfall/Modules/Graphics.cpp @@ -1251,10 +1251,10 @@ void Graphics::init() { : IniReader::GetConfigInt("Graphics", "Mode", 0); if (gMode >= 4) Graphics::mode = gMode; - if (Graphics::mode < 0 || Graphics::mode > 6) { + if (extWrapper || Graphics::mode < 0 || Graphics::mode > 6) { Graphics::mode = 0; } - IsWindowedMode = (mode == 2 || mode == 3 || mode >= 5); + Graphics::IsWindowedMode = (Graphics::mode == 2 || Graphics::mode == 3 || Graphics::mode >= 5); if (Graphics::mode >= 4) { dlog("Applying DX9 graphics patch.", DL_INIT); @@ -1269,7 +1269,7 @@ void Graphics::init() { } FreeLibrary(h); - SafeWrite8(0x50FB6B, '2'); // Set call DirectDrawCreate2 + SafeWrite8(0x50FB6B, '2'); // Set call DirectDrawCreat2 HookCall(0x44260C, game_init_hook); MakeJump(fo::funcoffs::GNW95_SetPaletteEntries_ + 1, GNW95_SetPaletteEntries_replacement); // 0x4CB310 diff --git a/sfall/main.cpp b/sfall/main.cpp index 72e958a1..ca9d0709 100644 --- a/sfall/main.cpp +++ b/sfall/main.cpp @@ -99,7 +99,9 @@ bool isDebug = false; bool versionCHI = false; -char falloutConfigName[65]; +bool extWrapper = false; + +static char falloutConfigName[65]; static void InitModules() { dlogr("In InitModules", DL_INIT); @@ -310,39 +312,44 @@ defaultIni: static void LoadOriginalDll(DWORD fdwReason) { switch (fdwReason) { - case DLL_PROCESS_ATTACH: + case DLL_PROCESS_ATTACH: + ddraw.dll = LoadLibraryA("wrapper\\ddraw.dll"); // external DirectDraw wrapper + if (ddraw.dll) { + sfall::extWrapper = true; + } else { char path[MAX_PATH]; - CopyMemory(path + GetSystemDirectoryA(path , MAX_PATH - 10), "\\ddraw.dll", 11); // path to original dll + CopyMemory(path + GetSystemDirectoryA(path, MAX_PATH - 10), "\\ddraw.dll", 11); // path to original dll ddraw.dll = LoadLibraryA(path); - if (ddraw.dll) { - ddraw.AcquireDDThreadLock = GetProcAddress(ddraw.dll, "AcquireDDThreadLock"); - ddraw.CheckFullscreen = GetProcAddress(ddraw.dll, "CheckFullscreen"); - ddraw.CompleteCreateSysmemSurface = GetProcAddress(ddraw.dll, "CompleteCreateSysmemSurface"); - ddraw.D3DParseUnknownCommand = GetProcAddress(ddraw.dll, "D3DParseUnknownCommand"); - ddraw.DDGetAttachedSurfaceLcl = GetProcAddress(ddraw.dll, "DDGetAttachedSurfaceLcl"); - ddraw.DDInternalLock = GetProcAddress(ddraw.dll, "DDInternalLock"); - ddraw.DDInternalUnlock = GetProcAddress(ddraw.dll, "DDInternalUnlock"); - ddraw.DSoundHelp = GetProcAddress(ddraw.dll, "DSoundHelp"); - ddraw.DirectDrawCreateClipper = GetProcAddress(ddraw.dll, "DirectDrawCreateClipper"); - ddraw.DirectDrawCreate = GetProcAddress(ddraw.dll, "DirectDrawCreate"); - ddraw.DirectDrawCreateEx = GetProcAddress(ddraw.dll, "DirectDrawCreateEx"); - ddraw.DirectDrawEnumerateA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateA"); - ddraw.DirectDrawEnumerateExA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExA"); - ddraw.DirectDrawEnumerateExW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExW"); - ddraw.DirectDrawEnumerateW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateW"); - ddraw.DllCanUnloadNow = GetProcAddress(ddraw.dll, "DllCanUnloadNow"); - ddraw.DllGetClassObject = GetProcAddress(ddraw.dll, "DllGetClassObject"); - ddraw.GetDDSurfaceLocal = GetProcAddress(ddraw.dll, "GetDDSurfaceLocal"); - ddraw.GetOLEThunkData = GetProcAddress(ddraw.dll, "GetOLEThunkData"); - ddraw.GetSurfaceFromDC = GetProcAddress(ddraw.dll, "GetSurfaceFromDC"); - ddraw.RegisterSpecialCase = GetProcAddress(ddraw.dll, "RegisterSpecialCase"); - ddraw.ReleaseDDThreadLock = GetProcAddress(ddraw.dll, "ReleaseDDThreadLock"); - ddraw.SetAppCompatData = GetProcAddress(ddraw.dll, "SetAppCompatData"); - } - break; - case DLL_PROCESS_DETACH: - if (ddraw.dll) FreeLibrary(ddraw.dll); - break; + } + if (ddraw.dll) { + ddraw.AcquireDDThreadLock = GetProcAddress(ddraw.dll, "AcquireDDThreadLock"); + ddraw.CheckFullscreen = GetProcAddress(ddraw.dll, "CheckFullscreen"); + ddraw.CompleteCreateSysmemSurface = GetProcAddress(ddraw.dll, "CompleteCreateSysmemSurface"); + ddraw.D3DParseUnknownCommand = GetProcAddress(ddraw.dll, "D3DParseUnknownCommand"); + ddraw.DDGetAttachedSurfaceLcl = GetProcAddress(ddraw.dll, "DDGetAttachedSurfaceLcl"); + ddraw.DDInternalLock = GetProcAddress(ddraw.dll, "DDInternalLock"); + ddraw.DDInternalUnlock = GetProcAddress(ddraw.dll, "DDInternalUnlock"); + ddraw.DSoundHelp = GetProcAddress(ddraw.dll, "DSoundHelp"); + ddraw.DirectDrawCreateClipper = GetProcAddress(ddraw.dll, "DirectDrawCreateClipper"); + ddraw.DirectDrawCreate = GetProcAddress(ddraw.dll, "DirectDrawCreate"); + ddraw.DirectDrawCreateEx = GetProcAddress(ddraw.dll, "DirectDrawCreateEx"); + ddraw.DirectDrawEnumerateA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateA"); + ddraw.DirectDrawEnumerateExA = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExA"); + ddraw.DirectDrawEnumerateExW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateExW"); + ddraw.DirectDrawEnumerateW = GetProcAddress(ddraw.dll, "DirectDrawEnumerateW"); + ddraw.DllCanUnloadNow = GetProcAddress(ddraw.dll, "DllCanUnloadNow"); + ddraw.DllGetClassObject = GetProcAddress(ddraw.dll, "DllGetClassObject"); + ddraw.GetDDSurfaceLocal = GetProcAddress(ddraw.dll, "GetDDSurfaceLocal"); + ddraw.GetOLEThunkData = GetProcAddress(ddraw.dll, "GetOLEThunkData"); + ddraw.GetSurfaceFromDC = GetProcAddress(ddraw.dll, "GetSurfaceFromDC"); + ddraw.RegisterSpecialCase = GetProcAddress(ddraw.dll, "RegisterSpecialCase"); + ddraw.ReleaseDDThreadLock = GetProcAddress(ddraw.dll, "ReleaseDDThreadLock"); + ddraw.SetAppCompatData = GetProcAddress(ddraw.dll, "SetAppCompatData"); + } + break; + case DLL_PROCESS_DETACH: + if (ddraw.dll) FreeLibrary(ddraw.dll); + break; } } diff --git a/sfall/main.h b/sfall/main.h index 80776119..cf76910f 100644 --- a/sfall/main.h +++ b/sfall/main.h @@ -83,7 +83,7 @@ namespace sfall extern bool versionCHI; -extern char falloutConfigName[65]; +extern bool extWrapper; __inline long GetIntHRPValue(DWORD addr) { return *reinterpret_cast(HRP::Setting::GetAddress(addr));