Browse Source

Unstub init.cpp

- Internal version is now set correctly
- Much better error handeling for SDL
- mpq files must now be in the same folder as the exec
- Window name is now "DIABLO" like the original
pull/25/head
Anders Jenbo 7 years ago
parent
commit
86b78a2ba5
  1. 3
      CMakeLists.txt
  2. 175
      SourceS/miniwin.h
  3. 1
      SourceX/DiabloUI/diabloui.cpp
  4. 269
      SourceX/init.cpp
  5. 284
      SourceX/miniwin.cpp
  6. 14
      SourceX/storm.cpp

3
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

175
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

1
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);

269
SourceX/init.cpp

@ -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);
}

284
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);

14
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)
{

Loading…
Cancel
Save