diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a6a9f28d..c88f6e7e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,7 +88,7 @@ add_library(devilution STATIC Source/gendung.cpp Source/gmenu.cpp Source/help.cpp -# Source/init.cpp + Source/init.cpp Source/interfac.cpp Source/inv.cpp Source/items.cpp @@ -137,7 +137,6 @@ add_executable(devilutionx SourceX/capture.cpp SourceX/dx.cpp SourceX/fault.cpp - SourceX/init.cpp SourceX/miniwin.cpp SourceX/miniwin_io.cpp SourceX/miniwin_msg_sdl.cpp diff --git a/SourceS/miniwin.h b/SourceS/miniwin.h index bb3c9eb89..63125ab52 100644 --- a/SourceS/miniwin.h +++ b/SourceS/miniwin.h @@ -67,7 +67,13 @@ typedef WORD *LPWORD; typedef long *LPLONG; typedef DWORD *LPDWORD; typedef void *LPVOID; -typedef CONST void *LPCVOID; +typedef const void *LPCVOID; +typedef void *HBRUSH; +typedef void *HMENU; +typedef void *HICON; +typedef void *LPITEMIDLIST; +typedef LPITEMIDLIST PIDLIST_ABSOLUTE; +typedef LPITEMIDLIST PCIDLIST_ABSOLUTE; typedef int INT; typedef unsigned int UINT; @@ -87,7 +93,8 @@ typedef ULONG_PTR SIZE_T; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; typedef CHAR *LPSTR; -typedef CONST CHAR *LPCSTR; +typedef CHAR *LPTSTR; +typedef const CHAR *LPCSTR; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; @@ -195,11 +202,11 @@ typedef struct tagMSG { POINT pt; } MSG, *LPMSG; -#define MAKEFOURCC(x, y, z, w) \ - (((uint32_t)((uint8_t)x)) \ - | (((uint32_t)((uint8_t)y)) << 8) \ - | (((uint32_t)((uint8_t)z)) << 16) \ - | (((uint32_t)((uint8_t)w)) << 24)) +#define MAKEFOURCC(x, y, z, w) \ + (((uint32_t)((uint8_t)x)) \ + | (((uint32_t)((uint8_t)y)) << 8) \ + | (((uint32_t)((uint8_t)z)) << 16) \ + | (((uint32_t)((uint8_t)w)) << 24)) typedef uint32_t FOURCC; @@ -211,6 +218,25 @@ typedef struct { DWORD dwFlags; } MMCKINFO; +typedef struct tagWNDCLASSEXA { + UINT cbSize; + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HINSTANCE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCSTR lpszMenuName; + LPCSTR lpszClassName; + HICON hIconSm; +} WNDCLASSEXA; + +typedef WORD ATOM; +#define WINUSERAPI +#define WNDCLASSEX WNDCLASSEXA + #define FOURCC_RIFF MAKEFOURCC('W', 'A', 'V', 'E') // @@ -221,6 +247,29 @@ typedef struct { #define THIS #define PURE = 0 +#define CS_HREDRAW 0x0001 +#define CS_VREDRAW 0x0002 + +#define IDC_ARROW 0x1 // Dummy value + +#define CSIDL_STARTMENU 0x000b + +#define SW_HIDE 0 +#define SW_SHOWNORMAL 1 + +#define BLACK_BRUSH 4 + +#define LR_DEFAULTCOLOR 0x0000 + +#define IMAGE_ICON 1 + +#define SM_CXSCREEN 0 +#define SM_CYSCREEN 1 + +#define GW_HWNDNEXT 2 + +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 + #define STDMETHOD(name) STDMETHOD_(HRESULT, name) #define STDMETHOD_(type, name) virtual WINAPI type name @@ -286,7 +335,7 @@ VOID WINAPI SetLastError(DWORD dwErrCode); WINBOOL WINAPI CloseHandle(HANDLE hObject); HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, WINBOOL bManualReset, WINBOOL bInitialState, - LPCSTR lpName); + LPCSTR lpName); #define CreateEvent CreateEventA BOOL WINAPI SetEvent(HANDLE hEvent); BOOL WINAPI ResetEvent(HANDLE hEvent); @@ -317,8 +366,41 @@ HWND WINAPI GetLastActivePopup(HWND hWnd); HWND WINAPI GetTopWindow(HWND hWnd); WINBOOL WINAPI SetForegroundWindow(HWND hWnd); HWND WINAPI SetFocus(HWND hWnd); +HWND GetDesktopWindow(); +HRESULT SHGetSpecialFolderLocation(HWND hwnd, int csidl, PIDLIST_ABSOLUTE *ppidl); +HWND CreateWindowExA( + DWORD dwExStyle, + LPCSTR lpClassName, + LPCSTR lpWindowName, + DWORD dwStyle, + int X, + int Y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam); +#define CreateWindowEx CreateWindowExA HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName); #define FindWindow FindWindowA +BOOL UpdateWindow(HWND hWnd); +BOOL ShowWindow(HWND hWnd, int nCmdShow); +WINUSERAPI ATOM WINAPI RegisterClassExA(const WNDCLASSEX *lpwcx); +#define RegisterClassEx RegisterClassExA +int GetSystemMetrics(int nIndex); +HGDIOBJ GetStockObject(int i); +HCURSOR LoadCursorA(HINSTANCE hInstance, LPCSTR lpCursorName); +#define LoadCursor LoadCursorA +HICON LoadIconA(HINSTANCE hInstance, LPCSTR lpIconName); +#define LoadIcon LoadIconA +HANDLE LoadImageA(HINSTANCE hInst, LPCSTR name, UINT type, int cx, int cy, UINT fuLoad); +#define LoadImage LoadImageA +BOOL SHGetPathFromIDListA(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath); +#define SHGetPathFromIDList SHGetPathFromIDListA +HINSTANCE ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd); +#define ShellExecute ShellExecuteA +int GetClassName(HWND hWnd, LPTSTR lpClassName, int nMaxCount); #define THREAD_BASE_PRIORITY_MAX 2 #define THREAD_PRIORITY_NORMAL 0 @@ -326,7 +408,7 @@ HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName); #define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST - 1) uintptr_t __cdecl _beginthreadex(void *_Security, unsigned _StackSize, unsigned(__stdcall *_StartAddress)(void *), - void *_ArgList, unsigned _InitFlag, unsigned *_ThrdAddr); + void *_ArgList, unsigned _InitFlag, unsigned *_ThrdAddr); HANDLE WINAPI GetCurrentThread(VOID); DWORD WINAPI GetCurrentThreadId(VOID); WINBOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority); @@ -369,20 +451,29 @@ char *__cdecl _strlwr(char *str); #define FILE_ATTRIBUTE_HIDDEN 0x00000002 #define FILE_ATTRIBUTE_SYSTEM 0x00000004 -struct _WIN32_FIND_DATAA { +#define OFS_MAXPATHNAME 128 +#define MAX_PATH 260 + +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; FILETIME ftCreationTime; + FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; -}; - -typedef struct _WIN32_FIND_DATAA *LPWIN32_FIND_DATAA; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[MAX_PATH]; + CHAR cAlternateFileName[14]; + DWORD dwFileType; + DWORD dwCreatorType; + WORD wFinderFlags; +} WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; typedef void *LPOVERLAPPED; typedef BOOL(CALLBACK *DLGPROC)(HWND, UINT, WPARAM, LPARAM); -#define OFS_MAXPATHNAME 128 -#define MAX_PATH 260 - typedef struct _OFSTRUCT { BYTE cBytes; BYTE fFixedDisk; @@ -418,18 +509,18 @@ typedef struct _PROCESS_INFORMATION { typedef void *LPSTARTUPINFOA; WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, - LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); + LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, + LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); #define CreateProcess CreateProcessA VOID WINAPI ExitProcess(UINT uExitCode); DWORD WINAPI GetCurrentProcessId(VOID); HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, - DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName); + DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName); #define CreateFileMapping CreateFileMappingA LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap); + DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap); WINBOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress); DWORD WINAPI WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds); @@ -438,7 +529,7 @@ HWND WINAPI GetWindow(HWND hWnd, UINT uCmd); DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId); DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, - DWORD nSize, LPCSTR lpFileName); + DWORD nSize, LPCSTR lpFileName); #define GetPrivateProfileString GetPrivateProfileStringA int MessageBoxA(HWND hWnd, const char *Text, const char *Title, UINT Flags); #define MessageBox MessageBoxA @@ -464,7 +555,7 @@ LONG SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); #define SetWindowLong SetWindowLongA WINBOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, - LPOVERLAPPED lpOverlapped); + LPOVERLAPPED lpOverlapped); DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); WINBOOL WINAPI SetEndOfFile(HANDLE hFile); DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName); @@ -473,23 +564,36 @@ WINBOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); #define SetFileAttributes SetFileAttributesA HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); #define FindFirstFile FindFirstFileA +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); +#define FindNextFile FindNextFileA WINBOOL WINAPI FindClose(HANDLE hFindFile); HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); + LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, + DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); #define CreateFile CreateFileA WINBOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverlapped); + LPOVERLAPPED lpOverlapped); DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); #define GetWindowsDirectory GetWindowsDirectoryA +DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer); +DWORD GetLogicalDriveStringsA(DWORD nBufferLength, LPSTR lpBuffer); +#define GetLogicalDriveStrings GetLogicalDriveStringsA +UINT GetDriveTypeA(LPCSTR lpRootPathName); +#define GetDriveType GetDriveTypeA WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); #define GetDiskFreeSpace GetDiskFreeSpaceA DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize); #define GetModuleFileName GetModuleFileNameA WINBOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize); #define GetComputerName GetComputerNameA +DWORD GetFileVersionInfoSizeA(LPCSTR lptstrFilename, LPDWORD lpdwHandle); +#define GetFileVersionInfoSize GetFileVersionInfoSizeA +BOOL GetFileVersionInfoA(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData); +#define GetFileVersionInfo GetFileVersionInfoA +BOOL VerQueryValueA(LPCVOID pBlock, LPCSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen); +#define VerQueryValue VerQueryValueA WINBOOL WINAPI DeleteFileA(LPCSTR lpFileName); #define DeleteFile DeleteFileA WINBOOL WINAPI CopyFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, WINBOOL bFailIfExists); @@ -498,8 +602,11 @@ HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle); #define GWL_STYLE (-16) +#define WS_POPUP 0x80000000L #define WS_SYSMENU 0x00080000L +#define DRIVE_CDROM 5 + // // Events // @@ -522,14 +629,14 @@ HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle); #define WM_CHAR 0x0102 #define WM_CAPTURECHANGED 0x0215 -#define WM_CREATE 0x0001 -#define WM_DESTROY 0x0002 -#define WM_PAINT 0x000F -#define WM_CLOSE 0x0010 -#define WM_ERASEBKGND 0x0014 -#define WM_ACTIVATEAPP 0x001C +#define WM_CREATE 0x0001 +#define WM_DESTROY 0x0002 +#define WM_PAINT 0x000F +#define WM_CLOSE 0x0010 +#define WM_ERASEBKGND 0x0014 +#define WM_ACTIVATEAPP 0x001C #define WM_QUERYNEWPALETTE 0x030F -#define WM_PALETTECHANGED 0x0311 +#define WM_PALETTECHANGED 0x0311 #define SC_CLOSE 0xF060 diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 93e77d6e7..98f43977f 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -367,6 +367,7 @@ void InitFont() printf("TTF_Init: %s\n", TTF_GetError()); exit(1); } + atexit(TTF_Quit); // TODO locate font dynamically, and use fallback font if missing font = TTF_OpenFont("/usr/share/fonts/truetype/msttcorefonts/Times_New_Roman_Bold.ttf", 17); diff --git a/SourceX/init.cpp b/SourceX/init.cpp deleted file mode 100644 index 8945ddf26..000000000 --- a/SourceX/init.cpp +++ /dev/null @@ -1,269 +0,0 @@ -#include "pch.h" - -_SNETVERSIONDATA fileinfo; -int gbActive; // weak -char diablo_exe_path[260]; -void *unused_mpq; -char patch_rt_mpq_path[260]; -WNDPROC CurrentProc; -void *diabdat_mpq; -char diabdat_mpq_path[260]; -void *patch_rt_mpq; -int killed_mom_parent; // weak -BOOLEAN screensaver_enabled_prev; - -/* data */ - -char gszVersionNumber[260] = "internal version unknown"; -char gszProductName[260] = "Diablo v1.09"; - -void __fastcall init_cleanup(BOOL show_cursor) -{ - pfile_flush_W(); - init_disable_screensaver(0); - init_run_office_from_start_menu(); - - if (diabdat_mpq) { - SFileCloseArchive(diabdat_mpq); - diabdat_mpq = NULL; - } - if (patch_rt_mpq) { - SFileCloseArchive(patch_rt_mpq); - patch_rt_mpq = NULL; - } - if (unused_mpq) { - SFileCloseArchive(unused_mpq); - unused_mpq = NULL; - } - - UiDestroy(); - effects_cleanup_sfx(); - sound_cleanup(); - NetClose(); - dx_cleanup(); - MI_Dummy(show_cursor); - StormDestroy(); - - if (show_cursor) - ShowCursor(TRUE); -} - -void __cdecl init_run_office_from_start_menu() -{ - DUMMY(); -} -// 634CA0: using guessed type int killed_mom_parent; - -// SDL_DisableScreenSaver -void __fastcall init_disable_screensaver(BOOLEAN disable) -{ - BOOLEAN v1; // al - char Data[16]; // [esp+4h] [ebp-20h] - DWORD Type; // [esp+14h] [ebp-10h] - DWORD cbData; // [esp+18h] [ebp-Ch] - HKEY phkResult; // [esp+1Ch] [ebp-8h] - BOOLEAN v6; // [esp+20h] [ebp-4h] - - // BUGFIX: this is probably the worst possible way to do this. Alternatives: ExtEscape() with SETPOWERMANAGEMENT, - // SystemParametersInfo() with SPI_SETSCREENSAVEACTIVE/SPI_SETPOWEROFFACTIVE/SPI_SETLOWPOWERACTIVE - - v6 = disable; - if (!RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &phkResult)) { - if (v6) { - cbData = 16; - if (!RegQueryValueEx(phkResult, "ScreenSaveActive", 0, &Type, (LPBYTE)Data, &cbData)) - screensaver_enabled_prev = Data[0] != '0'; - v1 = 0; - } else { - v1 = screensaver_enabled_prev; - } - Data[1] = 0; - Data[0] = (v1 != 0) + '0'; - RegSetValueEx(phkResult, "ScreenSaveActive", 0, REG_SZ, (const BYTE *)Data, 2u); - RegCloseKey(phkResult); - } -} - -/** - * Case insensitive search for a file name in a directory. - * @return Empty string when not found. - */ -static std::string find_file_in_directory(const char *dirpath, const char *file) -{ - DIR *dir = opendir(dirpath); - if (!dir) { - return ""; - } - - struct dirent *entry; - std::string result; - while ((entry = readdir(dir)) != NULL) { - if (strcasecmp(entry->d_name, file) == 0) { - result = std::string(dirpath) + "/" + entry->d_name; - break; - } - } - closedir(dir); - - return result; -} - -static std::string find_file_in_std_directories(const char *file) -{ - for (auto dir : { ".", "..", "../.." }) { - auto path = find_file_in_directory(dir, file); - - if (!path.empty()) { - printf("%s \n", path.c_str()); - return path; - } - } - - TermMsg("Required file %s not found", file); -} - -void FakeWMDestroy() -{ - MainWndProc(NULL, WM_DESTROY, NULL, NULL); -} - -void __fastcall init_create_window(int nCmdShow) -{ - DUMMY(); - - pfile_init_save_directory(); - atexit(SDL_Quit); - atexit(TTF_Quit); - SDL_Init(SDL_INIT_EVERYTHING); - - int flags = SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_INPUT_GRABBED; - if (!fullscreen) { - flags = SDL_WINDOW_RESIZABLE; - } - window = SDL_CreateWindow("Diablo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, flags); - - renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC); - printf("Window And Renderer Created!\n"); - - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2"); - SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT); - - surface = SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); - assert(surface); - - texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT); - assert(texture); - - palette = SDL_AllocPalette(256); - - j_lock_buf_priv(0); //FIXME 0? - - dx_init(NULL); - snd_init(NULL); - - init_archives(); - gmenu_init_menu(); - atexit(FakeWMDestroy); -} - -LRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - if (Msg > WM_ERASEBKGND) { - if (Msg == WM_ACTIVATEAPP) { - init_activate_window(hWnd, wParam); - } else { - if (Msg == WM_QUERYNEWPALETTE) { - SDrawRealizePalette(); - return 1; - } - if (Msg == WM_PALETTECHANGED && (HWND)wParam != hWnd) - SDrawRealizePalette(); - } - } else { - switch (Msg) { - case WM_ERASEBKGND: - return 0; - case WM_CREATE: - ghMainWnd = hWnd; - break; - case WM_DESTROY: - init_cleanup(1); - ghMainWnd = 0; - PostQuitMessage(0); - break; - case WM_PAINT: - drawpanflag = 255; - break; - case WM_CLOSE: - return 0; - } - } - return DefWindowProc(hWnd, Msg, wParam, lParam); -} - -void __fastcall init_activate_window(HWND hWnd, BOOLEAN bActive) -{ - LONG dwNewLong; // eax - - gbActive = bActive; - UiAppActivate(bActive); - dwNewLong = GetWindowLong(hWnd, GWL_STYLE); - - if (gbActive && fullscreen) - dwNewLong &= ~WS_SYSMENU; - else - dwNewLong |= WS_SYSMENU; - - SetWindowLong(hWnd, GWL_STYLE, dwNewLong); - - if (gbActive) { - drawpanflag = 255; - ResetPal(); - } -} -// 52571C: using guessed type int drawpanflag; -// 634980: using guessed type int gbActive; - -LRESULT __stdcall WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - LRESULT result; // eax - - if (CurrentProc) - result = CurrentProc(hWnd, Msg, wParam, lParam); - else - result = MainWndProc(hWnd, Msg, wParam, lParam); - return result; -} - -WNDPROC __fastcall SetWindowProc(WNDPROC NewProc) -{ - WNDPROC OldProc = CurrentProc; - CurrentProc = NewProc; - return OldProc; -} - -void __cdecl init_archives() -{ - DUMMY(); // We will need to remove the find_file_in_std_directories funct when it comes to mobile - - SFileOpenArchive(find_file_in_std_directories("diabdat.mpq").c_str(), 1000, MPQ_FLAG_READ_ONLY, &diabdat_mpq); - assert(diabdat_mpq); - - SFileOpenArchive("patch_rt.mpq", 1000, MPQ_FLAG_READ_ONLY, &patch_rt_mpq); -} - -void GetAvailableHeroes() -{ -} - -void HideCursor() -{ - Uint8 l_data[1]; - Uint8 l_mask[1]; - - l_data[0] = 0; - l_mask[0] = 0; - - SDL_Cursor *g_cursor = SDL_CreateCursor(l_data, l_mask, 1, 1, 0, 0); - SDL_SetCursor(g_cursor); -} diff --git a/SourceX/miniwin.cpp b/SourceX/miniwin.cpp index 4520ccea4..dc85033a3 100644 --- a/SourceX/miniwin.cpp +++ b/SourceX/miniwin.cpp @@ -74,12 +74,17 @@ UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { char *name = SDL_GetPrefPath("diasurgical", "devilution"); strncpy(lpBuffer, name, uSize); + SDL_free(name); + + DWORD len = strlen(lpBuffer); + + lpBuffer[len - 1] = '\0'; - return strlen(name); + return len - 1; } WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { struct statvfs fiData; int success = statvfs("/", &fiData); @@ -97,16 +102,11 @@ WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerClus DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) { char *name = SDL_GetPrefPath("diasurgical", "devilution"); - - if (strlen(name) >= nSize) { - printf("Save path longer then %d: %s\n", nSize, name); - ABORT(); - } - strncpy(lpFilename, name, nSize); SDL_free(name); - int len = strlen(lpFilename); + DWORD len = strlen(lpFilename); + lpFilename[len - 1] = '\\'; return len; @@ -119,6 +119,69 @@ WINBOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) *nSize = strlen(lpBuffer); } +DWORD GetFileVersionInfoSizeA(LPCSTR lptstrFilename, LPDWORD lpdwHandle) +{ + DUMMY(); + *lpdwHandle = 0; + + return 1532; +} + +BOOL GetFileVersionInfoA(LPCSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData) +{ + DUMMY(); + *(int *)lpData = 16711836; // TODO use actual version freom .rc + + return TRUE; +} + +BOOL VerQueryValueA(LPCVOID pBlock, LPCSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen) +{ + DUMMY(); + VS_FIXEDFILEINFO lpBuffer; + + // Set internal version, TODO use actual version freom .rc + lpBuffer.dwProductVersionMS = 1; + lpBuffer.dwProductVersionMS <<= 16; + lpBuffer.dwProductVersionMS |= 0 & 0xFFFF; + lpBuffer.dwProductVersionLS = 9; + lpBuffer.dwProductVersionLS <<= 16; + lpBuffer.dwProductVersionLS |= 2 & 0xFFFF; + *lplpBuffer = (LPVOID *)&lpBuffer; + + return TRUE; +} + +DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer) +{ + char *base_path = SDL_GetBasePath(); + if (!base_path) { + base_path = SDL_strdup("./"); + } + + strncpy(lpBuffer, base_path, nBufferLength); + SDL_free(base_path); + + DWORD len = strlen(lpBuffer); + + lpBuffer[len - 1] = '\\'; + + return len; +} + +DWORD GetLogicalDriveStringsA(DWORD nBufferLength, LPSTR lpBuffer) +{ + DUMMY(); + sprintf(lpBuffer, "/"); + + return 3; +} + +UINT GetDriveTypeA(LPCSTR lpRootPathName) +{ + return DRIVE_CDROM; +} + WINBOOL WINAPI DeleteFileA(LPCSTR lpFileName) { UNIMPLEMENTED(); @@ -179,6 +242,192 @@ HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName) return NULL; } +void FakeWMDestroy() +{ + MainWndProc(NULL, WM_DESTROY, NULL, NULL); +} + +HWND CreateWindowExA( + DWORD dwExStyle, + LPCSTR lpClassName, + LPCSTR lpWindowName, + DWORD dwStyle, + int X, + int Y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam) +{ + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { + SDL_Log("SDL_RenderSetLogicalSize: %s\n", SDL_GetError()); + return 1; + } + atexit(SDL_Quit); + + int flags = SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_INPUT_GRABBED; + if (!fullscreen) { + flags = SDL_WINDOW_RESIZABLE; + } + window = SDL_CreateWindow(lpWindowName, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, nWidth, nHeight, flags); + atexit(FakeWMDestroy); + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC); + if (renderer == NULL) { + SDL_Log("SDL_CreateRenderer: %s\n", SDL_GetError()); + return NULL; + } + + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2"); + if (SDL_RenderSetLogicalSize(renderer, nWidth, nHeight) != 0) { + SDL_Log("SDL_RenderSetLogicalSize: %s\n", SDL_GetError()); + return NULL; + } + + surface = SDL_CreateRGBSurface(0, nWidth, nHeight, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); + if (surface == NULL) { + SDL_Log("SDL_CreateRGBSurface: %s\n", SDL_GetError()); + return NULL; + } + + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, nWidth, nHeight); + if (texture == NULL) { + SDL_Log("SDL_CreateTexture: %s\n", SDL_GetError()); + return NULL; + } + + palette = SDL_AllocPalette(256); + if (palette == NULL) { + SDL_Log("SDL_AllocPalette: %s\n", SDL_GetError()); + return NULL; + } + + j_lock_buf_priv(0); //FIXME 0? + + return window; +} + +/** + * @brief Appears to be used to clear the FB on init + */ +BOOL UpdateWindow(HWND hWnd) +{ +} + +BOOL ShowWindow(HWND hWnd, int nCmdShow) +{ + if (nCmdShow == SW_HIDE) { + SDL_HideWindow(window); + } else if (nCmdShow == SW_SHOWNORMAL) { + SDL_ShowWindow(window); + } +} + +WINUSERAPI ATOM WINAPI RegisterClassExA(const WNDCLASSEX *lpwcx) +{ + DUMMY(); +} + +/** + * @brief Because we don't change resolution it dosen't make sens to use SDL_GetCurrentDisplayMode + */ +int GetSystemMetrics(int nIndex) +{ + switch (nIndex) { + case SM_CXSCREEN: + return 640; + case SM_CYSCREEN: + return 480; + } +} + +/** + * @brief Used for getting a black brush + */ +HGDIOBJ GetStockObject(int i) +{ + return NULL; +} + +/** + * @brief Used to load window icon + */ +HICON LoadIconA(HINSTANCE hInstance, LPCSTR lpIconName) +{ + DUMMY(); //SDL_SetWindowIcon +} + +/** + * @brief Used to load small window icon + */ +HANDLE LoadImageA(HINSTANCE hInst, LPCSTR name, UINT type, int cx, int cy, UINT fuLoad) +{ + DUMMY(); +} + +HCURSOR LoadCursorA(HINSTANCE hInstance, LPCSTR lpCursorName) +{ + DUMMY(); //SDL_CreateCursor +} + +/** + * @brief Used to shutdown a MS Office 95 tool bar + */ +HWND WINAPI GetForegroundWindow(VOID) +{ + return NULL; +} + +/** + * @brief Used to shutdown a MS Office 95 tool bar + */ +int GetClassName(HWND hWnd, LPTSTR lpClassName, int nMaxCount) +{ + return 0; +} + +/** + * @brief Used to find MS Office 95 + */ +HRESULT SHGetSpecialFolderLocation(HWND hwnd, int csidl, PIDLIST_ABSOLUTE *ppidl) +{ + return NULL; +} + +/** + * @brief Used to find MS Office 95 + */ +HINSTANCE ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd) +{ + return NULL; +} + +/** + * @brief Used to find MS Office 95 + */ +HWND GetDesktopWindow() +{ + return NULL; +} + +/** + * @brief Used to find MS Office 95 + */ +BOOL SHGetPathFromIDListA(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath) +{ + return FALSE; +} + +/** + * @brief Used to find MS Office 95 + */ +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) +{ + return FALSE; +} + VOID WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) { DUMMY(); @@ -231,9 +480,9 @@ UINT WINAPI GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALET } WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, - LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation) + LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, + LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation) { UNIMPLEMENTED(); } @@ -249,7 +498,7 @@ DWORD WINAPI GetCurrentProcessId(VOID) } HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, - DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName) + DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName) { DUMMY(); assert(hFile == (HANDLE)-1); @@ -257,7 +506,7 @@ HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappi } LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, - DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap) + DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap) { UNIMPLEMENTED(); } @@ -272,11 +521,6 @@ DWORD WINAPI WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds) UNIMPLEMENTED(); } -HWND WINAPI GetForegroundWindow(VOID) -{ - UNIMPLEMENTED(); -} - HWND WINAPI GetWindow(HWND hWnd, UINT uCmd) { UNIMPLEMENTED(); @@ -288,7 +532,7 @@ DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId) } DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, - DWORD nSize, LPCSTR lpFileName) + DWORD nSize, LPCSTR lpFileName) { if (!SRegLoadString(lpAppName, lpKeyName, 0, lpReturnedString, nSize)) { strncpy(lpReturnedString, lpDefault, nSize); diff --git a/SourceX/storm.cpp b/SourceX/storm.cpp index 123feeee1..47559f39c 100644 --- a/SourceX/storm.cpp +++ b/SourceX/storm.cpp @@ -1,5 +1,5 @@ -#include "pch.h" #include "../3rdParty/Radon/Radon/include/Radon.hpp" +#include "pch.h" DWORD nLastError = 0; @@ -269,7 +269,7 @@ void *STORMAPI SMemReAlloc(void *location, unsigned int amount, char *logfilenam bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, int *dataSize = NULL) { - radon::Section* section = ini.getSection(sectionName); + radon::Section *section = ini.getSection(sectionName); if (!section) return false; @@ -289,7 +289,7 @@ bool getIniValue(const char *sectionName, const char *keyName, char *string, int void setIniValue(const char *sectionName, const char *keyName, char *value, int len = 0) { - radon::Section* section = ini.getSection(sectionName); + radon::Section *section = ini.getSection(sectionName); if (!section) { ini.addSection(sectionName); section = ini.getSection(sectionName); @@ -445,10 +445,10 @@ BOOLEAN __cdecl StormDestroy(void) DUMMY(); } -// bool __stdcall SFileSetBasePath(char *) -//{ -// UNIMPLEMENTED(); -//} +BOOLEAN __stdcall SFileSetBasePath(char *) +{ + DUMMY(); +} void __cdecl SDrawRealizePalette(void) {