Devilution
Diablo devolved - magic behind the 1996 computer game
interfac.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 
9 
10 void *sgpBackCel;
13 
15 const BYTE BarColor[3] = { 138, 43, 254 };
17 const int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } };
18 
20 {
21  MSG Msg;
22 
23  while (PeekMessage(&Msg)) {
24  if (Msg.message != WM_QUIT) {
25  TranslateMessage(&Msg);
26  DispatchMessage(&Msg);
27  }
28  }
29 }
30 
32 {
34  sgdwProgress += 23;
35  if ((DWORD)sgdwProgress > 534)
36  sgdwProgress = 534;
37  if (sgpBackCel)
38  DrawCutscene();
39  return (DWORD)sgdwProgress >= 534;
40 }
41 
43 {
44  DWORD i;
45 
46  lock_buf(1);
47  CelDraw(PANEL_X, 480 + SCREEN_Y - 1, (BYTE *)sgpBackCel, 1, 640);
48 
49  for (i = 0; i < sgdwProgress; i++) {
51  BarPos[progress_id][0] + i + PANEL_X,
53  progress_id);
54  }
55 
56  unlock_buf(1);
57  force_redraw = 255;
59 }
60 
61 void DrawProgress(int screen_x, int screen_y, int progress_id)
62 {
63  BYTE *dst;
64  int i;
65 
66  dst = &gpBuffer[screen_x + BUFFER_WIDTH * screen_y];
67  for (i = 0; i < 22; i++) {
68  *dst = BarColor[progress_id];
69  dst += BUFFER_WIDTH;
70  }
71 }
72 
73 void ShowProgress(unsigned int uMsg)
74 {
75  WNDPROC saveProc;
76 
78  plrmsg_delay(TRUE);
79 
82 
86  InitCutscene(uMsg);
87  BlackPalette();
88  DrawCutscene();
89  PaletteFadeIn(8);
90  IncProgress();
91  sound_init();
92  IncProgress();
93 
94  switch (uMsg) {
95  case WM_DIABLOADGAME:
96  IncProgress();
97  IncProgress();
98  LoadGame(TRUE);
99  IncProgress();
100  IncProgress();
101  break;
102  case WM_DIABNEWGAME:
103  IncProgress();
104  FreeGameMem();
105  IncProgress();
107  IncProgress();
108  LoadGameLevel(TRUE, 0);
109  IncProgress();
110  break;
111  case WM_DIABNEXTLVL:
112  IncProgress();
113  if (gbMaxPlayers == 1) {
114  SaveLevel();
115  } else {
116  DeltaSaveLevel();
117  }
118  IncProgress();
119  FreeGameMem();
120  currlevel++;
123  IncProgress();
124  LoadGameLevel(FALSE, 0);
125  IncProgress();
126  break;
127  case WM_DIABPREVLVL:
128  IncProgress();
129  if (gbMaxPlayers == 1) {
130  SaveLevel();
131  } else {
132  DeltaSaveLevel();
133  }
134  IncProgress();
135  FreeGameMem();
136  currlevel--;
139  IncProgress();
140  LoadGameLevel(FALSE, 1);
141  IncProgress();
142  break;
143  case WM_DIABSETLVL:
144  SetReturnLvlPos();
145  IncProgress();
146  if (gbMaxPlayers == 1) {
147  SaveLevel();
148  } else {
149  DeltaSaveLevel();
150  }
151  IncProgress();
152  setlevel = TRUE;
154  FreeGameMem();
155  IncProgress();
156  LoadGameLevel(FALSE, 2);
157  IncProgress();
158  break;
159  case WM_DIABRTNLVL:
160  IncProgress();
161  if (gbMaxPlayers == 1) {
162  SaveLevel();
163  } else {
164  DeltaSaveLevel();
165  }
166  IncProgress();
167  setlevel = FALSE;
168  FreeGameMem();
169  IncProgress();
170  GetReturnLvlPos();
171  LoadGameLevel(FALSE, 3);
172  IncProgress();
173  break;
174  case WM_DIABWARPLVL:
175  IncProgress();
176  if (gbMaxPlayers == 1) {
177  SaveLevel();
178  } else {
179  DeltaSaveLevel();
180  }
181  IncProgress();
182  FreeGameMem();
183  GetPortalLevel();
184  IncProgress();
185  LoadGameLevel(FALSE, 5);
186  IncProgress();
187  break;
188  case WM_DIABTOWNWARP:
189  IncProgress();
190  if (gbMaxPlayers == 1) {
191  SaveLevel();
192  } else {
193  DeltaSaveLevel();
194  }
195  IncProgress();
196  FreeGameMem();
200  IncProgress();
201  LoadGameLevel(FALSE, 6);
202  IncProgress();
203  break;
204  case WM_DIABTWARPUP:
205  IncProgress();
206  if (gbMaxPlayers == 1) {
207  SaveLevel();
208  } else {
209  DeltaSaveLevel();
210  }
211  IncProgress();
212  FreeGameMem();
216  IncProgress();
217  LoadGameLevel(FALSE, 7);
218  IncProgress();
219  break;
220  case WM_DIABRETOWN:
221  IncProgress();
222  if (gbMaxPlayers == 1) {
223  SaveLevel();
224  } else {
225  DeltaSaveLevel();
226  }
227  IncProgress();
228  FreeGameMem();
232  IncProgress();
233  LoadGameLevel(FALSE, 0);
234  IncProgress();
235  break;
236  }
237 
239 
240  PaletteFadeOut(8);
241  FreeInterface();
242 
243  saveProc = SetWindowProc(saveProc);
245 
246  NetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr].WorldX, plr[myplr].WorldY, plr[myplr].plrlevel);
247  plrmsg_delay(FALSE);
248  ResetPal();
249 
250  if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) {
251  PrepDoEnding();
252  }
253 
254  gbSomebodyWonGameKludge = FALSE;
255 }
256 
258 {
260 }
261 
262 void InitCutscene(unsigned int uMsg)
263 {
265 
266  switch (uMsg) {
267  case WM_DIABNEXTLVL:
268  switch (gnLevelTypeTbl[currlevel]) {
269  case 0:
270  sgpBackCel = LoadFileInMem("Gendata\\Cuttt.CEL", NULL);
271  LoadPalette("Gendata\\Cuttt.pal");
272  progress_id = 1;
273  break;
274  case 1:
275  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
276  LoadPalette("Gendata\\Cutl1d.pal");
277  progress_id = 0;
278  break;
279  case 2:
280  sgpBackCel = LoadFileInMem("Gendata\\Cut2.CEL", NULL);
281  LoadPalette("Gendata\\Cut2.pal");
282  progress_id = 2;
283  break;
284  case 3:
285  sgpBackCel = LoadFileInMem("Gendata\\Cut3.CEL", NULL);
286  LoadPalette("Gendata\\Cut3.pal");
287  progress_id = 1;
288  break;
289  case 4:
290  if (currlevel < 15) {
291  sgpBackCel = LoadFileInMem("Gendata\\Cut4.CEL", NULL);
292  LoadPalette("Gendata\\Cut4.pal");
293  progress_id = 1;
294  } else {
295  sgpBackCel = LoadFileInMem("Gendata\\Cutgate.CEL", NULL);
296  LoadPalette("Gendata\\Cutgate.pal");
297  progress_id = 1;
298  }
299  break;
300  default:
301  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
302  LoadPalette("Gendata\\Cutl1d.pal");
303  progress_id = 0;
304  break;
305  }
306  break;
307  case WM_DIABPREVLVL:
308  if (gnLevelTypeTbl[currlevel - 1] == 0) {
309  sgpBackCel = LoadFileInMem("Gendata\\Cuttt.CEL", NULL);
310  LoadPalette("Gendata\\Cuttt.pal");
311  progress_id = 1;
312  } else {
313  switch (gnLevelTypeTbl[currlevel]) {
314  case 0:
315  sgpBackCel = LoadFileInMem("Gendata\\Cuttt.CEL", NULL);
316  LoadPalette("Gendata\\Cuttt.pal");
317  progress_id = 1;
318  break;
319  case 1:
320  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
321  LoadPalette("Gendata\\Cutl1d.pal");
322  progress_id = 0;
323  break;
324  case 2:
325  sgpBackCel = LoadFileInMem("Gendata\\Cut2.CEL", NULL);
326  LoadPalette("Gendata\\Cut2.pal");
327  progress_id = 2;
328  break;
329  case 3:
330  sgpBackCel = LoadFileInMem("Gendata\\Cut3.CEL", NULL);
331  LoadPalette("Gendata\\Cut3.pal");
332  progress_id = 1;
333  break;
334  case 4:
335  sgpBackCel = LoadFileInMem("Gendata\\Cut4.CEL", NULL);
336  LoadPalette("Gendata\\Cut4.pal");
337  progress_id = 1;
338  break;
339  default:
340  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
341  LoadPalette("Gendata\\Cutl1d.pal");
342  progress_id = 0;
343  break;
344  }
345  }
346  break;
347  case WM_DIABSETLVL:
348  if (setlvlnum == SL_BONECHAMB) {
349  sgpBackCel = LoadFileInMem("Gendata\\Cut2.CEL", NULL);
350  LoadPalette("Gendata\\Cut2.pal");
351  progress_id = 2;
352  } else if (setlvlnum == SL_VILEBETRAYER) {
353  sgpBackCel = LoadFileInMem("Gendata\\Cutportr.CEL", NULL);
354  LoadPalette("Gendata\\Cutportr.pal");
355  progress_id = 1;
356  } else {
357  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
358  LoadPalette("Gendata\\Cutl1d.pal");
359  progress_id = 0;
360  }
361  break;
362  case WM_DIABRTNLVL:
363  if (setlvlnum == SL_BONECHAMB) {
364  sgpBackCel = LoadFileInMem("Gendata\\Cut2.CEL", NULL);
365  LoadPalette("Gendata\\Cut2.pal");
366  progress_id = 2;
367  } else if (setlvlnum == SL_VILEBETRAYER) {
368  sgpBackCel = LoadFileInMem("Gendata\\Cutportr.CEL", NULL);
369  LoadPalette("Gendata\\Cutportr.pal");
370  progress_id = 1;
371  } else {
372  sgpBackCel = LoadFileInMem("Gendata\\Cutl1d.CEL", NULL);
373  LoadPalette("Gendata\\Cutl1d.pal");
374  progress_id = 0;
375  }
376  break;
377  case WM_DIABWARPLVL:
378  sgpBackCel = LoadFileInMem("Gendata\\Cutportl.CEL", NULL);
379  LoadPalette("Gendata\\Cutportl.pal");
380  progress_id = 1;
381  break;
382  case WM_DIABLOADGAME:
383  sgpBackCel = LoadFileInMem("Gendata\\Cutstart.CEL", NULL);
384  LoadPalette("Gendata\\Cutstart.pal");
385  progress_id = 1;
386  break;
387  case WM_DIABNEWGAME:
388  sgpBackCel = LoadFileInMem("Gendata\\Cutstart.CEL", NULL);
389  LoadPalette("Gendata\\Cutstart.pal");
390  progress_id = 1;
391  break;
392  case WM_DIABTOWNWARP:
393  case WM_DIABTWARPUP:
394  switch (gnLevelTypeTbl[plr[myplr].plrlevel]) {
395  case 0:
396  sgpBackCel = LoadFileInMem("Gendata\\Cuttt.CEL", NULL);
397  LoadPalette("Gendata\\Cuttt.pal");
398  progress_id = 1;
399  break;
400  case 2:
401  sgpBackCel = LoadFileInMem("Gendata\\Cut2.CEL", NULL);
402  LoadPalette("Gendata\\Cut2.pal");
403  progress_id = 2;
404  break;
405  case 3:
406  sgpBackCel = LoadFileInMem("Gendata\\Cut3.CEL", NULL);
407  LoadPalette("Gendata\\Cut3.pal");
408  progress_id = 1;
409  break;
410  case 4:
411  sgpBackCel = LoadFileInMem("Gendata\\Cut4.CEL", NULL);
412  LoadPalette("Gendata\\Cut4.pal");
413  progress_id = 1;
414  break;
415  }
416  break;
417  case WM_DIABRETOWN:
418  sgpBackCel = LoadFileInMem("Gendata\\Cuttt.CEL", NULL);
419  LoadPalette("Gendata\\Cuttt.pal");
420  progress_id = 1;
421  break;
422  default:
423  app_fatal("Unknown progress mode");
424  break;
425  }
426 
427  sgdwProgress = 0;
428 }
429 
gpBuffer
BYTE * gpBuffer
ShowProgress
void ShowProgress(unsigned int uMsg)
Definition: interfac.cpp:73
PANEL_X
#define PANEL_X
Definition: defs.h:136
force_redraw
int force_redraw
Definition: diablo.cpp:30
currlevel
BYTE currlevel
Definition: gendung.cpp:40
NetSendCmdLocParam1
void NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
Definition: msg.cpp:653
BlackPalette
void BlackPalette()
Definition: palette.cpp:161
SCREEN_Y
#define SCREEN_Y
Definition: defs.h:126
SetWindowProc
WNDPROC SetWindowProc(WNDPROC NewProc)
Definition: init.cpp:141
WM_DIABRETOWN
@ WM_DIABRETOWN
Definition: enums.h:2113
SL_VILEBETRAYER
@ SL_VILEBETRAYER
Definition: enums.h:2544
SaveLevel
void SaveLevel()
Definition: loadsave.cpp:1545
PaletteFadeIn
void PaletteFadeIn(int fr)
Definition: palette.cpp:166
SetReturnLvlPos
void SetReturnLvlPos()
Definition: quests.cpp:549
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
gnLevelTypeTbl
int gnLevelTypeTbl[NUMLEVELS]
Definition: diablo.cpp:16
DisableInputWndProc
LRESULT DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: diablo.cpp:515
InitCutscene
void InitCutscene(unsigned int uMsg)
Definition: interfac.cpp:262
WM_DIABPREVLVL
@ WM_DIABPREVLVL
Definition: enums.h:2107
all.h
SL_BONECHAMB
@ SL_BONECHAMB
Definition: enums.h:2541
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
interface_msg_pump
void interface_msg_pump()
Definition: interfac.cpp:19
FreeInterface
void FreeInterface()
Definition: interfac.cpp:257
WM_DIABTOWNWARP
@ WM_DIABTOWNWARP
Definition: enums.h:2111
WM_DIABWARPLVL
@ WM_DIABWARPLVL
Definition: enums.h:2110
app_fatal
void app_fatal(const char *pszFmt,...)
Definition: appfat.cpp:18
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
gbSomebodyWonGameKludge
DEVILUTION_BEGIN_NAMESPACE BOOLEAN gbSomebodyWonGameKludge
Definition: multi.cpp:12
lock_buf
void lock_buf(BYTE idx)
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
CelDraw
void CelDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
Blit CEL sprite to the back buffer at the given coordinates.
Definition: engine.cpp:47
LoadGame
void LoadGame(BOOL firstflag)
Definition: loadsave.cpp:12
plrmsg_delay
void plrmsg_delay(BOOL delay)
Definition: plrmsg.cpp:11
WM_DIABRTNLVL
@ WM_DIABRTNLVL
Definition: enums.h:2108
FreeGameMem
void FreeGameMem()
Definition: diablo.cpp:89
GetReturnLvlPos
void GetReturnLvlPos()
Definition: quests.cpp:579
WM_DIABNEWGAME
@ WM_DIABNEWGAME
Definition: enums.h:2114
unlock_buf
void unlock_buf(BYTE idx)
CMD_PLAYER_JOINLEVEL
@ CMD_PLAYER_JOINLEVEL
Definition: enums.h:2224
WM_DIABLOADGAME
@ WM_DIABLOADGAME
Definition: enums.h:2115
DrawCutscene
void DrawCutscene()
Definition: interfac.cpp:42
setlevel
BOOLEAN setlevel
Definition: gendung.cpp:65
LoadGameLevel
void LoadGameLevel(BOOL firstflag, int lvldir)
Definition: diablo.cpp:1447
LoadPalette
void LoadPalette(char *pszFileName)
Definition: palette.cpp:76
sgdwProgress
int sgdwProgress
Definition: interfac.cpp:11
WM_DIABNEXTLVL
@ WM_DIABNEXTLVL
Definition: enums.h:2106
PaletteFadeOut
void PaletteFadeOut(int fr)
Definition: palette.cpp:183
scrollrt_draw_game_screen
void scrollrt_draw_game_screen(BOOL draw_cursor)
Redraw screen.
Definition: scrollrt.cpp:1303
setlvlnum
BYTE setlvlnum
Definition: gendung.cpp:58
ResetPal
void ResetPal()
Definition: palette.cpp:112
pfile_remove_temp_files
void pfile_remove_temp_files()
Definition: pfile.cpp:436
myplr
int myplr
Definition: player.cpp:9
BUFFER_WIDTH
#define BUFFER_WIDTH
Definition: defs.h:128
PlayerStruct::plrlevel
int plrlevel
Definition: structs.h:187
GetPortalLevel
void GetPortalLevel()
Definition: portal.cpp:127
ClearScreenBuffer
void ClearScreenBuffer()
Render the whole screen black.
Definition: scrollrt.cpp:1084
progress_id
int progress_id
Definition: interfac.cpp:12
PrepDoEnding
void PrepDoEnding()
Definition: monster.cpp:2520
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
BarPos
const int BarPos[3][2]
The screen position of the top left corner of the progress bar.
Definition: interfac.cpp:17
IncProgress
BOOL IncProgress()
Definition: interfac.cpp:31
BarColor
const BYTE BarColor[3]
The colour used for the progress bar as an index into the palette.
Definition: interfac.cpp:15
DrawProgress
void DrawProgress(int screen_x, int screen_y, int progress_id)
Definition: interfac.cpp:61
WM_DIABSETLVL
@ WM_DIABSETLVL
Definition: enums.h:2109
sgpBackCel
DEVILUTION_BEGIN_NAMESPACE void * sgpBackCel
Definition: interfac.cpp:10
leveltype
BYTE leveltype
Definition: gendung.cpp:39
WM_DIABTWARPUP
@ WM_DIABTWARPUP
Definition: enums.h:2112
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
DeltaSaveLevel
void DeltaSaveLevel()
Definition: msg.cpp:451
setlvltype
char setlvltype
Definition: gendung.cpp:64
sound_init
void sound_init()
Definition: effects.cpp:1194