Compare commits
47 commits
master
...
war2-high-
Author | SHA1 | Date | |
---|---|---|---|
|
666a3ad0e3 | ||
|
6d44a0b122 | ||
|
2ec028e87a | ||
|
292af455b6 | ||
|
952fe4fe1a | ||
|
eeefbb9b71 | ||
|
f2a613ff2a | ||
|
a4e95ac6a0 | ||
|
6987d1a773 | ||
|
da0ccd99e8 | ||
|
f0816d26a6 | ||
|
02aa3bc0d9 | ||
|
418df16446 | ||
|
51d9ef58d9 | ||
|
bf7a3d021a | ||
|
6ead8985be | ||
|
608cb6fa68 | ||
|
b9eead1947 | ||
|
0a88e48e60 | ||
|
6aae09eea9 | ||
|
de2e3bb266 | ||
|
93c6e120b6 | ||
|
3997c03d70 | ||
|
88e9566ccf | ||
|
02d300c519 | ||
|
19ed60642f | ||
|
c9d5e1015c | ||
|
971bcb3985 | ||
|
b50f9fff7b | ||
|
9b028e6376 | ||
|
50d4c0aa81 | ||
|
8643372afe | ||
|
6e9307a422 | ||
|
6a38496bf7 | ||
|
a71528f35f | ||
|
bf3d21c835 | ||
|
aa1ba9f6ec | ||
|
e38222053b | ||
|
a4725e7b2d | ||
|
fce6319137 | ||
|
87d3fb169a | ||
|
8c6b2814a9 | ||
|
6a241ca0ae | ||
|
b4cb502f6a | ||
|
f7d5d6a46e | ||
|
2e23e4309c | ||
|
483a64c7e3 |
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
|
@ -49,12 +49,12 @@ __published: // Von der IDE verwaltete Komponenten
|
||||||
TLabel *MaxgameticksLbl;
|
TLabel *MaxgameticksLbl;
|
||||||
TLabel *NoactivateappLbl;
|
TLabel *NoactivateappLbl;
|
||||||
TToggleSwitch *NoactivateappChk;
|
TToggleSwitch *NoactivateappChk;
|
||||||
TLabel *HookLbl;
|
TLabel *ResolutionsLbl;
|
||||||
TToggleSwitch *HookChk;
|
TToggleSwitch *ResolutionsChk;
|
||||||
TLabel *MinfpsLbl;
|
TLabel *MinfpsLbl;
|
||||||
TToggleSwitch *MinfpsChk;
|
TToggleSwitch *MinfpsChk;
|
||||||
TToggleSwitch *FixpitchChk;
|
TToggleSwitch *SinglecpuChk;
|
||||||
TLabel *FixpitchLbl;
|
TLabel *SinglecpuLbl;
|
||||||
TLabel *NonexclusiveLbl;
|
TLabel *NonexclusiveLbl;
|
||||||
TToggleSwitch *NonexclusiveChk;
|
TToggleSwitch *NonexclusiveChk;
|
||||||
TPaintBox *PresentationPbox;
|
TPaintBox *PresentationPbox;
|
||||||
|
@ -62,6 +62,28 @@ __published: // Von der IDE verwaltete Komponenten
|
||||||
TPaintBox *ShaderPbox;
|
TPaintBox *ShaderPbox;
|
||||||
TPaintBox *MaxgameticksPbox;
|
TPaintBox *MaxgameticksPbox;
|
||||||
TImage *LanguageImg;
|
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 DisplayBtnClick(TObject *Sender);
|
||||||
void __fastcall AdvancedBtnClick(TObject *Sender);
|
void __fastcall AdvancedBtnClick(TObject *Sender);
|
||||||
void __fastcall CompatibilityBtnClick(TObject *Sender);
|
void __fastcall CompatibilityBtnClick(TObject *Sender);
|
||||||
|
@ -79,16 +101,30 @@ __published: // Von der IDE verwaltete Komponenten
|
||||||
void __fastcall SavesettingsChkClick(TObject *Sender);
|
void __fastcall SavesettingsChkClick(TObject *Sender);
|
||||||
void __fastcall MaxgameticksCbxChange(TObject *Sender);
|
void __fastcall MaxgameticksCbxChange(TObject *Sender);
|
||||||
void __fastcall NoactivateappChkClick(TObject *Sender);
|
void __fastcall NoactivateappChkClick(TObject *Sender);
|
||||||
void __fastcall HookChkClick(TObject *Sender);
|
void __fastcall ResolutionsChkClick(TObject *Sender);
|
||||||
void __fastcall MinfpsChkClick(TObject *Sender);
|
void __fastcall MinfpsChkClick(TObject *Sender);
|
||||||
void __fastcall FixpitchChkClick(TObject *Sender);
|
void __fastcall SinglecpuChkClick(TObject *Sender);
|
||||||
void __fastcall NonexclusiveChkClick(TObject *Sender);
|
void __fastcall NonexclusiveChkClick(TObject *Sender);
|
||||||
void __fastcall PboxPaint(TObject *Sender);
|
void __fastcall PboxPaint(TObject *Sender);
|
||||||
void __fastcall LanguageImgClick(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
|
private: // Benutzer-Deklarationen
|
||||||
|
virtual void __fastcall CreateParams(TCreateParams & Params);
|
||||||
void SaveSettings();
|
void SaveSettings();
|
||||||
bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue);
|
bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue);
|
||||||
void ApplyTranslation(TIniFile *ini);
|
void ApplyTranslation(TIniFile *ini);
|
||||||
|
System::UnicodeString GetKeyText(WORD key);
|
||||||
|
WORD GetKeyCode(System::UnicodeString text);
|
||||||
|
System::UnicodeString KeyToText(WORD key);
|
||||||
public: // Benutzer-Deklarationen
|
public: // Benutzer-Deklarationen
|
||||||
__fastcall TConfigForm(TComponent* Owner);
|
__fastcall TConfigForm(TComponent* Owner);
|
||||||
};
|
};
|
||||||
|
|
BIN
config/Resources/IT.png
Normal file
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
|
@ -2,19 +2,47 @@
|
||||||
|
|
||||||
#include <vcl.h>
|
#include <vcl.h>
|
||||||
#pragma hdrstop
|
#pragma hdrstop
|
||||||
|
#include <IniFiles.hpp>
|
||||||
|
#include <IOUtils.hpp>
|
||||||
|
#include <System.Hash.hpp>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#include <Vcl.Styles.hpp>
|
#include <Vcl.Styles.hpp>
|
||||||
#include <Vcl.Themes.hpp>
|
#include <Vcl.Themes.hpp>
|
||||||
USEFORM("ConfigFormUnit.cpp", ConfigForm);
|
USEFORM("ConfigFormUnit.cpp", ConfigForm);
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
|
||||||
|
|
||||||
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Application->Initialize();
|
Application->Initialize();
|
||||||
Application->MainFormOnTaskBar = true;
|
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->CreateForm(__classid(TConfigForm), &ConfigForm);
|
||||||
Application->Run();
|
Application->Run();
|
||||||
}
|
}
|
||||||
|
|
34
config/cnc-ddraw config.manifest
Normal file
34
config/cnc-ddraw config.manifest
Normal 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>
|
|
@ -3,5 +3,6 @@ PngImage_DE RCDATA "Resources\\DE.png"
|
||||||
PngImage_ES RCDATA "Resources\\ES.png"
|
PngImage_ES RCDATA "Resources\\ES.png"
|
||||||
PngImage_FR RCDATA "Resources\\fr.png"
|
PngImage_FR RCDATA "Resources\\fr.png"
|
||||||
PngImage_HU RCDATA "Resources\\hu.png"
|
PngImage_HU RCDATA "Resources\\hu.png"
|
||||||
|
PngImage_IT RCDATA "Resources\\IT.png"
|
||||||
PngImage_RU RCDATA "Resources\\RU.png"
|
PngImage_RU RCDATA "Resources\\RU.png"
|
||||||
PngImage_US RCDATA "Resources\\US.png"
|
PngImage_US RCDATA "Resources\\US.png"
|
||||||
|
|
|
@ -18,5 +18,13 @@ EXPORTS
|
||||||
DirectInputCreateW = fake_DirectInputCreateW
|
DirectInputCreateW = fake_DirectInputCreateW
|
||||||
DirectInputCreateEx = fake_DirectInputCreateEx
|
DirectInputCreateEx = fake_DirectInputCreateEx
|
||||||
DirectInput8Create = fake_DirectInput8Create
|
DirectInput8Create = fake_DirectInput8Create
|
||||||
|
DDmemcpy
|
||||||
|
DDmemmove
|
||||||
|
DDmemset
|
||||||
|
DDZeroMemory
|
||||||
|
DDmemcpyStd
|
||||||
|
DDmemmoveStd
|
||||||
|
DDmemsetStd
|
||||||
|
DDZeroMemoryStd
|
||||||
GameHandlesClose DATA
|
GameHandlesClose DATA
|
||||||
pvBmpBits = FakePrimarySurface DATA
|
pvBmpBits = FakePrimarySurface DATA
|
||||||
|
|
|
@ -30,6 +30,10 @@ typedef struct IDirectDrawSurfaceImpl
|
||||||
DWORD l_pitch;
|
DWORD l_pitch;
|
||||||
DWORD lx_pitch;
|
DWORD lx_pitch;
|
||||||
|
|
||||||
|
void* bnet_surface;
|
||||||
|
HDC bnet_dc;
|
||||||
|
HBITMAP bnet_bitmap;
|
||||||
|
|
||||||
PBITMAPINFO bmi;
|
PBITMAPINFO bmi;
|
||||||
HBITMAP bitmap;
|
HBITMAP bitmap;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
|
|
@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG
|
||||||
{
|
{
|
||||||
RECT window_rect;
|
RECT window_rect;
|
||||||
int window_state;
|
int window_state;
|
||||||
|
int upscaled_state;
|
||||||
char ini_path[MAX_PATH];
|
char ini_path[MAX_PATH];
|
||||||
char game_path[MAX_PATH];
|
char game_path[MAX_PATH];
|
||||||
char process_file_name[MAX_PATH];
|
char process_file_name[MAX_PATH];
|
||||||
|
|
4
inc/dd.h
4
inc/dd.h
|
@ -137,10 +137,11 @@ typedef struct CNCDDRAW
|
||||||
int show_cursor_count;
|
int show_cursor_count;
|
||||||
BOOL accurate_timers;
|
BOOL accurate_timers;
|
||||||
BOOL resizable;
|
BOOL resizable;
|
||||||
|
BOOL toggle_borderless;
|
||||||
|
BOOL toggle_upscaled;
|
||||||
BOOL nonexclusive;
|
BOOL nonexclusive;
|
||||||
BOOL fixpitch;
|
BOOL fixpitch;
|
||||||
int fixchilds;
|
int fixchilds;
|
||||||
BOOL fixwndprochook;
|
|
||||||
BOOL fixnotresponding;
|
BOOL fixnotresponding;
|
||||||
BOOL locktopleft;
|
BOOL locktopleft;
|
||||||
BOOL d3d9linear;
|
BOOL d3d9linear;
|
||||||
|
@ -155,6 +156,7 @@ typedef struct CNCDDRAW
|
||||||
BOOL bnet_was_fullscreen;
|
BOOL bnet_was_fullscreen;
|
||||||
BOOL bnet_was_upscaled;
|
BOOL bnet_was_upscaled;
|
||||||
RECT bnet_win_rect;
|
RECT bnet_win_rect;
|
||||||
|
DEVMODE bnet_mode;
|
||||||
POINT bnet_pos;
|
POINT bnet_pos;
|
||||||
void* last_freed_palette; /* Dungeon Keeper hack */
|
void* last_freed_palette; /* Dungeon Keeper hack */
|
||||||
BOOL child_window_exists;
|
BOOL child_window_exists;
|
||||||
|
|
|
@ -33,6 +33,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect);
|
||||||
HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD);
|
HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD);
|
||||||
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
|
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
|
||||||
HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter);
|
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
|
#endif
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#define SKIP_HOOK3 0x00000002l
|
#define SKIP_HOOK3 0x00000002l
|
||||||
|
|
||||||
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
|
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* GETCURSORPOSPROC)(LPPOINT);
|
||||||
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
|
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 BOOL(WINAPI* DESTROYWINDOWPROC)(HWND);
|
||||||
typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT);
|
typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT);
|
||||||
typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int);
|
typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int);
|
||||||
|
typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd);
|
||||||
typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
|
typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
|
||||||
typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int);
|
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* LOADLIBRARYAPROC)(LPCSTR);
|
||||||
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
|
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
|
||||||
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
|
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
|
||||||
|
@ -65,8 +68,11 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA;
|
||||||
extern DESTROYWINDOWPROC real_DestroyWindow;
|
extern DESTROYWINDOWPROC real_DestroyWindow;
|
||||||
extern MAPWINDOWPOINTSPROC real_MapWindowPoints;
|
extern MAPWINDOWPOINTSPROC real_MapWindowPoints;
|
||||||
extern SHOWWINDOWPROC real_ShowWindow;
|
extern SHOWWINDOWPROC real_ShowWindow;
|
||||||
|
extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow;
|
||||||
extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
|
extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
|
||||||
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
||||||
|
extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA;
|
||||||
|
extern CREATEFONTAPROC real_CreateFontA;
|
||||||
extern LOADLIBRARYAPROC real_LoadLibraryA;
|
extern LOADLIBRARYAPROC real_LoadLibraryA;
|
||||||
extern LOADLIBRARYWPROC real_LoadLibraryW;
|
extern LOADLIBRARYWPROC real_LoadLibraryW;
|
||||||
extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
|
extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
|
||||||
|
|
|
@ -27,8 +27,15 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable);
|
||||||
BOOL WINAPI fake_DestroyWindow(HWND hWnd);
|
BOOL WINAPI fake_DestroyWindow(HWND hWnd);
|
||||||
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);
|
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);
|
||||||
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow);
|
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);
|
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
|
||||||
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
|
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_LoadLibraryA(LPCSTR lpLibFileName);
|
||||||
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
|
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
|
||||||
HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
|
HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
|
#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
|
||||||
|
|
||||||
#define IDT_TIMER_LEAVE_BNET 541287654
|
#define IDT_TIMER_LEAVE_BNET 541287654
|
||||||
|
#define IDT_TIMER_REDRAW_BNET 541287655
|
||||||
|
|
||||||
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
|
|
@ -90,9 +90,21 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
||||||
HeapFree(GetProcessHeap(), 0, This->surface);
|
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)
|
if (This->hdc)
|
||||||
DeleteDC(This->hdc);
|
DeleteDC(This->hdc);
|
||||||
|
|
||||||
|
if (This->bnet_dc)
|
||||||
|
DeleteDC(This->bnet_dc);
|
||||||
|
|
||||||
if (This->bmi)
|
if (This->bmi)
|
||||||
HeapFree(GetProcessHeap(), 0, This->bmi);
|
HeapFree(GetProcessHeap(), 0, This->bmi);
|
||||||
|
|
||||||
|
|
65
src/config.c
65
src/config.c
|
@ -10,11 +10,13 @@
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES)
|
||||||
|
|
||||||
static void cfg_init();
|
static void cfg_init();
|
||||||
static void cfg_create_ini();
|
static void cfg_create_ini();
|
||||||
|
|
||||||
CNCDDRAWCONFIG g_config =
|
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()
|
void cfg_load()
|
||||||
{
|
{
|
||||||
|
@ -27,17 +29,22 @@ void cfg_load()
|
||||||
g_ddraw->border = cfg_get_bool("border", TRUE);
|
g_ddraw->border = cfg_get_bool("border", TRUE);
|
||||||
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
|
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
|
||||||
g_ddraw->maintas = cfg_get_bool("maintas", 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->devmode = cfg_get_bool("devmode", FALSE);
|
||||||
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
|
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
|
||||||
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
|
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
|
||||||
g_ddraw->vhack = cfg_get_bool("vhack", FALSE);
|
g_ddraw->vhack = cfg_get_bool("vhack", FALSE);
|
||||||
g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE);
|
g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE);
|
||||||
g_ddraw->resizable = cfg_get_bool("resizable", TRUE);
|
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->nonexclusive = cfg_get_bool("nonexclusive", FALSE);
|
||||||
g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE);
|
g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE);
|
||||||
g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT);
|
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->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE);
|
||||||
g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE);
|
g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE);
|
||||||
g_ddraw->releasealt = cfg_get_bool("releasealt", 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);
|
g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE)))
|
g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE);
|
||||||
{
|
|
||||||
g_config.window_rect.left = g_config.window_rect.top = -32000;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg_get_bool("singlecpu", TRUE))
|
if (cfg_get_bool("singlecpu", TRUE))
|
||||||
{
|
{
|
||||||
|
@ -146,6 +150,13 @@ void cfg_load()
|
||||||
else if (tolower(tmp[0]) == 'd') /* direct3d9 */
|
else if (tolower(tmp[0]) == 'd') /* direct3d9 */
|
||||||
{
|
{
|
||||||
g_ddraw->renderer = d3d9_render_main;
|
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 */
|
else if (tolower(tmp[0]) == 'o') /* opengl */
|
||||||
{
|
{
|
||||||
|
@ -164,6 +175,13 @@ void cfg_load()
|
||||||
if (!g_ddraw->wine && d3d9_is_available())
|
if (!g_ddraw->wine && d3d9_is_available())
|
||||||
{
|
{
|
||||||
g_ddraw->renderer = d3d9_render_main;
|
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())
|
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);
|
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()
|
static void cfg_create_ini()
|
||||||
|
@ -221,7 +244,7 @@ static void cfg_create_ini()
|
||||||
if (fh)
|
if (fh)
|
||||||
{
|
{
|
||||||
fputs(
|
fputs(
|
||||||
"; cnc-ddraw - https://github.com/CnCNet/cnc-ddraw - https://cncnet.org\n"
|
"; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw\n"
|
||||||
"\n"
|
"\n"
|
||||||
"[ddraw]\n"
|
"[ddraw]\n"
|
||||||
"; ### Optional settings ###\n"
|
"; ### Optional settings ###\n"
|
||||||
|
@ -240,7 +263,7 @@ static void cfg_create_ini()
|
||||||
"windowed=false\n"
|
"windowed=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Maintain aspect ratio\n"
|
"; Maintain aspect ratio\n"
|
||||||
"maintas=false\n"
|
"maintas=true\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Windowboxing / Integer Scaling\n"
|
"; Windowboxing / Integer Scaling\n"
|
||||||
"boxing=false\n"
|
"boxing=false\n"
|
||||||
|
@ -255,18 +278,18 @@ static void cfg_create_ini()
|
||||||
"\n"
|
"\n"
|
||||||
"; Automatic mouse sensitivity scaling\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"
|
"; 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"
|
"\n"
|
||||||
"; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\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"
|
"; 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"
|
"\n"
|
||||||
"; Window position, -32000 = center to screen\n"
|
"; Window position, -32000 = center to screen\n"
|
||||||
"posX=-32000\n"
|
"posX=-32000\n"
|
||||||
"posY=-32000\n"
|
"posY=-32000\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n"
|
"; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n"
|
||||||
"renderer=auto\n"
|
"renderer=opengl\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Developer mode (don't lock the cursor)\n"
|
"; Developer mode (don't lock the cursor)\n"
|
||||||
"devmode=false\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"
|
"; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n"
|
||||||
"configlang=auto\n"
|
"configlang=auto\n"
|
||||||
"\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"
|
||||||
"\n"
|
"\n"
|
||||||
"; ### Compatibility settings ###\n"
|
"; ### Compatibility settings ###\n"
|
||||||
|
@ -665,6 +694,14 @@ static void cfg_create_ini()
|
||||||
"maintas=false\n"
|
"maintas=false\n"
|
||||||
"boxing=false\n"
|
"boxing=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"; Diablo\n"
|
||||||
|
"[Diablo]\n"
|
||||||
|
"devmode=true\n"
|
||||||
|
"\n"
|
||||||
|
"; Diablo: Hellfire\n"
|
||||||
|
"[hellfire]\n"
|
||||||
|
"devmode=true\n"
|
||||||
|
"\n"
|
||||||
"; Eggsucker\n"
|
"; Eggsucker\n"
|
||||||
"[eggsucker]\n"
|
"[eggsucker]\n"
|
||||||
"fixpitch=true\n"
|
"fixpitch=true\n"
|
||||||
|
@ -691,17 +728,14 @@ static void cfg_create_ini()
|
||||||
"\n"
|
"\n"
|
||||||
"; Grand Theft Auto\n"
|
"; Grand Theft Auto\n"
|
||||||
"[Grand Theft Auto]\n"
|
"[Grand Theft Auto]\n"
|
||||||
"fixwndprochook=true\n"
|
|
||||||
"singlecpu=false\n"
|
"singlecpu=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Grand Theft Auto: London 1969\n"
|
"; Grand Theft Auto: London 1969\n"
|
||||||
"[gta_uk]\n"
|
"[gta_uk]\n"
|
||||||
"fixwndprochook=true\n"
|
|
||||||
"singlecpu=false\n"
|
"singlecpu=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Grand Theft Auto: London 1961\n"
|
"; Grand Theft Auto: London 1961\n"
|
||||||
"[Gta_61]\n"
|
"[Gta_61]\n"
|
||||||
"fixwndprochook=true\n"
|
|
||||||
"singlecpu=false\n"
|
"singlecpu=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Heroes of Might and Magic II: The Succession Wars\n"
|
"; Heroes of Might and Magic II: The Succession Wars\n"
|
||||||
|
@ -717,7 +751,6 @@ static void cfg_create_ini()
|
||||||
"; Invictus\n"
|
"; Invictus\n"
|
||||||
"[Invictus]\n"
|
"[Invictus]\n"
|
||||||
"adjmouse=true\n"
|
"adjmouse=true\n"
|
||||||
"fixwndprochook=true\n"
|
|
||||||
"renderer=opengl\n"
|
"renderer=opengl\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Interstate 76\n"
|
"; Interstate 76\n"
|
||||||
|
|
11
src/dd.c
11
src/dd.c
|
@ -450,9 +450,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
|
||||||
{
|
{
|
||||||
border = FALSE;
|
border = FALSE;
|
||||||
|
|
||||||
g_config.window_rect.left = -32000;
|
|
||||||
g_config.window_rect.top = -32000;
|
|
||||||
|
|
||||||
/* prevent OpenGL from going automatically into fullscreen exclusive mode */
|
/* prevent OpenGL from going automatically into fullscreen exclusive mode */
|
||||||
if (g_ddraw->renderer == ogl_render_main)
|
if (g_ddraw->renderer == ogl_render_main)
|
||||||
nonexclusive = TRUE;
|
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 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);
|
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 };
|
RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y };
|
||||||
|
|
||||||
AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE);
|
AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE);
|
||||||
|
|
|
@ -1190,13 +1190,51 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
|
||||||
return DD_OK;
|
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 */
|
/* Hack for Warcraft II BNE and Diablo */
|
||||||
HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
|
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;
|
HDC primary_dc;
|
||||||
dds_GetDC(This, &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;
|
g_ddraw->ticks_limiter.use_blt_or_flip = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This)
|
||||||
|
{
|
||||||
/* Hack for Star Trek Armada */
|
/* 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;
|
HDC primary_dc;
|
||||||
dds_GetDC(This, &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;
|
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)
|
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run)
|
||||||
{
|
{
|
||||||
|
@ -1471,6 +1520,26 @@ HRESULT dd_CreateSurface(
|
||||||
{
|
{
|
||||||
g_ddraw->primary = dst_surface;
|
g_ddraw->primary = dst_surface;
|
||||||
FakePrimarySurface = dst_surface->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);
|
SelectObject(dst_surface->hdc, dst_surface->bitmap);
|
||||||
|
|
|
@ -232,3 +232,45 @@ DWORD WINAPI DDInternalUnlock(DWORD a)
|
||||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||||
return ret;
|
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);
|
||||||
|
}
|
||||||
|
|
29
src/hook.c
29
src/hook.c
|
@ -40,14 +40,18 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA;
|
||||||
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
|
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
|
||||||
MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints;
|
MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints;
|
||||||
SHOWWINDOWPROC real_ShowWindow = ShowWindow;
|
SHOWWINDOWPROC real_ShowWindow = ShowWindow;
|
||||||
|
SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow;
|
||||||
SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
|
SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
|
||||||
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
||||||
|
CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA;
|
||||||
|
CREATEFONTAPROC real_CreateFontA = CreateFontA;
|
||||||
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
|
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
|
||||||
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
|
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
|
||||||
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
|
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
|
||||||
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
|
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
|
||||||
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
|
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
|
||||||
|
|
||||||
|
|
||||||
static HOOKLIST g_hooks[] =
|
static HOOKLIST g_hooks[] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
@ -76,6 +80,7 @@ static HOOKLIST g_hooks[] =
|
||||||
{ "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 },
|
{ "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 },
|
||||||
{ "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 },
|
{ "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 },
|
||||||
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
||||||
|
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
||||||
{ "", NULL, NULL, 0 }
|
{ "", NULL, NULL, 0 }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -495,6 +500,20 @@ void hook_init()
|
||||||
{
|
{
|
||||||
BOOL initial_hook = !g_hook_active;
|
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
|
#ifdef _MSC_VER
|
||||||
if (initial_hook && g_hook_dinput)
|
if (initial_hook && g_hook_dinput)
|
||||||
{
|
{
|
||||||
|
@ -575,6 +594,16 @@ void hook_exit()
|
||||||
{
|
{
|
||||||
g_hook_active = FALSE;
|
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
|
#ifdef _MSC_VER
|
||||||
if (g_hook_dinput)
|
if (g_hook_dinput)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,7 +13,7 @@ void mouse_lock()
|
||||||
if (g_ddraw->devmode || g_ddraw->bnet_active)
|
if (g_ddraw->devmode || g_ddraw->bnet_active)
|
||||||
return;
|
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 game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
|
||||||
int cur_count = real_ShowCursor(TRUE) - 1;
|
int cur_count = real_ShowCursor(TRUE) - 1;
|
||||||
|
|
|
@ -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);
|
LeaveCriticalSection(&g_ddraw->cs);
|
||||||
|
@ -456,11 +479,6 @@ DWORD WINAPI d3d9_render_main(void)
|
||||||
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
|
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
|
||||||
IDirect3DDevice9_EndScene(g_d3d9.device);
|
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)))
|
if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL)))
|
||||||
{
|
{
|
||||||
DWORD_PTR result;
|
DWORD_PTR result;
|
||||||
|
|
|
@ -74,7 +74,7 @@ DWORD WINAPI gdi_render_main(void)
|
||||||
|
|
||||||
if (g_ddraw->fixchilds)
|
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);
|
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)
|
if (g_ddraw->bnet_active)
|
||||||
{
|
{
|
||||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
if (GetSystemMetrics(SM_CMONITORS) == 1)
|
||||||
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
{
|
||||||
|
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)
|
else if (upscale_hack)
|
||||||
{
|
{
|
||||||
|
|
|
@ -150,7 +150,21 @@ static void ogl_build_programs()
|
||||||
_snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader);
|
_snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL);
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -676,7 +690,7 @@ static void ogl_render()
|
||||||
|
|
||||||
if (g_ddraw->fixchilds)
|
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);
|
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)
|
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);
|
LeaveCriticalSection(&g_ddraw->cs);
|
||||||
|
@ -823,9 +861,6 @@ static void ogl_render()
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_ddraw->bnet_active)
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
SwapBuffers(g_ddraw->render.hdc);
|
SwapBuffers(g_ddraw->render.hdc);
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
|
|
|
@ -132,8 +132,8 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t));
|
strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t));
|
||||||
_snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time);
|
_snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time);
|
||||||
|
|
||||||
if (src->bpp == 8 && src->palette)
|
if (src->bpp == 8 && src->palette)
|
||||||
{
|
{
|
||||||
|
|
88
src/utils.c
88
src/utils.c
|
@ -158,7 +158,7 @@ BOOL util_get_lowest_resolution(
|
||||||
DWORD max_height)
|
DWORD max_height)
|
||||||
{
|
{
|
||||||
BOOL result = FALSE;
|
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 };
|
SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 };
|
||||||
DWORD i = 0;
|
DWORD i = 0;
|
||||||
DEVMODE m;
|
DEVMODE m;
|
||||||
|
@ -174,7 +174,7 @@ BOOL util_get_lowest_resolution(
|
||||||
m.dmPelsWidth < lowest.cx &&
|
m.dmPelsWidth < lowest.cx &&
|
||||||
m.dmPelsHeight < lowest.cy)
|
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)
|
if (res_ratio == org_ratio)
|
||||||
{
|
{
|
||||||
|
@ -279,39 +279,69 @@ void util_toggle_fullscreen()
|
||||||
if (g_ddraw->bnet_active)
|
if (g_ddraw->bnet_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (g_ddraw->windowed)
|
memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height);
|
||||||
|
|
||||||
|
if (g_ddraw->toggle_borderless)
|
||||||
{
|
{
|
||||||
mouse_unlock();
|
if (!g_ddraw->fullscreen)
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
mouse_lock();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mouse_unlock();
|
|
||||||
g_config.window_state = g_ddraw->windowed = TRUE;
|
|
||||||
|
|
||||||
if (g_ddraw->renderer == d3d9_render_main)
|
|
||||||
{
|
{
|
||||||
d3d9_reset();
|
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
|
else
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
|
mouse_unlock();
|
||||||
}
|
|
||||||
|
|
||||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN);
|
g_config.upscaled_state = g_ddraw->fullscreen = FALSE;
|
||||||
//mouse_lock();
|
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;
|
||||||
|
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED);
|
||||||
|
util_update_bnet_pos(0, 0);
|
||||||
|
|
||||||
|
mouse_lock();
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
d3d9_reset();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN);
|
||||||
|
//mouse_lock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
||||||
|
|
||||||
return TRUE;
|
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)
|
if (lpPoint)
|
||||||
{
|
{
|
||||||
|
@ -418,24 +428,12 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
||||||
if (nIndex == GWL_STYLE)
|
if (nIndex == GWL_STYLE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook)
|
if (nIndex == GWL_WNDPROC)
|
||||||
{
|
{
|
||||||
if (dwNewLong == (LONG)compat_WndProc)
|
WNDPROC old = g_ddraw->wndproc;
|
||||||
{
|
g_ddraw->wndproc = (WNDPROC)dwNewLong;
|
||||||
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;
|
|
||||||
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 (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);
|
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)
|
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId)
|
||||||
{
|
{
|
||||||
if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod)
|
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);
|
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 WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName)
|
||||||
{
|
{
|
||||||
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
||||||
|
@ -591,6 +618,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
||||||
|
|
||||||
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
||||||
{
|
{
|
||||||
|
KillTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET);
|
||||||
g_ddraw->bnet_active = FALSE;
|
g_ddraw->bnet_active = FALSE;
|
||||||
SetFocus(g_ddraw->hwnd);
|
SetFocus(g_ddraw->hwnd);
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
|
@ -617,13 +645,13 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
||||||
dst_height,
|
dst_height,
|
||||||
flags);
|
flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled;
|
|
||||||
|
|
||||||
SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
|
|
||||||
|
|
||||||
g_ddraw->resizable = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled;
|
||||||
|
|
||||||
|
SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL);
|
||||||
|
|
||||||
|
g_ddraw->resizable = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -649,10 +677,29 @@ HWND WINAPI fake_CreateWindowExA(
|
||||||
|
|
||||||
if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen)
|
if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen)
|
||||||
{
|
{
|
||||||
int ws = g_config.window_state;
|
if ((g_ddraw->render.mode.dmPelsWidth != 640 ||
|
||||||
util_toggle_fullscreen();
|
g_ddraw->render.mode.dmPelsHeight != 480) &&
|
||||||
g_config.window_state = ws;
|
GetSystemMetrics(SM_CMONITORS) == 1)
|
||||||
g_ddraw->bnet_was_fullscreen = TRUE;
|
{
|
||||||
|
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_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect);
|
||||||
|
@ -673,7 +720,9 @@ HWND WINAPI fake_CreateWindowExA(
|
||||||
g_ddraw->resizable = FALSE;
|
g_ddraw->resizable = FALSE;
|
||||||
|
|
||||||
g_ddraw->bnet_active = TRUE;
|
g_ddraw->bnet_active = TRUE;
|
||||||
|
SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL);
|
||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
|
ReleaseCapture();
|
||||||
}
|
}
|
||||||
|
|
||||||
POINT pt = { 0, 0 };
|
POINT pt = { 0, 0 };
|
||||||
|
@ -684,10 +733,26 @@ HWND WINAPI fake_CreateWindowExA(
|
||||||
int align_y = added_height > 0 ? added_height / 2 : 0;
|
int align_y = added_height > 0 ? added_height / 2 : 0;
|
||||||
int align_x = added_width > 0 ? added_width / 2 : 0;
|
int align_x = added_width > 0 ? added_width / 2 : 0;
|
||||||
|
|
||||||
X += pt.x + align_x;
|
if (g_ddraw->windowed)
|
||||||
Y += pt.y + align_y;
|
{
|
||||||
|
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;
|
dwStyle |= WS_CLIPCHILDREN;
|
||||||
|
|
||||||
|
if (lpWindowName && !lpWindowName[0])
|
||||||
|
{
|
||||||
|
lpWindowName = "Bnet Lobby";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return real_CreateWindowExA(
|
return real_CreateWindowExA(
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "dllmain.h"
|
#include "dllmain.h"
|
||||||
#include "dd.h"
|
#include "dd.h"
|
||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
|
#include "ddsurface.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
#include "render_d3d9.h"
|
#include "render_d3d9.h"
|
||||||
#include "config.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);
|
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_active)
|
||||||
{
|
{
|
||||||
if (g_ddraw->bnet_was_fullscreen)
|
if (g_ddraw->bnet_was_fullscreen)
|
||||||
{
|
{
|
||||||
int ws = g_config.window_state;
|
memcpy(&g_ddraw->render.mode, &g_ddraw->bnet_mode, sizeof(DEVMODE));
|
||||||
util_toggle_fullscreen();
|
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
||||||
g_config.window_state = ws;
|
|
||||||
g_ddraw->bnet_was_fullscreen = FALSE;
|
g_ddraw->bnet_was_fullscreen = FALSE;
|
||||||
}
|
}
|
||||||
else if (g_ddraw->bnet_was_upscaled)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
case IDT_TIMER_REDRAW_BNET:
|
||||||
|
{
|
||||||
|
if (g_ddraw->primary)
|
||||||
|
dds_RedrawBnet(g_ddraw->primary, TRUE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -500,6 +504,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
if (g_ddraw->renderer != d3d9_render_main)
|
if (g_ddraw->renderer != d3d9_render_main)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
||||||
|
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -581,9 +586,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
|
|
||||||
if (g_ddraw->hotkeys.toggle_fullscreen &&
|
if (g_ddraw->hotkeys.toggle_fullscreen &&
|
||||||
wParam == g_ddraw->hotkeys.toggle_fullscreen &&
|
wParam == g_ddraw->hotkeys.toggle_fullscreen &&
|
||||||
!g_ddraw->fullscreen &&
|
|
||||||
context_code &&
|
context_code &&
|
||||||
!key_state)
|
!key_state &&
|
||||||
|
g_ddraw->renderer != d3d9_render_main)
|
||||||
{
|
{
|
||||||
util_toggle_fullscreen();
|
util_toggle_fullscreen();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue