Devilution
Diablo devolved - magic behind the 1996 computer game
diablo.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 #include "../3rdParty/Storm/Source/storm.h"
8 #include "../DiabloUI/diabloui.h"
9 #include <config.h>
10 
12 
13 SDL_Window *ghMainWnd;
17 int MouseY;
18 int MouseX;
21 BOOL gbRunGame;
24 BOOL zoomflag;
28 int DebugMonsters[10];
29 BOOLEAN cineflag;
38 BOOL trigdebug;
39 int setseed;
45 
46 /* rdata */
47 
52 BOOL fullscreen = TRUE;
54 #ifdef _DEBUG
55 int questdebug = -1;
56 int debug_mode_key_s;
57 int debug_mode_key_w;
58 int debug_mode_key_inverted_v;
59 int debug_mode_dollar_sign;
60 int debug_mode_key_d;
61 int debug_mode_key_i;
62 int dbgplr;
63 int dbgqst;
64 int dbgmon;
65 int arrowdebug;
66 #endif
72 BOOL FriendlyMode = TRUE;
74 char *spszMsgTbl[4] = {
75  "I need help! Come Here!",
76  "Follow me.",
77  "Here's something for you.",
78  "Now you DIE!"
79 };
81 char *spszMsgHotKeyTbl[4] = { "F9", "F10", "F11", "F12" };
82 
84 BOOL was_archives_init = false;
85 BOOL was_ui_init = false;
86 BOOL was_snd_init = false;
87 BOOL was_sfx_init = false;
88 
90 {
91  music_stop();
92 
97 
98  FreeMissiles();
99  FreeMonsters();
100  FreeObjectGFX();
101  FreeMonsterSnd();
102  FreeTownerGFX();
103 }
104 
105 BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer)
106 {
107  BOOL fExitProgram;
108  unsigned int uMsg;
109 
110  gbSelectProvider = TRUE;
111 
112  do {
113  fExitProgram = FALSE;
114  gbLoadGame = FALSE;
115 
116  if (!NetInit(bSinglePlayer, &fExitProgram)) {
117  gbRunGameResult = !fExitProgram;
118  break;
119  }
120 
121  gbSelectProvider = FALSE;
122 
123  if (bNewGame || !gbValidSaveFile) {
124  InitLevels();
125  InitQuests();
126  InitPortals();
128  }
129  if (!gbValidSaveFile || !gbLoadGame)
130  uMsg = WM_DIABNEWGAME;
131  else
132  uMsg = WM_DIABLOADGAME;
133 
134  run_game_loop(uMsg);
135  NetClose();
137  } while (gbRunGameResult);
138 
139  SNetDestroy();
140  return gbRunGameResult;
141 }
142 
143 // Controller support: Actions to run after updating the cursor state.
144 // Defined in SourceX/controls/plctrls.cpp.
145 extern void finish_simulated_mouse_clicks(int current_mouse_x, int current_mouse_y);
146 extern void plrctrls_after_check_curs_move();
147 
148 static bool ProcessInput()
149 {
150  if (PauseMode == 2) {
151  return false;
152  }
153  if (gbMaxPlayers == 1 && gmenu_is_active()) {
154  force_redraw |= 1;
155  return false;
156  }
157 
158  if (!gmenu_is_active() && sgnTimeoutCurs == 0) {
159 #ifndef USE_SDL1
161 #endif
162  CheckCursMove();
164  track_process();
165  }
166 
167  return true;
168 }
169 
170 void run_game_loop(unsigned int uMsg)
171 {
172  BOOL bLoop;
173  WNDPROC saveProc;
174  MSG msg;
175 
176  nthread_ignore_mutex(TRUE);
177  start_game(uMsg);
178  assert(ghMainWnd);
179  saveProc = SetWindowProc(GM_Game);
181  run_delta_info();
182  gbRunGame = TRUE;
183  gbProcessPlayers = TRUE;
184  gbRunGameResult = TRUE;
185  force_redraw = 255;
186  DrawAndBlit();
187  PaletteFadeIn(8);
188  force_redraw = 255;
189  gbGameLoopStartup = TRUE;
190  nthread_ignore_mutex(FALSE);
191 
192  while (gbRunGame) {
193  while (PeekMessage(&msg)) {
194  if (msg.message == WM_QUIT) {
195  gbRunGameResult = FALSE;
196  gbRunGame = FALSE;
197  break;
198  }
199  TranslateMessage(&msg);
200  DispatchMessage(&msg);
201  }
202  if (!gbRunGame)
203  break;
204  if (!nthread_has_500ms_passed(FALSE)) {
205  ProcessInput();
206  DrawAndBlit();
207  continue;
208  }
212  gbGameLoopStartup = FALSE;
213  DrawAndBlit();
214  }
215 
216  if (gbMaxPlayers > 1) {
218  }
219 
220  pfile_flush_W();
221  PaletteFadeOut(8);
224  force_redraw = 255;
226  saveProc = SetWindowProc(saveProc);
227  assert(saveProc == GM_Game);
228  free_game();
229 
230  if (cineflag) {
231  cineflag = FALSE;
232  DoEnding();
233  }
234 }
235 
236 void start_game(unsigned int uMsg)
237 {
238  zoomflag = TRUE;
239  cineflag = FALSE;
240  InitCursor();
241  InitLightTable();
242  LoadDebugGFX();
243  assert(ghMainWnd);
244  music_stop();
245  ShowProgress(uMsg);
246  gmenu_init_menu();
247  InitLevelCursor();
249  sgbMouseDown = 0;
250  track_repeat_walk(FALSE);
251 }
252 
253 void free_game()
254 {
255  int i;
256 
257  FreeControlPan();
258  FreeInvGFX();
259  FreeGMenu();
260  FreeQuestText();
261  FreeStoreMem();
262 
263  for (i = 0; i < MAX_PLRS; i++)
264  FreePlayerGFX(i);
265 
266  FreeItemGFX();
267  FreeCursor();
268  FreeLightTable();
269  FreeDebugGFX();
270  FreeGameMem();
271 }
272 
274 {
276 
277  SFileEnableDirectAccess(TRUE);
278  init_archives();
279  was_archives_init = true;
280 
281  UiInitialize();
282 #ifdef SPAWN
283  UiSetSpawned(TRUE);
284 #endif
285  was_ui_init = true;
286 
287  ReadOnlyTest();
288 
289  InitHash();
290 
292 
293  snd_init(NULL);
294  was_snd_init = true;
295 
296  sound_init();
297  was_sfx_init = true;
298 }
299 
301 {
302  if (!showintrodebug)
303  return;
304 
305  play_movie("gendata\\logo.smk", TRUE);
306 #ifndef SPAWN
307  if (getIniBool("Diablo", "Intro", true)) {
308  play_movie("gendata\\diablo1.smk", TRUE);
309  setIniValue("Diablo", "Intro", "0");
310  }
311 #endif
312  UiTitleDialog();
313 }
314 
316 {
317  if (was_sfx_init)
319  if (was_snd_init)
320  sound_cleanup();
321  if (was_ui_init)
322  UiDestroy();
323  if (was_archives_init)
324  init_cleanup();
325  if (was_window_init)
326  dx_cleanup(); // Cleanup SDL surfaces stuff, so we have to do it before SDL_Quit().
327  if (was_fonts_init)
328  FontsCleanup();
329  if (SDL_WasInit(SDL_INIT_EVERYTHING & ~SDL_INIT_HAPTIC))
330  SDL_Quit();
331 }
332 
333 void diablo_quit(int exitStatus)
334 {
335  diablo_deinit();
336  exit(exitStatus);
337 }
338 
339 int DiabloMain(int argc, char **argv)
340 {
341  diablo_parse_flags(argc, argv);
342  diablo_init();
343  diablo_splash();
344  mainmenu_loop();
345  diablo_deinit();
346 
347  return 0;
348 }
349 
350 static void print_help_and_exit()
351 {
352  printf("Options:\n");
353  printf(" %-20s %-30s\n", "-h, --help", "Print this message and exit");
354  printf(" %-20s %-30s\n", "--version", "Print the version and exit");
355  printf(" %-20s %-30s\n", "--data-dir", "Specify the folder of diabdat.mpq");
356  printf(" %-20s %-30s\n", "-n", "Skip startup videos");
357  printf(" %-20s %-30s\n", "-f", "Display frames per second");
358  printf(" %-20s %-30s\n", "-x", "Run in windowed mode");
359 #ifdef _DEBUG
360  printf("\nDebug options:\n");
361  printf(" %-20s %-30s\n", "-d", "Increaased item drops");
362  printf(" %-20s %-30s\n", "-w", "Enable cheats");
363  printf(" %-20s %-30s\n", "-$", "Enable god mode");
364  printf(" %-20s %-30s\n", "-^", "Enable god mode and debug tools");
365  //printf(" %-20s %-30s\n", "-b", "Enable item drop log");
366  printf(" %-20s %-30s\n", "-v", "Highlight visibility");
367  printf(" %-20s %-30s\n", "-i", "Ignore network timeout");
368  //printf(" %-20s %-30s\n", "-j <##>", "Init trigger at level");
369  printf(" %-20s %-30s\n", "-l <##> <##>", "Start in level as type");
370  printf(" %-20s %-30s\n", "-m <##>", "Add debug monster, up to 10 allowed");
371  printf(" %-20s %-30s\n", "-q <#>", "Force a certain quest");
372  printf(" %-20s %-30s\n", "-r <##########>", "Set map seed");
373  printf(" %-20s %-30s\n", "-t <##>", "Set current quest level");
374 #endif
375  printf("\nReport bugs at https://github.com/diasurgical/devilutionX/\n");
376  diablo_quit(0);
377 }
378 
379 void diablo_parse_flags(int argc, char **argv)
380 {
381  for (int i = 1; i < argc; i++) {
382  if (strcasecmp("-h", argv[i]) == 0 || strcasecmp("--help", argv[i]) == 0) {
384  } else if (strcasecmp("--version", argv[i]) == 0) {
385  printf("%s v%s\n", PROJECT_NAME, PROJECT_VERSION);
386  diablo_quit(0);
387  } else if (strcasecmp("--data-dir", argv[i]) == 0) {
388  basePath = argv[++i];
389 #ifdef _WIN32
390  if (basePath.back() != '\\')
391  basePath += '\\';
392 #else
393  if (basePath.back() != '/')
394  basePath += '/';
395 #endif
396  } else if (strcasecmp("-n", argv[i]) == 0) {
397  showintrodebug = 0;
398  } else if (strcasecmp("-f", argv[i]) == 0) {
400  } else if (strcasecmp("-x", argv[i]) == 0) {
401  fullscreen = FALSE;
402 #ifdef _DEBUG
403  } else if (strcasecmp("-^", argv[i]) == 0) {
404  debug_mode_key_inverted_v = 1;
405  } else if (strcasecmp("-$", argv[i]) == 0) {
406  debug_mode_dollar_sign = 1;
407  /*
408  } else if (strcasecmp("-b", argv[i]) == 0) {
409  debug_mode_key_b = 1;
410  */
411  } else if (strcasecmp("-d", argv[i]) == 0) {
412  debug_mode_key_d = 1;
413  } else if (strcasecmp("-i", argv[i]) == 0) {
414  debug_mode_key_i = 1;
415  /*
416  } else if (strcasecmp("-j", argv[i]) == 0) {
417  debug_mode_key_J_trigger = argv[++i];
418  */
419  } else if (strcasecmp("-l", argv[i]) == 0) {
420  setlevel = FALSE;
421  leveldebug = TRUE;
422  leveltype = SDL_atoi(argv[++i]);
423  currlevel = SDL_atoi(argv[++i]);
424  plr[0].plrlevel = currlevel;
425  } else if (strcasecmp("-m", argv[i]) == 0) {
426  monstdebug = TRUE;
427  DebugMonsters[debugmonsttypes++] = SDL_atoi(argv[++i]);
428  } else if (strcasecmp("-q", argv[i]) == 0) {
429  questdebug = SDL_atoi(argv[++i]);
430  } else if (strcasecmp("-r", argv[i]) == 0) {
431  setseed = SDL_atoi(argv[++i]);
432  } else if (strcasecmp("-s", argv[i]) == 0) {
433  debug_mode_key_s = 1;
434  } else if (strcasecmp("-t", argv[i]) == 0) {
435  leveldebug = TRUE;
436  setlevel = TRUE;
437  setlvlnum = SDL_atoi(argv[++i]);
438  } else if (strcasecmp("-v", argv[i]) == 0) {
439  visiondebug = TRUE;
440  } else if (strcasecmp("-w", argv[i]) == 0) {
441  debug_mode_key_w = 1;
442 #endif
443  } else {
444  printf("unrecognized option '%s'\n", argv[i]);
446  }
447  }
448 }
449 
451 {
452  int i;
453 
454  MouseX = SCREEN_WIDTH / 2;
455  MouseY = SCREEN_HEIGHT / 2;
456  if (!sgbControllerActive)
457  SetCursorPos(MouseX, MouseY);
458  ScrollInfo._sdx = 0;
459  ScrollInfo._sdy = 0;
460  ScrollInfo._sxoff = 0;
461  ScrollInfo._syoff = 0;
463 
464  ClrDiabloMsg();
465 }
466 
468 {
469  BOOL rv = FALSE;
470 
471  if (doomflag) {
472  doom_close();
473  rv = TRUE;
474  }
475  if (helpflag) {
476  helpflag = FALSE;
477  rv = TRUE;
478  }
479 
480  if (qtextflag) {
481  qtextflag = FALSE;
482  stream_stop();
483  rv = TRUE;
484  } else if (stextflag) {
485  STextESC();
486  rv = TRUE;
487  }
488 
489  if (msgflag) {
490  msgdelay = 0;
491  rv = TRUE;
492  }
493  if (talkflag) {
495  rv = TRUE;
496  }
497  if (dropGoldFlag) {
498  control_drop_gold(VK_ESCAPE);
499  rv = TRUE;
500  }
501  if (spselflag) {
502  spselflag = FALSE;
503  rv = TRUE;
504  }
505 
506  return rv;
507 }
508 
509 static void GetMousePos(LPARAM lParam)
510 {
511  MouseX = (short)(lParam & 0xffff);
512  MouseY = (short)((lParam >> 16) & 0xffff);
513 }
514 
515 LRESULT DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
516 {
517  switch (uMsg) {
518  case WM_KEYDOWN:
519  case WM_KEYUP:
520  case WM_CHAR:
521  case WM_SYSKEYDOWN:
522  case WM_SYSCOMMAND:
523  case WM_MOUSEMOVE:
524  GetMousePos(lParam);
525  return 0;
526  case WM_LBUTTONDOWN:
527  if (sgbMouseDown != 0)
528  return 0;
529  sgbMouseDown = 1;
530  return 0;
531  case WM_LBUTTONUP:
532  if (sgbMouseDown != 1)
533  return 0;
534  sgbMouseDown = 0;
535  return 0;
536  case WM_RBUTTONDOWN:
537  if (sgbMouseDown != 0)
538  return 0;
539  sgbMouseDown = 2;
540  return 0;
541  case WM_RBUTTONUP:
542  if (sgbMouseDown != 2)
543  return 0;
544  sgbMouseDown = 0;
545  return 0;
546  case WM_CAPTURECHANGED:
547  if (hWnd == (HWND)lParam)
548  return 0;
549  sgbMouseDown = 0;
550  return 0;
551  }
552 
553  return MainWndProc(hWnd, uMsg, wParam, lParam);
554 }
555 
556 LRESULT GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
557 {
558  switch (uMsg) {
559  case WM_KEYDOWN:
560  PressKey(wParam);
561  return 0;
562  case WM_KEYUP:
563  ReleaseKey(wParam);
564  return 0;
565  case WM_CHAR:
566  PressChar(wParam);
567  return 0;
568  case WM_SYSKEYDOWN:
569  if (PressSysKey(wParam))
570  return 0;
571  break;
572  case WM_SYSCOMMAND:
573  if (wParam == SC_CLOSE) {
574  gbRunGame = FALSE;
575  gbRunGameResult = FALSE;
576  return 0;
577  }
578  break;
579  case WM_MOUSEMOVE:
580  GetMousePos(lParam);
582  return 0;
583  case WM_LBUTTONDOWN:
584  GetMousePos(lParam);
585  if (sgbMouseDown == 0) {
586  sgbMouseDown = 1;
588  }
589  return 0;
590  case WM_LBUTTONUP:
591  GetMousePos(lParam);
592  if (sgbMouseDown == 1) {
593  sgbMouseDown = 0;
594  LeftMouseUp();
595  track_repeat_walk(FALSE);
596  }
597  return 0;
598  case WM_RBUTTONDOWN:
599  GetMousePos(lParam);
600  if (sgbMouseDown == 0) {
601  sgbMouseDown = 2;
602  RightMouseDown();
603  }
604  return 0;
605  case WM_RBUTTONUP:
606  GetMousePos(lParam);
607  if (sgbMouseDown == 2) {
608  sgbMouseDown = 0;
609  }
610  return 0;
611  case WM_CAPTURECHANGED:
612  if (hWnd != (HWND)lParam) {
613  sgbMouseDown = 0;
614  track_repeat_walk(FALSE);
615  }
616  break;
617  case WM_DIABNEXTLVL:
618  case WM_DIABPREVLVL:
619  case WM_DIABRTNLVL:
620  case WM_DIABSETLVL:
621  case WM_DIABWARPLVL:
622  case WM_DIABTOWNWARP:
623  case WM_DIABTWARPUP:
624  case WM_DIABRETOWN:
625  if (gbMaxPlayers > 1)
627  nthread_ignore_mutex(TRUE);
628  PaletteFadeOut(8);
629  sound_stop();
630  music_stop();
631  track_repeat_walk(FALSE);
632  sgbMouseDown = 0;
633  ShowProgress(uMsg);
634  force_redraw = 255;
635  DrawAndBlit();
636  if (gbRunGame)
637  PaletteFadeIn(8);
638  nthread_ignore_mutex(FALSE);
639  gbGameLoopStartup = TRUE;
640  return 0;
641  }
642 
643  return MainWndProc(hWnd, uMsg, wParam, lParam);
644 }
645 
646 BOOL LeftMouseDown(int wParam)
647 {
649  if (deathflag) {
651  } else if (PauseMode != 2) {
652  if (doomflag) {
653  doom_close();
654  } else if (spselflag) {
655  SetSpell();
656  } else if (stextflag) {
657  CheckStoreBtn();
658  } else if (MouseY < PANEL_TOP || MouseX < PANEL_LEFT || MouseX > PANEL_LEFT + PANEL_WIDTH) {
659  if (!gmenu_is_active() && !TryIconCurs()) {
660  if (questlog && MouseX > 32 && MouseX < 288 && MouseY > 32 && MouseY < 308) {
661  QuestlogESC();
662  } else if (qtextflag) {
663  qtextflag = FALSE;
664  stream_stop();
665  } else if (chrflag && MouseX < SPANEL_WIDTH && MouseY < SPANEL_HEIGHT) {
666  CheckChrBtns();
667  } else if (invflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) {
668  if (!dropGoldFlag)
669  CheckInvItem();
670  } else if (sbookflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) {
671  CheckSBook();
672  } else if (pcurs >= CURSOR_FIRSTITEM) {
673  if (TryInvPut()) {
676  }
677  } else {
678  if (plr[myplr]._pStatPts && !spselflag)
679  CheckLvlBtn();
680  if (!lvlbtndown)
681  return LeftMouseCmd(wParam == MK_SHIFT + MK_LBUTTON);
682  }
683  }
684  } else {
685  if (!talkflag && !dropGoldFlag && !gmenu_is_active())
686  CheckInvScrn();
687  DoPanBtn();
690  }
691  }
692  }
693 
694  return FALSE;
695 }
696 
697 BOOL LeftMouseCmd(BOOL bShift)
698 {
699  BOOL bNear;
700 
702 
703  if (leveltype == DTYPE_TOWN) {
704  if (pcursitem != -1 && pcurs == CURSOR_HAND)
706  if (pcursmonst != -1)
708  if (pcursitem == -1 && pcursmonst == -1 && pcursplr == -1)
709  return TRUE;
710  } else {
711  bNear = abs(plr[myplr].WorldX - cursmx) < 2 && abs(plr[myplr].WorldY - cursmy) < 2;
712  if (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) {
714  } else if (pcursobj != -1 && (!bShift || bNear && object[pcursobj]._oBreak == 1)) {
716  } else if (plr[myplr]._pwtype == WT_RANGED) {
717  if (bShift) {
719  } else if (pcursmonst != -1) {
720  if (CanTalkToMonst(pcursmonst)) {
722  } else {
724  }
725  } else if (pcursplr != -1 && !FriendlyMode) {
727  }
728  } else {
729  if (bShift) {
730  if (pcursmonst != -1) {
731  if (CanTalkToMonst(pcursmonst)) {
733  } else {
735  }
736  } else {
738  }
739  } else if (pcursmonst != -1) {
741  } else if (pcursplr != -1 && !FriendlyMode) {
743  }
744  }
745  if (!bShift && pcursitem == -1 && pcursobj == -1 && pcursmonst == -1 && pcursplr == -1)
746  return TRUE;
747  }
748 
749  return FALSE;
750 }
751 
753 {
754  if (pcurs == CURSOR_RESURRECT) {
756  return TRUE;
757  } else if (pcurs == CURSOR_HEALOTHER) {
759  return TRUE;
760  } else if (pcurs == CURSOR_TELEKINESIS) {
761  DoTelekinesis();
762  return TRUE;
763  } else if (pcurs == CURSOR_IDENTIFY) {
764  if (pcursinvitem != -1) {
766  } else {
768  }
769  return TRUE;
770  } else if (pcurs == CURSOR_REPAIR) {
771  if (pcursinvitem != -1) {
773  } else {
775  }
776  return TRUE;
777  } else if (pcurs == CURSOR_RECHARGE) {
778  if (pcursinvitem != -1) {
780  } else {
782  }
783  return TRUE;
784  } else if (pcurs == CURSOR_TELEPORT) {
785  if (pcursmonst != -1) {
786  NetSendCmdParam3(TRUE, CMD_TSPELLID, pcursmonst, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell));
787  } else if (pcursplr != -1) {
788  NetSendCmdParam3(TRUE, CMD_TSPELLPID, pcursplr, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell));
789  } else {
791  }
793  return TRUE;
794  } else if (pcurs == CURSOR_DISARM && pcursobj == -1) {
796  return TRUE;
797  }
798 
799  return FALSE;
800 }
801 
803 {
804  gmenu_left_mouse(FALSE);
806  if (panbtndown)
807  CheckBtnUp();
808  if (chrbtnactive)
809  ReleaseChrBtns();
810  if (lvlbtndown)
811  ReleaseLvlBtn();
812  if (stextflag)
813  ReleaseStoreBtn();
814 }
815 
817 {
818  if (!gmenu_is_active() && sgnTimeoutCurs == CURSOR_NONE && PauseMode != 2 && !plr[myplr]._pInvincible) {
819  if (doomflag) {
820  doom_close();
821  } else if (!stextflag) {
822  if (spselflag) {
823  SetSpell();
824  } else if (MouseY >= SPANEL_HEIGHT
825  || (!sbookflag || MouseX <= RIGHT_PANEL)
826  && !TryIconCurs()
827  && (pcursinvitem == -1 || !UseInvItem(myplr, pcursinvitem))) {
828  if (pcurs == CURSOR_HAND) {
829  if (pcursinvitem == -1 || !UseInvItem(myplr, pcursinvitem))
830  CheckPlrSpell();
831  } else if (pcurs > CURSOR_HAND && pcurs < CURSOR_FIRSTITEM) {
833  }
834  }
835  }
836  }
837 }
838 
839 BOOL PressSysKey(int wParam)
840 {
841  if (gmenu_is_active() || wParam != VK_F10)
842  return FALSE;
844  return TRUE;
845 }
846 
847 void diablo_hotkey_msg(DWORD dwMsg)
848 {
849  char szMsg[MAX_SEND_STR_LEN];
850 
851  if (gbMaxPlayers == 1) {
852  return;
853  }
854 
856  if (!getIniValue("NetMsg", spszMsgHotKeyTbl[dwMsg], szMsg, MAX_SEND_STR_LEN)) {
857  snprintf(szMsg, MAX_SEND_STR_LEN, "%s", spszMsgTbl[dwMsg]);
858  setIniValue("NetMsg", spszMsgHotKeyTbl[dwMsg], szMsg);
859  }
860 
861  NetSendCmdString(-1, szMsg);
862 }
863 
864 void ReleaseKey(int vkey)
865 {
866  if (vkey == VK_SNAPSHOT)
867  CaptureScreen();
868 }
869 
870 void PressKey(int vkey)
871 {
872  if (gmenu_presskeys(vkey) || control_presskeys(vkey)) {
873  return;
874  }
875 
876  if (deathflag) {
877  if (sgnTimeoutCurs != 0) {
878  return;
879  }
880  if (vkey == VK_F9) {
882  }
883  if (vkey == VK_F10) {
885  }
886  if (vkey == VK_F11) {
888  }
889  if (vkey == VK_F12) {
891  }
892  if (vkey == VK_RETURN) {
894  }
895  if (vkey != VK_ESCAPE) {
896  return;
897  }
898  }
899  if (vkey == VK_ESCAPE) {
900  if (!PressEscKey()) {
901  track_repeat_walk(FALSE);
902  gamemenu_on();
903  }
904  return;
905  }
906 
907  if (sgnTimeoutCurs != 0 || dropGoldFlag) {
908  return;
909  }
910  if (vkey == VK_PAUSE) {
912  return;
913  }
914  if (PauseMode == 2) {
915  return;
916  }
917 
918  if (vkey == VK_RETURN) {
919  if (GetAsyncKeyState(VK_MENU) & 0x8000) {
920  dx_reinit();
921  } else if (stextflag) {
922  STextEnter();
923  } else if (questlog) {
924  QuestlogEnter();
925  } else {
927  }
928  } else if (vkey == VK_F1) {
929  if (helpflag) {
930  helpflag = FALSE;
931  } else if (stextflag) {
932  ClearPanel();
933  AddPanelString("No help available", TRUE);
934  AddPanelString("while in stores", TRUE);
935  track_repeat_walk(FALSE);
936  } else {
937  invflag = FALSE;
938  chrflag = FALSE;
939  sbookflag = FALSE;
940  spselflag = FALSE;
941  if (qtextflag && leveltype == DTYPE_TOWN) {
942  qtextflag = FALSE;
943  stream_stop();
944  }
945  questlog = FALSE;
946  automapflag = FALSE;
947  msgdelay = 0;
948  gamemenu_off();
949  DisplayHelp();
950  doom_close();
951  }
952  }
953 #ifdef _DEBUG
954  else if (vkey == VK_F2) {
955  }
956 #endif
957 #ifdef _DEBUG
958  else if (vkey == VK_F3) {
959  if (pcursitem != -1) {
960  sprintf(
961  tempstr,
962  "IDX = %i : Seed = %i : CF = %i",
963  item[pcursitem].IDidx,
964  item[pcursitem]._iSeed,
965  item[pcursitem]._iCreateInfo);
967  }
968  sprintf(tempstr, "Numitems : %i", numitems);
970  }
971 #endif
972 #ifdef _DEBUG
973  else if (vkey == VK_F4) {
974  PrintDebugQuest();
975  }
976 #endif
977  else if (vkey == VK_F5) {
978  if (spselflag) {
979  SetSpeedSpell(0);
980  return;
981  }
982  ToggleSpell(0);
983  return;
984  } else if (vkey == VK_F6) {
985  if (spselflag) {
986  SetSpeedSpell(1);
987  return;
988  }
989  ToggleSpell(1);
990  return;
991  } else if (vkey == VK_F7) {
992  if (spselflag) {
993  SetSpeedSpell(2);
994  return;
995  }
996  ToggleSpell(2);
997  return;
998  } else if (vkey == VK_F8) {
999  if (spselflag) {
1000  SetSpeedSpell(3);
1001  return;
1002  }
1003  ToggleSpell(3);
1004  return;
1005  } else if (vkey == VK_F9) {
1006  diablo_hotkey_msg(0);
1007  } else if (vkey == VK_F10) {
1008  diablo_hotkey_msg(1);
1009  } else if (vkey == VK_F11) {
1010  diablo_hotkey_msg(2);
1011  } else if (vkey == VK_F12) {
1012  diablo_hotkey_msg(3);
1013  } else if (vkey == VK_UP) {
1014  if (stextflag) {
1015  STextUp();
1016  } else if (questlog) {
1017  QuestlogUp();
1018  } else if (helpflag) {
1019  HelpScrollUp();
1020  } else if (automapflag) {
1021  AutomapUp();
1022  }
1023  } else if (vkey == VK_DOWN) {
1024  if (stextflag) {
1025  STextDown();
1026  } else if (questlog) {
1027  QuestlogDown();
1028  } else if (helpflag) {
1029  HelpScrollDown();
1030  } else if (automapflag) {
1031  AutomapDown();
1032  }
1033  } else if (vkey == VK_PRIOR) {
1034  if (stextflag) {
1035  STextPrior();
1036  }
1037  } else if (vkey == VK_NEXT) {
1038  if (stextflag) {
1039  STextNext();
1040  }
1041  } else if (vkey == VK_LEFT) {
1042  if (automapflag && !talkflag) {
1043  AutomapLeft();
1044  }
1045  } else if (vkey == VK_RIGHT) {
1046  if (automapflag && !talkflag) {
1047  AutomapRight();
1048  }
1049  } else if (vkey == VK_TAB) {
1050  DoAutoMap();
1051  } else if (vkey == VK_SPACE) {
1052  if (!chrflag && invflag && MouseX < 480 && MouseY < PANEL_TOP && PANELS_COVER) {
1053  SetCursorPos(MouseX + 160, MouseY);
1054  }
1055  if (!invflag && chrflag && MouseX > 160 && MouseY < PANEL_TOP && PANELS_COVER) {
1056  SetCursorPos(MouseX - 160, MouseY);
1057  }
1058  helpflag = FALSE;
1059  invflag = FALSE;
1060  chrflag = FALSE;
1061  sbookflag = FALSE;
1062  spselflag = FALSE;
1063  if (qtextflag && leveltype == DTYPE_TOWN) {
1064  qtextflag = FALSE;
1065  stream_stop();
1066  }
1067  questlog = FALSE;
1068  automapflag = FALSE;
1069  msgdelay = 0;
1070  gamemenu_off();
1071  doom_close();
1072  }
1073 }
1074 
1076 {
1077  if (gbMaxPlayers <= 1) {
1078  if (PauseMode) {
1079  PauseMode = 0;
1080  } else {
1081  PauseMode = 2;
1082  sound_stop();
1083  track_repeat_walk(FALSE);
1084  }
1085  force_redraw = 255;
1086  }
1087 }
1088 
1092 void PressChar(int vkey)
1093 {
1094  if (gmenu_is_active() || control_talk_last_key(vkey) || sgnTimeoutCurs != 0 || deathflag) {
1095  return;
1096  }
1097  if ((char)vkey == 'p' || (char)vkey == 'P') {
1099  return;
1100  }
1101  if (PauseMode == 2) {
1102  return;
1103  }
1104  if (doomflag) {
1105  doom_close();
1106  return;
1107  }
1108  if (dropGoldFlag) {
1109  control_drop_gold(vkey);
1110  return;
1111  }
1112 
1113  switch (vkey) {
1114  case 'G':
1115  case 'g':
1116  DecreaseGamma();
1117  return;
1118  case 'F':
1119  case 'f':
1120  IncreaseGamma();
1121  return;
1122  case 'I':
1123  case 'i':
1124  if (!stextflag) {
1125  sbookflag = FALSE;
1126  invflag = !invflag;
1127  if (!invflag || chrflag) {
1128  if (MouseX < 480 && MouseY < PANEL_TOP && PANELS_COVER) {
1129  SetCursorPos(MouseX + 160, MouseY);
1130  }
1131  } else {
1132  if (MouseX > 160 && MouseY < PANEL_TOP && PANELS_COVER) {
1133  SetCursorPos(MouseX - 160, MouseY);
1134  }
1135  }
1136  }
1137  return;
1138  case 'C':
1139  case 'c':
1140  if (!stextflag) {
1141  questlog = FALSE;
1142  chrflag = !chrflag;
1143  if (!chrflag || invflag) {
1144  if (MouseX > 160 && MouseY < PANEL_TOP && PANELS_COVER) {
1145  SetCursorPos(MouseX - 160, MouseY);
1146  }
1147  } else {
1148  if (MouseX < 480 && MouseY < PANEL_TOP && PANELS_COVER) {
1149  SetCursorPos(MouseX + 160, MouseY);
1150  }
1151  }
1152  }
1153  return;
1154  case 'Q':
1155  case 'q':
1156  if (!stextflag) {
1157  chrflag = FALSE;
1158  if (!questlog) {
1159  StartQuestlog();
1160  } else {
1161  questlog = FALSE;
1162  }
1163  }
1164  return;
1165  case 'Z':
1166  case 'z':
1167  zoomflag = !zoomflag;
1168  return;
1169  case 'S':
1170  case 's':
1171  if (!stextflag) {
1172  invflag = FALSE;
1173  if (!spselflag) {
1174  DoSpeedBook();
1175  } else {
1176  spselflag = FALSE;
1177  }
1178  track_repeat_walk(FALSE);
1179  }
1180  return;
1181  case 'B':
1182  case 'b':
1183  if (!stextflag) {
1184  invflag = FALSE;
1185  sbookflag = !sbookflag;
1186  }
1187  return;
1188  case '+':
1189  case '=':
1190  if (automapflag) {
1191  AutomapZoomIn();
1192  }
1193  return;
1194  case '-':
1195  case '_':
1196  if (automapflag) {
1197  AutomapZoomOut();
1198  }
1199  return;
1200  case 'v':
1202  return;
1203  case 'V':
1205  return;
1206  case '!':
1207  case '1':
1208  if (plr[myplr].SpdList[0]._itype != ITYPE_NONE && plr[myplr].SpdList[0]._itype != ITYPE_GOLD) {
1210  }
1211  return;
1212  case '@':
1213  case '2':
1214  if (plr[myplr].SpdList[1]._itype != ITYPE_NONE && plr[myplr].SpdList[1]._itype != ITYPE_GOLD) {
1216  }
1217  return;
1218  case '#':
1219  case '3':
1220  if (plr[myplr].SpdList[2]._itype != ITYPE_NONE && plr[myplr].SpdList[2]._itype != ITYPE_GOLD) {
1222  }
1223  return;
1224  case '$':
1225  case '4':
1226  if (plr[myplr].SpdList[3]._itype != ITYPE_NONE && plr[myplr].SpdList[3]._itype != ITYPE_GOLD) {
1228  }
1229  return;
1230  case '%':
1231  case '5':
1232  if (plr[myplr].SpdList[4]._itype != ITYPE_NONE && plr[myplr].SpdList[4]._itype != ITYPE_GOLD) {
1234  }
1235  return;
1236  case '^':
1237  case '6':
1238  if (plr[myplr].SpdList[5]._itype != ITYPE_NONE && plr[myplr].SpdList[5]._itype != ITYPE_GOLD) {
1240  }
1241  return;
1242  case '&':
1243  case '7':
1244  if (plr[myplr].SpdList[6]._itype != ITYPE_NONE && plr[myplr].SpdList[6]._itype != ITYPE_GOLD) {
1246  }
1247  return;
1248  case '*':
1249  case '8':
1250 #ifdef _DEBUG
1251  if (debug_mode_key_inverted_v || debug_mode_key_w) {
1253  return;
1254  }
1255 #endif
1256  if (plr[myplr].SpdList[7]._itype != ITYPE_NONE && plr[myplr].SpdList[7]._itype != ITYPE_GOLD) {
1258  }
1259  return;
1260 #ifdef _DEBUG
1261  case ')':
1262  case '0':
1263  if (debug_mode_key_inverted_v) {
1264  if (arrowdebug > 2) {
1265  arrowdebug = 0;
1266  }
1267  if (arrowdebug == 0) {
1270  }
1271  if (arrowdebug == 1) {
1273  }
1274  if (arrowdebug == 2) {
1276  }
1277  arrowdebug++;
1278  }
1279  return;
1280  case ':':
1281  if (currlevel == 0 && debug_mode_key_w) {
1282  SetAllSpellsCheat();
1283  }
1284  return;
1285  case '[':
1286  if (currlevel == 0 && debug_mode_key_w) {
1287  TakeGoldCheat();
1288  }
1289  return;
1290  case ']':
1291  if (currlevel == 0 && debug_mode_key_w) {
1292  MaxSpellsCheat();
1293  }
1294  return;
1295  case 'a':
1296  if (debug_mode_key_inverted_v) {
1299  }
1300  return;
1301  case 'D':
1302  PrintDebugPlayer(TRUE);
1303  return;
1304  case 'd':
1305  PrintDebugPlayer(FALSE);
1306  return;
1307  case 'L':
1308  case 'l':
1309  if (debug_mode_key_inverted_v) {
1310  ToggleLighting();
1311  }
1312  return;
1313  case 'M':
1314  NextDebugMonster();
1315  return;
1316  case 'm':
1317  GetDebugMonster();
1318  return;
1319  case 'R':
1320  case 'r':
1321  sprintf(tempstr, "seed = %i", glSeedTbl[currlevel]);
1323  sprintf(tempstr, "Mid1 = %i : Mid2 = %i : Mid3 = %i", glMid1Seed[currlevel], glMid2Seed[currlevel], glMid3Seed[currlevel]);
1325  sprintf(tempstr, "End = %i", glEndSeed[currlevel]);
1327  return;
1328  case 'T':
1329  case 't':
1330  if (debug_mode_key_inverted_v) {
1331  sprintf(tempstr, "PX = %i PY = %i", plr[myplr].WorldX, plr[myplr].WorldY);
1333  sprintf(tempstr, "CX = %i CY = %i DP = %i", cursmx, cursmy, dungeon[cursmx][cursmy]);
1335  }
1336  return;
1337  case '|':
1338  if (currlevel == 0 && debug_mode_key_w) {
1339  GiveGoldCheat();
1340  }
1341  return;
1342  case '~':
1343  if (currlevel == 0 && debug_mode_key_w) {
1344  StoresCheat();
1345  }
1346  return;
1347 #endif
1348  }
1349 }
1350 
1352 {
1354 
1355  switch (leveltype) {
1356  case DTYPE_TOWN:
1357  pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL", NULL);
1358  pMegaTiles = LoadFileInMem("Levels\\TownData\\Town.TIL", NULL);
1359  pLevelPieces = LoadFileInMem("Levels\\TownData\\Town.MIN", NULL);
1360  pSpecialCels = LoadFileInMem("Levels\\TownData\\TownS.CEL", NULL);
1361  break;
1362  case DTYPE_CATHEDRAL:
1363  pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL", NULL);
1364  pMegaTiles = LoadFileInMem("Levels\\L1Data\\L1.TIL", NULL);
1365  pLevelPieces = LoadFileInMem("Levels\\L1Data\\L1.MIN", NULL);
1366  pSpecialCels = LoadFileInMem("Levels\\L1Data\\L1S.CEL", NULL);
1367  break;
1368 #ifndef SPAWN
1369  case DTYPE_CATACOMBS:
1370  pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL", NULL);
1371  pMegaTiles = LoadFileInMem("Levels\\L2Data\\L2.TIL", NULL);
1372  pLevelPieces = LoadFileInMem("Levels\\L2Data\\L2.MIN", NULL);
1373  pSpecialCels = LoadFileInMem("Levels\\L2Data\\L2S.CEL", NULL);
1374  break;
1375  case DTYPE_CAVES:
1376  pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL", NULL);
1377  pMegaTiles = LoadFileInMem("Levels\\L3Data\\L3.TIL", NULL);
1378  pLevelPieces = LoadFileInMem("Levels\\L3Data\\L3.MIN", NULL);
1379  pSpecialCels = LoadFileInMem("Levels\\L1Data\\L1S.CEL", NULL);
1380  break;
1381  case DTYPE_HELL:
1382  pDungeonCels = LoadFileInMem("Levels\\L4Data\\L4.CEL", NULL);
1383  pMegaTiles = LoadFileInMem("Levels\\L4Data\\L4.TIL", NULL);
1384  pLevelPieces = LoadFileInMem("Levels\\L4Data\\L4.MIN", NULL);
1385  pSpecialCels = LoadFileInMem("Levels\\L2Data\\L2S.CEL", NULL);
1386  break;
1387 #endif
1388  default:
1389  app_fatal("LoadLvlGFX");
1390  break;
1391  }
1392 }
1393 
1395 {
1396  IncProgress();
1397  IncProgress();
1398  InitObjectGFX();
1399  IncProgress();
1400  InitMissileGFX();
1401  IncProgress();
1402 }
1403 
1407 void CreateLevel(int lvldir)
1408 {
1409  switch (leveltype) {
1410  case DTYPE_TOWN:
1411  CreateTown(lvldir);
1412  InitTownTriggers();
1413  LoadRndLvlPal(0);
1414  break;
1415  case DTYPE_CATHEDRAL:
1417  InitL1Triggers();
1418  Freeupstairs();
1419  LoadRndLvlPal(1);
1420  break;
1421 #ifndef SPAWN
1422  case DTYPE_CATACOMBS:
1424  InitL2Triggers();
1425  Freeupstairs();
1426  LoadRndLvlPal(2);
1427  break;
1428  case DTYPE_CAVES:
1430  InitL3Triggers();
1431  Freeupstairs();
1432  LoadRndLvlPal(3);
1433  break;
1434  case DTYPE_HELL:
1436  InitL4Triggers();
1437  Freeupstairs();
1438  LoadRndLvlPal(4);
1439  break;
1440 #endif
1441  default:
1442  app_fatal("CreateLevel");
1443  break;
1444  }
1445 }
1446 
1447 void LoadGameLevel(BOOL firstflag, int lvldir)
1448 {
1449  int i, j;
1450  BOOL visited;
1451 
1452  if (setseed)
1454 
1455  music_stop();
1458  IncProgress();
1459  MakeLightTable();
1460  LoadLvlGFX();
1461  IncProgress();
1462 
1463  if (firstflag) {
1464  InitInv();
1465  InitItemGFX();
1466  InitQuestText();
1467 
1468  for (i = 0; i < gbMaxPlayers; i++)
1469  InitPlrGFXMem(i);
1470 
1471  InitStores();
1472  InitAutomapOnce();
1473  InitHelp();
1474  }
1475 
1477 
1478  if (leveltype == DTYPE_TOWN)
1479  SetupTownStores();
1480 
1481  IncProgress();
1482  InitAutomap();
1483 
1484  if (leveltype != DTYPE_TOWN && lvldir != 4) {
1485  InitLighting();
1486  InitVision();
1487  }
1488 
1490  IncProgress();
1491 
1492  if (!setlevel) {
1493  CreateLevel(lvldir);
1494  IncProgress();
1497 
1498  if (leveltype != DTYPE_TOWN) {
1499  GetLevelMTypes();
1500  InitThemes();
1501  LoadAllGFX();
1502  } else {
1503  IncProgress();
1504  IncProgress();
1505  InitMissileGFX();
1506  IncProgress();
1507  IncProgress();
1508  }
1509 
1510  IncProgress();
1511 
1512  if (lvldir == 3)
1513  GetReturnLvlPos();
1514  if (lvldir == 5)
1515  GetPortalLvlPos();
1516 
1517  IncProgress();
1518 
1519  for (i = 0; i < MAX_PLRS; i++) {
1520  if (plr[i].plractive && currlevel == plr[i].plrlevel) {
1521  InitPlayerGFX(i);
1522  if (lvldir != 4)
1523  InitPlayer(i, firstflag);
1524  }
1525  }
1526 
1527  PlayDungMsgs();
1528  InitMultiView();
1529  IncProgress();
1530 
1531  visited = FALSE;
1532  for (i = 0; i < gbMaxPlayers; i++) {
1533  if (plr[i].plractive)
1534  visited = visited || plr[i]._pLvlVisited[currlevel];
1535  }
1536 
1538 
1539  if (leveltype != DTYPE_TOWN) {
1540  if (firstflag || lvldir == 4 || !plr[myplr]._pLvlVisited[currlevel] || gbMaxPlayers != 1) {
1541  HoldThemeRooms();
1543  InitMonsters();
1545  IncProgress();
1546  InitObjects();
1547  InitItems();
1548  CreateThemeRooms();
1549  IncProgress();
1551  InitMissiles();
1552  InitDead();
1554 
1555  if (gbMaxPlayers != 1)
1556  DeltaLoadLevel();
1557 
1558  IncProgress();
1559  SavePreLighting();
1560  } else {
1561  InitMonsters();
1562  InitMissiles();
1563  InitDead();
1564  IncProgress();
1565  LoadLevel();
1566  IncProgress();
1567  }
1568  } else {
1569  for (i = 0; i < MAXDUNX; i++) {
1570  for (j = 0; j < MAXDUNY; j++)
1571  dFlags[i][j] |= BFLAG_LIT;
1572  }
1573 
1574  InitTowners();
1575  InitItems();
1576  InitMissiles();
1577  IncProgress();
1578 
1579  if (!firstflag && lvldir != 4 && plr[myplr]._pLvlVisited[currlevel] && gbMaxPlayers == 1)
1580  LoadLevel();
1581  if (gbMaxPlayers != 1)
1582  DeltaLoadLevel();
1583 
1584  IncProgress();
1585  }
1586  if (gbMaxPlayers == 1)
1587  ResyncQuests();
1588  else
1589  ResyncMPQuests();
1590 #ifndef SPAWN
1591  } else {
1592  LoadSetMap();
1593  IncProgress();
1594  GetLevelMTypes();
1595  IncProgress();
1596  InitMonsters();
1597  IncProgress();
1598  InitMissileGFX();
1599  IncProgress();
1600  InitDead();
1601  IncProgress();
1603  IncProgress();
1604 
1605  if (lvldir == 5)
1606  GetPortalLvlPos();
1607  IncProgress();
1608 
1609  for (i = 0; i < MAX_PLRS; i++) {
1610  if (plr[i].plractive && currlevel == plr[i].plrlevel) {
1611  InitPlayerGFX(i);
1612  if (lvldir != 4)
1613  InitPlayer(i, firstflag);
1614  }
1615  }
1616  IncProgress();
1617 
1618  InitMultiView();
1619  IncProgress();
1620 
1621  if (firstflag || lvldir == 4 || !plr[myplr]._pSLvlVisited[setlvlnum]) {
1622  InitItems();
1623  SavePreLighting();
1624  } else {
1625  LoadLevel();
1626  }
1627 
1628  InitMissiles();
1629  IncProgress();
1630 #endif
1631  }
1632 
1633  SyncPortals();
1634 
1635  for (i = 0; i < MAX_PLRS; i++) {
1636  if (plr[i].plractive && plr[i].plrlevel == currlevel && (!plr[i]._pLvlChanging || i == myplr)) {
1637  if (plr[i]._pHitPoints > 0) {
1638  if (gbMaxPlayers == 1)
1639  dPlayer[plr[i].WorldX][plr[i].WorldY] = i + 1;
1640  else
1641  SyncInitPlrPos(i);
1642  } else {
1644  }
1645  }
1646  }
1647 
1648  SetDungeonMicros();
1649 
1650  InitLightMax();
1651  IncProgress();
1652  IncProgress();
1653 
1654  if (firstflag) {
1655  InitControlPan();
1656  }
1657  IncProgress();
1658  if (leveltype != DTYPE_TOWN) {
1659  ProcessLightList();
1661  }
1662 
1664 
1665  while (!IncProgress())
1666  ;
1667 
1668 #ifndef SPAWN
1669  if (setlevel && setlvlnum == SL_SKELKING && quests[Q_SKELKING]._qactive == QUEST_ACTIVE)
1671 #endif
1672 }
1673 
1674 void game_loop(BOOL bStartup)
1675 {
1676  int i;
1677 
1678  i = bStartup ? 60 : 3;
1679 
1680  while (i--) {
1681  if (!multi_handle_delta()) {
1682  timeout_cursor(TRUE);
1683  break;
1684  } else {
1685  timeout_cursor(FALSE);
1686  game_logic();
1687  }
1688  if (!gbRunGame || gbMaxPlayers == 1 || !nthread_has_500ms_passed(TRUE))
1689  break;
1690  }
1691 }
1692 
1693 // Controller support:
1694 extern void plrctrls_after_game_logic();
1695 
1697 {
1698  if (!ProcessInput()) {
1699  return;
1700  }
1701  if (gbProcessPlayers) {
1702  ProcessPlayers();
1703  }
1704  if (leveltype != DTYPE_TOWN) {
1705  ProcessMonsters();
1706  ProcessObjects();
1707  ProcessMissiles();
1708  ProcessItems();
1709  ProcessLightList();
1711  } else {
1712  ProcessTowners();
1713  ProcessItems();
1714  ProcessMissiles();
1715  }
1716 
1717 #ifdef _DEBUG
1718  if (debug_mode_key_inverted_v && GetAsyncKeyState(VK_SHIFT) & 0x8000) {
1719  ScrollView();
1720  }
1721 #endif
1722 
1723  sound_update();
1724  ClearPlrMsg();
1725  CheckTriggers();
1726  CheckQuests();
1727  force_redraw |= 1;
1728  pfile_update(FALSE);
1729 
1731 }
1732 
1733 void timeout_cursor(BOOL bTimeout)
1734 {
1735  if (bTimeout) {
1738  multi_net_ping();
1739  ClearPanel();
1740  AddPanelString("-- Network timeout --", TRUE);
1741  AddPanelString("-- Waiting for players --", TRUE);
1743  force_redraw = 255;
1744  }
1746  } else if (sgnTimeoutCurs) {
1748  sgnTimeoutCurs = 0;
1749  ClearPanel();
1750  force_redraw = 255;
1751  }
1752 }
1753 
1755 {
1757  return;
1758 
1759  if (leveltype == DTYPE_HELL) {
1761  } else if (leveltype == DTYPE_CAVES) {
1763  }
1764 }
1765 
InitControlPan
void InitControlPan()
Definition: control.cpp:747
CMD_TSPELLID
@ CMD_TSPELLID
Definition: enums.h:2195
AutomapZoomOut
void AutomapZoomOut()
Definition: automap.cpp:162
QuestlogEnter
void QuestlogEnter()
Definition: quests.cpp:799
multi_net_ping
void multi_net_ping()
Definition: multi.cpp:274
IncreaseGamma
void IncreaseGamma()
Definition: palette.cpp:116
ISPL_FIRE_ARROWS
@ ISPL_FIRE_ARROWS
Definition: enums.h:2756
ReleaseKey
void ReleaseKey(int vkey)
Definition: diablo.cpp:864
ProcessObjects
void ProcessObjects()
Definition: objects.cpp:1720
cursmx
int cursmx
Definition: cursor.cpp:24
STextNext
void STextNext()
Definition: stores.cpp:1718
control_release_talk_btn
void control_release_talk_btn()
Definition: control.cpp:2111
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
CreateL5Dungeon
void CreateL5Dungeon(DWORD rseed, int entry)
Definition: drlg_l1.cpp:1709
was_window_init
BOOL was_window_init
InitPlrGFXMem
void InitPlrGFXMem(int pnum)
Definition: player.cpp:260
DoRepair
void DoRepair(int pnum, int cii)
Definition: items.cpp:2532
glMid2Seed
int glMid2Seed[NUMLEVELS]
Definition: diablo.cpp:15
scrollflag
BOOL scrollflag
unused
Definition: diablo.cpp:33
track_process
void track_process()
Definition: track.cpp:9
ShowProgress
void ShowProgress(unsigned int uMsg)
Definition: interfac.cpp:73
play_movie
void play_movie(char *pszMovie, BOOL user_can_close)
Definition: movie.cpp:17
ProcessMissiles
void ProcessMissiles()
Definition: missiles.cpp:4063
MakeLightTable
void MakeLightTable()
Definition: lighting.cpp:798
pfile_create_player_description
BOOL pfile_create_player_description(char *dst, DWORD len)
Definition: pfile.cpp:101
talkflag
BOOL talkflag
Definition: control.cpp:46
MouseY
int MouseY
Definition: diablo.cpp:17
control_talk_last_key
BOOL control_talk_last_key(int vkey)
Definition: control.cpp:2169
ScrollStruct::_sdir
int _sdir
Definition: structs.h:1110
SyncPortals
void SyncPortals()
Definition: portal.cpp:53
force_redraw
int force_redraw
Definition: diablo.cpp:30
currlevel
BYTE currlevel
Definition: gendung.cpp:40
dx_cleanup
void dx_cleanup()
TryInvPut
BOOL TryInvPut()
Definition: inv.cpp:1735
NetSendCmdLocParam1
void NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
Definition: msg.cpp:653
UseInvItem
BOOL UseInvItem(int pnum, int cii)
Definition: inv.cpp:2097
DoPanBtn
void DoPanBtn()
Checks if the mouse cursor is within any of the panel buttons and flag it if so.
Definition: control.cpp:920
GM_Game
LRESULT GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: diablo.cpp:556
ProcessMonsters
void ProcessMonsters()
Definition: monster.cpp:4472
SpellData::sTownSpell
BOOL sTownSpell
Definition: structs.h:1024
trigdebug
BOOL trigdebug
unused
Definition: diablo.cpp:38
DoRecharge
void DoRecharge(int pnum, int cii)
Definition: items.cpp:2584
SetCursor_
void SetCursor_(int i)
Definition: cursor.cpp:99
control_check_btn_press
void control_check_btn_press()
Definition: control.cpp:946
doomflag
BOOL doomflag
Definition: doom.cpp:13
FreeQuestText
void FreeQuestText()
Definition: minitext.cpp:57
SetWindowProc
WNDPROC SetWindowProc(WNDPROC NewProc)
Definition: init.cpp:141
WM_DIABRETOWN
@ WM_DIABRETOWN
Definition: enums.h:2113
MAX_PLRS
#define MAX_PLRS
Definition: defs.h:16
FreeDebugGFX
void FreeDebugGFX()
Definition: debug.cpp:29
CMD_HEALOTHER
@ CMD_HEALOTHER
Definition: enums.h:2248
SetRndSeed
void SetRndSeed(int s)
Set the RNG seed.
Definition: engine.cpp:728
finish_simulated_mouse_clicks
void finish_simulated_mouse_clicks(int current_mouse_x, int current_mouse_y)
pSpecialCels
BYTE * pSpecialCels
Definition: gendung.cpp:55
color_cycle_timer
int color_cycle_timer
Definition: diablo.cpp:44
glEndSeed
int glEndSeed[NUMLEVELS]
Definition: diablo.cpp:26
DecreaseGamma
void DecreaseGamma()
Definition: palette.cpp:127
PlayerStruct::_pSpell
int _pSpell
Definition: structs.h:215
was_snd_init
BOOL was_snd_init
Definition: diablo.cpp:86
nthread_ignore_mutex
void nthread_ignore_mutex(BOOL bStart)
Definition: nthread.cpp:213
ReleaseChrBtns
void ReleaseChrBtns()
Definition: control.cpp:1628
GetLevelMTypes
void GetLevelMTypes()
Definition: monster.cpp:178
FreePlayerGFX
void FreePlayerGFX(int pnum)
Definition: player.cpp:376
palette_get_color_cycling
BOOL palette_get_color_cycling()
Definition: palette.cpp:227
dungeon
BYTE dungeon[DMAXX][DMAXY]
Definition: gendung.cpp:18
DoTelekinesis
void DoTelekinesis()
Definition: inv.cpp:2206
LoadDebugGFX
void LoadDebugGFX()
Definition: debug.cpp:23
CMD_OPOBJXY
@ CMD_OPOBJXY
Definition: enums.h:2187
effects_cleanup_sfx
void effects_cleanup_sfx()
Definition: effects.cpp:1180
zoomflag
BOOL zoomflag
Definition: diablo.cpp:24
STextESC
void STextESC()
Definition: stores.cpp:1555
CMD_ATTACKPID
@ CMD_ATTACKPID
Definition: enums.h:2190
DTYPE_CATACOMBS
@ DTYPE_CATACOMBS
Definition: enums.h:1870
CheckQuests
void CheckQuests()
Definition: quests.cpp:135
LoadLevel
void LoadLevel()
Definition: loadsave.cpp:1637
FreeMissiles
void FreeMissiles()
Definition: missiles.cpp:1158
PlayerStruct::WorldX
int WorldX
Definition: structs.h:188
CheckInvItem
void CheckInvItem()
Definition: inv.cpp:1341
pcursinvitem
char pcursinvitem
inv_item value
Definition: cursor.cpp:19
PaletteFadeIn
void PaletteFadeIn(int fr)
Definition: palette.cpp:166
PlayerStruct::_pIFlags
int _pIFlags
Definition: structs.h:327
pDungeonCels
BYTE * pDungeonCels
Definition: gendung.cpp:47
HoldThemeRooms
void HoldThemeRooms()
HoldThemeRooms marks theme rooms as populated.
Definition: themes.cpp:464
CURSOR_HAND
@ CURSOR_HAND
Definition: enums.h:2067
frameflag
int frameflag
Definition: diablo.cpp:67
MAXDUNX
#define MAXDUNX
Definition: defs.h:25
gamemenu_off
void gamemenu_off()
Definition: gamemenu.cpp:85
debugmonsttypes
int debugmonsttypes
Definition: diablo.cpp:40
pcursplr
char pcursplr
Definition: cursor.cpp:23
InitItemGFX
void InitItemGFX()
Definition: items.cpp:194
InitCursor
void InitCursor()
Definition: cursor.cpp:78
music_start
void music_start(int nTrack)
DisplayHelp
void DisplayHelp()
Definition: help.cpp:562
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
QuestlogESC
void QuestlogESC()
Definition: quests.cpp:807
CaptureScreen
void CaptureScreen()
Definition: capture.cpp:148
print_help_and_exit
static void print_help_and_exit()
Definition: diablo.cpp:350
CheckInvScrn
void CheckInvScrn()
Check for interactions with belt.
Definition: inv.cpp:1353
stream_stop
void stream_stop()
Definition: effects.cpp:932
NetSendCmdLocParam2
void NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)
Definition: msg.cpp:667
pLevelPieces
BYTE * pLevelPieces
Definition: gendung.cpp:30
questlog
BOOL questlog
Definition: quests.cpp:6
pMegaTiles
BYTE * pMegaTiles
Definition: gendung.cpp:29
InitL1Triggers
void InitL1Triggers()
Definition: trigs.cpp:98
CMD_TSPELLXY
@ CMD_TSPELLXY
Definition: enums.h:2186
gmenu_init_menu
void gmenu_init_menu()
Definition: gmenu.cpp:82
ResyncQuests
void ResyncQuests()
Definition: quests.cpp:613
ReleaseStoreBtn
void ReleaseStoreBtn()
Definition: stores.cpp:2775
InitTowners
void InitTowners()
Definition: towners.cpp:359
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
PlayerStruct::_pSplLvl
char _pSplLvl[64]
Definition: structs.h:225
InitL4Triggers
void InitL4Triggers()
Definition: trigs.cpp:188
CreateL3Dungeon
void CreateL3Dungeon(DWORD rseed, int entry)
Definition: drlg_l3.cpp:1683
CURSOR_REPAIR
@ CURSOR_REPAIR
Definition: enums.h:2069
STextDown
void STextDown()
Definition: stores.cpp:1665
CanTalkToMonst
BOOL CanTalkToMonst(int m)
Definition: monster.cpp:5449
CheckBtnUp
void CheckBtnUp()
Check if the mouse is within a control panel button that's flagged.
Definition: control.cpp:1075
framestart
int framestart
Definition: diablo.cpp:70
game_loop
void game_loop(BOOL bStartup)
Definition: diablo.cpp:1674
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
STextUp
void STextUp()
Definition: stores.cpp:1628
FreeMonsters
void FreeMonsters()
Definition: monster.cpp:4617
gmenu_presskeys
BOOL gmenu_presskeys(int vkey)
Definition: gmenu.cpp:238
NetSendCmdString
void NetSendCmdString(int pmask, const char *pszStr)
Definition: msg.cpp:965
WT_RANGED
@ WT_RANGED
Definition: enums.h:2733
Freeupstairs
void Freeupstairs()
Definition: trigs.cpp:531
AutomapDown
void AutomapDown()
Definition: automap.cpp:132
CURSOR_HOURGLASS
@ CURSOR_HOURGLASS
Definition: enums.h:2077
gnLevelTypeTbl
int gnLevelTypeTbl[NUMLEVELS]
Definition: diablo.cpp:16
NetInit
BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
Definition: multi.cpp:636
DisableInputWndProc
LRESULT DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: diablo.cpp:515
LeftMouseUp
void LeftMouseUp()
Definition: diablo.cpp:802
automapflag
BOOL automapflag
Specifies whether the automap is enabled.
Definition: automap.cpp:18
InitDungMsgs
void InitDungMsgs(int pnum)
Definition: player.cpp:4065
pfile_update
void pfile_update(BOOL force_save)
Definition: pfile.cpp:573
WM_DIABPREVLVL
@ WM_DIABPREVLVL
Definition: enums.h:2107
InitL2Triggers
void InitL2Triggers()
Definition: trigs.cpp:123
msgdelay
DWORD msgdelay
Definition: error.cpp:11
CheckStoreBtn
void CheckStoreBtn()
Definition: stores.cpp:2723
all.h
plrctrls_after_game_logic
void plrctrls_after_game_logic()
FreeItemGFX
void FreeItemGFX()
Definition: items.cpp:2482
DoAutoMap
void DoAutoMap()
Definition: control.cpp:962
CreateL4Dungeon
void CreateL4Dungeon(DWORD rseed, int entry)
Definition: drlg_l4.cpp:1939
PressChar
void PressChar(int vkey)
Definition: diablo.cpp:1092
gbLoadGame
BOOL gbLoadGame
Definition: diablo.cpp:27
CheckPlrSpell
void CheckPlrSpell()
Definition: player.cpp:3586
QuestlogUp
void QuestlogUp()
Definition: quests.cpp:771
CheckIdentify
void CheckIdentify(int pnum, int cii)
Definition: items.cpp:2516
control_drop_gold
void control_drop_gold(char vkey)
Definition: control.cpp:1926
CURSOR_RECHARGE
@ CURSOR_RECHARGE
Definition: enums.h:2070
gbSelectProvider
BOOLEAN gbSelectProvider
Definition: multi.cpp:25
CMD_TSPELLPID
@ CMD_TSPELLPID
Definition: enums.h:2196
PauseMode
int PauseMode
Definition: diablo.cpp:41
CMD_RATTACKID
@ CMD_RATTACKID
Definition: enums.h:2191
CheckTriggers
void CheckTriggers()
Definition: trigs.cpp:646
ProcessItems
void ProcessItems()
Definition: items.cpp:2454
CMD_RATTACKPID
@ CMD_RATTACKPID
Definition: enums.h:2192
InitObjects
void InitObjects()
Definition: objects.cpp:743
spelldata
DEVILUTION_BEGIN_NAMESPACE SpellData spelldata[]
Data related to each spell ID.
Definition: spelldat.cpp:6
fullscreen
BOOL fullscreen
Specifies whether to give the game exclusive access to the screen, as needed for efficient rendering ...
Definition: diablo.cpp:52
CURSOR_HEALOTHER
@ CURSOR_HEALOTHER
Definition: enums.h:2076
gbMaxPlayers
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
Definition: multi.cpp:34
CMD_RATTACKXY
@ CMD_RATTACKXY
Definition: enums.h:2184
DrawAndBlit
void DrawAndBlit()
Render the game.
Definition: scrollrt.cpp:1333
SCREEN_WIDTH
#define SCREEN_WIDTH
Definition: defs.h:105
STextPrior
void STextPrior()
Definition: stores.cpp:1702
FreeStoreMem
void FreeStoreMem()
Definition: stores.cpp:112
sound_update
void sound_update()
Definition: effects.cpp:1162
CMD_CHEAT_EXPERIENCE
@ CMD_CHEAT_EXPERIENCE
Definition: enums.h:2203
RIGHT_PANEL
#define RIGHT_PANEL
Definition: defs.h:143
LoadRndLvlPal
void LoadRndLvlPal(int l)
Definition: palette.cpp:98
PlayerStruct::_pLvlVisited
BOOLEAN _pLvlVisited[NUMLEVELS]
Definition: structs.h:285
free_game
void free_game()
Definition: diablo.cpp:253
control_type_message
void control_type_message()
Definition: control.cpp:2143
ISPL_LIGHT_ARROWS
@ ISPL_LIGHT_ARROWS
Definition: enums.h:2778
MAXDUNY
#define MAXDUNY
Definition: defs.h:26
InitLevelCursor
void InitLevelCursor()
Definition: cursor.cpp:112
ResyncMPQuests
void ResyncMPQuests()
Definition: quests.cpp:589
BFLAG_LIT
@ BFLAG_LIT
Definition: enums.h:1883
sbookflag
BOOL sbookflag
Definition: control.cpp:48
ClearPanel
void ClearPanel()
Definition: control.cpp:559
gmenu_is_active
BOOL gmenu_is_active()
Definition: gmenu.cpp:97
mainmenu_loop
void mainmenu_loop()
Definition: mainmenu.cpp:93
CURSOR_NONE
@ CURSOR_NONE
Definition: enums.h:2066
CreateThemeRooms
void CreateThemeRooms()
CreateThemeRooms adds thematic elements to rooms.
Definition: themes.cpp:1003
InitObjectGFX
void InitObjectGFX()
Definition: objects.cpp:80
CMD_TALKXY
@ CMD_TALKXY
Definition: enums.h:2200
HelpScrollUp
void HelpScrollUp()
Definition: help.cpp:569
FreeCursor
void FreeCursor()
Definition: cursor.cpp:85
CURSOR_FIRSTITEM
@ CURSOR_FIRSTITEM
Definition: enums.h:2078
gbProcessPlayers
BOOL gbProcessPlayers
Definition: diablo.cpp:25
light4flag
BOOL light4flag
Definition: diablo.cpp:34
gszVersionNumber
char gszVersionNumber[MAX_PATH]
defined in dx.cpp
Definition: init.cpp:27
NetSendCmdParam1
void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
Definition: msg.cpp:698
control_presskeys
BOOL control_presskeys(int vkey)
Definition: control.cpp:2190
ProcessLightList
void ProcessLightList()
Definition: lighting.cpp:1116
SetupTownStores
void SetupTownStores()
Definition: stores.cpp:85
LeftMouseDown
BOOL LeftMouseDown(int wParam)
Definition: diablo.cpp:646
CheckSBook
void CheckSBook()
Definition: control.cpp:1864
gbGameLoopStartup
BOOL gbGameLoopStartup
Definition: diablo.cpp:19
WM_DIABTOWNWARP
@ WM_DIABTOWNWARP
Definition: enums.h:2111
assert
#define assert(exp)
Definition: defs.h:168
ScrollStruct::_sdy
int _sdy
Definition: structs.h:1109
DoEnding
void DoEnding()
Definition: monster.cpp:2478
ReleaseLvlBtn
void ReleaseLvlBtn()
Definition: control.cpp:1572
WM_DIABWARPLVL
@ WM_DIABWARPLVL
Definition: enums.h:2110
gamemenu_on
void gamemenu_on()
Definition: gamemenu.cpp:51
sound_cleanup
void sound_cleanup()
DebugMonsters
int DebugMonsters[10]
Definition: diablo.cpp:28
CheckCursMove
void CheckCursMove()
Definition: cursor.cpp:180
InitMissileGFX
void InitMissileGFX()
Definition: missiles.cpp:1126
app_fatal
void app_fatal(const char *pszFmt,...)
Definition: appfat.cpp:18
CMD_GOTOGETITEM
@ CMD_GOTOGETITEM
Definition: enums.h:2212
gbRunGame
BOOL gbRunGame
Definition: diablo.cpp:21
pfile_write_hero
void pfile_write_hero()
Definition: pfile.cpp:20
dx_reinit
void dx_reinit()
TryIconCurs
BOOL TryIconCurs()
Definition: diablo.cpp:752
control_check_talk_btn
BOOL control_check_talk_btn()
Definition: control.cpp:2086
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
ITYPE_GOLD
@ ITYPE_GOLD
Definition: enums.h:2491
AutomapRight
void AutomapRight()
Definition: automap.cpp:144
InitStores
void InitStores()
Definition: stores.cpp:54
SetDungeonMicros
void SetDungeonMicros()
Definition: gendung.cpp:134
nthread_has_500ms_passed
BOOL nthread_has_500ms_passed(BOOL unused)
Definition: nthread.cpp:224
FriendlyMode
BOOL FriendlyMode
Specifies whether players are in non-PvP mode.
Definition: diablo.cpp:72
FreeGMenu
void FreeGMenu()
Definition: gmenu.cpp:73
timeout_cursor
void timeout_cursor(BOOL bTimeout)
Definition: diablo.cpp:1733
SL_SKELKING
@ SL_SKELKING
Definition: enums.h:2540
AddPanelString
void AddPanelString(char *str, BOOL just)
Definition: control.cpp:550
palette_update_caves
void palette_update_caves()
Definition: palette.cpp:200
start_game
void start_game(unsigned int uMsg)
Definition: diablo.cpp:236
PressKey
void PressKey(int vkey)
Definition: diablo.cpp:870
InitL3Triggers
void InitL3Triggers()
Definition: trigs.cpp:156
CURSOR_TELEKINESIS
@ CURSOR_TELEKINESIS
Definition: enums.h:2073
InitHash
void InitHash()
Definition: encrypt.cpp:65
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
GetMousePos
static void GetMousePos(LPARAM lParam)
Definition: diablo.cpp:509
sound_stop
void sound_stop()
Definition: effects.cpp:1157
glMid3Seed
int glMid3Seed[NUMLEVELS]
Definition: diablo.cpp:22
InitHelp
void InitHelp()
Definition: help.cpp:445
PressSysKey
BOOL PressSysKey(int wParam)
Definition: diablo.cpp:839
gszProductName
char gszProductName[MAX_PATH]
Definition: init.cpp:28
PANEL_WIDTH
#define PANEL_WIDTH
Definition: defs.h:132
NUMLEVELS
#define NUMLEVELS
Definition: defs.h:56
InitTownTriggers
void InitTownTriggers()
Definition: trigs.cpp:34
DeltaLoadLevel
void DeltaLoadLevel()
Definition: msg.cpp:465
diablo_color_cyc_logic
void diablo_color_cyc_logic()
Definition: diablo.cpp:1754
ReadOnlyTest
DEVILUTION_BEGIN_NAMESPACE void ReadOnlyTest()
Definition: restrict.cpp:6
snd_init
void snd_init(HWND hWnd)
WM_DIABRTNLVL
@ WM_DIABRTNLVL
Definition: enums.h:2108
FreeGameMem
void FreeGameMem()
Definition: diablo.cpp:89
CMD_GOTOAGETITEM
@ CMD_GOTOAGETITEM
Definition: enums.h:2213
GetReturnLvlPos
void GetReturnLvlPos()
Definition: quests.cpp:579
chrbtnactive
BOOL chrbtnactive
Definition: control.cpp:25
music_stop
void music_stop()
leveldebug
BOOL leveldebug
Definition: diablo.cpp:35
FreeControlPan
void FreeControlPan()
Definition: control.cpp:1150
WM_DIABNEWGAME
@ WM_DIABNEWGAME
Definition: enums.h:2114
BFLAG_DEAD_PLAYER
@ BFLAG_DEAD_PLAYER
Definition: enums.h:1879
CURSOR_DISARM
@ CURSOR_DISARM
Definition: enums.h:2071
InitQuestText
void InitQuestText()
Definition: minitext.cpp:63
InitThemes
void InitThemes()
Definition: themes.cpp:397
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
ScrollStruct::_sdx
int _sdx
Definition: structs.h:1108
init_archives
void init_archives()
Definition: init.cpp:62
WM_DIABLOADGAME
@ WM_DIABLOADGAME
Definition: enums.h:2115
ClrDiabloMsg
void ClrDiabloMsg()
Definition: error.cpp:82
panbtndown
BOOL panbtndown
Definition: control.cpp:60
LoadLvlGFX
void LoadLvlGFX()
Definition: diablo.cpp:1351
GetSpellLevel
int GetSpellLevel(int id, int sn)
Definition: missiles.cpp:249
StartQuestlog
void StartQuestlog()
Definition: quests.cpp:748
DoSpeedBook
void DoSpeedBook()
Draws the "Speed Book": the rows of known spells for quick-setting a spell that show up when you clic...
Definition: control.cpp:864
AutomapLeft
void AutomapLeft()
Definition: automap.cpp:138
InitItems
void InitItems()
Definition: items.cpp:258
multi_handle_delta
int multi_handle_delta()
Definition: multi.cpp:280
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
pfile_flush_W
void pfile_flush_W()
Definition: pfile.cpp:151
HelpScrollDown
void HelpScrollDown()
Definition: help.cpp:575
InitLevelMonsters
void InitLevelMonsters()
Definition: monster.cpp:131
NetSendCmdParam3
void NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)
Definition: msg.cpp:723
SPANEL_WIDTH
#define SPANEL_WIDTH
Definition: defs.h:139
setlevel
BOOLEAN setlevel
Definition: gendung.cpp:65
pcursmonst
int pcursmonst
Definition: cursor.cpp:13
PANELS_COVER
#define PANELS_COVER
Definition: defs.h:141
InitLighting
void InitLighting()
Definition: lighting.cpp:1008
LoadGameLevel
void LoadGameLevel(BOOL firstflag, int lvldir)
Definition: diablo.cpp:1447
pcursobj
char pcursobj
Definition: cursor.cpp:22
FreeLightTable
void FreeLightTable()
Definition: lighting.cpp:787
InitQuests
void InitQuests()
Definition: quests.cpp:53
diablo_pause_game
void diablo_pause_game()
Definition: diablo.cpp:1075
game_logic
void game_logic()
Definition: diablo.cpp:1696
FreeMonsterSnd
void FreeMonsterSnd()
Definition: effects.cpp:969
DTYPE_TOWN
@ DTYPE_TOWN
Definition: enums.h:1868
DTYPE_HELL
@ DTYPE_HELL
Definition: enums.h:1872
diablo_init
void diablo_init()
Definition: diablo.cpp:273
ToggleSpell
void ToggleSpell(int slot)
Definition: control.cpp:467
NetSendCmd
void NetSendCmd(BOOL bHiPri, BYTE bCmd)
Definition: msg.cpp:615
CMD_SATTACKXY
@ CMD_SATTACKXY
Definition: enums.h:2226
numitems
int numitems
Definition: items.cpp:19
cineflag
BOOLEAN cineflag
Definition: diablo.cpp:29
diablo_splash
void diablo_splash()
Definition: diablo.cpp:300
AutomapUp
void AutomapUp()
Definition: automap.cpp:126
LoadAllGFX
void LoadAllGFX()
Definition: diablo.cpp:1394
SyncInitPlrPos
void SyncInitPlrPos(int pnum)
Definition: player.cpp:3738
CMD_ATTACKID
@ CMD_ATTACKID
Definition: enums.h:2189
run_delta_info
void run_delta_info()
Definition: msg.cpp:148
spselflag
BOOL spselflag
Definition: control.cpp:62
tempstr
char tempstr[256]
Definition: control.cpp:41
run_game_loop
void run_game_loop(unsigned int uMsg)
Definition: diablo.cpp:170
InitLightMax
void InitLightMax()
Definition: lighting.cpp:999
invflag
DEVILUTION_BEGIN_NAMESPACE BOOL invflag
Definition: inv.cpp:10
ProcessVisionList
void ProcessVisionList()
Definition: lighting.cpp:1229
DTYPE_CAVES
@ DTYPE_CAVES
Definition: enums.h:1871
glSeedTbl
DWORD glSeedTbl[NUMLEVELS]
Definition: diablo.cpp:20
CreateTown
void CreateTown(int entry)
Initialize town level.
Definition: town.cpp:144
CheckChrBtns
void CheckChrBtns()
Definition: control.cpp:1590
CMD_RESURRECT
@ CMD_RESURRECT
Definition: enums.h:2197
InitMonsters
void InitMonsters()
Definition: monster.cpp:924
plrctrls_after_check_curs_move
void plrctrls_after_check_curs_move()
InitDead
void InitDead()
Definition: dead.cpp:15
WM_DIABNEXTLVL
@ WM_DIABNEXTLVL
Definition: enums.h:2106
SPANEL_HEIGHT
#define SPANEL_HEIGHT
Definition: defs.h:140
InitPortals
void InitPortals()
Definition: portal.cpp:15
StartGame
BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer)
Definition: diablo.cpp:105
PaletteFadeOut
void PaletteFadeOut(int fr)
Definition: palette.cpp:183
FreeTownerGFX
void FreeTownerGFX()
Definition: towners.cpp:376
InitLevels
void InitLevels()
Definition: gendung.cpp:568
doom_close
void doom_close()
Definition: doom.cpp:75
sgbMouseDown
char sgbMouseDown
Definition: diablo.cpp:43
CreateL2Dungeon
void CreateL2Dungeon(DWORD rseed, int entry)
Definition: drlg_l2.cpp:2087
EnableFrameCount
void EnableFrameCount()
Initialize the FPS meter.
Definition: scrollrt.cpp:1188
scrollrt_draw_game_screen
void scrollrt_draw_game_screen(BOOL draw_cursor)
Redraw screen.
Definition: scrollrt.cpp:1303
was_ui_init
BOOL was_ui_init
Definition: diablo.cpp:85
diablo_quit
void diablo_quit(int exitStatus)
Definition: diablo.cpp:333
msgflag
char msgflag
Definition: error.cpp:12
setlvlnum
BYTE setlvlnum
Definition: gendung.cpp:58
DTYPE_CATHEDRAL
@ DTYPE_CATHEDRAL
Definition: enums.h:1869
LoadSetMap
void LoadSetMap()
Definition: setmaps.cpp:134
CURSOR_RESURRECT
@ CURSOR_RESURRECT
Definition: enums.h:2074
InitInv
void InitInv()
Definition: inv.cpp:119
control_update_life_mana
void control_update_life_mana()
Definition: control.cpp:699
FillSolidBlockTbls
void FillSolidBlockTbls()
Definition: gendung.cpp:81
gmenu_left_mouse
BOOL gmenu_left_mouse(BOOL isDown)
Definition: gmenu.cpp:324
diablo_hotkey_msg
void diablo_hotkey_msg(DWORD dwMsg)
Definition: diablo.cpp:847
framerate
int framerate
Definition: diablo.cpp:69
NetClose
void NetClose()
Definition: multi.cpp:568
chrflag
BOOL chrflag
Definition: control.cpp:49
pcursitem
char pcursitem
Definition: cursor.cpp:21
was_fonts_init
BOOL was_fonts_init
myplr
int myplr
Definition: player.cpp:9
track_repeat_walk
void track_repeat_walk(BOOL rep)
Definition: track.cpp:31
SetSpeedSpell
void SetSpeedSpell(int slot)
Definition: control.cpp:453
helpflag
BOOL helpflag
Definition: help.cpp:12
ghMainWnd
DEVILUTION_BEGIN_NAMESPACE SDL_Window * ghMainWnd
Definition: diablo.cpp:13
Q_SKELKING
@ Q_SKELKING
Definition: enums.h:2560
cursmy
int cursmy
Definition: cursor.cpp:25
InitMultiView
void InitMultiView()
Definition: player.cpp:949
RightMouseDown
void RightMouseDown()
Definition: diablo.cpp:816
MAX_SEND_STR_LEN
#define MAX_SEND_STR_LEN
Definition: defs.h:21
showintrodebug
int showintrodebug
Definition: diablo.cpp:53
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
PlayerStruct::plrlevel
int plrlevel
Definition: structs.h:187
INVITEM_BELT_FIRST
@ INVITEM_BELT_FIRST
Definition: enums.h:2809
FreeInvGFX
void FreeInvGFX()
Definition: inv.cpp:114
glMid1Seed
int glMid1Seed[NUMLEVELS]
Definition: diablo.cpp:14
ClearScreenBuffer
void ClearScreenBuffer()
Render the whole screen black.
Definition: scrollrt.cpp:1084
GetPortalLvlPos
void GetPortalLvlPos()
Definition: portal.cpp:154
gbRunGameResult
BOOL gbRunGameResult
Definition: diablo.cpp:23
was_archives_init
BOOL was_archives_init
To know if these things have been done when we get to the diablo_deinit() function.
Definition: diablo.cpp:84
LeftMouseCmd
BOOL LeftMouseCmd(BOOL bShift)
Definition: diablo.cpp:697
pcurs
int pcurs
Definition: cursor.cpp:27
gmenu_on_mouse_move
BOOL gmenu_on_mouse_move()
Definition: gmenu.cpp:292
gbValidSaveFile
BOOL gbValidSaveFile
Definition: pfile.cpp:18
PressEscKey
BOOL PressEscKey()
Definition: diablo.cpp:467
spszMsgTbl
char * spszMsgTbl[4]
Default quick messages.
Definition: diablo.cpp:74
diablo_init_screen
void diablo_init_screen()
Definition: diablo.cpp:450
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
CMD_PUTITEM
@ CMD_PUTITEM
Definition: enums.h:2181
InitLightTable
void InitLightTable()
Definition: lighting.cpp:792
SavePreLighting
void SavePreLighting()
Definition: lighting.cpp:1158
sgbControllerActive
bool sgbControllerActive
IncProgress
BOOL IncProgress()
Definition: interfac.cpp:31
DiabloMain
int DiabloMain(int argc, char **argv)
Definition: diablo.cpp:339
FontsCleanup
void FontsCleanup()
AutomapZoomIn
void AutomapZoomIn()
Definition: automap.cpp:150
PANEL_TOP
#define PANEL_TOP
Definition: defs.h:134
spszMsgHotKeyTbl
char * spszMsgHotKeyTbl[4]
INI files variable names for quick message keys.
Definition: diablo.cpp:81
InitVision
void InitVision()
Definition: lighting.cpp:1163
SPL_TELEPORT
@ SPL_TELEPORT
Definition: enums.h:2153
CheckLvlBtn
void CheckLvlBtn()
Definition: control.cpp:1566
dropGoldFlag
BOOL dropGoldFlag
Definition: control.cpp:15
ProcessTowners
void ProcessTowners()
Definition: towners.cpp:500
PANEL_LEFT
#define PANEL_LEFT
Definition: defs.h:135
dPlayer
char dPlayer[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:49
init_cleanup
void init_cleanup()
Definition: init.cpp:30
dFlags
char dFlags[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:56
ScrollInfo
ScrollStruct ScrollInfo
Definition: gendung.cpp:46
MainWndProc
LRESULT MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: init.cpp:122
ScrollStruct::_syoff
int _syoff
Definition: structs.h:1107
WM_DIABSETLVL
@ WM_DIABSETLVL
Definition: enums.h:2109
USFX_SKING1
@ USFX_SKING1
Definition: enums.h:1157
PlayerStruct::WorldY
int WorldY
Definition: structs.h:189
InitAutomapOnce
void InitAutomapOnce()
Definition: automap.cpp:50
frameend
int frameend
Definition: diablo.cpp:68
NetSendCmdLoc
void NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
Definition: msg.cpp:640
ProcessInput
static bool ProcessInput()
Definition: diablo.cpp:148
CURSOR_TELEPORT
@ CURSOR_TELEPORT
Definition: enums.h:2075
was_sfx_init
BOOL was_sfx_init
Definition: diablo.cpp:87
STextEnter
void STextEnter()
Definition: stores.cpp:2641
ScrollStruct::_sxoff
int _sxoff
Definition: structs.h:1106
InitMissiles
void InitMissiles()
Definition: missiles.cpp:1178
qtextflag
BOOLEAN qtextflag
Definition: minitext.cpp:13
FreeObjectGFX
void FreeObjectGFX()
Definition: objects.cpp:117
CreateLevel
void CreateLevel(int lvldir)
Definition: diablo.cpp:1407
multi_process_network_packets
void multi_process_network_packets()
Definition: multi.cpp:408
SCREEN_HEIGHT
#define SCREEN_HEIGHT
Definition: defs.h:106
diablo_parse_flags
void diablo_parse_flags(int argc, char **argv)
Definition: diablo.cpp:379
InitPlayerGFX
void InitPlayerGFX(int pnum)
Definition: player.cpp:246
leveltype
BYTE leveltype
Definition: gendung.cpp:39
sgnTimeoutCurs
int sgnTimeoutCurs
Definition: diablo.cpp:42
WM_DIABTWARPUP
@ WM_DIABTWARPUP
Definition: enums.h:2112
visiondebug
BOOL visiondebug
Definition: diablo.cpp:31
CMD_DISARMXY
@ CMD_DISARMXY
Definition: enums.h:2188
ProcessPlayers
void ProcessPlayers()
Definition: player.cpp:3341
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
InitAutomap
void InitAutomap()
Definition: automap.cpp:61
lvlbtndown
BOOL lvlbtndown
Definition: control.cpp:21
setseed
int setseed
Definition: diablo.cpp:39
CURSOR_IDENTIFY
@ CURSOR_IDENTIFY
Definition: enums.h:2068
ClearPlrMsg
void ClearPlrMsg()
Definition: plrmsg.cpp:66
lighting_color_cycling
void lighting_color_cycling()
Definition: lighting.cpp:1274
control_reset_talk
void control_reset_talk()
Definition: control.cpp:2162
MouseX
int MouseX
Definition: diablo.cpp:18
stextflag
char stextflag
Definition: stores.cpp:39
SetSpell
void SetSpell()
Definition: control.cpp:442
monstdebug
BOOL monstdebug
Definition: diablo.cpp:36
diablo_deinit
void diablo_deinit()
Definition: diablo.cpp:315
QuestlogDown
void QuestlogDown()
Definition: quests.cpp:785
deathflag
BOOL deathflag
Definition: player.cpp:13
PlayDungMsgs
void PlayDungMsgs()
Definition: player.cpp:4074
SDIR_NONE
@ SDIR_NONE
Definition: enums.h:2094
init_create_window
void init_create_window()
Definition: init.cpp:50
InitPlayer
void InitPlayer(int pnum, BOOL FirstTime)
Definition: player.cpp:837
NetSendCmdPItem
void NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
Definition: msg.cpp:851
sound_init
void sound_init()
Definition: effects.cpp:1194