mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-12 07:50:53 +02:00
544 lines
13 KiB
C++
544 lines
13 KiB
C++
/*-----------------------------------------------------------------------**
|
|
** Diablo
|
|
**
|
|
** Menu interface processing
|
|
**
|
|
** (C)1996 Condor, Inc. All rights reserved.
|
|
**
|
|
**-----------------------------------------------------------------------**
|
|
** $Header: /Diablo/INTERFAC.CPP 1 1/22/97 2:06p Dgartner $
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
#include "diablo.h"
|
|
#pragma hdrstop
|
|
#include "storm/h/storm.h"
|
|
#include "palette.h"
|
|
#include "engine.h"
|
|
#include "scrollrt.h"
|
|
#include "gendung.h"
|
|
#include "items.h"
|
|
#include "player.h"
|
|
#include "gamemenu.h"
|
|
#include "control.h"
|
|
#include "cursor.h"
|
|
#include "trigs.h"
|
|
#include "multi.h"
|
|
#include "msg.h"
|
|
#include "effects.h"
|
|
#include "portal.h"
|
|
#include "quests.h"
|
|
#include "setmaps.h"
|
|
|
|
|
|
//******************************************************************
|
|
// extern
|
|
//******************************************************************
|
|
extern BYTE gbSomebodyWonGameKludge;
|
|
WNDPROC my_SetWindowProc(WNDPROC wndProc);
|
|
void plrmsg_hold(BOOL bStart);
|
|
void BlackPalette();
|
|
void DestroyTempSaves();
|
|
LRESULT CALLBACK DisableInputWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
|
|
|
|
|
|
//******************************************************************
|
|
// private
|
|
//******************************************************************
|
|
#define MAX_PROGRESS 534
|
|
static BYTE *sgpBackCel;
|
|
static DWORD sgdwProgress, sgdwXY;
|
|
|
|
|
|
//******************************************************************
|
|
//******************************************************************
|
|
static void ProgressFree() {
|
|
DiabloFreePtr(sgpBackCel);
|
|
}
|
|
|
|
|
|
//******************************************************************
|
|
//******************************************************************
|
|
static void ProgressLoad(UINT uMsg) {
|
|
app_assert(! sgpBackCel);
|
|
switch (uMsg) {
|
|
case WM_DIABNEXTLVL :
|
|
switch (gnLevelTypeTbl[currlevel]) {
|
|
case 0:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cuttt.CEL",NULL,'PROG');
|
|
LoadPalette("Gendata\\Cuttt.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
case 1:
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\cutl5.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\cutl5.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut2.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut2.pal");
|
|
sgdwXY = 2;
|
|
break;
|
|
case 3:
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut3.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut3.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\cutl6.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\cutl6.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
|
|
case 4:
|
|
if (currlevel < 15) {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut4.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut4.pal");
|
|
sgdwXY = 1;
|
|
} else {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutgate.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutgate.pal");
|
|
sgdwXY = 1;
|
|
}
|
|
break;
|
|
default:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_DIABPREVLVL :
|
|
if (gnLevelTypeTbl[currlevel-1] == 0) {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cuttt.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cuttt.pal");
|
|
sgdwXY = 1;
|
|
} else {
|
|
switch (gnLevelTypeTbl[currlevel]) {
|
|
case 0:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cuttt.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cuttt.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
case 1:
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\cutl5.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\cutl5.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut2.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut2.pal");
|
|
sgdwXY = 2;
|
|
break;
|
|
case 3:
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut3.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut3.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\cutl6.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\cutl6.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
case 4:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut4.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut4.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
default:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DIABSETLVL :
|
|
if (setlvlnum == SL_BONECHAMB) {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut2.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut2.pal");
|
|
sgdwXY = 2;
|
|
} else if (setlvlnum == SL_VILEBETRAYER) {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutportr.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutportr.pal");
|
|
sgdwXY = 1;
|
|
} else {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
}
|
|
break;
|
|
|
|
case WM_DIABRTNLVL :
|
|
if (setlvlnum == SL_BONECHAMB) { // bone chamber
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut2.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut2.pal");
|
|
sgdwXY = 2;
|
|
} else if (setlvlnum == SL_VILEBETRAYER) { // vile betrayer
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutportr.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutportr.pal");
|
|
sgdwXY = 1;
|
|
} else {
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
}
|
|
break;
|
|
|
|
case WM_DIABWARPLVL :
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutportl.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutportl.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
|
|
case WM_DIABLOADGAME :
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutstart.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutstart.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
|
|
case WM_DIABNEWGAME:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutstart.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutstart.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
|
|
case WM_DIABTOWNWARP:
|
|
case WM_DIABTWARPUP:
|
|
switch (gnLevelTypeTbl[plr[myplr].plrlevel]) {
|
|
case 0:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cuttt.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cuttt.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
case 1: // added to allow the crypt JKE
|
|
if (plr[myplr].plrlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cutl1d.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cutl1d.pal");
|
|
sgdwXY = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\Cutl5.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\Cutl5.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
case 2:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut2.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut2.pal");
|
|
sgdwXY = 2;
|
|
break;
|
|
case 3:
|
|
if (plr[myplr].plrlevel < HIVESTART)
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut3.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut3.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sgpBackCel = LoadFileInMemSig("Nlevels\\Cutl6.CEL",NULL,'PROG');
|
|
LoadPalette ("Nlevels\\Cutl6.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
|
|
case 4:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cut4.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cut4.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_DIABRETOWN:
|
|
sgpBackCel = LoadFileInMemSig("Gendata\\Cuttt.CEL",NULL,'PROG');
|
|
LoadPalette ("Gendata\\Cuttt.pal");
|
|
sgdwXY = 1;
|
|
break;
|
|
|
|
default:
|
|
app_fatal("Unknown progress mode");
|
|
break;
|
|
}
|
|
|
|
// Indicates time for the progress bar
|
|
sgdwProgress = 0;
|
|
}
|
|
|
|
|
|
//******************************************************************
|
|
//******************************************************************
|
|
static void DrawBarXY(int x, int y, int v2) {
|
|
app_assert(gpBuffer);
|
|
static const BYTE pixel[3] = { 0x8a, 0x2b, 0xfe };
|
|
BYTE * pto = gpBuffer + nBuffWTbl[y] + x;
|
|
for (int i = 0; i < 22; i++) {
|
|
*pto = pixel[v2];
|
|
pto = pto + 768;
|
|
}
|
|
}
|
|
|
|
|
|
//******************************************************************
|
|
//******************************************************************
|
|
static void ProgressIntDraw() {
|
|
static const int xytable[3][2] = { {53, 37}, {53, 421}, {53, 37} };
|
|
|
|
// draw background
|
|
lock_buf(1);
|
|
app_assert(sgpBackCel);
|
|
DrawCel(64, 639, sgpBackCel, 1, 640);
|
|
|
|
// draw load/progress bar
|
|
for (DWORD i = 0; i < sgdwProgress; i++)
|
|
DrawBarXY (64 + xytable[sgdwXY][0] + i, xytable[sgdwXY][1] + 160, sgdwXY);
|
|
unlock_buf(1);
|
|
|
|
// force a full blit
|
|
force_redraw = FULLDRAW;
|
|
FullBlit(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 IntCheck() {
|
|
interface_msg_pump();
|
|
|
|
// make bar increase
|
|
sgdwProgress += 15;
|
|
if (sgdwProgress > MAX_PROGRESS)
|
|
sgdwProgress = MAX_PROGRESS;
|
|
|
|
// redraw the screen
|
|
if (sgpBackCel) ProgressIntDraw();
|
|
|
|
// are we done?
|
|
return (sgdwProgress >= MAX_PROGRESS);
|
|
}
|
|
|
|
|
|
//******************************************************************
|
|
//******************************************************************
|
|
void ShowProgress(UINT uMsg) {
|
|
gbSomebodyWonGameKludge = FALSE;
|
|
plrmsg_hold(TRUE);
|
|
|
|
app_assert(ghMainWnd);
|
|
WNDPROC saveProc = my_SetWindowProc(DisableInputWndProc);
|
|
interface_msg_pump();
|
|
|
|
// load progress background and fade in
|
|
ClrDraw();
|
|
FullBlit(TRUE);
|
|
ProgressLoad(uMsg);
|
|
BlackPalette();
|
|
ProgressIntDraw();
|
|
PaletteFadeIn(FADE_FAST);
|
|
|
|
IntCheck();
|
|
sound_init();
|
|
IntCheck();
|
|
|
|
switch (uMsg) {
|
|
case WM_DIABLOADGAME :
|
|
IntCheck();
|
|
GM_LoadGame(TRUE);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABNEWGAME :
|
|
IntCheck();
|
|
FreeGameMem();
|
|
IntCheck();
|
|
DestroyTempSaves();
|
|
LoadGameLevel(TRUE, LVL_DOWN);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABNEXTLVL :
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
|
|
FreeGameMem();
|
|
currlevel++;
|
|
leveltype = gnLevelTypeTbl[currlevel];
|
|
app_assert(plr[myplr].plrlevel == currlevel);
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_DOWN);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABPREVLVL :
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
|
|
IntCheck();
|
|
FreeGameMem();
|
|
currlevel--;
|
|
leveltype = gnLevelTypeTbl[currlevel];
|
|
app_assert(plr[myplr].plrlevel == currlevel);
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_UP);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABSETLVL :
|
|
SetReturnLvlPos();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
setlevel = TRUE;
|
|
leveltype = setlvltype;
|
|
FreeGameMem();
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_SET);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABRTNLVL :
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
setlevel = FALSE;
|
|
FreeGameMem();
|
|
IntCheck();
|
|
GetReturnLvlPos();
|
|
LoadGameLevel(FALSE, LVL_RTN);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABWARPLVL :
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
FreeGameMem();
|
|
GetPortalLevel();
|
|
IntCheck();
|
|
|
|
LoadGameLevel(FALSE, LVL_WARP);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABTOWNWARP:
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
|
|
FreeGameMem();
|
|
currlevel = plr[myplr].plrlevel;
|
|
leveltype = gnLevelTypeTbl[currlevel];
|
|
app_assert(plr[myplr].plrlevel == currlevel);
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_TWARPDN);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABTWARPUP:
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
|
|
FreeGameMem();
|
|
currlevel = plr[myplr].plrlevel;
|
|
leveltype = gnLevelTypeTbl[currlevel];
|
|
app_assert(plr[myplr].plrlevel == currlevel);
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_TWARPUP);
|
|
IntCheck();
|
|
break;
|
|
|
|
case WM_DIABRETOWN:
|
|
IntCheck();
|
|
if (gbMaxPlayers == 1) SaveLevel();
|
|
else DeltaSaveLevel();
|
|
|
|
FreeGameMem();
|
|
currlevel = plr[myplr].plrlevel;
|
|
leveltype = gnLevelTypeTbl[currlevel];
|
|
app_assert(plr[myplr].plrlevel == currlevel);
|
|
IntCheck();
|
|
LoadGameLevel(FALSE, LVL_DOWN);
|
|
IntCheck();
|
|
break;
|
|
|
|
}
|
|
|
|
// cleanup
|
|
app_assert(ghMainWnd);
|
|
PaletteFadeOut(FADE_FAST);
|
|
ProgressFree();
|
|
|
|
// restore window procedure
|
|
saveProc = my_SetWindowProc(saveProc);
|
|
app_assert(saveProc == DisableInputWndProc);
|
|
|
|
NetSendCmdLocParam1(
|
|
TRUE,
|
|
CMD_PLAYER_JOINLEVEL,
|
|
plr[myplr]._px,
|
|
plr[myplr]._py,
|
|
plr[myplr].plrlevel
|
|
);
|
|
|
|
plrmsg_hold(FALSE);
|
|
ResetPal();
|
|
|
|
if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) {
|
|
// somebody killed diablo while we were on the stairs
|
|
void PrepDoEnding();
|
|
PrepDoEnding();
|
|
}
|
|
gbSomebodyWonGameKludge = FALSE;
|
|
} |