Compare commits

...

47 commits

Author SHA1 Message Date
FunkyFr3sh
666a3ad0e3 only use shader if upscaling is enabled 2024-12-07 05:29:10 +01:00
FunkyFr3sh
6d44a0b122 fix issue where game is shifted towards the bottom right after joining the lobby twice 2024-12-07 05:01:22 +01:00
FunkyFr3sh
2ec028e87a allow alt+enter with fullscreen upscaled mode 2024-12-04 22:05:38 +01:00
FunkyFr3sh
292af455b6 set new toggle_fullscreen bool 2024-12-04 21:57:59 +01:00
FunkyFr3sh
952fe4fe1a add support for alt+enter in fullscreen upscaled mode 2024-12-04 21:57:52 +01:00
FunkyFr3sh
eeefbb9b71 add support for alt+enter in fullscreen upscaled mode 2024-12-04 21:57:27 +01:00
FunkyFr3sh
f2a613ff2a new .ini setting #toggle_borderless 2024-12-04 21:40:33 +01:00
FunkyFr3sh
a4e95ac6a0 force pos 0,0 in borderless mode 2024-12-04 21:31:17 +01:00
FunkyFr3sh
6987d1a773 remove unneeded function 2024-12-04 20:54:41 +01:00
FunkyFr3sh
da0ccd99e8 try to use translated key names 2024-12-04 20:54:33 +01:00
FunkyFr3sh
f0816d26a6 use english key names for now 2024-12-04 20:51:46 +01:00
FunkyFr3sh
02aa3bc0d9 remove fixwndprochook setting 2024-10-17 22:09:19 +02:00
FunkyFr3sh
418df16446 fix mousei input issues in diablo 1 2024-05-22 04:55:27 +02:00
FunkyFr3sh
51d9ef58d9 always use full path to avoid issues with working directories in wine 2024-04-03 00:37:24 +02:00
FunkyFr3sh
bf7a3d021a fix screenshot names 2024-03-07 17:44:34 +01:00
FunkyFr3sh
6ead8985be fix screenshot names 2024-03-07 17:42:36 +01:00
FunkyFr3sh
608cb6fa68 add 1024x576 to config 2024-02-17 03:49:32 +01:00
FunkyFr3sh
b9eead1947 fix url 2024-02-16 04:22:53 +01:00
FunkyFr3sh
0a88e48e60 reset resolution to default 2024-02-16 04:21:13 +01:00
FunkyFr3sh
6aae09eea9 increase dropdowncount 2024-02-16 01:46:54 +01:00
FunkyFr3sh
de2e3bb266 add new resolution settings 2024-02-16 01:45:41 +01:00
FunkyFr3sh
93c6e120b6 restore original .ini file name 2024-02-03 21:06:24 +01:00
FunkyFr3sh
3997c03d70 add 16:10 resolutions 2024-01-17 23:17:21 +01:00
FunkyFr3sh
88e9566ccf adjust ini file name and settings 2024-01-17 23:00:08 +01:00
FunkyFr3sh
02d300c519 change default settings 2023-09-03 00:18:32 +02:00
FunkyFr3sh
19ed60642f add Resolution setting 2023-09-03 00:08:14 +02:00
FunkyFr3sh
c9d5e1015c remove new filter settings to keep config compatible with old cnc-ddraw build 2023-09-02 23:22:04 +02:00
FunkyFr3sh
971bcb3985 update config to latest version 2023-09-02 23:11:51 +02:00
FunkyFr3sh
b50f9fff7b add hooks to fix blurry fonts 2023-08-16 14:21:26 +02:00
FunkyFr3sh
9b028e6376 disable debug code 2023-04-09 20:07:43 +02:00
FunkyFr3sh
50d4c0aa81 hook SetForegroundWindow for profile links 2023-04-09 20:06:51 +02:00
FunkyFr3sh
8643372afe fix for non working links in profile 2023-04-09 19:32:24 +02:00
FunkyFr3sh
6e9307a422 give bnet lobby a name to make OBS auto scene switcher working with the game 2021-11-28 12:49:13 +01:00
FunkyFr3sh
6a38496bf7 fix cursor lock on alt+tab 2021-11-27 17:38:22 +01:00
FunkyFr3sh
a71528f35f add workaround for multi-monitor setups 2021-11-27 12:51:35 +01:00
FunkyFr3sh
bf3d21c835 add exports for game patching 2021-11-20 03:45:05 +01:00
FunkyFr3sh
aa1ba9f6ec make lowest resolutio check less strict 2021-11-12 02:05:39 +01:00
FunkyFr3sh
e38222053b clear bnet surface on alt+enter 2021-11-12 02:00:40 +01:00
FunkyFr3sh
a4725e7b2d leave fullscreen exclusive on bnet 2021-11-11 23:19:26 +01:00
FunkyFr3sh
fce6319137 re-enable d3d9 but only for windowed/borderless - default to opengl 2021-11-08 03:18:28 +01:00
FunkyFr3sh
87d3fb169a center in windowed mode + clear 2021-11-08 02:36:28 +01:00
FunkyFr3sh
8c6b2814a9 redraw only top window for better performance 2021-11-07 23:22:46 +01:00
FunkyFr3sh
6a241ca0ae add OBS game capture support for bnet lobby 2021-11-07 22:42:55 +01:00
FunkyFr3sh
b4cb502f6a don't enable nonexclusive 2021-11-06 20:12:15 +01:00
FunkyFr3sh
f7d5d6a46e don't change display settings for original war2 2021-11-06 18:51:07 +01:00
FunkyFr3sh
2e23e4309c run lobby in fullscreen with opengl/gdi renderer 2021-11-06 17:12:02 +01:00
FunkyFr3sh
483a64c7e3 change default settings and rename ddraw.ini for high res pach tests 2021-11-06 17:11:23 +01:00
30 changed files with 2230 additions and 814 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -49,12 +49,12 @@ __published: // Von der IDE verwaltete Komponenten
TLabel *MaxgameticksLbl;
TLabel *NoactivateappLbl;
TToggleSwitch *NoactivateappChk;
TLabel *HookLbl;
TToggleSwitch *HookChk;
TLabel *ResolutionsLbl;
TToggleSwitch *ResolutionsChk;
TLabel *MinfpsLbl;
TToggleSwitch *MinfpsChk;
TToggleSwitch *FixpitchChk;
TLabel *FixpitchLbl;
TToggleSwitch *SinglecpuChk;
TLabel *SinglecpuLbl;
TLabel *NonexclusiveLbl;
TToggleSwitch *NonexclusiveChk;
TPaintBox *PresentationPbox;
@ -62,6 +62,28 @@ __published: // Von der IDE verwaltete Komponenten
TPaintBox *ShaderPbox;
TPaintBox *MaxgameticksPbox;
TImage *LanguageImg;
TPanel *HotkeyPnl;
TLabel *ToggleWindowedLbl;
TSpeedButton *HotkeyBtn;
TEdit *ToggleWindowedEdt;
TLabel *ToggleWindowedKeyLbl;
TLabel *MaximizeWindowLbl;
TEdit *MaximizeWindowEdt;
TLabel *MaximizeWindowKeyLbl;
TLabel *UnlockCursor1Lbl;
TEdit *UnlockCursor1Edt;
TLabel *UnlockCursor1KeyLbl;
TLabel *UnlockCursor2Lbl;
TEdit *UnlockCursor2Edt;
TLabel *UnlockCursor2KeyLbl;
TLabel *ScreenshotLbl;
TEdit *ScreenshotEdt;
TComboBox *ShaderD3DCbx;
TSpeedButton *RestoreDefaultsBtn;
TPanel *ThemePnl;
TComboBox *ResolutionCbx;
TLabel *ResolutionLbl;
TPaintBox *ResolutionPbox;
void __fastcall DisplayBtnClick(TObject *Sender);
void __fastcall AdvancedBtnClick(TObject *Sender);
void __fastcall CompatibilityBtnClick(TObject *Sender);
@ -79,16 +101,30 @@ __published: // Von der IDE verwaltete Komponenten
void __fastcall SavesettingsChkClick(TObject *Sender);
void __fastcall MaxgameticksCbxChange(TObject *Sender);
void __fastcall NoactivateappChkClick(TObject *Sender);
void __fastcall HookChkClick(TObject *Sender);
void __fastcall ResolutionsChkClick(TObject *Sender);
void __fastcall MinfpsChkClick(TObject *Sender);
void __fastcall FixpitchChkClick(TObject *Sender);
void __fastcall SinglecpuChkClick(TObject *Sender);
void __fastcall NonexclusiveChkClick(TObject *Sender);
void __fastcall PboxPaint(TObject *Sender);
void __fastcall LanguageImgClick(TObject *Sender);
void __fastcall FormActivate(TObject *Sender);
void __fastcall HotkeyBtnClick(TObject *Sender);
void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall ShaderD3DCbxChange(TObject *Sender);
void __fastcall RestoreDefaultsBtnClick(TObject *Sender);
void __fastcall ThemePnlClick(TObject *Sender);
private: // Benutzer-Deklarationen
virtual void __fastcall CreateParams(TCreateParams & Params);
void SaveSettings();
bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue);
void ApplyTranslation(TIniFile *ini);
System::UnicodeString GetKeyText(WORD key);
WORD GetKeyCode(System::UnicodeString text);
System::UnicodeString KeyToText(WORD key);
public: // Benutzer-Deklarationen
__fastcall TConfigForm(TComponent* Owner);
};

BIN
config/Resources/IT.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

File diff suppressed because it is too large Load diff

View file

@ -2,19 +2,47 @@
#include <vcl.h>
#pragma hdrstop
#include <IniFiles.hpp>
#include <IOUtils.hpp>
#include <System.Hash.hpp>
#include <tchar.h>
//---------------------------------------------------------------------------
#include <Vcl.Styles.hpp>
#include <Vcl.Themes.hpp>
USEFORM("ConfigFormUnit.cpp", ConfigForm);
//---------------------------------------------------------------------------
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
TStyleManager::TrySetStyle("Windows10 Blue");
HWND hwnd =
FindWindow(
THashSHA1::GetHashString(Application->ExeName).w_str(), NULL);
if (hwnd && ParamStr(1) != L"-restart") {
if (IsIconic(hwnd)) {
ShowWindow(hwnd, SW_RESTORE);
}
SetForegroundWindow(hwnd);
return 0;
}
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
auto theme = ini->ReadString("ddraw", "configtheme", "Windows10");
TStyleManager::TrySetStyle(
theme == "Cobalt XEMedia" ? "Cobalt XEMedia" : "Windows10");
delete ini;
Application->CreateForm(__classid(TConfigForm), &ConfigForm);
Application->Run();
}

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates app support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates app support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates app support for Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--The ID below indicates app support for Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--The ID below indicates app support for Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View file

@ -3,5 +3,6 @@ PngImage_DE RCDATA "Resources\\DE.png"
PngImage_ES RCDATA "Resources\\ES.png"
PngImage_FR RCDATA "Resources\\fr.png"
PngImage_HU RCDATA "Resources\\hu.png"
PngImage_IT RCDATA "Resources\\IT.png"
PngImage_RU RCDATA "Resources\\RU.png"
PngImage_US RCDATA "Resources\\US.png"

View file

@ -18,5 +18,13 @@ EXPORTS
DirectInputCreateW = fake_DirectInputCreateW
DirectInputCreateEx = fake_DirectInputCreateEx
DirectInput8Create = fake_DirectInput8Create
DDmemcpy
DDmemmove
DDmemset
DDZeroMemory
DDmemcpyStd
DDmemmoveStd
DDmemsetStd
DDZeroMemoryStd
GameHandlesClose DATA
pvBmpBits = FakePrimarySurface DATA

View file

@ -30,6 +30,10 @@ typedef struct IDirectDrawSurfaceImpl
DWORD l_pitch;
DWORD lx_pitch;
void* bnet_surface;
HDC bnet_dc;
HBITMAP bnet_bitmap;
PBITMAPINFO bmi;
HBITMAP bitmap;
HDC hdc;

View file

@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG
{
RECT window_rect;
int window_state;
int upscaled_state;
char ini_path[MAX_PATH];
char game_path[MAX_PATH];
char process_file_name[MAX_PATH];

View file

@ -137,10 +137,11 @@ typedef struct CNCDDRAW
int show_cursor_count;
BOOL accurate_timers;
BOOL resizable;
BOOL toggle_borderless;
BOOL toggle_upscaled;
BOOL nonexclusive;
BOOL fixpitch;
int fixchilds;
BOOL fixwndprochook;
BOOL fixnotresponding;
BOOL locktopleft;
BOOL d3d9linear;
@ -155,6 +156,7 @@ typedef struct CNCDDRAW
BOOL bnet_was_fullscreen;
BOOL bnet_was_upscaled;
RECT bnet_win_rect;
DEVMODE bnet_mode;
POINT bnet_pos;
void* last_freed_palette; /* Dungeon Keeper hack */
BOOL child_window_exists;

View file

@ -33,6 +33,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect);
HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD);
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter);
void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack);
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This);
#endif

View file

@ -9,7 +9,7 @@
#define SKIP_HOOK3 0x00000002l
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[24]; } HOOKLIST;
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST;
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
@ -34,8 +34,11 @@ typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int
typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND);
typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT);
typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int);
typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd);
typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int);
typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*);
typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR);
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
@ -65,8 +68,11 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA;
extern DESTROYWINDOWPROC real_DestroyWindow;
extern MAPWINDOWPOINTSPROC real_MapWindowPoints;
extern SHOWWINDOWPROC real_ShowWindow;
extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow;
extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
extern GETDEVICECAPSPROC real_GetDeviceCaps;
extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA;
extern CREATEFONTAPROC real_CreateFontA;
extern LOADLIBRARYAPROC real_LoadLibraryA;
extern LOADLIBRARYWPROC real_LoadLibraryW;
extern LOADLIBRARYEXAPROC real_LoadLibraryExA;

View file

@ -27,8 +27,15 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable);
BOOL WINAPI fake_DestroyWindow(HWND hWnd);
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow);
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd);
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf);
HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight,
DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet,
DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily,
LPCTSTR lpszFace);
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName);
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);

View file

@ -9,6 +9,7 @@
#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
#define IDT_TIMER_LEAVE_BNET 541287654
#define IDT_TIMER_REDRAW_BNET 541287655
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

View file

@ -90,9 +90,21 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
HeapFree(GetProcessHeap(), 0, This->surface);
}
if (This->bnet_bitmap)
{
DeleteObject(This->bnet_bitmap);
}
else if (This->bnet_surface)
{
HeapFree(GetProcessHeap(), 0, This->bnet_surface);
}
if (This->hdc)
DeleteDC(This->hdc);
if (This->bnet_dc)
DeleteDC(This->bnet_dc);
if (This->bmi)
HeapFree(GetProcessHeap(), 0, This->bmi);

View file

@ -10,11 +10,13 @@
#include "hook.h"
#include "debug.h"
#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES)
static void cfg_init();
static void cfg_create_ini();
CNCDDRAWCONFIG g_config =
{ .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1 };
{ .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 };
void cfg_load()
{
@ -27,17 +29,22 @@ void cfg_load()
g_ddraw->border = cfg_get_bool("border", TRUE);
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
g_ddraw->maintas = cfg_get_bool("maintas", FALSE);
g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE);
g_ddraw->adjmouse =
cfg_get_bool("adjmouse", TRUE) ||
!cfg_get_bool("handlemouse", TRUE) ||
FILE_EXISTS(".\\plugin\\HardwareCursor.w2p");
g_ddraw->devmode = cfg_get_bool("devmode", FALSE);
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
g_ddraw->vhack = cfg_get_bool("vhack", FALSE);
g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE);
g_ddraw->resizable = cfg_get_bool("resizable", TRUE);
g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE);
g_ddraw->toggle_upscaled = cfg_get_bool("toggle_upscaled", FALSE);
g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE);
g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE);
g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT);
g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE);
g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE);
g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE);
g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE);
@ -107,10 +114,7 @@ void cfg_load()
g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f);
}
if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE)))
{
g_config.window_rect.left = g_config.window_rect.top = -32000;
}
g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE);
if (cfg_get_bool("singlecpu", TRUE))
{
@ -146,6 +150,13 @@ void cfg_load()
else if (tolower(tmp[0]) == 'd') /* direct3d9 */
{
g_ddraw->renderer = d3d9_render_main;
if (!g_ddraw->windowed)
{
g_ddraw->fullscreen = TRUE;
g_ddraw->windowed = TRUE;
g_config.window_rect.left = g_config.window_rect.top = -32000;
}
}
else if (tolower(tmp[0]) == 'o') /* opengl */
{
@ -164,6 +175,13 @@ void cfg_load()
if (!g_ddraw->wine && d3d9_is_available())
{
g_ddraw->renderer = d3d9_render_main;
if (!g_ddraw->windowed)
{
g_ddraw->fullscreen = TRUE;
g_ddraw->windowed = TRUE;
g_config.window_rect.left = g_config.window_rect.top = -32000;
}
}
else if (oglu_load_dll())
{
@ -213,6 +231,11 @@ void cfg_save()
{
WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path);
}
if (g_config.upscaled_state != -1)
{
WritePrivateProfileString(section, "fullscreen", g_config.upscaled_state ? "true" : "false", g_config.ini_path);
}
}
static void cfg_create_ini()
@ -221,7 +244,7 @@ static void cfg_create_ini()
if (fh)
{
fputs(
"; cnc-ddraw - https://github.com/CnCNet/cnc-ddraw - https://cncnet.org\n"
"; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw\n"
"\n"
"[ddraw]\n"
"; ### Optional settings ###\n"
@ -240,7 +263,7 @@ static void cfg_create_ini()
"windowed=false\n"
"\n"
"; Maintain aspect ratio\n"
"maintas=false\n"
"maintas=true\n"
"\n"
"; Windowboxing / Integer Scaling\n"
"boxing=false\n"
@ -255,18 +278,18 @@ static void cfg_create_ini()
"\n"
"; Automatic mouse sensitivity scaling\n"
"; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window\n"
"adjmouse=true\n"
"adjmouse=false\n"
"\n"
"; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n"
"; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n"
"shader=Shaders\\interpolation\\bilinear.glsl\n"
"shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n"
"\n"
"; Window position, -32000 = center to screen\n"
"posX=-32000\n"
"posY=-32000\n"
"\n"
"; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n"
"renderer=auto\n"
"renderer=opengl\n"
"\n"
"; Developer mode (don't lock the cursor)\n"
"devmode=false\n"
@ -290,6 +313,12 @@ static void cfg_create_ini()
"; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n"
"configlang=auto\n"
"\n"
"; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n"
"toggle_borderless=false\n"
"\n"
"; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes\n"
"toggle_upscaled=false\n"
"\n"
"\n"
"\n"
"; ### Compatibility settings ###\n"
@ -665,6 +694,14 @@ static void cfg_create_ini()
"maintas=false\n"
"boxing=false\n"
"\n"
"; Diablo\n"
"[Diablo]\n"
"devmode=true\n"
"\n"
"; Diablo: Hellfire\n"
"[hellfire]\n"
"devmode=true\n"
"\n"
"; Eggsucker\n"
"[eggsucker]\n"
"fixpitch=true\n"
@ -691,17 +728,14 @@ static void cfg_create_ini()
"\n"
"; Grand Theft Auto\n"
"[Grand Theft Auto]\n"
"fixwndprochook=true\n"
"singlecpu=false\n"
"\n"
"; Grand Theft Auto: London 1969\n"
"[gta_uk]\n"
"fixwndprochook=true\n"
"singlecpu=false\n"
"\n"
"; Grand Theft Auto: London 1961\n"
"[Gta_61]\n"
"fixwndprochook=true\n"
"singlecpu=false\n"
"\n"
"; Heroes of Might and Magic II: The Succession Wars\n"
@ -717,7 +751,6 @@ static void cfg_create_ini()
"; Invictus\n"
"[Invictus]\n"
"adjmouse=true\n"
"fixwndprochook=true\n"
"renderer=opengl\n"
"\n"
"; Interstate 76\n"

View file

@ -450,9 +450,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
{
border = FALSE;
g_config.window_rect.left = -32000;
g_config.window_rect.top = -32000;
/* prevent OpenGL from going automatically into fullscreen exclusive mode */
if (g_ddraw->renderer == ogl_render_main)
nonexclusive = TRUE;
@ -672,6 +669,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2);
int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2);
if (g_ddraw->fullscreen)
{
x = y = 0;
}
if (IsIconic(g_ddraw->hwnd))
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y };
AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE);

View file

@ -1190,13 +1190,51 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
return DD_OK;
}
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack)
{
/* Hack for Warcraft II BNE and Diablo */
HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
if (hwnd)
{
if (obs_hack)
{
/* hack for windows 8/10 fullscreen exclusive mode */
if (g_ddraw->primary->palette)
{
SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb);
}
EnterCriticalSection(&g_ddraw->cs);
RECT rc;
if (fake_GetWindowRect(hwnd, &rc))
{
HDC dc = GetDC(hwnd);
BitBlt(
g_ddraw->primary->bnet_dc,
rc.left,
rc.top,
rc.right - rc.left,
rc.bottom - rc.top,
dc,
0,
0,
SRCCOPY);
ReleaseDC(hwnd, dc);
}
LeaveCriticalSection(&g_ddraw->cs);
if (g_ddraw->render.run)
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
return;
}
HDC primary_dc;
dds_GetDC(This, &primary_dc);
@ -1246,11 +1284,14 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
g_ddraw->ticks_limiter.use_blt_or_flip = x;
}
}
}
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This)
{
/* Hack for Star Trek Armada */
hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
if (hwnd)
{
HDC primary_dc;
dds_GetDC(This, &primary_dc);
@ -1284,7 +1325,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
g_ddraw->ticks_limiter.use_blt_or_flip = x;
}
}
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
{
if ((This->caps & DDSCAPS_PRIMARYSURFACE))
{
dds_RedrawBnet(This, FALSE);
dds_RedrawArmada(This);
}
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run)
{
@ -1471,6 +1520,26 @@ HRESULT dd_CreateSurface(
{
g_ddraw->primary = dst_surface;
FakePrimarySurface = dst_surface->surface;
dst_surface->bnet_dc = CreateCompatibleDC(g_ddraw->render.hdc);
dst_surface->bnet_bitmap =
CreateDIBSection(
dst_surface->bnet_dc,
dst_surface->bmi,
DIB_RGB_COLORS,
(void**)&dst_surface->bnet_surface, NULL, 0);
if (!dst_surface->bnet_bitmap)
{
dst_surface->bnet_surface =
HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch);
}
SelectObject(dst_surface->bnet_dc, dst_surface->bnet_bitmap);
}
SelectObject(dst_surface->hdc, dst_surface->bitmap);

View file

@ -232,3 +232,45 @@ DWORD WINAPI DDInternalUnlock(DWORD a)
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret;
}
/* Exports for game patching */
void* __cdecl DDmemcpy(void* _Dst, void const* _Src, size_t _Size)
{
return memcpy(_Dst, _Src, _Size);
}
void* __cdecl DDmemmove(void* _Dst, void const* _Src, size_t _Size)
{
return memmove(_Dst, _Src, _Size);
}
void* __cdecl DDmemset(void* _Dst, int _Val, size_t _Size)
{
return memset(_Dst, _Val, _Size);
}
void __cdecl DDZeroMemory(PVOID Destination, SIZE_T Length)
{
memset(Destination, 0, Length);
}
void* __stdcall DDmemcpyStd(void* _Dst, void const* _Src, size_t _Size)
{
return memcpy(_Dst, _Src, _Size);
}
void* __stdcall DDmemmoveStd(void* _Dst, void const* _Src, size_t _Size)
{
return memmove(_Dst, _Src, _Size);
}
void* __stdcall DDmemsetStd(void* _Dst, int _Val, size_t _Size)
{
return memset(_Dst, _Val, _Size);
}
void __stdcall DDZeroMemoryStd(PVOID Destination, SIZE_T Length)
{
memset(Destination, 0, Length);
}

View file

@ -40,14 +40,18 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA;
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints;
SHOWWINDOWPROC real_ShowWindow = ShowWindow;
SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow;
SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA;
CREATEFONTAPROC real_CreateFontA = CreateFontA;
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
static HOOKLIST g_hooks[] =
{
{
@ -76,6 +80,7 @@ static HOOKLIST g_hooks[] =
{ "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 },
{ "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 },
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
{ "", NULL, NULL, 0 }
}
},
@ -495,6 +500,20 @@ void hook_init()
{
BOOL initial_hook = !g_hook_active;
if (initial_hook)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
DetourTransactionCommit();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
DetourTransactionCommit();
}
#ifdef _MSC_VER
if (initial_hook && g_hook_dinput)
{
@ -575,6 +594,16 @@ void hook_exit()
{
g_hook_active = FALSE;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
DetourTransactionCommit();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
DetourTransactionCommit();
#ifdef _MSC_VER
if (g_hook_dinput)
{

View file

@ -13,7 +13,7 @@ void mouse_lock()
if (g_ddraw->devmode || g_ddraw->bnet_active)
return;
if (g_hook_active && !g_ddraw->locked)
if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd))
{
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
int cur_count = real_ShowCursor(TRUE) - 1;

View file

@ -442,6 +442,29 @@ DWORD WINAPI d3d9_render_main(void)
}
}
}
if (g_ddraw->bnet_active)
{
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
RECT rc = { 0,0,g_ddraw->width,g_ddraw->height };
if (SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
{
unsigned char* src = (unsigned char*)g_ddraw->primary->bnet_surface;
unsigned char* dst = (unsigned char*)lock_rc.pBits;
for (int i = 0; i < g_ddraw->height; i++)
{
memcpy(dst, src, g_ddraw->primary->l_pitch);
src += g_ddraw->primary->l_pitch;
dst += lock_rc.Pitch;
}
IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0);
}
}
}
LeaveCriticalSection(&g_ddraw->cs);
@ -456,11 +479,6 @@ DWORD WINAPI d3d9_render_main(void)
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
IDirect3DDevice9_EndScene(g_d3d9.device);
if (g_ddraw->bnet_active)
{
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
}
if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL)))
{
DWORD_PTR result;

View file

@ -74,7 +74,7 @@ DWORD WINAPI gdi_render_main(void)
if (g_ddraw->fixchilds)
{
g_ddraw->child_window_exists = FALSE;
g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1;
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
}
@ -97,8 +97,39 @@ DWORD WINAPI gdi_render_main(void)
if (g_ddraw->bnet_active)
{
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
if (GetSystemMetrics(SM_CMONITORS) == 1)
{
StretchDIBits(
g_ddraw->render.hdc,
g_ddraw->render.viewport.x,
g_ddraw->render.viewport.y,
g_ddraw->render.viewport.width,
g_ddraw->render.viewport.height,
0,
0,
g_ddraw->width,
g_ddraw->height,
g_ddraw->primary->bnet_surface,
g_ddraw->primary->bmi,
DIB_RGB_COLORS,
SRCCOPY);
}
else
{
SetDIBitsToDevice(
g_ddraw->render.hdc,
0,
0,
g_ddraw->width,
g_ddraw->height,
0,
0,
0,
g_ddraw->height,
g_ddraw->primary->bnet_surface,
g_ddraw->primary->bmi,
DIB_RGB_COLORS);
}
}
else if (upscale_hack)
{

View file

@ -150,8 +150,22 @@ static void ogl_build_programs()
_snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader);
}
BOOL is_upscaler =
strstr(g_ddraw->shader, "fsr.glsl") != NULL ||
strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL ||
strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL ||
strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL ||
strstr(g_ddraw->shader, "xbrz-freescale-multipass.glsl") != NULL ||
strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL;
if (!is_upscaler ||
g_ddraw->render.viewport.width != g_ddraw->width ||
g_ddraw->render.viewport.height != g_ddraw->height ||
g_ddraw->vhack)
{
g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL);
}
}
else
{
g_oglu_got_version3 = FALSE;
@ -676,7 +690,7 @@ static void ogl_render()
if (g_ddraw->fixchilds)
{
g_ddraw->child_window_exists = FALSE;
g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1;
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
@ -701,6 +715,30 @@ static void ogl_render()
}
}
}
if (g_ddraw->bnet_active)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
if (g_ogl.adjust_alignment)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexSubImage2D(
GL_TEXTURE_2D,
0,
0,
0,
g_ddraw->width,
g_ddraw->height,
g_ogl.surface_format,
g_ogl.surface_type,
g_ddraw->primary->bnet_surface);
if (g_ogl.adjust_alignment)
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
}
}
LeaveCriticalSection(&g_ddraw->cs);
@ -823,9 +861,6 @@ static void ogl_render()
glEnd();
}
if (g_ddraw->bnet_active)
glClear(GL_COLOR_BUFFER_BIT);
SwapBuffers(g_ddraw->render.hdc);
#if _DEBUG

View file

@ -132,8 +132,8 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
}
}
strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t));
_snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time);
strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t));
_snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time);
if (src->bpp == 8 && src->palette)
{

View file

@ -158,7 +158,7 @@ BOOL util_get_lowest_resolution(
DWORD max_height)
{
BOOL result = FALSE;
int org_ratio = (int)((ratio + 0.005f) * 100);
int org_ratio = (int)((ratio + 0.005f) * 10);
SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 };
DWORD i = 0;
DEVMODE m;
@ -174,7 +174,7 @@ BOOL util_get_lowest_resolution(
m.dmPelsWidth < lowest.cx &&
m.dmPelsHeight < lowest.cy)
{
int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100);
int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10);
if (res_ratio == org_ratio)
{
@ -279,18 +279,41 @@ void util_toggle_fullscreen()
if (g_ddraw->bnet_active)
return;
memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height);
if (g_ddraw->toggle_borderless)
{
if (!g_ddraw->fullscreen)
{
mouse_unlock();
g_config.upscaled_state = g_ddraw->fullscreen = TRUE;
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
mouse_lock();
}
else
{
mouse_unlock();
g_config.upscaled_state = g_ddraw->fullscreen = FALSE;
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
//mouse_lock();
}
}
else
{
if (g_ddraw->windowed)
{
mouse_unlock();
if (g_ddraw->toggle_upscaled)
{
g_config.upscaled_state = g_ddraw->fullscreen = TRUE;
}
g_config.window_state = g_ddraw->windowed = FALSE;
LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE);
real_SetWindowLongA(
g_ddraw->hwnd,
GWL_STYLE,
style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED);
util_update_bnet_pos(0, 0);
@ -299,6 +322,12 @@ void util_toggle_fullscreen()
else
{
mouse_unlock();
if (g_ddraw->toggle_upscaled)
{
g_config.upscaled_state = g_ddraw->fullscreen = FALSE;
}
g_config.window_state = g_ddraw->windowed = TRUE;
if (g_ddraw->renderer == d3d9_render_main)
@ -314,6 +343,7 @@ void util_toggle_fullscreen()
//mouse_lock();
}
}
}
BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle)
{

View file

@ -107,6 +107,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
return TRUE;
}
else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt))
{
if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height)
{
lpPoint->x = pt.x;
lpPoint->y = pt.y;
return TRUE;
}
}
if (lpPoint)
{
@ -418,24 +428,12 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
if (nIndex == GWL_STYLE)
return 0;
if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook)
if (nIndex == GWL_WNDPROC)
{
if (dwNewLong == (LONG)compat_WndProc)
{
WNDPROC old = g_ddraw->wndproc = g_compat_wndproc;
//g_compat_wndproc = NULL;
return (LONG)old;
}
else
{
if (dwNewLong != (LONG)g_ddraw->wndproc)
{
g_compat_wndproc = g_ddraw->wndproc;
WNDPROC old = g_ddraw->wndproc;
g_ddraw->wndproc = (WNDPROC)dwNewLong;
}
return (LONG)compat_WndProc;
}
return (LONG)old;
}
}
@ -446,9 +444,9 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
{
if (g_ddraw && g_ddraw->hwnd == hWnd)
{
if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook)
if (nIndex == GWL_WNDPROC)
{
return (LONG)compat_WndProc;
return (LONG)g_ddraw->wndproc;
}
}
@ -516,6 +514,11 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
return real_ShowWindow(hWnd, nCmdShow);
}
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd)
{
return TRUE;
}
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId)
{
if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod)
@ -545,6 +548,30 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index)
return real_GetDeviceCaps(hdc, index);
}
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf)
{
LOGFONTA lf;
memcpy(&lf, lplf, sizeof(lf));
lf.lfQuality = NONANTIALIASED_QUALITY;
return real_CreateFontIndirectA(&lf);
}
HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight,
DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet,
DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily,
LPCTSTR lpszFace)
{
fdwQuality = NONANTIALIASED_QUALITY;
return
real_CreateFontA(
nHeight, nWidth, nEscapement, nOrientation, fnWeight,
fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet,
fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily,
lpszFace);
}
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName)
{
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
@ -591,6 +618,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
{
KillTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET);
g_ddraw->bnet_active = FALSE;
SetFocus(g_ddraw->hwnd);
mouse_lock();
@ -617,6 +645,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
dst_height,
flags);
}
}
g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled;
@ -625,7 +654,6 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
g_ddraw->resizable = TRUE;
}
}
}
return result;
}
@ -649,11 +677,30 @@ HWND WINAPI fake_CreateWindowExA(
if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen)
{
int ws = g_config.window_state;
util_toggle_fullscreen();
g_config.window_state = ws;
if ((g_ddraw->render.mode.dmPelsWidth != 640 ||
g_ddraw->render.mode.dmPelsHeight != 480) &&
GetSystemMetrics(SM_CMONITORS) == 1)
{
memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE));
g_ddraw->render.mode.dmPelsWidth = 640;
g_ddraw->render.mode.dmPelsHeight = 480;
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
g_ddraw->bnet_was_fullscreen = TRUE;
}
else
{
real_SetWindowPos(
g_ddraw->hwnd,
0,
0,
0,
g_ddraw->render.width,
g_ddraw->render.height + 1,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING);
}
}
real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect);
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2);
@ -673,7 +720,9 @@ HWND WINAPI fake_CreateWindowExA(
g_ddraw->resizable = FALSE;
g_ddraw->bnet_active = TRUE;
SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL);
mouse_unlock();
ReleaseCapture();
}
POINT pt = { 0, 0 };
@ -684,10 +733,26 @@ HWND WINAPI fake_CreateWindowExA(
int align_y = added_height > 0 ? added_height / 2 : 0;
int align_x = added_width > 0 ? added_width / 2 : 0;
X += pt.x + align_x;
Y += pt.y + align_y;
if (g_ddraw->windowed)
{
X += align_x;
Y += align_y;
}
else if (GetSystemMetrics(SM_CMONITORS) > 1)
{
X += min(g_ddraw->render.width / 2 - 640 / 2, added_width);
Y += min(g_ddraw->render.height / 2 - 480 / 2, added_height);
}
X += pt.x;
Y += pt.y;
dwStyle |= WS_CLIPCHILDREN;
if (lpWindowName && !lpWindowName[0])
{
lpWindowName = "Bnet Lobby";
}
}
return real_CreateWindowExA(

View file

@ -4,6 +4,7 @@
#include "dllmain.h"
#include "dd.h"
#include "hook.h"
#include "ddsurface.h"
#include "mouse.h"
#include "render_d3d9.h"
#include "config.h"
@ -145,16 +146,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET);
if (!g_ddraw->windowed)
g_ddraw->bnet_was_fullscreen = FALSE;
if (!g_ddraw->bnet_active)
{
if (g_ddraw->bnet_was_fullscreen)
{
int ws = g_config.window_state;
util_toggle_fullscreen();
g_config.window_state = ws;
memcpy(&g_ddraw->render.mode, &g_ddraw->bnet_mode, sizeof(DEVMODE));
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
g_ddraw->bnet_was_fullscreen = FALSE;
}
else if (g_ddraw->bnet_was_upscaled)
@ -166,6 +163,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0;
}
case IDT_TIMER_REDRAW_BNET:
{
if (g_ddraw->primary)
dds_RedrawBnet(g_ddraw->primary, TRUE);
return 0;
}
}
break;
}
@ -500,6 +504,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (g_ddraw->renderer != d3d9_render_main)
{
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
mouse_lock();
}
}
@ -581,9 +586,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (g_ddraw->hotkeys.toggle_fullscreen &&
wParam == g_ddraw->hotkeys.toggle_fullscreen &&
!g_ddraw->fullscreen &&
context_code &&
!key_state)
!key_state &&
g_ddraw->renderer != d3d9_render_main)
{
util_toggle_fullscreen();
return 0;