diff --git a/Source/codec.h b/Source/codec.h index 2c004f6be..4332ed189 100644 --- a/Source/codec.h +++ b/Source/codec.h @@ -12,7 +12,7 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -int codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword); +int codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword); DWORD codec_get_encoded_len(DWORD dwSrcBytes); void codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, const char *pszPassword); diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 22c836320..6c1f03162 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -101,9 +101,129 @@ const char *const spszMsgHotKeyTbl[4] = { "F9", "F10", "F11", "F12" }; /** To know if these things have been done when we get to the diablo_deinit() function */ BOOL was_archives_init = false; +/** To know if surfaces have been initialized or not */ +BOOL was_window_init = false; BOOL was_ui_init = false; BOOL was_snd_init = false; +static void print_help_and_exit() +{ + printf("Options:\n"); + printf(" %-20s %-30s\n", "-h, --help", "Print this message and exit"); + printf(" %-20s %-30s\n", "--version", "Print the version and exit"); + printf(" %-20s %-30s\n", "--data-dir", "Specify the folder of diabdat.mpq"); + printf(" %-20s %-30s\n", "--save-dir", "Specify the folder of save files"); + printf(" %-20s %-30s\n", "-n", "Skip startup videos"); + printf(" %-20s %-30s\n", "-f", "Display frames per second"); + printf(" %-20s %-30s\n", "-x", "Run in windowed mode"); + printf(" %-20s %-30s\n", "--spawn", "Force spawn mode even if diabdat.mpq is found"); +#ifdef HELLFIRE + printf(" %-20s %-30s\n", "--theoquest", "Enable the Theo quest"); + printf(" %-20s %-30s\n", "--cowquest", "Enable the Cow quest"); + printf(" %-20s %-30s\n", "--nestart", "Use alternate nest palette"); + printf(" %-20s %-30s\n", "--bardtest", "Enable the Bard class"); + printf(" %-20s %-30s\n", "--barbariantest", "Enable the Barbarian class"); +#endif +#ifdef _DEBUG + printf("\nDebug options:\n"); + printf(" %-20s %-30s\n", "-d", "Increaased item drops"); + printf(" %-20s %-30s\n", "-w", "Enable cheats"); + printf(" %-20s %-30s\n", "-$", "Enable god mode"); + printf(" %-20s %-30s\n", "-^", "Enable god mode and debug tools"); + //printf(" %-20s %-30s\n", "-b", "Enable item drop log"); + printf(" %-20s %-30s\n", "-v", "Highlight visibility"); + printf(" %-20s %-30s\n", "-i", "Ignore network timeout"); + //printf(" %-20s %-30s\n", "-j <##>", "Init trigger at level"); + printf(" %-20s %-30s\n", "-l <##> <##>", "Start in level as type"); + printf(" %-20s %-30s\n", "-m <##>", "Add debug monster, up to 10 allowed"); + printf(" %-20s %-30s\n", "-q <#>", "Force a certain quest"); + printf(" %-20s %-30s\n", "-r <##########>", "Set map seed"); + printf(" %-20s %-30s\n", "-t <##>", "Set current quest level"); +#endif + printf("\nReport bugs at https://github.com/diasurgical/devilutionX/\n"); + diablo_quit(0); +} + +static void diablo_parse_flags(int argc, char **argv) +{ + for (int i = 1; i < argc; i++) { + if (strcasecmp("-h", argv[i]) == 0 || strcasecmp("--help", argv[i]) == 0) { + print_help_and_exit(); + } else if (strcasecmp("--version", argv[i]) == 0) { + printf("%s v%s\n", PROJECT_NAME, PROJECT_VERSION); + diablo_quit(0); + } else if (strcasecmp("--data-dir", argv[i]) == 0) { + SetBasePath(argv[++i]); + } else if (strcasecmp("--save-dir", argv[i]) == 0) { + SetPrefPath(argv[++i]); + } else if (strcasecmp("-n", argv[i]) == 0) { + showintrodebug = FALSE; + } else if (strcasecmp("-f", argv[i]) == 0) { + EnableFrameCount(); + } else if (strcasecmp("-x", argv[i]) == 0) { + fullscreen = FALSE; + } else if (strcasecmp("--spawn", argv[i]) == 0) { + forceSpawn = TRUE; +#ifdef HELLFIRE + } else if (strcasecmp("--theoquest", argv[i]) == 0) { + UseTheoQuest = TRUE; + } else if (strcasecmp("--cowquest", argv[i]) == 0) { + UseCowFarmer = TRUE; + } else if (strcasecmp("--nestart", argv[i]) == 0) { + UseNestArt = TRUE; + } else if (strcasecmp("--bardtest", argv[i]) == 0) { + UseBardTest = TRUE; + } else if (strcasecmp("--barbariantest", argv[i]) == 0) { + UseBarbarianTest = TRUE; +#endif +#ifdef _DEBUG + } else if (strcasecmp("-^", argv[i]) == 0) { + debug_mode_key_inverted_v = TRUE; + } else if (strcasecmp("-$", argv[i]) == 0) { + debug_mode_dollar_sign = TRUE; + /* + } else if (strcasecmp("-b", argv[i]) == 0) { + debug_mode_key_b = 1; + */ + } else if (strcasecmp("-d", argv[i]) == 0) { + debug_mode_key_d = TRUE; + } else if (strcasecmp("-i", argv[i]) == 0) { + debug_mode_key_i = TRUE; + /* + } else if (strcasecmp("-j", argv[i]) == 0) { + debug_mode_key_J_trigger = argv[++i]; + */ + } else if (strcasecmp("-l", argv[i]) == 0) { + setlevel = FALSE; + leveldebug = TRUE; + leveltype = SDL_atoi(argv[++i]); + currlevel = SDL_atoi(argv[++i]); + plr[0].plrlevel = currlevel; + } else if (strcasecmp("-m", argv[i]) == 0) { + monstdebug = TRUE; + DebugMonsters[debugmonsttypes++] = SDL_atoi(argv[++i]); + } else if (strcasecmp("-q", argv[i]) == 0) { + questdebug = SDL_atoi(argv[++i]); + } else if (strcasecmp("-r", argv[i]) == 0) { + setseed = SDL_atoi(argv[++i]); + } else if (strcasecmp("-s", argv[i]) == 0) { + debug_mode_key_s = TRUE; + } else if (strcasecmp("-t", argv[i]) == 0) { + leveldebug = TRUE; + setlevel = TRUE; + setlvlnum = SDL_atoi(argv[++i]); + } else if (strcasecmp("-v", argv[i]) == 0) { + visiondebug = TRUE; + } else if (strcasecmp("-w", argv[i]) == 0) { + debug_mode_key_w = TRUE; +#endif + } else { + printf("unrecognized option '%s'\n", argv[i]); + print_help_and_exit(); + } + } +} + void FreeGameMem() { music_stop(); @@ -120,53 +240,42 @@ void FreeGameMem() FreeTownerGFX(); } -BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer) +static void start_game(unsigned int uMsg) { - BOOL fExitProgram; - unsigned int uMsg; - - gbSelectProvider = TRUE; - - do { - fExitProgram = FALSE; -#ifndef HELLFIRE - gbLoadGame = FALSE; -#endif + zoomflag = TRUE; + CalcViewportGeometry(); + cineflag = FALSE; + InitCursor(); + InitLightTable(); + LoadDebugGFX(); + assert(ghMainWnd); + music_stop(); + ShowProgress(uMsg); + gmenu_init_menu(); + InitLevelCursor(); + sgnTimeoutCurs = CURSOR_NONE; + sgbMouseDown = CLICK_NONE; + track_repeat_walk(FALSE); +} - if (!NetInit(bSinglePlayer, &fExitProgram)) { - gbRunGameResult = !fExitProgram; - break; - } +static void free_game() +{ + int i; - gbSelectProvider = FALSE; + FreeControlPan(); + FreeInvGFX(); + FreeGMenu(); + FreeQuestText(); + FreeStoreMem(); - if (bNewGame || !gbValidSaveFile) { - InitLevels(); - InitQuests(); - InitPortals(); - InitDungMsgs(myplr); -#ifndef HELLFIRE - } - if (!gbValidSaveFile || !gbLoadGame) { -#else - if (!gbValidSaveFile && gbLoadGame) - inv_diablo_to_hellfire(myplr); -#endif - uMsg = WM_DIABNEWGAME; - } else { - uMsg = WM_DIABLOADGAME; - } - run_game_loop(uMsg); - NetClose(); -#ifndef HELLFIRE - pfile_create_player_description(0, 0); - } while (gbRunGameResult); -#else - } while (gbMaxPlayers == 1 || !gbRunGameResult); -#endif + for (i = 0; i < MAX_PLRS; i++) + FreePlayerGFX(i); - SNetDestroy(); - return gbRunGameResult; + FreeItemGFX(); + FreeCursor(); + FreeLightTable(); + FreeDebugGFX(); + FreeGameMem(); } // Controller support: Actions to run after updating the cursor state. @@ -196,7 +305,7 @@ static bool ProcessInput() return true; } -void run_game_loop(unsigned int uMsg) +static void run_game_loop(unsigned int uMsg) { WNDPROC saveProc; MSG msg; @@ -261,47 +370,74 @@ void run_game_loop(unsigned int uMsg) } } -void start_game(unsigned int uMsg) +BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer) { - zoomflag = TRUE; - CalcViewportGeometry(); - cineflag = FALSE; - InitCursor(); - InitLightTable(); - LoadDebugGFX(); - assert(ghMainWnd); - music_stop(); - ShowProgress(uMsg); - gmenu_init_menu(); - InitLevelCursor(); - sgnTimeoutCurs = CURSOR_NONE; - sgbMouseDown = 0; - track_repeat_walk(FALSE); -} + BOOL fExitProgram; + unsigned int uMsg; -void free_game() -{ - int i; + gbSelectProvider = TRUE; - FreeControlPan(); - FreeInvGFX(); - FreeGMenu(); - FreeQuestText(); - FreeStoreMem(); + do { + fExitProgram = FALSE; +#ifndef HELLFIRE + gbLoadGame = FALSE; +#endif - for (i = 0; i < MAX_PLRS; i++) - FreePlayerGFX(i); + if (!NetInit(bSinglePlayer, &fExitProgram)) { + gbRunGameResult = !fExitProgram; + break; + } - FreeItemGFX(); - FreeCursor(); - FreeLightTable(); - FreeDebugGFX(); - FreeGameMem(); -} + gbSelectProvider = FALSE; -void diablo_init() -{ - init_create_window(); + if (bNewGame || !gbValidSaveFile) { + InitLevels(); + InitQuests(); + InitPortals(); + InitDungMsgs(myplr); +#ifndef HELLFIRE + } + if (!gbValidSaveFile || !gbLoadGame) { +#else + if (!gbValidSaveFile && gbLoadGame) + inv_diablo_to_hellfire(myplr); +#endif + uMsg = WM_DIABNEWGAME; + } else { + uMsg = WM_DIABLOADGAME; + } + run_game_loop(uMsg); + NetClose(); +#ifndef HELLFIRE + pfile_create_player_description(0, 0); + } while (gbRunGameResult); +#else + } while (gbMaxPlayers == 1 || !gbRunGameResult); +#endif + + SNetDestroy(); + return gbRunGameResult; +} + +static void diablo_init_screen() +{ + MouseX = SCREEN_WIDTH / 2; + MouseY = SCREEN_HEIGHT / 2; + if (!sgbControllerActive) + SetCursorPos(MouseX, MouseY); + ScrollInfo._sdx = 0; + ScrollInfo._sdy = 0; + ScrollInfo._sxoff = 0; + ScrollInfo._syoff = 0; + ScrollInfo._sdir = SDIR_NONE; + + ClrDiabloMsg(); +} + +static void diablo_init() +{ + init_create_window(); + was_window_init = true; SFileEnableDirectAccess(TRUE); init_archives(); @@ -326,7 +462,7 @@ void diablo_init() ui_sound_init(); } -void diablo_splash() +static void diablo_splash() { if (!showintrodebug) return; @@ -348,7 +484,7 @@ void diablo_splash() UiTitleDialog(); } -void diablo_deinit() +static void diablo_deinit() { if (was_snd_init) { effects_cleanup_sfx(); @@ -383,370 +519,7 @@ int DiabloMain(int argc, char **argv) return 0; } -static void print_help_and_exit() -{ - printf("Options:\n"); - printf(" %-20s %-30s\n", "-h, --help", "Print this message and exit"); - printf(" %-20s %-30s\n", "--version", "Print the version and exit"); - printf(" %-20s %-30s\n", "--data-dir", "Specify the folder of diabdat.mpq"); - printf(" %-20s %-30s\n", "--save-dir", "Specify the folder of save files"); - printf(" %-20s %-30s\n", "-n", "Skip startup videos"); - printf(" %-20s %-30s\n", "-f", "Display frames per second"); - printf(" %-20s %-30s\n", "-x", "Run in windowed mode"); - printf(" %-20s %-30s\n", "--spawn", "Force spawn mode even if diabdat.mpq is found"); -#ifdef HELLFIRE - printf(" %-20s %-30s\n", "--theoquest", "Enable the Theo quest"); - printf(" %-20s %-30s\n", "--cowquest", "Enable the Cow quest"); - printf(" %-20s %-30s\n", "--nestart", "Use alternate nest palette"); - printf(" %-20s %-30s\n", "--bardtest", "Enable the Bard class"); - printf(" %-20s %-30s\n", "--barbariantest", "Enable the Barbarian class"); -#endif -#ifdef _DEBUG - printf("\nDebug options:\n"); - printf(" %-20s %-30s\n", "-d", "Increaased item drops"); - printf(" %-20s %-30s\n", "-w", "Enable cheats"); - printf(" %-20s %-30s\n", "-$", "Enable god mode"); - printf(" %-20s %-30s\n", "-^", "Enable god mode and debug tools"); - //printf(" %-20s %-30s\n", "-b", "Enable item drop log"); - printf(" %-20s %-30s\n", "-v", "Highlight visibility"); - printf(" %-20s %-30s\n", "-i", "Ignore network timeout"); - //printf(" %-20s %-30s\n", "-j <##>", "Init trigger at level"); - printf(" %-20s %-30s\n", "-l <##> <##>", "Start in level as type"); - printf(" %-20s %-30s\n", "-m <##>", "Add debug monster, up to 10 allowed"); - printf(" %-20s %-30s\n", "-q <#>", "Force a certain quest"); - printf(" %-20s %-30s\n", "-r <##########>", "Set map seed"); - printf(" %-20s %-30s\n", "-t <##>", "Set current quest level"); -#endif - printf("\nReport bugs at https://github.com/diasurgical/devilutionX/\n"); - diablo_quit(0); -} - -void diablo_parse_flags(int argc, char **argv) -{ - for (int i = 1; i < argc; i++) { - if (strcasecmp("-h", argv[i]) == 0 || strcasecmp("--help", argv[i]) == 0) { - print_help_and_exit(); - } else if (strcasecmp("--version", argv[i]) == 0) { - printf("%s v%s\n", PROJECT_NAME, PROJECT_VERSION); - diablo_quit(0); - } else if (strcasecmp("--data-dir", argv[i]) == 0) { - SetBasePath(argv[++i]); - } else if (strcasecmp("--save-dir", argv[i]) == 0) { - SetPrefPath(argv[++i]); - } else if (strcasecmp("-n", argv[i]) == 0) { - showintrodebug = FALSE; - } else if (strcasecmp("-f", argv[i]) == 0) { - EnableFrameCount(); - } else if (strcasecmp("-x", argv[i]) == 0) { - fullscreen = FALSE; - } else if (strcasecmp("--spawn", argv[i]) == 0) { - forceSpawn = TRUE; -#ifdef HELLFIRE - } else if (strcasecmp("--theoquest", argv[i]) == 0) { - UseTheoQuest = TRUE; - } else if (strcasecmp("--cowquest", argv[i]) == 0) { - UseCowFarmer = TRUE; - } else if (strcasecmp("--nestart", argv[i]) == 0) { - UseNestArt = TRUE; - } else if (strcasecmp("--bardtest", argv[i]) == 0) { - UseBardTest = TRUE; - } else if (strcasecmp("--barbariantest", argv[i]) == 0) { - UseBarbarianTest = TRUE; -#endif -#ifdef _DEBUG - } else if (strcasecmp("-^", argv[i]) == 0) { - debug_mode_key_inverted_v = TRUE; - } else if (strcasecmp("-$", argv[i]) == 0) { - debug_mode_dollar_sign = TRUE; - /* - } else if (strcasecmp("-b", argv[i]) == 0) { - debug_mode_key_b = 1; - */ - } else if (strcasecmp("-d", argv[i]) == 0) { - debug_mode_key_d = TRUE; - } else if (strcasecmp("-i", argv[i]) == 0) { - debug_mode_key_i = TRUE; - /* - } else if (strcasecmp("-j", argv[i]) == 0) { - debug_mode_key_J_trigger = argv[++i]; - */ - } else if (strcasecmp("-l", argv[i]) == 0) { - setlevel = FALSE; - leveldebug = TRUE; - leveltype = SDL_atoi(argv[++i]); - currlevel = SDL_atoi(argv[++i]); - plr[0].plrlevel = currlevel; - } else if (strcasecmp("-m", argv[i]) == 0) { - monstdebug = TRUE; - DebugMonsters[debugmonsttypes++] = SDL_atoi(argv[++i]); - } else if (strcasecmp("-q", argv[i]) == 0) { - questdebug = SDL_atoi(argv[++i]); - } else if (strcasecmp("-r", argv[i]) == 0) { - setseed = SDL_atoi(argv[++i]); - } else if (strcasecmp("-s", argv[i]) == 0) { - debug_mode_key_s = TRUE; - } else if (strcasecmp("-t", argv[i]) == 0) { - leveldebug = TRUE; - setlevel = TRUE; - setlvlnum = SDL_atoi(argv[++i]); - } else if (strcasecmp("-v", argv[i]) == 0) { - visiondebug = TRUE; - } else if (strcasecmp("-w", argv[i]) == 0) { - debug_mode_key_w = TRUE; -#endif - } else { - printf("unrecognized option '%s'\n", argv[i]); - print_help_and_exit(); - } - } -} - -void diablo_init_screen() -{ - MouseX = SCREEN_WIDTH / 2; - MouseY = SCREEN_HEIGHT / 2; - if (!sgbControllerActive) - SetCursorPos(MouseX, MouseY); - ScrollInfo._sdx = 0; - ScrollInfo._sdy = 0; - ScrollInfo._sxoff = 0; - ScrollInfo._syoff = 0; - ScrollInfo._sdir = SDIR_NONE; - - ClrDiabloMsg(); -} - -BOOL PressEscKey() -{ - BOOL rv = FALSE; - - if (doomflag) { - doom_close(); - rv = TRUE; - } - if (helpflag) { - helpflag = FALSE; - rv = TRUE; - } - - if (qtextflag) { - qtextflag = FALSE; - stream_stop(); - rv = TRUE; - } else if (stextflag) { - STextESC(); - rv = TRUE; - } - - if (msgflag) { - msgdelay = 0; - rv = TRUE; - } - if (talkflag) { - control_reset_talk(); - rv = TRUE; - } - if (dropGoldFlag) { - control_drop_gold(DVL_VK_ESCAPE); - rv = TRUE; - } - if (spselflag) { - spselflag = FALSE; - rv = TRUE; - } - - return rv; -} - -static void GetMousePos(LPARAM lParam) -{ - MouseX = (short)(lParam & 0xffff); - MouseY = (short)((lParam >> 16) & 0xffff); -} - -void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case DVL_WM_KEYDOWN: - case DVL_WM_KEYUP: - case DVL_WM_CHAR: - case DVL_WM_SYSKEYDOWN: - case DVL_WM_SYSCOMMAND: - case DVL_WM_MOUSEMOVE: - GetMousePos(lParam); - return; - case DVL_WM_LBUTTONDOWN: - if (sgbMouseDown != 0) - return; - sgbMouseDown = 1; - return; - case DVL_WM_LBUTTONUP: - if (sgbMouseDown != 1) - return; - sgbMouseDown = 0; - return; - case DVL_WM_RBUTTONDOWN: - if (sgbMouseDown != 0) - return; - sgbMouseDown = 2; - return; - case DVL_WM_RBUTTONUP: - if (sgbMouseDown != 2) - return; - sgbMouseDown = 0; - return; - case DVL_WM_CAPTURECHANGED: - if (hWnd == (HWND)lParam) - return; - sgbMouseDown = 0; - return; - } - - MainWndProc(hWnd, uMsg, wParam, lParam); -} - -void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case DVL_WM_KEYDOWN: - PressKey(wParam); - return; - case DVL_WM_KEYUP: - ReleaseKey(wParam); - return; - case DVL_WM_CHAR: - PressChar(wParam); - return; - case DVL_WM_SYSKEYDOWN: - if (PressSysKey(wParam)) - return; - break; - case DVL_WM_SYSCOMMAND: - if (wParam == DVL_SC_CLOSE) { - gbRunGame = FALSE; - gbRunGameResult = FALSE; - return; - } - break; - case DVL_WM_MOUSEMOVE: - GetMousePos(lParam); - gmenu_on_mouse_move(); - return; - case DVL_WM_LBUTTONDOWN: - GetMousePos(lParam); - if (sgbMouseDown == 0) { - sgbMouseDown = 1; - track_repeat_walk(LeftMouseDown(wParam)); - } - return; - case DVL_WM_LBUTTONUP: - GetMousePos(lParam); - if (sgbMouseDown == 1) { - sgbMouseDown = 0; - LeftMouseUp(); - track_repeat_walk(FALSE); - } - return; - case DVL_WM_RBUTTONDOWN: - GetMousePos(lParam); - if (sgbMouseDown == 0) { - sgbMouseDown = 2; - RightMouseDown(); - } - return; - case DVL_WM_RBUTTONUP: - GetMousePos(lParam); - if (sgbMouseDown == 2) { - sgbMouseDown = 0; - } - return; - case DVL_WM_CAPTURECHANGED: - if (hWnd != (HWND)lParam) { - sgbMouseDown = 0; - track_repeat_walk(FALSE); - } - break; - case WM_DIABNEXTLVL: - case WM_DIABPREVLVL: - case WM_DIABRTNLVL: - case WM_DIABSETLVL: - case WM_DIABWARPLVL: - case WM_DIABTOWNWARP: - case WM_DIABTWARPUP: - case WM_DIABRETOWN: - if (gbMaxPlayers > 1) - pfile_write_hero(); - nthread_ignore_mutex(TRUE); - PaletteFadeOut(8); - sound_stop(); - music_stop(); - track_repeat_walk(FALSE); - sgbMouseDown = 0; - ShowProgress(uMsg); - force_redraw = 255; - DrawAndBlit(); - if (gbRunGame) - PaletteFadeIn(8); - nthread_ignore_mutex(FALSE); - gbGameLoopStartup = TRUE; - return; - } - - MainWndProc(hWnd, uMsg, wParam, lParam); -} - -BOOL LeftMouseDown(int wParam) -{ - if (!gmenu_left_mouse(TRUE) && !control_check_talk_btn() && sgnTimeoutCurs == CURSOR_NONE) { - if (deathflag) { - control_check_btn_press(); - } else if (PauseMode != 2) { - if (doomflag) { - doom_close(); - } else if (spselflag) { - SetSpell(); - } else if (stextflag != STORE_NONE) { - CheckStoreBtn(); - } else if (MouseY < PANEL_TOP || MouseX < PANEL_LEFT || MouseX >= PANEL_LEFT + PANEL_WIDTH) { - if (!gmenu_is_active() && !TryIconCurs()) { - if (questlog && MouseX > 32 && MouseX < 288 && MouseY > 32 && MouseY < 308) { - QuestlogESC(); - } else if (qtextflag) { - qtextflag = FALSE; - stream_stop(); - } else if (chrflag && MouseX < SPANEL_WIDTH && MouseY < SPANEL_HEIGHT) { - CheckChrBtns(); - } else if (invflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { - if (!dropGoldFlag) - CheckInvItem(); - } else if (sbookflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { - CheckSBook(); - } else if (pcurs >= CURSOR_FIRSTITEM) { - if (TryInvPut()) { - NetSendCmdPItem(TRUE, CMD_PUTITEM, cursmx, cursmy); - NewCursor(CURSOR_HAND); - } - } else { - if (plr[myplr]._pStatPts != 0 && !spselflag) - CheckLvlBtn(); - if (!lvlbtndown) - return LeftMouseCmd(wParam == DVL_MK_SHIFT + DVL_MK_LBUTTON); - } - } - } else { - if (!talkflag && !dropGoldFlag && !gmenu_is_active()) - CheckInvScrn(); - DoPanBtn(); - if (pcurs > CURSOR_HAND && pcurs < CURSOR_FIRSTITEM) - NewCursor(CURSOR_HAND); - } - } - } - - return FALSE; -} - -BOOL LeftMouseCmd(BOOL bShift) +static BOOL LeftMouseCmd(BOOL bShift) { BOOL bNear; @@ -806,61 +579,144 @@ BOOL TryIconCurs() if (pcurs == CURSOR_RESURRECT) { NetSendCmdParam1(TRUE, CMD_RESURRECT, pcursplr); return TRUE; - } else if (pcurs == CURSOR_HEALOTHER) { + } + + if (pcurs == CURSOR_HEALOTHER) { NetSendCmdParam1(TRUE, CMD_HEALOTHER, pcursplr); return TRUE; - } else if (pcurs == CURSOR_TELEKINESIS) { + } + + if (pcurs == CURSOR_TELEKINESIS) { DoTelekinesis(); return TRUE; - } else if (pcurs == CURSOR_IDENTIFY) { - if (pcursinvitem != -1) { + } + + if (pcurs == CURSOR_IDENTIFY) { + if (pcursinvitem != -1) CheckIdentify(myplr, pcursinvitem); - } else { + else NewCursor(CURSOR_HAND); - } return TRUE; - } else if (pcurs == CURSOR_REPAIR) { - if (pcursinvitem != -1) { + } + + if (pcurs == CURSOR_REPAIR) { + if (pcursinvitem != -1) DoRepair(myplr, pcursinvitem); - } else { + else NewCursor(CURSOR_HAND); + return TRUE; + } + + if (pcurs == CURSOR_RECHARGE) { + if (pcursinvitem != -1) + DoRecharge(myplr, pcursinvitem); + else + NewCursor(CURSOR_HAND); + return TRUE; + } + +#ifdef HELLFIRE + if (pcurs == CURSOR_OIL) { + if (pcursinvitem != -1) + DoOil(myplr, pcursinvitem); + else + SetCursor_(CURSOR_HAND); + return TRUE; + } + +#endif + if (pcurs == CURSOR_TELEPORT) { + if (pcursmonst != -1) + NetSendCmdParam3(TRUE, CMD_TSPELLID, pcursmonst, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); + else if (pcursplr != -1) + NetSendCmdParam3(TRUE, CMD_TSPELLPID, pcursplr, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); + else + NetSendCmdLocParam2(TRUE, CMD_TSPELLXY, cursmx, cursmy, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); + NewCursor(CURSOR_HAND); + return TRUE; + } + + if (pcurs == CURSOR_DISARM && pcursobj == -1) { + NewCursor(CURSOR_HAND); + return TRUE; + } + + return FALSE; +} + +static BOOL LeftMouseDown(int wParam) +{ + if (gmenu_left_mouse(TRUE)) + return FALSE; + + if (control_check_talk_btn()) + return FALSE; + + if (sgnTimeoutCurs != CURSOR_NONE) + return FALSE; + + if (deathflag) { + control_check_btn_press(); + return FALSE; + } + + if (PauseMode == 2) { + return FALSE; + } + if (doomflag) { + doom_close(); + return FALSE; + } + + if (spselflag) { + SetSpell(); + return FALSE; + } + + if (stextflag != STORE_NONE) { + CheckStoreBtn(); + return FALSE; + } + + if (MouseY < PANEL_TOP || MouseX < PANEL_LEFT || MouseX >= PANEL_LEFT + PANEL_WIDTH) { + if (!gmenu_is_active() && !TryIconCurs()) { + if (questlog && MouseX > 32 && MouseX < 288 && MouseY > 32 && MouseY < 308) { + QuestlogESC(); + } else if (qtextflag) { + qtextflag = FALSE; + stream_stop(); + } else if (chrflag && MouseX < SPANEL_WIDTH && MouseY < SPANEL_HEIGHT) { + CheckChrBtns(); + } else if (invflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { + if (!dropGoldFlag) + CheckInvItem(); + } else if (sbookflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { + CheckSBook(); + } else if (pcurs >= CURSOR_FIRSTITEM) { + if (TryInvPut()) { + NetSendCmdPItem(TRUE, CMD_PUTITEM, cursmx, cursmy); + NewCursor(CURSOR_HAND); + } + } else { + if (plr[myplr]._pStatPts != 0 && !spselflag) + CheckLvlBtn(); + if (!lvlbtndown) + return LeftMouseCmd(wParam == DVL_MK_SHIFT + DVL_MK_LBUTTON); + } } - return TRUE; - } else if (pcurs == CURSOR_RECHARGE) { - if (pcursinvitem != -1) { - DoRecharge(myplr, pcursinvitem); - } else { + } else { + if (!talkflag && !dropGoldFlag && !gmenu_is_active()) + CheckInvScrn(); + DoPanBtn(); + if (pcurs > CURSOR_HAND && pcurs < CURSOR_FIRSTITEM) NewCursor(CURSOR_HAND); - } - return TRUE; -#ifdef HELLFIRE - } else if (pcurs == CURSOR_OIL) { - if (pcursinvitem != -1) { - DoOil(myplr, pcursinvitem); - } else { - SetCursor_(CURSOR_HAND); - } - return TRUE; -#endif - } else if (pcurs == CURSOR_TELEPORT) { - if (pcursmonst != -1) { - NetSendCmdParam3(TRUE, CMD_TSPELLID, pcursmonst, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); - } else if (pcursplr != -1) { - NetSendCmdParam3(TRUE, CMD_TSPELLPID, pcursplr, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); - } else { - NetSendCmdLocParam2(TRUE, CMD_TSPELLXY, cursmx, cursmy, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell)); - } - NewCursor(CURSOR_HAND); - return TRUE; - } else if (pcurs == CURSOR_DISARM && pcursobj == -1) { - NewCursor(CURSOR_HAND); - return TRUE; } + return FALSE; } -void LeftMouseUp() +static void LeftMouseUp() { gmenu_left_mouse(FALSE); control_release_talk_btn(); @@ -874,7 +730,7 @@ void LeftMouseUp() ReleaseStoreBtn(); } -void RightMouseDown() +static void RightMouseDown() { if (!gmenu_is_active() && sgnTimeoutCurs == CURSOR_NONE && PauseMode != 2 && !plr[myplr]._pInvincible) { if (doomflag) { @@ -901,15 +757,21 @@ void RightMouseDown() } } -BOOL PressSysKey(int wParam) +static void diablo_pause_game() { - if (gmenu_is_active() || wParam != DVL_VK_F10) - return FALSE; - diablo_hotkey_msg(1); - return TRUE; + if (gbMaxPlayers <= 1) { + if (PauseMode) { + PauseMode = 0; + } else { + PauseMode = 2; + sound_stop(); + track_repeat_walk(FALSE); + } + force_redraw = 255; + } } -void diablo_hotkey_msg(DWORD dwMsg) +static void diablo_hotkey_msg(DWORD dwMsg) { char szMsg[MAX_SEND_STR_LEN]; @@ -926,13 +788,63 @@ void diablo_hotkey_msg(DWORD dwMsg) NetSendCmdString(-1, szMsg); } -void ReleaseKey(int vkey) +static BOOL PressSysKey(int wParam) +{ + if (gmenu_is_active() || wParam != DVL_VK_F10) + return FALSE; + diablo_hotkey_msg(1); + return TRUE; +} + +static void ReleaseKey(int vkey) { if (vkey == DVL_VK_SNAPSHOT) CaptureScreen(); } -void PressKey(int vkey) +BOOL PressEscKey() +{ + BOOL rv = FALSE; + + if (doomflag) { + doom_close(); + rv = TRUE; + } + if (helpflag) { + helpflag = FALSE; + rv = TRUE; + } + + if (qtextflag) { + qtextflag = FALSE; + stream_stop(); + rv = TRUE; + } else if (stextflag) { + STextESC(); + rv = TRUE; + } + + if (msgflag) { + msgdelay = 0; + rv = TRUE; + } + if (talkflag) { + control_reset_talk(); + rv = TRUE; + } + if (dropGoldFlag) { + control_drop_gold(DVL_VK_ESCAPE); + rv = TRUE; + } + if (spselflag) { + spselflag = FALSE; + rv = TRUE; + } + + return rv; +} + +static void PressKey(int vkey) { if (gmenu_presskeys(vkey) || control_presskeys(vkey)) { return; @@ -1142,24 +1054,10 @@ void PressKey(int vkey) } } -void diablo_pause_game() -{ - if (gbMaxPlayers <= 1) { - if (PauseMode) { - PauseMode = 0; - } else { - PauseMode = 2; - sound_stop(); - track_repeat_walk(FALSE); - } - force_redraw = 255; - } -} - /** * @internal `return` must be used instead of `break` to be bin exact as C++ */ -void PressChar(int vkey) +static void PressChar(int vkey) { if (gmenu_is_active() || control_talk_last_key(vkey) || sgnTimeoutCurs != CURSOR_NONE || deathflag) { return; @@ -1425,6 +1323,143 @@ void PressChar(int vkey) } } +static void GetMousePos(LPARAM lParam) +{ + MouseX = (short)(lParam & 0xffff); + MouseY = (short)((lParam >> 16) & 0xffff); +} + +void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case DVL_WM_KEYDOWN: + case DVL_WM_KEYUP: + case DVL_WM_CHAR: + case DVL_WM_SYSKEYDOWN: + case DVL_WM_SYSCOMMAND: + case DVL_WM_MOUSEMOVE: + GetMousePos(lParam); + return; + case DVL_WM_LBUTTONDOWN: + if (sgbMouseDown != CLICK_NONE) + return; + sgbMouseDown = CLICK_LEFT; + return; + case DVL_WM_LBUTTONUP: + if (sgbMouseDown != CLICK_LEFT) + return; + sgbMouseDown = CLICK_NONE; + return; + case DVL_WM_RBUTTONDOWN: + if (sgbMouseDown != CLICK_NONE) + return; + sgbMouseDown = CLICK_RIGHT; + return; + case DVL_WM_RBUTTONUP: + if (sgbMouseDown != CLICK_RIGHT) + return; + sgbMouseDown = CLICK_NONE; + return; + case DVL_WM_CAPTURECHANGED: + if (hWnd == (HWND)lParam) + return; + sgbMouseDown = CLICK_NONE; + return; + } + + MainWndProc(hWnd, uMsg, wParam, lParam); +} + +void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case DVL_WM_KEYDOWN: + PressKey(wParam); + return; + case DVL_WM_KEYUP: + ReleaseKey(wParam); + return; + case DVL_WM_CHAR: + PressChar(wParam); + return; + case DVL_WM_SYSKEYDOWN: + if (PressSysKey(wParam)) + return; + break; + case DVL_WM_SYSCOMMAND: + if (wParam == DVL_SC_CLOSE) { + gbRunGame = FALSE; + gbRunGameResult = FALSE; + return; + } + break; + case DVL_WM_MOUSEMOVE: + GetMousePos(lParam); + gmenu_on_mouse_move(); + return; + case DVL_WM_LBUTTONDOWN: + GetMousePos(lParam); + if (sgbMouseDown == CLICK_NONE) { + sgbMouseDown = CLICK_LEFT; + track_repeat_walk(LeftMouseDown(wParam)); + } + return; + case DVL_WM_LBUTTONUP: + GetMousePos(lParam); + if (sgbMouseDown == CLICK_LEFT) { + sgbMouseDown = CLICK_NONE; + LeftMouseUp(); + track_repeat_walk(FALSE); + } + return; + case DVL_WM_RBUTTONDOWN: + GetMousePos(lParam); + if (sgbMouseDown == CLICK_NONE) { + sgbMouseDown = CLICK_RIGHT; + RightMouseDown(); + } + return; + case DVL_WM_RBUTTONUP: + GetMousePos(lParam); + if (sgbMouseDown == CLICK_RIGHT) { + sgbMouseDown = CLICK_NONE; + } + return; + case DVL_WM_CAPTURECHANGED: + if (hWnd != (HWND)lParam) { + sgbMouseDown = CLICK_NONE; + track_repeat_walk(FALSE); + } + break; + case WM_DIABNEXTLVL: + case WM_DIABPREVLVL: + case WM_DIABRTNLVL: + case WM_DIABSETLVL: + case WM_DIABWARPLVL: + case WM_DIABTOWNWARP: + case WM_DIABTWARPUP: + case WM_DIABRETOWN: + if (gbMaxPlayers > 1) + pfile_write_hero(); + nthread_ignore_mutex(TRUE); + PaletteFadeOut(8); + sound_stop(); + music_stop(); + track_repeat_walk(FALSE); + sgbMouseDown = CLICK_NONE; + ShowProgress(uMsg); + force_redraw = 255; + DrawAndBlit(); + if (gbRunGame) + PaletteFadeIn(8); + nthread_ignore_mutex(FALSE); + gbGameLoopStartup = TRUE; + return; + } + + MainWndProc(hWnd, uMsg, wParam, lParam); +} + void LoadLvlGFX() { assert(! pDungeonCels); @@ -1807,29 +1842,10 @@ void LoadGameLevel(BOOL firstflag, int lvldir) PlaySFX(USFX_SKING1); } -void game_loop(BOOL bStartup) -{ - int i; - - i = bStartup ? ticks_per_sec * 3 : 3; - - while (i--) { - if (!multi_handle_delta()) { - timeout_cursor(TRUE); - break; - } else { - timeout_cursor(FALSE); - game_logic(); - } - if (!gbRunGame || gbMaxPlayers == 1 || !nthread_has_500ms_passed(TRUE)) - break; - } -} - // Controller support: extern void plrctrls_after_game_logic(); -void game_logic() +static void game_logic() { if (!ProcessInput()) { return; @@ -1866,10 +1882,10 @@ void game_logic() plrctrls_after_game_logic(); } -void timeout_cursor(BOOL bTimeout) +static void timeout_cursor(BOOL bTimeout) { if (bTimeout) { - if (sgnTimeoutCurs == CURSOR_NONE && !sgbMouseDown) { + if (sgnTimeoutCurs == CURSOR_NONE && sgbMouseDown == CLICK_NONE) { sgnTimeoutCurs = pcurs; multi_net_ping(); ClearPanel(); @@ -1887,6 +1903,25 @@ void timeout_cursor(BOOL bTimeout) } } +void game_loop(BOOL bStartup) +{ + int i; + + i = bStartup ? ticks_per_sec * 3 : 3; + + while (i--) { + if (!multi_handle_delta()) { + timeout_cursor(TRUE); + break; + } else { + timeout_cursor(FALSE); + game_logic(); + } + if (!gbRunGame || gbMaxPlayers == 1 || !nthread_has_500ms_passed(TRUE)) + break; + } +} + void diablo_color_cyc_logic() { if (!palette_get_color_cycling()) diff --git a/Source/diablo.h b/Source/diablo.h index 5910be0c9..b1285a814 100644 --- a/Source/diablo.h +++ b/Source/diablo.h @@ -15,20 +15,8 @@ extern "C" { extern SDL_Window *ghMainWnd; extern DWORD glSeedTbl[NUMLEVELS]; extern int gnLevelTypeTbl[NUMLEVELS]; -#ifndef HELLFIRE -extern int glEndSeed[NUMLEVELS]; -extern int glMid1Seed[NUMLEVELS]; -extern int glMid2Seed[NUMLEVELS]; -extern int glMid3Seed[NUMLEVELS]; -#else -extern int glEndSeed[NUMLEVELS + 1]; -extern int glMid1Seed[NUMLEVELS + 1]; -extern int glMid2Seed[NUMLEVELS + 1]; -extern int glMid3Seed[NUMLEVELS + 1]; -#endif extern int MouseX; extern int MouseY; -extern BOOL gbGameLoopStartup; extern BOOL gbRunGame; extern BOOL gbRunGameResult; extern BOOL zoomflag; @@ -43,13 +31,10 @@ extern BOOL visiondebug; extern BOOL was_fonts_init; extern void FontsCleanup(); /** unused */ -extern BOOL scrollflag; extern BOOL light4flag; extern BOOL leveldebug; extern BOOL monstdebug; /** unused */ -extern BOOL trigdebug; -extern int setseed; extern int debugmonsttypes; extern int PauseMode; #ifdef HELLFIRE @@ -61,53 +46,28 @@ extern BOOLEAN UseBarbarianTest; extern BOOLEAN UseMultiTest; #endif extern char sgbMouseDown; -extern int color_cycle_timer; extern int ticks_per_sec; extern WORD tick_delay; void FreeGameMem(); BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer); -void run_game_loop(unsigned int uMsg); -void start_game(unsigned int uMsg); -void free_game(); -int DiabloMain(int argc, char **argv); -void diablo_parse_flags(int argc, char **argv); -void diablo_init_screen(); -void diablo_reload_process(HINSTANCE hInstance); void diablo_quit(int exitStatus); +int DiabloMain(int argc, char **argv); +BOOL TryIconCurs(); BOOL PressEscKey(); void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); -BOOL LeftMouseDown(int wParam); -BOOL LeftMouseCmd(BOOL bShift); -BOOL TryIconCurs(); -void LeftMouseUp(); -void RightMouseDown(); -void j_gmenu_on_mouse_move(LPARAM lParam); -BOOL PressSysKey(int wParam); -void diablo_hotkey_msg(DWORD dwMsg); -void ReleaseKey(int vkey); void PressKey(int vkey); -void diablo_pause_game(); -void PressChar(int vkey); -void LoadLvlGFX(); -void LoadAllGFX(); -void CreateLevel(int lvldir); void LoadGameLevel(BOOL firstflag, int lvldir); void game_loop(BOOL bStartup); -void game_logic(); -void timeout_cursor(BOOL bTimeout); void diablo_color_cyc_logic(); -/* data */ - /* rdata */ extern BOOL fullscreen; extern int showintrodebug; #ifdef _DEBUG extern int questdebug; -extern int debug_mode_key_s; extern int debug_mode_key_w; extern int debug_mode_key_inverted_v; extern int debug_mode_dollar_sign; @@ -116,15 +76,12 @@ extern int debug_mode_key_i; extern int dbgplr; extern int dbgqst; extern int dbgmon; -extern int arrowdebug; #endif extern int frameflag; extern int frameend; extern int framerate; extern int framestart; extern BOOL FriendlyMode; -extern const char *const spszMsgTbl[4]; -extern const char *const spszMsgHotKeyTbl[4]; #ifdef __cplusplus } diff --git a/Source/doom.cpp b/Source/doom.cpp index b20356fa3..dbd0a3949 100644 --- a/Source/doom.cpp +++ b/Source/doom.cpp @@ -42,10 +42,22 @@ int doom_get_frame_from_time() return DoomQuestState / 1200; } +void doom_cleanup() +{ +#ifdef HELLFIRE + if (pDoomCel != NULL) { + MemFreeDbg(pDoomCel); + pDoomCel = NULL; + } +#else + MemFreeDbg(pDoomCel); +#endif +} + #ifdef HELLFIRE -BOOLEAN doom_alloc_cel() +static BOOLEAN doom_alloc_cel() #else -void doom_alloc_cel() +static void doom_alloc_cel() #endif { #ifdef HELLFIRE @@ -57,22 +69,10 @@ void doom_alloc_cel() #endif } -void doom_cleanup() -{ -#ifdef HELLFIRE - if (pDoomCel != NULL) { - MemFreeDbg(pDoomCel); - pDoomCel = NULL; - } -#else - MemFreeDbg(pDoomCel); -#endif -} - #ifdef HELLFIRE -BOOLEAN doom_load_graphics() +static BOOLEAN doom_load_graphics() #else -void doom_load_graphics() +static void doom_load_graphics() #endif { #ifdef HELLFIRE diff --git a/Source/doom.h b/Source/doom.h index 1fdeba082..1c489dea4 100644 --- a/Source/doom.h +++ b/Source/doom.h @@ -12,26 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int doom_quest_time; -extern int doom_stars_drawn; -extern BYTE *pDoomCel; extern DIABOOL doomflag; extern int DoomQuestState; -/* -void doom_reset_state(); -void doom_play_movie(); -*/ -int doom_get_frame_from_time(); -#ifdef HELLFIRE -BOOLEAN doom_alloc_cel(); -void doom_cleanup(); -BOOLEAN doom_load_graphics(); -#else -void doom_alloc_cel(); -void doom_cleanup(); -void doom_load_graphics(); -#endif void doom_init(); void doom_close(); void doom_draw(); diff --git a/Source/dthread.cpp b/Source/dthread.cpp index 8c54b11e6..079a7baae 100644 --- a/Source/dthread.cpp +++ b/Source/dthread.cpp @@ -17,6 +17,44 @@ event_emul *sghWorkToDoEvent; /* rdata */ static SDL_Thread *sghThread = NULL; +static unsigned int dthread_handler(void *data) +{ + const char *error_buf; + TMegaPkt *pkt; + DWORD dwMilliseconds; + + while (dthread_running) { + if (!sgpInfoHead && WaitForEvent(sghWorkToDoEvent) == -1) { + error_buf = TraceLastError(); + app_fatal("dthread4:\n%s", error_buf); + } + + sgMemCrit.Enter(); + pkt = sgpInfoHead; + if (sgpInfoHead) + sgpInfoHead = sgpInfoHead->pNext; + else + ResetEvent(sghWorkToDoEvent); + sgMemCrit.Leave(); + + if (pkt) { + if (pkt->dwSpaceLeft != MAX_PLRS) + multi_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(DWORD *)&pkt->data[4]); + + dwMilliseconds = 1000 * *(DWORD *)&pkt->data[4] / gdwDeltaBytesSec; + if (dwMilliseconds >= 1) + dwMilliseconds = 1; + + mem_free_dbg(pkt); + + if (dwMilliseconds) + SDL_Delay(dwMilliseconds); + } + } + + return 0; +} + void dthread_remove_player(int pnum) { TMegaPkt *pkt; @@ -78,44 +116,6 @@ void dthread_start() } } -unsigned int dthread_handler(void *data) -{ - const char *error_buf; - TMegaPkt *pkt; - DWORD dwMilliseconds; - - while (dthread_running) { - if (!sgpInfoHead && WaitForEvent(sghWorkToDoEvent) == -1) { - error_buf = TraceLastError(); - app_fatal("dthread4:\n%s", error_buf); - } - - sgMemCrit.Enter(); - pkt = sgpInfoHead; - if (sgpInfoHead) - sgpInfoHead = sgpInfoHead->pNext; - else - ResetEvent(sghWorkToDoEvent); - sgMemCrit.Leave(); - - if (pkt) { - if (pkt->dwSpaceLeft != MAX_PLRS) - multi_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(DWORD *)&pkt->data[4]); - - dwMilliseconds = 1000 * *(DWORD *)&pkt->data[4] / gdwDeltaBytesSec; - if (dwMilliseconds >= 1) - dwMilliseconds = 1; - - mem_free_dbg(pkt); - - if (dwMilliseconds) - SDL_Delay(dwMilliseconds); - } - } - - return 0; -} - void dthread_cleanup() { TMegaPkt *tmp; diff --git a/Source/dthread.h b/Source/dthread.h index a695ccbc6..1418d5755 100644 --- a/Source/dthread.h +++ b/Source/dthread.h @@ -12,13 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern SDL_threadID glpDThreadId; -extern BOOLEAN dthread_running; - void dthread_remove_player(int pnum); void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen); void dthread_start(); -unsigned int dthread_handler(void *data); void dthread_cleanup(); /* data */ diff --git a/Source/effects.cpp b/Source/effects.cpp index 3726499c8..3d93d1494 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -1078,6 +1078,38 @@ void stream_stop() } } +static void stream_play(TSFX *pSFX, int lVolume, int lPan) +{ + BOOL success; + + assert(pSFX); + assert(pSFX->bFlags & sfx_STREAM); + stream_stop(); + lVolume += sound_get_or_set_sound_volume(1); + if (lVolume >= VOLUME_MIN) { + if (lVolume > VOLUME_MAX) + lVolume = VOLUME_MAX; + success = SFileOpenFile(pSFX->pszName, &sghStream); + if (!success) { + sghStream = NULL; + } else { + if (!SFileDdaBeginEx(sghStream, 0x40000, 0, 0, lVolume, lPan, 0)) + stream_stop(); + else + sgpStreamSFX = pSFX; + } + } +} + +static void stream_update() +{ + DWORD current, end; + + if (sghStream != NULL && SFileDdaGetPos(sghStream, ¤t, &end) && current >= end) { + stream_stop(); + } +} + void InitMonsterSND(int monst) { TSnd *pSnd; @@ -1130,33 +1162,7 @@ void FreeMonsterSnd() } } -void PlayEffect(int i, int mode) -{ - int sndIdx, mi, lVolume, lPan; - TSnd *snd; - - if (plr[myplr].pLvlLoad) { - return; - } - - sndIdx = random_(164, 2); - if (!gbSndInited || !gbSoundOn || gbBufferMsgs) { - return; - } - - mi = monster[i]._mMTidx; - snd = Monsters[mi].Snds[mode][sndIdx]; - if (!snd || snd_playing(snd)) { - return; - } - - if (!calc_snd_position(monster[i]._mx, monster[i]._my, &lVolume, &lPan)) - return; - - snd_play_snd(snd, lVolume, lPan); -} - -BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan) +static BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan) { int pan, volume; @@ -1181,13 +1187,7 @@ BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan) return TRUE; } -void PlaySFX(int psfx) -{ - psfx = RndSFX(psfx); - PlaySFX_priv(&sgSFX[psfx], FALSE, 0, 0); -} - -void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y) +static void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y) { int lPan, lVolume; @@ -1220,30 +1220,33 @@ void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y) snd_play_snd(pSFX->pSnd, lVolume, lPan); } -void stream_play(TSFX *pSFX, int lVolume, int lPan) +void PlayEffect(int i, int mode) { - BOOL success; + int sndIdx, mi, lVolume, lPan; + TSnd *snd; - assert(pSFX); - assert(pSFX->bFlags & sfx_STREAM); - stream_stop(); - lVolume += sound_get_or_set_sound_volume(1); - if (lVolume >= VOLUME_MIN) { - if (lVolume > VOLUME_MAX) - lVolume = VOLUME_MAX; - success = SFileOpenFile(pSFX->pszName, &sghStream); - if (!success) { - sghStream = NULL; - } else { - if (!SFileDdaBeginEx(sghStream, 0x40000, 0, 0, lVolume, lPan, 0)) - stream_stop(); - else - sgpStreamSFX = pSFX; - } + if (plr[myplr].pLvlLoad) { + return; + } + + sndIdx = random_(164, 2); + if (!gbSndInited || !gbSoundOn || gbBufferMsgs) { + return; } + + mi = monster[i]._mMTidx; + snd = Monsters[mi].Snds[mode][sndIdx]; + if (!snd || snd_playing(snd)) { + return; + } + + if (!calc_snd_position(monster[i]._mx, monster[i]._my, &lVolume, &lPan)) + return; + + snd_play_snd(snd, lVolume, lPan); } -int RndSFX(int psfx) +static int RndSFX(int psfx) { int nRand; @@ -1280,6 +1283,12 @@ int RndSFX(int psfx) return psfx + random_(165, nRand); } +void PlaySFX(int psfx) +{ + psfx = RndSFX(psfx); + PlaySFX_priv(&sgSFX[psfx], FALSE, 0, 0); +} + void PlaySfxLoc(int psfx, int x, int y) { TSnd *pSnd; @@ -1309,26 +1318,48 @@ void sound_update() stream_update(); } -void stream_update() +void effects_cleanup_sfx() { - DWORD current, end; + DWORD i; - if (sghStream != NULL && SFileDdaGetPos(sghStream, ¤t, &end) && current >= end) { - stream_stop(); + sound_stop(); + + for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) { + if (sgSFX[i].pSnd) { + sound_file_cleanup(sgSFX[i].pSnd); + sgSFX[i].pSnd = NULL; + } } } -void effects_cleanup_sfx() +static void priv_sound_init(BYTE bLoadMask) { DWORD i; - sound_stop(); + if (!gbSndInited) { + return; + } for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) { if (sgSFX[i].pSnd) { - sound_file_cleanup(sgSFX[i].pSnd); - sgSFX[i].pSnd = NULL; + continue; + } + + if (sgSFX[i].bFlags & sfx_STREAM) { + continue; + } + + if (!(sgSFX[i].bFlags & bLoadMask)) { + continue; } + +#ifndef HELLFIRE + if (sgSFX[i].bFlags & sfx_HELLFIRE) { + continue; + } +#endif + + sgSFX[i].pSnd = sound_file_load(sgSFX[i].pszName); } } @@ -1363,37 +1394,6 @@ void sound_init() priv_sound_init(mask); } -void priv_sound_init(BYTE bLoadMask) -{ - DWORD i; - - if (!gbSndInited) { - return; - } - - for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) { - if (sgSFX[i].pSnd) { - continue; - } - - if (sgSFX[i].bFlags & sfx_STREAM) { - continue; - } - - if (!(sgSFX[i].bFlags & bLoadMask)) { - continue; - } - -#ifndef HELLFIRE - if (sgSFX[i].bFlags & sfx_HELLFIRE) { - continue; - } -#endif - - sgSFX[i].pSnd = sound_file_load(sgSFX[i].pszName); - } -} - void ui_sound_init() { priv_sound_init(sfx_UI); diff --git a/Source/effects.h b/Source/effects.h index 51c13b77f..f6b5c9f30 100644 --- a/Source/effects.h +++ b/Source/effects.h @@ -14,35 +14,23 @@ extern "C" { extern int sfxdelay; extern int sfxdnum; -extern HANDLE sghStream; -extern TSFX *sgpStreamSFX; BOOL effect_is_playing(int nSFX); void stream_stop(); void InitMonsterSND(int monst); void FreeMonsterSnd(); void PlayEffect(int i, int mode); -BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan); void PlaySFX(int psfx); -void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y); -void stream_play(TSFX *pSFX, int lVolume, int lPan); -int RndSFX(int psfx); void PlaySfxLoc(int psfx, int x, int y); void sound_stop(); void sfx_stop(); void sound_update(); -void stream_update(); void effects_cleanup_sfx(); void sound_init(); -void priv_sound_init(BYTE bLoadMask); void ui_sound_init(); void effects_play_sound(const char *snd_file); -/* rdata */ -extern const char MonstSndChar[]; - -/* data */ #ifdef __cplusplus } #endif diff --git a/Source/encrypt.cpp b/Source/encrypt.cpp index c092f3f0c..1c7fcd8bb 100644 --- a/Source/encrypt.cpp +++ b/Source/encrypt.cpp @@ -75,6 +75,35 @@ void InitHash() } } +static unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param) +{ + TDataInfo *pInfo; + DWORD sSize; + + pInfo = (TDataInfo *)param; + + if (*size >= pInfo->size - pInfo->srcOffset) { + sSize = pInfo->size - pInfo->srcOffset; + } else { + sSize = *size; + } + + memcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize); + pInfo->srcOffset += sSize; + + return sSize; +} + +static void PkwareBufferWrite(char *buf, unsigned int *size, void *param) +{ + TDataInfo *pInfo; + + pInfo = (TDataInfo *)param; + + memcpy(pInfo->destData + pInfo->destOffset, buf, *size); + pInfo->destOffset += *size; +} + int PkwareCompress(BYTE *srcData, int size) { BYTE *destData; @@ -111,35 +140,6 @@ int PkwareCompress(BYTE *srcData, int size) return size; } -unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param) -{ - TDataInfo *pInfo; - DWORD sSize; - - pInfo = (TDataInfo *)param; - - if (*size >= pInfo->size - pInfo->srcOffset) { - sSize = pInfo->size - pInfo->srcOffset; - } else { - sSize = *size; - } - - memcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize); - pInfo->srcOffset += sSize; - - return sSize; -} - -void PkwareBufferWrite(char *buf, unsigned int *size, void *param) -{ - TDataInfo *pInfo; - - pInfo = (TDataInfo *)param; - - memcpy(pInfo->destData + pInfo->destOffset, buf, *size); - pInfo->destOffset += *size; -} - void PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes) { char *ptr; diff --git a/Source/encrypt.h b/Source/encrypt.h index 561acb1c5..63c7b5894 100644 --- a/Source/encrypt.h +++ b/Source/encrypt.h @@ -12,15 +12,11 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern DWORD hashtable[5][256]; - void Decrypt(DWORD *castBlock, DWORD size, DWORD key); void Encrypt(DWORD *castBlock, DWORD size, DWORD key); DWORD Hash(const char *s, int type); void InitHash(); int PkwareCompress(BYTE *srcData, int size); -unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param); -void PkwareBufferWrite(char *buf, unsigned int *size, void *param); void PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes); #ifdef __cplusplus diff --git a/Source/engine.cpp b/Source/engine.cpp index 3a85f96a9..f82692687 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -17,7 +17,9 @@ DEVILUTION_BEGIN_NAMESPACE /** automap pixel color 8-bit (palette entry) */ char gbPixelCol; -BOOL gbRotateMap; // flip - if y < x +/** flip - if y < x */ +BOOL gbRotateMap; +/** Seed value before the most recent call to SetRndSeed() */ int orgseed; /** Width of sprite being blitted */ int sgnWidth; @@ -26,7 +28,8 @@ int sglGameSeed; static CCritSect sgMemCrit; /** Number of times the current seed has been fetched */ int SeedCount; -BOOL gbNotInView; // valid - if x/y are in bounds +/** valid - if x/y are in bounds */ +BOOL gbNotInView; /** * Specifies the increment used in the Borland C/C++ pseudo-random. @@ -895,32 +898,6 @@ void Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel) } } -/** - * @brief Blit CL2 sprite, to the back buffer at the given coordianates - * @param sx Back buffer coordinate - * @param sy Back buffer coordinate - * @param pCelBuff CL2 buffer - * @param nCel CL2 frame number - * @param nWidth Width of sprite - */ -void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) -{ - BYTE *pRLEBytes; - int nDataSize; - - assert(gpBuffer != NULL); - assert(pCelBuff != NULL); - assert(nCel > 0); - - pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); - - Cl2BlitSafe( - &gpBuffer[sx + BUFFER_WIDTH * sy], - pRLEBytes, - nDataSize, - nWidth); -} - /** * @brief Blit CL2 sprite to the given buffer * @param pDecodeTo The output buffer @@ -928,7 +905,7 @@ void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) * @param nDataSize Size of CL2 in bytes * @param nWidth Width of sprite */ -void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) +static void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { int w; char width; @@ -999,36 +976,6 @@ void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) } } -/** - * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates - * @param col Color index from current palette - * @param sx Back buffer coordinate - * @param sy Back buffer coordinate - * @param pCelBuff CL2 buffer - * @param nCel CL2 frame number - * @param nWidth Width of sprite - */ -void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) -{ - int nDataSize; - BYTE *pRLEBytes; - - assert(gpBuffer != NULL); - assert(pCelBuff != NULL); - assert(nCel > 0); - - pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); - - gpBufEnd -= BUFFER_WIDTH; - Cl2BlitOutlineSafe( - &gpBuffer[sx + BUFFER_WIDTH * sy], - pRLEBytes, - nDataSize, - nWidth, - col); - gpBufEnd += BUFFER_WIDTH; -} - /** * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the given buffer * @param pDecodeTo The output buffer @@ -1037,7 +984,7 @@ void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWid * @param nWidth Width of sprite * @param col Color index from current palette */ -void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col) +static void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col) { int w; char width; @@ -1114,41 +1061,6 @@ void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWi } } -/** - * @brief Blit CL2 sprite, and apply a given lighting, to the back buffer at the given coordianates - * @param sx Back buffer coordinate - * @param sy Back buffer coordinate - * @param pCelBuff CL2 buffer - * @param nCel CL2 frame number - * @param nWidth Width of sprite - * @param light Light shade to use - */ -void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char light) -{ - int nDataSize, idx; - BYTE *pRLEBytes, *pDecodeTo; - - assert(gpBuffer != NULL); - assert(pCelBuff != NULL); - assert(nCel > 0); - - pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); - pDecodeTo = &gpBuffer[sx + BUFFER_WIDTH * sy]; - - idx = light4flag ? 1024 : 4096; - if (light == 2) - idx += 256; // gray colors - if (light >= 4) - idx += (light - 1) << 8; - - Cl2BlitLightSafe( - pDecodeTo, - pRLEBytes, - nDataSize, - nWidth, - &pLightTbl[idx]); -} - /** * @brief Blit CL2 sprite, and apply lighting, to the given buffer * @param pDecodeTo The output buffer @@ -1157,7 +1069,7 @@ void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char * @param nWidth With of CL2 sprite * @param pTable Light color table */ -void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable) +static void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable) { int w; char width; @@ -1229,6 +1141,96 @@ void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidt } } +/** + * @brief Blit CL2 sprite, to the back buffer at the given coordianates + * @param sx Back buffer coordinate + * @param sy Back buffer coordinate + * @param pCelBuff CL2 buffer + * @param nCel CL2 frame number + * @param nWidth Width of sprite + */ +void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) +{ + BYTE *pRLEBytes; + int nDataSize; + + assert(gpBuffer != NULL); + assert(pCelBuff != NULL); + assert(nCel > 0); + + pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); + + Cl2BlitSafe( + &gpBuffer[sx + BUFFER_WIDTH * sy], + pRLEBytes, + nDataSize, + nWidth); +} +/** + * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates + * @param col Color index from current palette + * @param sx Back buffer coordinate + * @param sy Back buffer coordinate + * @param pCelBuff CL2 buffer + * @param nCel CL2 frame number + * @param nWidth Width of sprite + */ +void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) +{ + int nDataSize; + BYTE *pRLEBytes; + + assert(gpBuffer != NULL); + assert(pCelBuff != NULL); + assert(nCel > 0); + + pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); + + gpBufEnd -= BUFFER_WIDTH; + Cl2BlitOutlineSafe( + &gpBuffer[sx + BUFFER_WIDTH * sy], + pRLEBytes, + nDataSize, + nWidth, + col); + gpBufEnd += BUFFER_WIDTH; +} + +/** + * @brief Blit CL2 sprite, and apply a given lighting, to the back buffer at the given coordianates + * @param sx Back buffer coordinate + * @param sy Back buffer coordinate + * @param pCelBuff CL2 buffer + * @param nCel CL2 frame number + * @param nWidth Width of sprite + * @param light Light shade to use + */ +void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char light) +{ + int nDataSize, idx; + BYTE *pRLEBytes, *pDecodeTo; + + assert(gpBuffer != NULL); + assert(pCelBuff != NULL); + assert(nCel > 0); + + pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize); + pDecodeTo = &gpBuffer[sx + BUFFER_WIDTH * sy]; + + idx = light4flag ? 1024 : 4096; + if (light == 2) + idx += 256; // gray colors + if (light >= 4) + idx += (light - 1) << 8; + + Cl2BlitLightSafe( + pDecodeTo, + pRLEBytes, + nDataSize, + nWidth, + &pLightTbl[idx]); +} + /** * @brief Blit CL2 sprite, and apply lighting, to the back buffer at the given coordinates * @param sx Back buffer coordinate diff --git a/Source/engine.h b/Source/engine.h index fc89d89dc..181cfd10c 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -19,20 +19,6 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -//offset 0 -//pCelBuff->pFrameTable[0] - -/** automap pixel color 8-bit (palette entry) */ -extern char gbPixelCol; -/** flip - if y < x */ -extern BOOL gbRotateMap; -/** Seed value before the most recent call to SetRndSeed() */ -extern int orgseed; -/** Track number of calls to GetRndSeed() since last call to SetRndSeed() */ -extern int SeedCount; -/** valid - if x/y are in bounds */ -extern BOOL gbNotInView; - inline BYTE *CelGetFrameStart(BYTE *pCelBuff, int nCel) { DWORD *pFrameTable; @@ -99,10 +85,6 @@ void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWi void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable); void PlayInGameMovie(const char *pszMovie); -/* rdata */ - -extern const int RndInc; -extern const int RndMult; #ifdef __cplusplus } diff --git a/Source/error.h b/Source/error.h index f9bb01083..8c55b2463 100644 --- a/Source/error.h +++ b/Source/error.h @@ -12,18 +12,13 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern char msgtable[MAX_SEND_STR_LEN]; extern DWORD msgdelay; extern char msgflag; -extern char msgcnt; void InitDiabloMsg(char e); void ClrDiabloMsg(); void DrawDiabloMsg(); -/* data */ -extern const char *const MsgStrings[]; - #ifdef __cplusplus } #endif diff --git a/Source/gamemenu.cpp b/Source/gamemenu.cpp index 0dcf1f404..1354bc06d 100644 --- a/Source/gamemenu.cpp +++ b/Source/gamemenu.cpp @@ -80,17 +80,7 @@ char *jogging_title = "Fast Walk"; /** Specifies the menu names for colour cycling disabled and enabled. */ const char *const color_cycling_toggle_names[] = { "Color Cycling Off", "Color Cycling On" }; -void gamemenu_on() -{ - if (gbMaxPlayers == 1) { - gmenu_set_items(sgSingleMenu, gamemenu_update_single); - } else { - gmenu_set_items(sgMultiMenu, gamemenu_update_multi); - } - PressEscKey(); -} - -void gamemenu_update_single(TMenuItem *pMenuItems) +static void gamemenu_update_single(TMenuItem *pMenuItems) { BOOL enable; @@ -103,11 +93,21 @@ void gamemenu_update_single(TMenuItem *pMenuItems) gmenu_enable(&sgSingleMenu[0], enable); } -void gamemenu_update_multi(TMenuItem *pMenuItems) +static void gamemenu_update_multi(TMenuItem *pMenuItems) { gmenu_enable(&sgMultiMenu[2], deathflag); } +void gamemenu_on() +{ + if (gbMaxPlayers == 1) { + gmenu_set_items(sgSingleMenu, gamemenu_update_single); + } else { + gmenu_set_items(sgMultiMenu, gamemenu_update_multi); + } + PressEscKey(); +} + void gamemenu_off() { gmenu_set_items(NULL, NULL); @@ -209,27 +209,7 @@ void gamemenu_restart_town(BOOL bActivate) NetSendCmd(TRUE, CMD_RETOWN); } -void gamemenu_options(BOOL bActivate) -{ - gamemenu_get_music(); - gamemenu_get_sound(); -#ifdef HELLFIRE - gamemenu_jogging(); -#endif - gamemenu_get_gamma(); -#ifndef HELLFIRE - gamemenu_get_speed(); - //gamemenu_get_color_cycling(); -#endif - gmenu_set_items(sgOptionsMenu, NULL); -} - -void gamemenu_get_music() -{ - gamemenu_sound_music_toggle(music_toggle_names, sgOptionsMenu, sound_get_or_set_music_volume(1)); -} - -void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int volume) +static void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int volume) { if (gbSndInited) { menu_item->dwFlags |= GMENU_ENABLED | GMENU_SLIDER; @@ -243,13 +223,23 @@ void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, menu_item->pszStr = names[1]; } -void gamemenu_get_sound() +static int gamemenu_slider_music_sound(TMenuItem *menu_item) +{ + return gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX); +} + +static void gamemenu_get_music() +{ + gamemenu_sound_music_toggle(music_toggle_names, sgOptionsMenu, sound_get_or_set_music_volume(1)); +} + +static void gamemenu_get_sound() { gamemenu_sound_music_toggle(sound_toggle_names, &sgOptionsMenu[1], sound_get_or_set_sound_volume(1)); } #ifdef HELLFIRE -void gamemenu_jogging() +static void gamemenu_jogging() { gmenu_slider_steps(&sgOptionsMenu[3], 2); gmenu_slider_set(&sgOptionsMenu[3], 0, 1, jogging_opt); @@ -257,15 +247,57 @@ void gamemenu_jogging() } #endif -void gamemenu_get_color_cycling() +static void gamemenu_get_gamma() +{ + gmenu_slider_steps(&sgOptionsMenu[2], 15); + gmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0)); +} + +static void gamemenu_get_speed() +{ + if (gbMaxPlayers != 1) { + sgOptionsMenu[3].dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER); + if (ticks_per_sec >= 50) + sgOptionsMenu[3].pszStr = "Speed: Fastest"; + else if (ticks_per_sec >= 40) + sgOptionsMenu[3].pszStr = "Speed: Faster"; + else if (ticks_per_sec >= 30) + sgOptionsMenu[3].pszStr = "Speed: Fast"; + else if (ticks_per_sec == 20) + sgOptionsMenu[3].pszStr = "Speed: Normal"; + return; + } + + sgOptionsMenu[3].dwFlags |= GMENU_ENABLED | GMENU_SLIDER; + + sgOptionsMenu[3].pszStr = "Speed"; + gmenu_slider_steps(&sgOptionsMenu[3], 46); + gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec); +} + +static void gamemenu_get_color_cycling() { sgOptionsMenu[3].pszStr = color_cycling_toggle_names[palette_get_color_cycling() & 1]; } -void gamemenu_get_gamma() +static int gamemenu_slider_gamma() { - gmenu_slider_steps(&sgOptionsMenu[2], 15); - gmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0)); + return gmenu_slider_get(&sgOptionsMenu[2], 30, 100); +} + +void gamemenu_options(BOOL bActivate) +{ + gamemenu_get_music(); + gamemenu_get_sound(); +#ifdef HELLFIRE + gamemenu_jogging(); +#endif + gamemenu_get_gamma(); +#ifndef HELLFIRE + gamemenu_get_speed(); + //gamemenu_get_color_cycling(); +#endif + gmenu_set_items(sgOptionsMenu, NULL); } void gamemenu_music_volume(BOOL bActivate) @@ -322,11 +354,6 @@ void gamemenu_music_volume(BOOL bActivate) gamemenu_get_music(); } -int gamemenu_slider_music_sound(TMenuItem *menu_item) -{ - return gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX); -} - void gamemenu_sound_volume(BOOL bActivate) { int volume; @@ -384,33 +411,6 @@ void gamemenu_gamma(BOOL bActivate) gamemenu_get_gamma(); } -int gamemenu_slider_gamma() -{ - return gmenu_slider_get(&sgOptionsMenu[2], 30, 100); -} - -void gamemenu_get_speed() -{ - if (gbMaxPlayers != 1) { - sgOptionsMenu[3].dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER); - if (ticks_per_sec >= 50) - sgOptionsMenu[3].pszStr = "Speed: Fastest"; - else if (ticks_per_sec >= 40) - sgOptionsMenu[3].pszStr = "Speed: Faster"; - else if (ticks_per_sec >= 30) - sgOptionsMenu[3].pszStr = "Speed: Fast"; - else if (ticks_per_sec == 20) - sgOptionsMenu[3].pszStr = "Speed: Normal"; - return; - } - - sgOptionsMenu[3].dwFlags |= GMENU_ENABLED | GMENU_SLIDER; - - sgOptionsMenu[3].pszStr = "Speed"; - gmenu_slider_steps(&sgOptionsMenu[3], 46); - gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec); -} - void gamemenu_speed(BOOL bActivate) { if (bActivate) { diff --git a/Source/gamemenu.h b/Source/gamemenu.h index 900116e45..9eb770383 100644 --- a/Source/gamemenu.h +++ b/Source/gamemenu.h @@ -18,8 +18,6 @@ extern BOOL jogging_opt; #endif void gamemenu_on(); -void gamemenu_update_single(TMenuItem *pMenuItems); -void gamemenu_update_multi(TMenuItem *pMenuItems); void gamemenu_off(); void gamemenu_handle_previous(); void gamemenu_previous(BOOL bActivate); @@ -29,36 +27,15 @@ void gamemenu_load_game(BOOL bActivate); void gamemenu_save_game(BOOL bActivate); void gamemenu_restart_town(BOOL bActivate); void gamemenu_options(BOOL bActivate); -void gamemenu_get_music(); -void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int gamma); -void gamemenu_get_sound(); -#ifdef HELLFIRE -void gamemenu_jogging(); -#endif -#ifndef HELLFIRE -void gamemenu_get_color_cycling(); -#endif -void gamemenu_get_gamma(); void gamemenu_music_volume(BOOL bActivate); -int gamemenu_slider_music_sound(TMenuItem *menu_item); void gamemenu_sound_volume(BOOL bActivate); #ifdef HELLFIRE void gamemenu_loadjog(BOOL bActivate); #endif void gamemenu_gamma(BOOL bActivate); -int gamemenu_slider_gamma(); #ifndef HELLFIRE -void gamemenu_color_cycling(BOOL bActivate); -#endif - -void gamemenu_get_speed(); void gamemenu_speed(BOOL bActivate); - -/* rdata */ -extern const char *const music_toggle_names[]; -extern const char *const sound_toggle_names[]; -#ifndef HELLFIRE -extern const char *const color_cycling_toggle_names[]; +void gamemenu_color_cycling(BOOL bActivate); #endif #ifdef __cplusplus diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index 7110b5df8..53e8cd948 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -50,17 +50,7 @@ const BYTE lfontkern[] = { 11, 10, 12, 11, 21, 23 }; -void gmenu_draw_pause() -{ - if (currlevel != 0) - RedBack(); - if (!sgpCurrentMenu) { - light_table_index = 0; - gmenu_print_text(316 + PANEL_LEFT, 336, "Pause"); - } -} - -void gmenu_print_text(int x, int y, const char *pszStr) +static void gmenu_print_text(int x, int y, const char *pszStr) { BYTE c; @@ -73,6 +63,16 @@ void gmenu_print_text(int x, int y, const char *pszStr) } } +void gmenu_draw_pause() +{ + if (currlevel != 0) + RedBack(); + if (!sgpCurrentMenu) { + light_table_index = 0; + gmenu_print_text(316 + PANEL_LEFT, 336, "Pause"); + } +} + void FreeGMenu() { MemFreeDbg(sgpLogo); @@ -108,30 +108,7 @@ BOOL gmenu_is_active() return sgpCurrentMenu != NULL; } -void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *)) -{ - int i; - - PauseMode = 0; - mouseNavigation = FALSE; - sgpCurrentMenu = pItem; - dword_63447C = gmFunc; - if (gmFunc) { - dword_63447C(sgpCurrentMenu); - pItem = sgpCurrentMenu; - } - sgCurrentMenuIdx = 0; - if (sgpCurrentMenu) { - for (i = 0; sgpCurrentMenu[i].fnMenu; i++) { - sgCurrentMenuIdx++; - } - } - // BUGFIX: OOB access when sgCurrentMenuIdx is 0; should be set to NULL instead. (fixed) - sgpCurrItem = sgCurrentMenuIdx > 0 ? &sgpCurrentMenu[sgCurrentMenuIdx - 1] : NULL; - gmenu_up_down(TRUE); -} - -void gmenu_up_down(BOOL isDown) +static void gmenu_up_down(BOOL isDown) { int i; @@ -161,40 +138,58 @@ void gmenu_up_down(BOOL isDown) } } -void gmenu_draw() +void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *)) { - int y; - TMenuItem *i; - DWORD ticks; + int i; + PauseMode = 0; + mouseNavigation = FALSE; + sgpCurrentMenu = pItem; + dword_63447C = gmFunc; + if (gmFunc) { + dword_63447C(sgpCurrentMenu); + pItem = sgpCurrentMenu; + } + sgCurrentMenuIdx = 0; if (sgpCurrentMenu) { - if (dword_63447C) - dword_63447C(sgpCurrentMenu); -#ifdef HELLFIRE - ticks = SDL_GetTicks(); - if ((int)(ticks - LogoAnim_tick) > 25) { - LogoAnim_frame++; - if (LogoAnim_frame > 16) - LogoAnim_frame = 1; - LogoAnim_tick = ticks; - } - CelDraw((SCREEN_WIDTH - 430) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, LogoAnim_frame, 430); -#else - CelDraw((SCREEN_WIDTH - 296) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, 1, 296); -#endif - y = 160 + SCREEN_Y + UI_OFFSET_Y; - i = sgpCurrentMenu; - if (sgpCurrentMenu->fnMenu) { - while (i->fnMenu) { - gmenu_draw_menu_item(i, y); - i++; - y += 45; - } + for (i = 0; sgpCurrentMenu[i].fnMenu; i++) { + sgCurrentMenuIdx++; } } + // BUGFIX: OOB access when sgCurrentMenuIdx is 0; should be set to NULL instead. (fixed) + sgpCurrItem = sgCurrentMenuIdx > 0 ? &sgpCurrentMenu[sgCurrentMenuIdx - 1] : NULL; + gmenu_up_down(TRUE); +} + +static void gmenu_clear_buffer(int x, int y, int width, int height) +{ + BYTE *i; + + i = gpBuffer + BUFFER_WIDTH * y + x; + while (height--) { + memset(i, 205, width); + i -= BUFFER_WIDTH; + } +} + +static int gmenu_get_lfont(TMenuItem *pItem) +{ + const char *text; + int i; + BYTE c; + + if (pItem->dwFlags & GMENU_SLIDER) + return 490; + text = pItem->pszStr; + i = 0; + while (*text) { + c = gbFontTransTbl[(BYTE)*text++]; + i += lfontkern[lfontframe[c]] + 2; + } + return i - 2; } -void gmenu_draw_menu_item(TMenuItem *pItem, int y) +static void gmenu_draw_menu_item(TMenuItem *pItem, int y) { DWORD w, x, nSteps, step, pos, t; #ifndef HELLFIRE @@ -229,32 +224,58 @@ void gmenu_draw_menu_item(TMenuItem *pItem, int y) } } -void gmenu_clear_buffer(int x, int y, int width, int height) +void gmenu_draw() { - BYTE *i; + int y; + TMenuItem *i; + DWORD ticks; - i = gpBuffer + BUFFER_WIDTH * y + x; - while (height--) { - memset(i, 205, width); - i -= BUFFER_WIDTH; - } + if (sgpCurrentMenu) { + if (dword_63447C) + dword_63447C(sgpCurrentMenu); +#ifdef HELLFIRE + ticks = SDL_GetTicks(); + if ((int)(ticks - LogoAnim_tick) > 25) { + LogoAnim_frame++; + if (LogoAnim_frame > 16) + LogoAnim_frame = 1; + LogoAnim_tick = ticks; + } + CelDraw((SCREEN_WIDTH - 430) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, LogoAnim_frame, 430); +#else + CelDraw((SCREEN_WIDTH - 296) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, 1, 296); +#endif + y = 160 + SCREEN_Y + UI_OFFSET_Y; + i = sgpCurrentMenu; + if (sgpCurrentMenu->fnMenu) { + while (i->fnMenu) { + gmenu_draw_menu_item(i, y); + i++; + y += 45; + } + } + } } -int gmenu_get_lfont(TMenuItem *pItem) +static void gmenu_left_right(BOOL isRight) { - const char *text; - int i; - BYTE c; + int step; - if (pItem->dwFlags & GMENU_SLIDER) - return 490; - text = pItem->pszStr; - i = 0; - while (*text) { - c = gbFontTransTbl[(BYTE)*text++]; - i += lfontkern[lfontframe[c]] + 2; + if (sgpCurrItem->dwFlags & GMENU_SLIDER) { + step = sgpCurrItem->dwFlags & 0xFFF; + if (isRight) { + if (step == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12) + return; + step++; + } else { + if (!step) + return; + step--; + } + sgpCurrItem->dwFlags &= 0xFFFFF000; + sgpCurrItem->dwFlags |= step; + sgpCurrItem->fnMenu(FALSE); } - return i - 2; } BOOL gmenu_presskeys(int vkey) @@ -290,25 +311,19 @@ BOOL gmenu_presskeys(int vkey) return TRUE; } -void gmenu_left_right(BOOL isRight) +static BOOLEAN gmenu_get_mouse_slider(int *plOffset) { - int step; - - if (sgpCurrItem->dwFlags & GMENU_SLIDER) { - step = sgpCurrItem->dwFlags & 0xFFF; - if (isRight) { - if (step == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12) - return; - step++; - } else { - if (!step) - return; - step--; - } - sgpCurrItem->dwFlags &= 0xFFFFF000; - sgpCurrItem->dwFlags |= step; - sgpCurrItem->fnMenu(FALSE); + *plOffset = 282; + if (MouseX < 282 + PANEL_LEFT) { + *plOffset = 0; + return FALSE; } + if (MouseX > 538 + PANEL_LEFT) { + *plOffset = 256; + return FALSE; + } + *plOffset = MouseX - 282 - PANEL_LEFT; + return TRUE; } BOOL gmenu_on_mouse_move() @@ -328,21 +343,6 @@ BOOL gmenu_on_mouse_move() return TRUE; } -BOOLEAN gmenu_get_mouse_slider(int *plOffset) -{ - *plOffset = 282; - if (MouseX < 282 + PANEL_LEFT) { - *plOffset = 0; - return FALSE; - } - if (MouseX > 538 + PANEL_LEFT) { - *plOffset = 256; - return FALSE; - } - *plOffset = MouseX - 282 - PANEL_LEFT; - return TRUE; -} - BOOL gmenu_left_mouse(BOOL isDown) { TMenuItem *pItem; diff --git a/Source/gmenu.h b/Source/gmenu.h index 104f512dd..757cecce7 100644 --- a/Source/gmenu.h +++ b/Source/gmenu.h @@ -12,43 +12,23 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern BYTE *optbar_cel; -extern BOOLEAN mouseNavigation; -extern BYTE *PentSpin_cel; -extern BYTE *BigTGold_cel; -extern int dword_634474; -extern char byte_634478; extern void (*dword_63447C)(TMenuItem *); extern TMenuItem *sgpCurrentMenu; -extern BYTE *option_cel; -extern int sgCurrentMenuIdx; void gmenu_draw_pause(); -void gmenu_print_text(int x, int y, const char *pszStr); void FreeGMenu(); void gmenu_init_menu(); BOOL gmenu_is_active(); void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *)); -void gmenu_up_down(BOOL isDown); void gmenu_draw(); -void gmenu_draw_menu_item(TMenuItem *pItem, int y); -void gmenu_clear_buffer(int x, int y, int width, int height); -int gmenu_get_lfont(TMenuItem *pItem); BOOL gmenu_presskeys(int vkey); -void gmenu_left_right(BOOL isRight); BOOL gmenu_on_mouse_move(); -BOOLEAN gmenu_get_mouse_slider(int *plOffset); BOOL gmenu_left_mouse(BOOL isDown); void gmenu_enable(TMenuItem *pMenuItem, BOOL enable); void gmenu_slider_set(TMenuItem *pItem, int min, int max, int gamma); int gmenu_slider_get(TMenuItem *pItem, int min, int max); void gmenu_slider_steps(TMenuItem *pItem, int dwTicks); -/* rdata */ - -extern const BYTE lfontframe[]; -extern const BYTE lfontkern[]; - #ifdef __cplusplus } #endif diff --git a/Source/help.cpp b/Source/help.cpp index 84327db97..0e05007e3 100644 --- a/Source/help.cpp +++ b/Source/help.cpp @@ -449,6 +449,27 @@ void InitHelp() displayinghelp[0] = 0; } +static void DrawHelpLine(int x, int y, char *text, char color) +{ + int sx, sy, width; + BYTE c; + + width = 0; + sx = x + 32 + PANEL_X; + sy = y * 12 + 44 + SCREEN_Y + UI_OFFSET_Y; + while (*text) { + c = gbFontTransTbl[(BYTE)*text]; + text++; + c = fontframe[c]; + width += fontkern[c] + 1; + if (c) { + if (width <= 577) + PrintChar(sx, sy, c, color); + } + sx += fontkern[c] + 1; + } +} + void DrawHelp() { int i, c, w; @@ -545,27 +566,6 @@ void DrawHelp() PrintSString(0, 23, TRUE, "Press ESC to end or the arrow keys to scroll.", COL_GOLD, 0); } -void DrawHelpLine(int x, int y, char *text, char color) -{ - int sx, sy, width; - BYTE c; - - width = 0; - sx = x + 32 + PANEL_X; - sy = y * 12 + 44 + SCREEN_Y + UI_OFFSET_Y; - while (*text) { - c = gbFontTransTbl[(BYTE)*text]; - text++; - c = fontframe[c]; - width += fontkern[c] + 1; - if (c) { - if (width <= 577) - PrintChar(sx, sy, c, color); - } - sx += fontkern[c] + 1; - } -} - void DisplayHelp() { help_select_line = 0; diff --git a/Source/help.h b/Source/help.h index f7d2c783e..0f1e39a47 100644 --- a/Source/help.h +++ b/Source/help.h @@ -12,22 +12,14 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int help_select_line; -extern int dword_634494; extern BOOL helpflag; -extern int displayinghelp[22]; -extern int HelpTop; void InitHelp(); void DrawHelp(); -void DrawHelpLine(int x, int y, char *text, char color); void DisplayHelp(); void HelpScrollUp(); void HelpScrollDown(); -/* rdata */ -extern const char gszHelpText[]; - #ifdef __cplusplus } #endif diff --git a/Source/init.cpp b/Source/init.cpp index bc6481190..00d6a65e4 100644 --- a/Source/init.cpp +++ b/Source/init.cpp @@ -116,16 +116,10 @@ void init_cleanup() NetClose(); } -void init_create_window() +static void init_get_file_info() { - if (!SpawnWindow(PROJECT_NAME)) - app_fatal("Unable to create main window"); - dx_init(NULL); - was_window_init = true; - gbActive = true; - gpBufStart = &gpBuffer[BUFFER_WIDTH * SCREEN_Y]; - gpBufEnd = (BYTE *)(BUFFER_WIDTH * (SCREEN_HEIGHT + SCREEN_Y)); - SDL_DisableScreenSaver(); + snprintf(gszProductName, sizeof(gszProductName) / sizeof(char), "%s v%s", PROJECT_NAME, PROJECT_VERSION); + snprintf(gszVersionNumber, sizeof(gszVersionNumber) / sizeof(char), "version %s", PROJECT_VERSION); } void init_archives() @@ -165,10 +159,15 @@ void init_archives() #endif } -void init_get_file_info() +void init_create_window() { - snprintf(gszProductName, sizeof(gszProductName) / sizeof(char), "%s v%s", PROJECT_NAME, PROJECT_VERSION); - snprintf(gszVersionNumber, sizeof(gszVersionNumber) / sizeof(char), "version %s", PROJECT_VERSION); + if (!SpawnWindow(PROJECT_NAME)) + app_fatal("Unable to create main window"); + dx_init(NULL); + gbActive = true; + gpBufStart = &gpBuffer[BUFFER_WIDTH * SCREEN_Y]; + gpBufEnd = (BYTE *)(BUFFER_WIDTH * (SCREEN_HEIGHT + SCREEN_Y)); + SDL_DisableScreenSaver(); } void MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) diff --git a/Source/init.h b/Source/init.h index a96537cfa..b92bd6ac7 100644 --- a/Source/init.h +++ b/Source/init.h @@ -17,32 +17,20 @@ extern int gbActive; extern HANDLE hellfire_mpq; extern WNDPROC CurrentProc; extern HANDLE diabdat_mpq; -extern HANDLE patch_rt_mpq; extern bool gbIsSpawn; -extern BOOLEAN screensaver_enabled_prev; +extern HANDLE patch_rt_mpq; #ifdef HELLFIRE extern HANDLE hfmonk_mpq; extern HANDLE hfbard_mpq; extern HANDLE hfbarb_mpq; -extern HANDLE hfmusic_mpq; -extern HANDLE hfvoice_mpq; -extern HANDLE hfopt1_mpq; -extern HANDLE hfopt2_mpq; #endif void init_cleanup(); -void init_disable_screensaver(BOOLEAN disable); -void init_create_window(); void init_archives(); -void init_get_file_info(); +void init_create_window(); void MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -void init_activate_window(HWND hWnd, BOOL bActive); WNDPROC SetWindowProc(WNDPROC NewProc); -extern BOOL was_window_init; /** defined in dx.cpp */ - -/* rdata */ - /* data */ extern char gszVersionNumber[260]; diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 5b8195b21..06339b063 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -16,250 +16,12 @@ const BYTE BarColor[3] = { 138, 43, 254 }; /** The screen position of the top left corner of the progress bar. */ const int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } }; -void interface_msg_pump() -{ - MSG Msg; - - while (PeekMessage(&Msg)) { - if (Msg.message != DVL_WM_QUIT) { - TranslateMessage(&Msg); - DispatchMessage(&Msg); - } - } -} - -BOOL IncProgress() -{ - interface_msg_pump(); - sgdwProgress += 23; - if ((DWORD)sgdwProgress > 534) - sgdwProgress = 534; - if (sgpBackCel) - DrawCutscene(); - return (DWORD)sgdwProgress >= 534; -} - -void DrawCutscene() -{ - DWORD i; - - lock_buf(1); - CelDraw(PANEL_X, 480 + SCREEN_Y - 1 + UI_OFFSET_Y, sgpBackCel, 1, 640); - - for (i = 0; i < sgdwProgress; i++) { - DrawProgress( - BarPos[progress_id][0] + i + PANEL_X, - BarPos[progress_id][1] + SCREEN_Y + UI_OFFSET_Y, - progress_id); - } - - unlock_buf(1); - force_redraw = 255; - scrollrt_draw_game_screen(FALSE); -} - -void DrawProgress(int screen_x, int screen_y, int progress_id) -{ - BYTE *dst; - int i; - - dst = &gpBuffer[screen_x + BUFFER_WIDTH * screen_y]; - for (i = 0; i < 22; i++) { - *dst = BarColor[progress_id]; - dst += BUFFER_WIDTH; - } -} - -void ShowProgress(unsigned int uMsg) -{ - WNDPROC saveProc; - - gbSomebodyWonGameKludge = FALSE; - plrmsg_delay(TRUE); - - assert(ghMainWnd); - saveProc = SetWindowProc(DisableInputWndProc); - - interface_msg_pump(); - ClearScreenBuffer(); - scrollrt_draw_game_screen(TRUE); - InitCutscene(uMsg); - BlackPalette(); - DrawCutscene(); - PaletteFadeIn(8); - IncProgress(); - sound_init(); - IncProgress(); - - switch (uMsg) { - case WM_DIABLOADGAME: - IncProgress(); - IncProgress(); - LoadGame(TRUE); - IncProgress(); - IncProgress(); - break; - case WM_DIABNEWGAME: - IncProgress(); - FreeGameMem(); - IncProgress(); - pfile_remove_temp_files(); - IncProgress(); - LoadGameLevel(TRUE, ENTRY_MAIN); - IncProgress(); - break; - case WM_DIABNEXTLVL: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - currlevel++; - leveltype = gnLevelTypeTbl[currlevel]; - assert(plr[myplr].plrlevel == currlevel); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_MAIN); - IncProgress(); - break; - case WM_DIABPREVLVL: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - currlevel--; - leveltype = gnLevelTypeTbl[currlevel]; - assert(plr[myplr].plrlevel == currlevel); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_PREV); - IncProgress(); - break; - case WM_DIABSETLVL: - SetReturnLvlPos(); - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - setlevel = TRUE; - leveltype = setlvltype; - FreeGameMem(); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_SETLVL); - IncProgress(); - break; - case WM_DIABRTNLVL: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - setlevel = FALSE; - FreeGameMem(); - IncProgress(); - GetReturnLvlPos(); - LoadGameLevel(FALSE, ENTRY_RTNLVL); - IncProgress(); - break; - case WM_DIABWARPLVL: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - GetPortalLevel(); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_WARPLVL); - IncProgress(); - break; - case WM_DIABTOWNWARP: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - currlevel = plr[myplr].plrlevel; - leveltype = gnLevelTypeTbl[currlevel]; - assert(plr[myplr].plrlevel == currlevel); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_TWARPDN); - IncProgress(); - break; - case WM_DIABTWARPUP: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - currlevel = plr[myplr].plrlevel; - leveltype = gnLevelTypeTbl[currlevel]; - assert(plr[myplr].plrlevel == currlevel); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_TWARPUP); - IncProgress(); - break; - case WM_DIABRETOWN: - IncProgress(); - if (gbMaxPlayers == 1) { - SaveLevel(); - } else { - DeltaSaveLevel(); - } - IncProgress(); - FreeGameMem(); - currlevel = plr[myplr].plrlevel; - leveltype = gnLevelTypeTbl[currlevel]; - assert(plr[myplr].plrlevel == currlevel); - IncProgress(); - LoadGameLevel(FALSE, ENTRY_MAIN); - IncProgress(); - break; - } - - assert(ghMainWnd); - - PaletteFadeOut(8); - FreeInterface(); - - saveProc = SetWindowProc(saveProc); - assert(saveProc == DisableInputWndProc); - - NetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr]._px, plr[myplr]._py, plr[myplr].plrlevel); - plrmsg_delay(FALSE); - ResetPal(); - - if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) { - PrepDoEnding(); - } - - gbSomebodyWonGameKludge = FALSE; -} - -void FreeInterface() +static void FreeInterface() { MemFreeDbg(sgpBackCel); } -void InitCutscene(unsigned int uMsg) +static void InitCutscene(unsigned int uMsg) { assert(!sgpBackCel); @@ -490,4 +252,242 @@ void InitCutscene(unsigned int uMsg) sgdwProgress = 0; } +static void DrawProgress(int screen_x, int screen_y, int progress_id) +{ + BYTE *dst; + int i; + + dst = &gpBuffer[screen_x + BUFFER_WIDTH * screen_y]; + for (i = 0; i < 22; i++) { + *dst = BarColor[progress_id]; + dst += BUFFER_WIDTH; + } +} + +static void DrawCutscene() +{ + DWORD i; + + lock_buf(1); + CelDraw(PANEL_X, 480 + SCREEN_Y - 1 + UI_OFFSET_Y, sgpBackCel, 1, 640); + + for (i = 0; i < sgdwProgress; i++) { + DrawProgress( + BarPos[progress_id][0] + i + PANEL_X, + BarPos[progress_id][1] + SCREEN_Y + UI_OFFSET_Y, + progress_id); + } + + unlock_buf(1); + force_redraw = 255; + scrollrt_draw_game_screen(FALSE); +} + +void interface_msg_pump() +{ + MSG Msg; + + while (PeekMessage(&Msg)) { + if (Msg.message != DVL_WM_QUIT) { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } +} + +BOOL IncProgress() +{ + interface_msg_pump(); + sgdwProgress += 23; + if ((DWORD)sgdwProgress > 534) + sgdwProgress = 534; + if (sgpBackCel) + DrawCutscene(); + return (DWORD)sgdwProgress >= 534; +} + +void ShowProgress(unsigned int uMsg) +{ + WNDPROC saveProc; + + gbSomebodyWonGameKludge = FALSE; + plrmsg_delay(TRUE); + + assert(ghMainWnd); + saveProc = SetWindowProc(DisableInputWndProc); + + interface_msg_pump(); + ClearScreenBuffer(); + scrollrt_draw_game_screen(TRUE); + InitCutscene(uMsg); + BlackPalette(); + DrawCutscene(); + PaletteFadeIn(8); + IncProgress(); + sound_init(); + IncProgress(); + + switch (uMsg) { + case WM_DIABLOADGAME: + IncProgress(); + IncProgress(); + LoadGame(TRUE); + IncProgress(); + IncProgress(); + break; + case WM_DIABNEWGAME: + IncProgress(); + FreeGameMem(); + IncProgress(); + pfile_remove_temp_files(); + IncProgress(); + LoadGameLevel(TRUE, ENTRY_MAIN); + IncProgress(); + break; + case WM_DIABNEXTLVL: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + currlevel++; + leveltype = gnLevelTypeTbl[currlevel]; + assert(plr[myplr].plrlevel == currlevel); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_MAIN); + IncProgress(); + break; + case WM_DIABPREVLVL: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + currlevel--; + leveltype = gnLevelTypeTbl[currlevel]; + assert(plr[myplr].plrlevel == currlevel); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_PREV); + IncProgress(); + break; + case WM_DIABSETLVL: + SetReturnLvlPos(); + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + setlevel = TRUE; + leveltype = setlvltype; + FreeGameMem(); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_SETLVL); + IncProgress(); + break; + case WM_DIABRTNLVL: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + setlevel = FALSE; + FreeGameMem(); + IncProgress(); + GetReturnLvlPos(); + LoadGameLevel(FALSE, ENTRY_RTNLVL); + IncProgress(); + break; + case WM_DIABWARPLVL: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + GetPortalLevel(); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_WARPLVL); + IncProgress(); + break; + case WM_DIABTOWNWARP: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + currlevel = plr[myplr].plrlevel; + leveltype = gnLevelTypeTbl[currlevel]; + assert(plr[myplr].plrlevel == currlevel); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_TWARPDN); + IncProgress(); + break; + case WM_DIABTWARPUP: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + currlevel = plr[myplr].plrlevel; + leveltype = gnLevelTypeTbl[currlevel]; + assert(plr[myplr].plrlevel == currlevel); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_TWARPUP); + IncProgress(); + break; + case WM_DIABRETOWN: + IncProgress(); + if (gbMaxPlayers == 1) { + SaveLevel(); + } else { + DeltaSaveLevel(); + } + IncProgress(); + FreeGameMem(); + currlevel = plr[myplr].plrlevel; + leveltype = gnLevelTypeTbl[currlevel]; + assert(plr[myplr].plrlevel == currlevel); + IncProgress(); + LoadGameLevel(FALSE, ENTRY_MAIN); + IncProgress(); + break; + } + + assert(ghMainWnd); + + PaletteFadeOut(8); + FreeInterface(); + + saveProc = SetWindowProc(saveProc); + assert(saveProc == DisableInputWndProc); + + NetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr]._px, plr[myplr]._py, plr[myplr].plrlevel); + plrmsg_delay(FALSE); + ResetPal(); + + if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) { + PrepDoEnding(); + } + + gbSomebodyWonGameKludge = FALSE; +} + DEVILUTION_END_NAMESPACE diff --git a/Source/interfac.h b/Source/interfac.h index e0835732c..c60558269 100644 --- a/Source/interfac.h +++ b/Source/interfac.h @@ -12,20 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int progress_id; - void interface_msg_pump(); BOOL IncProgress(); -void DrawCutscene(); -void DrawProgress(int screen_x, int screen_y, int progress_id); void ShowProgress(unsigned int uMsg); -void FreeInterface(); -void InitCutscene(unsigned int uMsg); - -/* rdata */ - -extern const BYTE BarColor[3]; -extern const int BarPos[3][2]; #ifdef __cplusplus } diff --git a/Source/monster.cpp b/Source/monster.cpp index 3ed1f7485..300f887cd 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1804,7 +1804,8 @@ void SpawnLoot(int i, BOOL sendmsg) if (QuestStatus(Q_GARBUD) && Monst->mName == UniqMonst[UMT_GARBUD].mName) { CreateTypeItem(Monst->_mx + 1, Monst->_my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE); } else if (Monst->mName == UniqMonst[UMT_DEFILER].mName) { - stream_stop(); + if (effect_is_playing(USFX_DEFILER8)) + stream_stop(); quests[Q_DEFILER]._qlog = 0; SpawnMapOfDoom(Monst->_mx, Monst->_my); } else if (Monst->mName == UniqMonst[UMT_HORKDMN].mName) { @@ -1815,7 +1816,11 @@ void SpawnLoot(int i, BOOL sendmsg) } } else if (Monst->MType->mtype == MT_HORKSPWN) { } else if (Monst->MType->mtype == MT_NAKRUL) { - stream_stop(); + nSFX = IsUberRoomOpened ? USFX_NAKRUL4 : USFX_NAKRUL5; + if (UseCowFarmer) + nSFX = USFX_NAKRUL6; + if (effect_is_playing(nSFX)) + stream_stop(); quests[Q_NAKRUL]._qlog = 0; UberDiabloMonsterIndex = -2; CreateMagicWeapon(Monst->_mx, Monst->_my, ITYPE_SWORD, ICURS_GREAT_SWORD, FALSE, TRUE); diff --git a/Source/objects.cpp b/Source/objects.cpp index 462c5226e..11dbdaf4d 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1944,7 +1944,7 @@ void Obj_Circle(int i) quests[Q_BETRAYER]._qvar1 = 4; AddMissile(plr[myplr]._px, plr[myplr]._py, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, 0, myplr, 0, 0); track_repeat_walk(FALSE); - sgbMouseDown = 0; + sgbMouseDown = CLICK_NONE; ClrPlrPath(myplr); StartStand(myplr, 0); } diff --git a/SourceX/dx.cpp b/SourceX/dx.cpp index e65b209fb..3bd2004f0 100644 --- a/SourceX/dx.cpp +++ b/SourceX/dx.cpp @@ -32,9 +32,6 @@ SDL_Surface *renderer_texture_surface = NULL; /** 8-bit surface wrapper around #gpBuffer */ SDL_Surface *pal_surface; -/** To know if surfaces have been initialized or not */ -BOOL was_window_init = false; - static void dx_create_back_buffer() { pal_surface = SDL_CreateRGBSurfaceWithFormat(0, BUFFER_WIDTH, BUFFER_HEIGHT, 8, SDL_PIXELFORMAT_INDEX8); diff --git a/enums.h b/enums.h index 197cf4402..087648830 100644 --- a/enums.h +++ b/enums.h @@ -2231,6 +2231,12 @@ typedef enum dflag { BFLAG_EXPLORED = 0x80, } dflag; +typedef enum clicktype { + CLICK_NONE = 0, + CLICK_LEFT = 1, + CLICK_RIGHT = 2, +} clicktype; + /* First 5 bits store level 6th bit stores onlygood flag