mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-12 07:50:53 +02:00
Initial commit.
This commit is contained in:
+544
@@ -0,0 +1,544 @@
|
||||
/*-----------------------------------------------------------------------**
|
||||
** 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;
|
||||
}
|
||||
Reference in New Issue
Block a user