You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
405 lines
11 KiB
405 lines
11 KiB
#include <dirent.h> |
|
#include <string> |
|
|
|
#include "../types.h" |
|
#include "stubs.h" |
|
|
|
#ifndef NO_GLOBALS |
|
void *diabdat_mpq; |
|
void *patch_rt_mpq; |
|
|
|
_SNETVERSIONDATA fileinfo; |
|
WNDPROC CurrentProc; |
|
int gbActive; |
|
#endif |
|
|
|
char gszVersionNumber[260]; |
|
char gszProductName[260]; |
|
|
|
/** |
|
* 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()) { |
|
return path; |
|
} |
|
} |
|
|
|
TermMsg("Required file %s not found", file); |
|
} |
|
|
|
void __fastcall init_create_window(int nCmdShow) |
|
{ |
|
DUMMY(); |
|
SDL_Diablo_UI(); |
|
|
|
init_get_file_info(); |
|
|
|
// pfile_init_save_directory(); |
|
|
|
dx_init(NULL); |
|
snd_init(NULL); |
|
|
|
init_archives(); |
|
} |
|
|
|
LRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) |
|
{ |
|
UNIMPLEMENTED(); |
|
} |
|
|
|
WNDPROC __fastcall SetWindowProc(WNDPROC NewProc) |
|
{ |
|
WNDPROC OldProc = CurrentProc; |
|
CurrentProc = NewProc; |
|
return OldProc; |
|
} |
|
|
|
void __cdecl init_archives() |
|
{ |
|
DUMMY(); |
|
|
|
SFileOpenArchive(find_file_in_std_directories("diabdat.mpq").c_str(), 1000, 0, &diabdat_mpq); |
|
assert(diabdat_mpq); |
|
|
|
SFileOpenArchive(find_file_in_std_directories("patch_rt.mpq").c_str(), 1000, 0, &patch_rt_mpq); |
|
assert(patch_rt_mpq); |
|
} |
|
|
|
void __cdecl init_get_file_info() |
|
{ |
|
strcpy(gszVersionNumber, "0.1"); |
|
strcpy(gszProductName, "devil-test"); |
|
} |
|
|
|
void LoadCharNamesintoMemory(int start, int end) |
|
{ |
|
PkPlayerStruct pkplr; |
|
int unused; |
|
void *CharFile; |
|
char *p_hero_names = *hero_names; // Not sure if this is correct |
|
|
|
memset(hero_names, 0, 0x140u); |
|
|
|
while (start != end) { |
|
CharFile = pfile_open_save_archive(&unused, start); |
|
if (CharFile) { |
|
if (pfile_read_hero(CharFile, &pkplr)) { |
|
strcpy(p_hero_names, pkplr.pName); |
|
UnPackPlayer(&pkplr, 0, 0); |
|
pfile_archive_contains_game(CharFile); |
|
} |
|
pfile_SFileCloseArchive(CharFile); |
|
} |
|
|
|
p_hero_names += 32; |
|
start++; |
|
} |
|
// memcpy(shero_names, hero_names, sizeof(hero_names)); |
|
} |
|
|
|
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); |
|
} |
|
|
|
void SDL_Diablo_UI() // I anticipate to move this later. |
|
{ |
|
snd_init(0); |
|
init_archives(); |
|
music_start(5); |
|
printf("This is Run And We need a Wile Loop"); |
|
|
|
int menu = 0; |
|
SDL_Event event; |
|
int x, y; |
|
bool quit = false; |
|
int CharsLoaded = 0; |
|
/* Comment out these functions */ |
|
printf("Main Menu Init\n"); |
|
// SDL_ShowCursor(SDL_DISABLE);//Doesn't really work... Use HideCursor() instead. |
|
SdlDiabloMainWindow(); |
|
|
|
SDLCreateDiabloCursor(); |
|
HideCursor(); |
|
|
|
while (1 && quit == false) { |
|
|
|
if (menu == 0) { |
|
|
|
CreateMainDiabloMenu(); |
|
SDL_RenderDiabloMainPage(); |
|
// printf("I am 0\n"); |
|
} |
|
|
|
if (menu == 2) { |
|
|
|
if (CharsLoaded == 0) { |
|
LoadCharNamesintoMemory(0, 10); |
|
CharsLoaded = 1; |
|
} |
|
|
|
RenderCharNames(); |
|
SDL_RenderDiabloSinglePlayerPage(); |
|
gbMaxPlayers = 1; |
|
} |
|
|
|
if (menu == 3) { |
|
|
|
CreateMenuDialogBox(); |
|
} |
|
|
|
if (SDL_PollEvent(&event)) { |
|
|
|
if (event.type == SDL_QUIT) { |
|
|
|
quit = true; |
|
SDL_Quit(); |
|
// goto LABEL_16; |
|
} |
|
|
|
if (event.type == SDL_MOUSEMOTION) { |
|
// Get the mouse offsets |
|
x = event.motion.x; |
|
y = event.motion.y; |
|
} |
|
|
|
// If a key was pressed |
|
if (event.type == SDL_MOUSEBUTTONDOWN) { |
|
|
|
if (event.button.button == SDL_BUTTON_LEFT) { |
|
x = event.button.x; |
|
y = event.button.y; |
|
printf("X %d , Y %d\n", x, y); |
|
|
|
if (menu == 0) { |
|
|
|
if ((x > SinglePlrBox.x) && (y > SinglePlrBox.y) && (x < SinglePlrBox.w) && |
|
(y < SinglePlrBox.h)) { // Single clicked |
|
printf("SinglePlayer Diablo\n"); |
|
// effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
// a2 = 2; |
|
menu = 2; |
|
} |
|
|
|
if ((x > MultiPlrBox.x) && (y > MultiPlrBox.y) && (x < MultiPlrBox.w) && |
|
(y < MultiPlrBox.h)) { // MultiBox clicked |
|
printf("MultiPlayer Diablo\n"); |
|
// effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
// v1 = mainmenu_multi_player(); |
|
// goto LABEL_15; |
|
} |
|
if ((x > ReplayIntroBox.x) && (y > ReplayIntroBox.y) && (x < ReplayIntroBox.w) && |
|
(y < ReplayIntroBox.h)) { // Reply Intro clicked |
|
printf("Replay Intro\n"); |
|
// effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
// goto LABEL_10; |
|
} |
|
if ((x > ShowCreditsBox.x) && (y > ShowCreditsBox.y) && (x < ShowCreditsBox.w) && |
|
(y < ShowCreditsBox.h)) { // ShowCredits clicked |
|
printf("Show Credits\n"); |
|
// effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
UiCreditsDialog(16); |
|
} |
|
|
|
if ((x > ExitBox.x) && (y > ExitBox.y) && (x < ExitBox.w) && |
|
(y < ExitBox.h)) { // ExitBox clicked |
|
printf("Exiting Diablo\n"); |
|
// effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
|
|
quit = true; |
|
SDL_Quit(); |
|
exit(0); |
|
// goto LABEL_16; |
|
} |
|
|
|
} // End of this Menu0 |
|
|
|
if (menu == 2) { |
|
|
|
// int x = 364; |
|
// int y = 240; |
|
int ClickListStart = 250; |
|
int sizeOfBox = 30; |
|
int WidthOfBox = 400; |
|
int ClickListEnd = 343; |
|
|
|
// Render Clicks |
|
if (TotalPlayers >= 1 && (x > ClickListStart) && (y > ClickListStart) && |
|
(x < ClickListStart + WidthOfBox) && (y < ClickListStart + sizeOfBox)) { // MultiBox clicked |
|
printf("Player %s\n", hero_names[0]); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[0]); |
|
printf("Player %s\n", chr_name_str); |
|
break; |
|
} |
|
|
|
if (TotalPlayers >= 2 && (x > ClickListStart) && (y > ClickListStart + (sizeOfBox)) && |
|
(x < ClickListStart + WidthOfBox) && |
|
(y < ClickListStart + (sizeOfBox) + sizeOfBox)) { // MultiBox clicked |
|
printf("Player 2 Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[1]); |
|
printf("Player %s\n", chr_name_str); |
|
// XStartGame(); |
|
break; |
|
} |
|
if (TotalPlayers >= 3 && (x > ClickListStart) && (y > ClickListStart + (sizeOfBox * 2)) && |
|
(x < ClickListStart + WidthOfBox) && |
|
(y < ClickListStart + (sizeOfBox * 2) + sizeOfBox)) { // MultiBox clicked |
|
printf("Player 3 Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[2]); |
|
printf("Player %s\n", chr_name_str); |
|
break; |
|
// XStartGame(); |
|
} |
|
if (TotalPlayers >= 4 && (x > ClickListStart) && (y > ClickListStart + (sizeOfBox * 3)) && |
|
(x < ClickListStart + WidthOfBox) && |
|
(y < ClickListStart + (sizeOfBox * 3) + sizeOfBox)) { // MultiBox clicked |
|
printf("Player 4 Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[3]); |
|
printf("Player %s\n", chr_name_str); |
|
break; |
|
// XStartGame(); |
|
} |
|
if (TotalPlayers >= 5 && (x > ClickListStart) && (y > ClickListStart + (sizeOfBox * 4)) && |
|
(x < ClickListStart + WidthOfBox) && |
|
(y < ClickListStart + (sizeOfBox * 4) + sizeOfBox)) { // MultiBox clicked |
|
printf("Player 5 Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[4]); |
|
printf("Player %s\n", chr_name_str); |
|
|
|
break; |
|
// XStartGame(); |
|
} |
|
if (TotalPlayers >= 6 && (x > ClickListStart) && (y > ClickListStart + (sizeOfBox * 5)) && |
|
(x < ClickListStart + WidthOfBox) && |
|
(y < ClickListStart + (sizeOfBox * 5) + sizeOfBox)) { // MultiBox clicked |
|
printf("Player 6 Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
strcpy(chr_name_str, hero_names[5]); |
|
printf("Player %s\n", chr_name_str); |
|
break; |
|
// XStartGame(); |
|
} |
|
|
|
if ((x > SinglePlayerMenuCancelBox.x) && (y > SinglePlayerMenuCancelBox.y) && |
|
(x < SinglePlayerMenuCancelBox.w) && (y < SinglePlayerMenuCancelBox.h)) { // ExitBox clicked |
|
printf("CancelBox Diablo\n"); |
|
effects_play_sound("Sfx\\Items\\Titlslct.wav"); |
|
|
|
// quit = true; |
|
// goto LABEL_16; |
|
menu = 0; |
|
} |
|
if ((x > CreateHeroBox.x) && (y > CreateHeroBox.y) && (x < CreateHeroBox.w) && |
|
(y < CreateHeroBox.h)) { |
|
printf("Clicked Create Hero Box\n"); |
|
menu = 3; |
|
} |
|
} |
|
if (menu == 3) { |
|
// SinglePlayerMenuItemsLoaded = 0; |
|
printf("menu X%d Y%d", x, y); |
|
|
|
int WarriorSelectBoxY = 379; |
|
int WarriorSelectBoxW = 100; |
|
int WarriorSelectBoxS = 100; |
|
|
|
int RogueSelectBoxX = 360; |
|
int RogueSelectBoxY = 345; |
|
int SorcerorSelectBoxX = 383; |
|
int SorcerorSelectBoxY = 365; |
|
int CreateHeroOkBoxX = 330; |
|
int CreateHeroOkBoxY = 441; |
|
int CreateHeroCanBBoxX = 445; |
|
int CreateHeroCanBBoxY = 473; |
|
|
|
SDL_Rect WarriorSelectBox; |
|
WarriorSelectBox.y = 280; |
|
WarriorSelectBox.x = 375; |
|
WarriorSelectBox.w = WarriorSelectBox.x + 100; |
|
WarriorSelectBox.h = WarriorSelectBox.y + 30; |
|
|
|
SDL_Rect RogueSelectBox; |
|
RogueSelectBox.y = 320; |
|
RogueSelectBox.x = 400; |
|
RogueSelectBox.w = RogueSelectBox.x + 100; |
|
RogueSelectBox.h = RogueSelectBox.y + 30; |
|
|
|
SDL_Rect SorcerorSelectBox; |
|
SorcerorSelectBox.y = 360; |
|
SorcerorSelectBox.x = 380; |
|
SorcerorSelectBox.w = SorcerorSelectBox.x + 100; |
|
SorcerorSelectBox.h = SorcerorSelectBox.y + 30; |
|
|
|
// 397 323 |
|
|
|
if ((x > WarriorSelectBox.x) && (y > WarriorSelectBox.y) && (x < WarriorSelectBox.w) && |
|
(y < WarriorSelectBox.h)) { |
|
|
|
printf("I was hit\n\n\n"); |
|
WarriorCreateSelected = 1; |
|
RogueCreateSelected = 0; |
|
SorcerorCreateSelected = 0; |
|
} |
|
if ((x > RogueSelectBox.x) && (y > RogueSelectBox.y) && (x < RogueSelectBox.w) && |
|
(y < RogueSelectBox.h)) { |
|
|
|
printf("I was hit\n\n\n"); |
|
WarriorCreateSelected = 0; |
|
RogueCreateSelected = 1; |
|
SorcerorCreateSelected = 0; |
|
} |
|
if ((x > SorcerorSelectBox.x) && (y > SorcerorSelectBox.y) && (x < SorcerorSelectBox.w) && |
|
(y < SorcerorSelectBox.h)) { |
|
|
|
printf("I was hit\n\n\n"); |
|
WarriorCreateSelected = 0; |
|
RogueCreateSelected = 0; |
|
SorcerorCreateSelected = 1; |
|
} |
|
|
|
// SorcerorCreateSelected; |
|
// WarriorCreateSelected; |
|
// RogueCreateSelected; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|