Browse Source
- 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 originalpull/25/head
6 changed files with 414 additions and 332 deletions
@ -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); |
||||
} |
||||
Loading…
Reference in new issue