|
|
|
|
@ -15,238 +15,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, NULL, 0, 0, PM_REMOVE)) { |
|
|
|
|
if (Msg.message != WM_QUIT) { |
|
|
|
|
TranslateMessage(&Msg); |
|
|
|
|
DispatchMessage(&Msg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOL IncProgress() |
|
|
|
|
{ |
|
|
|
|
interface_msg_pump(); |
|
|
|
|
sgdwProgress += 15; |
|
|
|
|
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, sgpBackCel, 1, 640); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < sgdwProgress; i++) { |
|
|
|
|
DrawProgress( |
|
|
|
|
BarPos[progress_id][0] + i + PANEL_X, |
|
|
|
|
BarPos[progress_id][1] + SCREEN_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 + PitchTbl[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(); |
|
|
|
|
LoadGame(TRUE); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABNEWGAME: |
|
|
|
|
IncProgress(); |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
pfile_remove_temp_files(); |
|
|
|
|
LoadGameLevel(TRUE, ENTRY_MAIN); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABNEXTLVL: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
setlevel = TRUE; |
|
|
|
|
leveltype = setlvltype; |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_SETLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABRTNLVL: |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
setlevel = FALSE; |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
GetReturnLvlPos(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_RTNLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABWARPLVL: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
FreeGameMem(); |
|
|
|
|
GetPortalLevel(); |
|
|
|
|
IncProgress(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_WARPLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABTOWNWARP: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
@ -476,3 +250,229 @@ 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 + PitchTbl[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, sgpBackCel, 1, 640); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < sgdwProgress; i++) { |
|
|
|
|
DrawProgress( |
|
|
|
|
BarPos[progress_id][0] + i + PANEL_X, |
|
|
|
|
BarPos[progress_id][1] + SCREEN_Y, |
|
|
|
|
progress_id); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
unlock_buf(1); |
|
|
|
|
force_redraw = 255; |
|
|
|
|
scrollrt_draw_game_screen(FALSE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void interface_msg_pump() |
|
|
|
|
{ |
|
|
|
|
MSG Msg; |
|
|
|
|
|
|
|
|
|
while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { |
|
|
|
|
if (Msg.message != WM_QUIT) { |
|
|
|
|
TranslateMessage(&Msg); |
|
|
|
|
DispatchMessage(&Msg); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOL IncProgress() |
|
|
|
|
{ |
|
|
|
|
interface_msg_pump(); |
|
|
|
|
sgdwProgress += 15; |
|
|
|
|
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(); |
|
|
|
|
LoadGame(TRUE); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABNEWGAME: |
|
|
|
|
IncProgress(); |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
pfile_remove_temp_files(); |
|
|
|
|
LoadGameLevel(TRUE, ENTRY_MAIN); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABNEXTLVL: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
setlevel = TRUE; |
|
|
|
|
leveltype = setlvltype; |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_SETLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABRTNLVL: |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
setlevel = FALSE; |
|
|
|
|
FreeGameMem(); |
|
|
|
|
IncProgress(); |
|
|
|
|
GetReturnLvlPos(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_RTNLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABWARPLVL: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
FreeGameMem(); |
|
|
|
|
GetPortalLevel(); |
|
|
|
|
IncProgress(); |
|
|
|
|
LoadGameLevel(FALSE, ENTRY_WARPLVL); |
|
|
|
|
IncProgress(); |
|
|
|
|
break; |
|
|
|
|
case WM_DIABTOWNWARP: |
|
|
|
|
IncProgress(); |
|
|
|
|
if (gbMaxPlayers == 1) { |
|
|
|
|
SaveLevel(); |
|
|
|
|
} else { |
|
|
|
|
DeltaSaveLevel(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|