-
Notifications
You must be signed in to change notification settings - Fork 925
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WinMain+Direct file access from HDD #456
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -254,71 +254,81 @@ void __cdecl free_game() | |
FreeGameMem(); | ||
} | ||
|
||
bool __cdecl diablo_get_not_running() | ||
BOOL __cdecl diablo_get_not_running() | ||
{ | ||
SetLastError(0); | ||
CreateEvent(NULL, FALSE, FALSE, "DiabloEvent"); | ||
return GetLastError() != ERROR_ALREADY_EXISTS; | ||
} | ||
|
||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) | ||
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) | ||
{ | ||
HINSTANCE v4; // esi | ||
char Filename[260]; // [esp+8h] [ebp-10Ch] | ||
char value_name[8]; // [esp+10Ch] [ebp-8h] | ||
HINSTANCE hInst; | ||
int nData; | ||
char szFileName[MAX_PATH]; | ||
|
||
v4 = hInstance; | ||
hInst = hInstance; | ||
#ifndef DEBUGGER | ||
diablo_reload_process(hInstance); | ||
#endif | ||
ghInst = v4; | ||
if (RestrictedTest()) | ||
ghInst = hInst; | ||
|
||
if(RestrictedTest()) | ||
ErrOkDlg(IDD_DIALOG10, 0, "C:\\Src\\Diablo\\Source\\DIABLO.CPP", 877); | ||
if (ReadOnlyTest()) { | ||
if (!GetModuleFileName(ghInst, Filename, 0x104u)) | ||
*Filename = '\0'; | ||
DirErrorDlg(Filename); | ||
if(ReadOnlyTest()) { | ||
if(!GetModuleFileName(ghInst, szFileName, sizeof(szFileName))) | ||
szFileName[0] = '\0'; | ||
DirErrorDlg(szFileName); | ||
} | ||
|
||
ShowCursor(FALSE); | ||
srand(GetTickCount()); | ||
InitHash(); | ||
exception_get_filter(); | ||
if (!diablo_find_window("DIABLO") && diablo_get_not_running()) { | ||
|
||
BOOL bNoEvent = diablo_get_not_running(); | ||
if(!diablo_find_window("DIABLO") && bNoEvent) { | ||
#ifdef _DEBUG | ||
SFileEnableDirectAccess(TRUE); | ||
#endif | ||
diablo_init_screen(); | ||
diablo_parse_flags(lpCmdLine); | ||
init_create_window(nCmdShow); | ||
sound_init(); | ||
UiInitialize(); | ||
|
||
#ifdef _DEBUG | ||
if (showintrodebug) | ||
play_movie("gendata\\logo.smk", 1); | ||
#else | ||
play_movie("gendata\\logo.smk", 1); | ||
if(showintrodebug) | ||
#endif | ||
strcpy(value_name, "Intro"); | ||
if (!SRegLoadValue("Diablo", value_name, 0, (int *)&hInstance)) | ||
hInstance = (HINSTANCE)1; | ||
if (hInstance) | ||
play_movie("gendata\\diablo1.smk", 1); | ||
SRegSaveValue("Diablo", value_name, 0, 0); | ||
play_movie("gendata\\logo.smk", TRUE); | ||
AJenbo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
char szValueName[] = "Intro"; | ||
if(!SRegLoadValue("Diablo", szValueName, 0, &nData)) | ||
nData = 1; | ||
if(nData) | ||
AJenbo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
play_movie("gendata\\diablo1.smk", TRUE); | ||
SRegSaveValue("Diablo", szValueName, 0, 0); | ||
|
||
#ifdef _DEBUG | ||
if (showintrodebug) { | ||
if(showintrodebug) { | ||
#endif | ||
UiTitleDialog(7); | ||
BlackPalette(); | ||
#ifdef _DEBUG | ||
} | ||
#else | ||
UiTitleDialog(7); | ||
BlackPalette(); | ||
#endif | ||
|
||
mainmenu_loop(); | ||
UiDestroy(); | ||
SaveGamma(); | ||
if (ghMainWnd) { | ||
|
||
if(ghMainWnd) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if (ghMainWnd != NULL) { |
||
Sleep(300); | ||
DestroyWindow(ghMainWnd); | ||
} | ||
} | ||
return 0; | ||
|
||
return FALSE; | ||
} | ||
|
||
void __fastcall diablo_parse_flags(char *args) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -41,8 +41,8 @@ int __fastcall diablo_init_menu(int a1, int bSinglePlayer); | |
void __fastcall run_game_loop(int uMsg); | ||
void __fastcall start_game(int uMsg); | ||
void __cdecl free_game(); | ||
bool __cdecl diablo_get_not_running(); | ||
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); | ||
BOOL __cdecl diablo_get_not_running(); | ||
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've never seen the Would int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wasn't 100% sure what to use here, since There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, makes sense. Still boggles my mind to have a PASCAL calling convention though, as the arguments are passed in reverse order as opposed to regular C calling conventions? From https://en.wikipedia.org/wiki/X86_calling_conventions#pascal:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After a bit of research it seems that I don't think it should be an issue though, PASCAL and WINAPI generate the same code. It was likely also used for the WindowProc routine, i.e.: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll probably change it back, just to prevent confusion. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Generally, I'd prefer if when converting a function from one call type to another, We could use an alias instead if just changing the call type, for the sake of documentation and future reference. for example, instead of doing
I'd prefer
:D There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I seam to remember having heard that they originally wanted to target dos. |
||
void __fastcall diablo_parse_flags(char *args); | ||
void __cdecl diablo_init_screen(); | ||
BOOL __fastcall diablo_find_window(LPCSTR lpClassName); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (GetModuleFileName(...) == 0)
GetModuleFileName returns the length of the returned name, not a boolean value.