mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-11 23:40:51 +02:00
1102 lines
28 KiB
C++
1102 lines
28 KiB
C++
/*-----------------------------------------------------------------------**
|
|
** Diablo
|
|
**
|
|
** Triggers file
|
|
**
|
|
** (C)1995 Condor, Inc. All rights reserved.
|
|
**
|
|
**-----------------------------------------------------------------------**
|
|
** $Header: /Diablo/TRIGS.CPP 2 1/23/97 12:21p Jmorin $
|
|
**-----------------------------------------------------------------------**
|
|
**
|
|
** File Routines
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
#include "diablo.h"
|
|
#pragma hdrstop
|
|
#include "trigs.h"
|
|
#include "palette.h"
|
|
#include "gendung.h"
|
|
#include "items.h"
|
|
#include "player.h"
|
|
#include "quests.h"
|
|
#include "cursor.h"
|
|
#include "control.h"
|
|
#include "effects.h"
|
|
#include "msg.h"
|
|
#include "multi.h"
|
|
#include "error.h"
|
|
#include "inv.h"
|
|
#include "setmaps.h"
|
|
|
|
//#define JIM
|
|
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
** Global Variables
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
TriggerStruct trigs[MAXTRIGGERS];
|
|
int numtrigs;
|
|
int TWarpFrom;
|
|
|
|
int TownDownList[] = { 716, 715, 719, 720, 721, 723, 724, 725, 726, 727, -1 };
|
|
int TownWarp1List[] = { 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1181, 1183, 1185, -1 };
|
|
|
|
//HellFire patch JKE
|
|
int TownCryptList[] = { 1331,1332,1333,1334,1335,1336,1337,1338, -1}; // Tag for info box
|
|
int TownHiveList[] = { 1307,1308,1309,1310, -1};
|
|
//end of patch JKE
|
|
|
|
int L1UpList[] = { 127, 129, 130, 131, 132, 133, 135, 137, 138, 139, 140, -1 };
|
|
int L1DownList[] = { 106, 107, 108, 109, 110, 112, 114, 115, 118, -1 };
|
|
int L2UpList[] = { 266, 267, -1 };
|
|
int L2DownList[] = { 269, 270, 271, 272, -1 };
|
|
int L2TWarpUpList[] = { 558, 559, -1 };
|
|
int L3UpList[] = { 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, -1 };
|
|
int L3DownList[] = { 162, 163, 164, 165, 166, 167, 168, 169, -1 };
|
|
int L3TWarpUpList[] = { 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, -1 };
|
|
//int L4UpList[] = { 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, -1 };
|
|
//int L4DownList[] = { 118, 120, 126, 127, 131, 132, 133, 134, 135, 137, 139, 140, 142, -1 };
|
|
//int L4TWarpUpList[] = { 425, 427, 429, 430, 431, 432, 433, 434, 435, 439, -1 };
|
|
int L4UpList[] = { 82, 83, 90, -1 };
|
|
int L4DownList[] = { 120, 130, 131, 132, 133, -1 };
|
|
int L4TWarpUpList[] = { 421, 422, 429, -1 };
|
|
int L4PentaList[] = { 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, -1 };
|
|
|
|
// JKE new warp list for L5 CRYPT
|
|
int L5TWarpUpList[] = {172,173,174,175,176,177,178,179,184,-1};
|
|
//int L5UpList[] = {159,-1};
|
|
int L5UpList[] = {149,150,151,152,153,154,155,157,158,159,-1};
|
|
//int L5DownList[] = {125,126,129,130,131,132,135,136,140,142,-1};
|
|
int L5DownList[] = {125, 126, 129, 131, 132, 135, 136, 140, 142,-1};
|
|
|
|
// JKE new warp list for L6
|
|
int L6TWarpUpList[] = {79,80,81,82,83,84,85,86,87,88,89,90,91,92,-1};
|
|
int L6UpList[] = {65,66,67,68,69,70,71,72,73,74,75,76,77,78,-1};
|
|
int L6DownList[] = {57,58,59,60,61,62,63,64,-1};
|
|
|
|
BOOL trigflag;
|
|
BOOL townwarps[3];
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitNoTriggers()
|
|
{
|
|
numtrigs = 0;
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitTownTriggers()
|
|
{
|
|
trigs[0]._tx = 25;
|
|
trigs[0]._ty = 29;
|
|
trigs[0]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs = 1;
|
|
#if IS_VERSION(SHAREWARE)
|
|
for (int i = 0; i < (MAX_PLRS - 1); i++) townwarps[i] = FALSE;
|
|
trigflag = FALSE;
|
|
return;
|
|
#endif
|
|
if (gbMaxPlayers == MAX_PLRS) {
|
|
for (int i = 0; i < 3; i++) townwarps[i] = TRUE;
|
|
trigs[1]._tx = 49;
|
|
trigs[1]._ty = 21;
|
|
trigs[1]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[1]._tlvl = 5;
|
|
#if CHEATS
|
|
extern BOOL trigdebug;
|
|
if (trigdebug)
|
|
trigs[1]._tlvl = trigdebug;
|
|
#endif
|
|
numtrigs++;
|
|
trigs[2]._tx = 17;
|
|
trigs[2]._ty = 69;
|
|
trigs[2]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[2]._tlvl = 9;
|
|
numtrigs++;
|
|
trigs[3]._tx = 41;
|
|
trigs[3]._ty = 80;
|
|
trigs[3]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[3]._tlvl = 13;
|
|
numtrigs++;
|
|
trigs[4]._tx = 36;
|
|
trigs[4]._ty = 24;
|
|
trigs[4]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[4]._tlvl = CRYPTSTART;
|
|
numtrigs++;
|
|
trigs[5]._tx = 80;
|
|
trigs[5]._ty = 62;
|
|
trigs[5]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[5]._tlvl = HIVESTART;
|
|
numtrigs++;
|
|
} else {
|
|
for (int i = 0; i < (MAX_PLRS - 1); i++) townwarps[i] = FALSE;
|
|
if (plr[myplr].pTownWarps & 0x01 || plr[myplr]._pLevel >= 10) {
|
|
trigs[numtrigs]._tx = 49;
|
|
trigs[numtrigs]._ty = 21;
|
|
trigs[numtrigs]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[numtrigs]._tlvl = 5;
|
|
numtrigs++;
|
|
townwarps[0] = TRUE;
|
|
}
|
|
if (plr[myplr].pTownWarps & 0x02 || plr[myplr]._pLevel >= 15) {
|
|
trigs[numtrigs]._tx = 17;
|
|
trigs[numtrigs]._ty = 69;
|
|
trigs[numtrigs]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[numtrigs]._tlvl = 9;
|
|
numtrigs++;
|
|
townwarps[1] = TRUE;
|
|
}
|
|
if (plr[myplr].pTownWarps & 0x04 || plr[myplr]._pLevel >= 20) {
|
|
trigs[numtrigs]._tx = 41;
|
|
trigs[numtrigs]._ty = 80;
|
|
trigs[numtrigs]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[numtrigs]._tlvl = 13;
|
|
numtrigs++;
|
|
townwarps[2] = TRUE;
|
|
}
|
|
// This will all have to be ifed with whatever we want to trigger with.
|
|
// for now I've assumed it is last and always active. JKE
|
|
|
|
if (quests[Q_CRYPTMAP]._qactive == QUEST_DONE)
|
|
{
|
|
trigs[numtrigs]._tx = 36;
|
|
trigs[numtrigs]._ty = 24;
|
|
trigs[numtrigs]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[numtrigs]._tlvl = CRYPTSTART;
|
|
++numtrigs;
|
|
}
|
|
|
|
trigs[numtrigs]._tx = 80;
|
|
trigs[numtrigs]._ty = 62;
|
|
trigs[numtrigs]._tmsg = WM_DIABTOWNWARP;
|
|
trigs[numtrigs]._tlvl = HIVESTART;
|
|
++numtrigs;
|
|
}
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitL1Triggers()
|
|
{
|
|
int i,j;
|
|
|
|
numtrigs = 0;
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
// if ((dPiece[i][j] == 129) && (currlevel == CRYPTSTART)) { // cheat to add level up for crypt very temporary JKE
|
|
// trigs[numtrigs]._tx = i;
|
|
// trigs[numtrigs]._ty = j;
|
|
// trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
// trigs[numtrigs]._tlvl = 0;
|
|
// numtrigs++;
|
|
// } else {
|
|
if (dPiece[i][j] == 129) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
// }
|
|
if (dPiece[i][j] == 115) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 184) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
trigs[numtrigs]._tlvl = 0;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 158) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
|
|
if (dPiece[i][j] == 126) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitL2Triggers()
|
|
{
|
|
int i,j;
|
|
|
|
numtrigs = 0;
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 267) {
|
|
if ((i != quests[Q_SCHAMB]._qtx) || (j != quests[Q_SCHAMB]._qty)) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
if (dPiece[i][j] == 559) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
trigs[numtrigs]._tlvl = 0;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 271) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitL3Triggers()
|
|
{
|
|
int i,j;
|
|
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
numtrigs = 0;
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 171) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 168) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 549) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
numtrigs = 0;
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 66) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 63) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 80) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitL4Triggers()
|
|
{
|
|
int i,j;
|
|
|
|
numtrigs = 0;
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 83) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABPREVLVL;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 422) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABTWARPUP;
|
|
trigs[numtrigs]._tlvl = 0;
|
|
numtrigs++;
|
|
}
|
|
if (dPiece[i][j] == 120) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
// this will ensure that the first trigger is not the trigger down to 16
|
|
for (j = 0; j < DMAXY; j++) {
|
|
for (i = 0; i < DMAXX; i++) {
|
|
if (dPiece[i][j] == 370) {
|
|
if (quests[Q_BETRAYER]._qactive == QUEST_DONE) {
|
|
trigs[numtrigs]._tx = i;
|
|
trigs[numtrigs]._ty = j;
|
|
trigs[numtrigs]._tmsg = WM_DIABNEXTLVL;
|
|
numtrigs++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitSKingTriggers()
|
|
{
|
|
numtrigs = 1;
|
|
trigs[0]._tx = 82;
|
|
trigs[0]._ty = 42;
|
|
trigs[0]._tmsg = WM_DIABRTNLVL;
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitSChambTriggers()
|
|
{
|
|
numtrigs = 1;
|
|
trigs[0]._tx = 70;
|
|
trigs[0]._ty = 39;
|
|
trigs[0]._tmsg = WM_DIABRTNLVL;
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitPWaterTriggers()
|
|
{
|
|
numtrigs = 1;
|
|
trigs[0]._tx = 30;
|
|
trigs[0]._ty = 83;
|
|
trigs[0]._tmsg = WM_DIABRTNLVL;
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void InitVPTriggers()
|
|
{
|
|
numtrigs = 1;
|
|
trigs[0]._tx = 35;
|
|
trigs[0]._ty = 32;
|
|
trigs[0]._tmsg = WM_DIABRTNLVL;
|
|
trigflag = FALSE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceTownTrig()
|
|
{
|
|
int i;
|
|
#ifdef JIM // debug only
|
|
char mystr[10];
|
|
#endif
|
|
|
|
// HellFire patch JKE
|
|
for (i = 0; TownCryptList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == TownCryptList[i]) {
|
|
strcpy(infostr, "Down to Crypt");
|
|
#ifdef JIM // debug only
|
|
_itoa(dPiece[cursmx][cursmy],mystr,10);
|
|
strcat(infostr,mystr);
|
|
|
|
#endif // END
|
|
cursmx = 36;
|
|
cursmy = 24;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
for (i = 0; TownHiveList [i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == TownHiveList[i]) {
|
|
strcpy(infostr, "Down to Hive");
|
|
cursmx = 80;
|
|
cursmy = 62;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
// end patch JKE
|
|
|
|
for (i = 0; TownDownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == TownDownList[i]) {
|
|
strcpy(infostr, "Down to dungeon");
|
|
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
_itoa(dPiece[cursmx][cursmy],mystr,10);
|
|
strcat(infostr,mystr);
|
|
#endif
|
|
// END
|
|
cursmx = 25;
|
|
cursmy = 29;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
if (townwarps[0]) {
|
|
for (i = 0; TownWarp1List[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == TownWarp1List[i]) {
|
|
strcpy(infostr, "Down to catacombs");
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
_itoa(dPiece[cursmx][cursmy],mystr,10);
|
|
strcat(infostr,mystr);
|
|
#endif
|
|
// END
|
|
cursmx = 49;
|
|
cursmy = 21;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
if (townwarps[1]) {
|
|
for (i = 1199; i <= 1220; i++) {
|
|
if (dPiece[cursmx][cursmy] == i) {
|
|
strcpy(infostr, "Down to caves");
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
_itoa(dPiece[cursmx][cursmy],mystr,10);
|
|
strcat(infostr,mystr);
|
|
#endif
|
|
// END
|
|
cursmx = 17;
|
|
cursmy = 69;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
if (townwarps[2]) {
|
|
for (i = 1240; i <= 1255; i++) {
|
|
if (dPiece[cursmx][cursmy] == i) {
|
|
strcpy(infostr, "Down to hell");
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
_itoa(dPiece[cursmx][cursmy],mystr,10);
|
|
strcat(infostr,mystr);
|
|
#endif
|
|
// END
|
|
cursmx = 41;
|
|
cursmy = 80;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
sprintf(infostr,"X: %d, Y: %d, dPiece: %d", cursmx, cursmy,dPiece[cursmx][cursmy]);
|
|
return (TRUE);
|
|
#endif
|
|
// END
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
BOOL ForceL1Trig() {
|
|
int i, j, dx, dy;
|
|
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
for (i = 0; L1UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L1UpList[i]) {
|
|
if (currlevel > 1) sprintf(infostr, "Up to level %i",currlevel - 1);
|
|
else strcpy(infostr, "Up to town");
|
|
// Total hack up just cause I aint got art. JKE
|
|
// if (currlevel == 17) {
|
|
// strcpy(infostr, "Warp to town");
|
|
// if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
// cursmx = trigs[j]._tx;
|
|
// cursmy = trigs[j]._ty;
|
|
// return(TRUE);
|
|
// }
|
|
// }
|
|
// end of hack
|
|
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0; L1DownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L1DownList[i]) {
|
|
sprintf(infostr, "Down to level %i", currlevel + 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; L5UpList[i] != -1; i++)
|
|
{
|
|
if (dPiece[cursmx][cursmy] == L5UpList[i])
|
|
{
|
|
sprintf(infostr, "Up to Crypt level %i", currlevel - 21);
|
|
for (j = 0; j < numtrigs; j++)
|
|
{
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL)
|
|
{
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (dPiece[cursmx][cursmy] == 317) // cornerstone
|
|
{
|
|
strcpy (infostr, "Cornerstone of the World");
|
|
return(TRUE);
|
|
}
|
|
for (i = 0; L5DownList[i] != -1; i++)
|
|
{
|
|
if (dPiece[cursmx][cursmy] == L5DownList[i])
|
|
{
|
|
sprintf(infostr, "Down to Crypt level %i", currlevel - 19);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (currlevel == CRYPTSTART) {
|
|
for (i = 0; L5TWarpUpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L5TWarpUpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
strcpy(infostr, "Up to town");
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// JIM info bit
|
|
#ifdef JIM
|
|
sprintf(infostr,"X: %d, Y: %d, dPiece: %d", cursmx, cursmy,dPiece[cursmx][cursmy]);
|
|
return (TRUE);
|
|
#endif
|
|
// END
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceL2Trig()
|
|
{
|
|
int i, j, dx, dy;
|
|
|
|
for (i = 0; L2UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L2UpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
sprintf(infostr, "Up to level %i", currlevel - 1);
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; L2DownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L2DownList[i]) {
|
|
sprintf(infostr, "Down to level %i", currlevel + 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (currlevel == 5) {
|
|
for (i = 0; L2TWarpUpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L2TWarpUpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
strcpy(infostr, "Up to town");
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceL3Trig()
|
|
{
|
|
int i, j, dx, dy;
|
|
|
|
// JKE level 6 stuff
|
|
if (currlevel < HIVESTART)
|
|
{
|
|
for (i = 0; L3UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L3UpList[i]) {
|
|
sprintf(infostr, "Up to level %i", currlevel - 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; L3DownList[i] != -1; i++) {
|
|
if ((dPiece[cursmx][cursmy] == L3DownList[i]) ||
|
|
(dPiece[cursmx+1][cursmy] == L3DownList[i]) ||
|
|
(dPiece[cursmx+2][cursmy] == L3DownList[i])) {
|
|
sprintf(infostr, "Down to level %i", currlevel + 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; L6UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L6UpList[i]) {
|
|
sprintf(infostr, "Up to Nest level %i", currlevel - 17);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; L6DownList[i] != -1; i++) {
|
|
if ((dPiece[cursmx][cursmy] == L6DownList[i]) ||
|
|
(dPiece[cursmx+1][cursmy] == L6DownList[i]) ||
|
|
(dPiece[cursmx+2][cursmy] == L6DownList[i])) {
|
|
sprintf(infostr, "Down to level %i", currlevel - 15);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (currlevel == 9) {
|
|
for (i = 0; L3TWarpUpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L3TWarpUpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
strcpy(infostr, "Up to town");
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (currlevel == HIVESTART) {
|
|
for (i = 0; L6TWarpUpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L6TWarpUpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
strcpy(infostr, "Up to town");
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceL4Trig()
|
|
{
|
|
int i, j, dx, dy;
|
|
|
|
for (i = 0; L4UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L4UpList[i]) {
|
|
sprintf(infostr, "Up to level %i", currlevel - 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABPREVLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; L4DownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L4DownList[i]) {
|
|
sprintf(infostr, "Down to level %i", currlevel + 1);
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (currlevel == 13) {
|
|
for (i = 0; L4TWarpUpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L4TWarpUpList[i]) {
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABTWARPUP) {
|
|
dx = abs(trigs[j]._tx - cursmx);
|
|
dy = abs(trigs[j]._ty - cursmy);
|
|
if ((dx < 4) && (dy < 4)) {
|
|
strcpy(infostr, "Up to town");
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (currlevel == 15) {
|
|
for (i = 0; L4PentaList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L4PentaList[i]) {
|
|
strcpy(infostr, "Down to Diablo");
|
|
for (j = 0; j < numtrigs; j++) {
|
|
if (trigs[j]._tmsg == WM_DIABNEXTLVL) {
|
|
cursmx = trigs[j]._tx;
|
|
cursmy = trigs[j]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
void Freeupstairs()
|
|
{
|
|
int j, tx, ty, xx, yy;
|
|
|
|
for (j = 0; j < numtrigs; j++) {
|
|
tx = trigs[j]._tx;
|
|
ty = trigs[j]._ty;
|
|
for (yy = -2; yy <= 2; yy++) {
|
|
for (xx = -2; xx <= 2; xx++)
|
|
dFlags[tx+xx][ty+yy] |= BFLAG_SETPC;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceSKingTrig()
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; L1UpList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L1UpList[i]) {
|
|
sprintf(infostr, "Back to Level %i", quests[Q_SKELKING]._qlevel);
|
|
cursmx = trigs[0]._tx;
|
|
cursmy = trigs[0]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForceSChambTrig()
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; L2DownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L2DownList[i]) {
|
|
sprintf(infostr, "Back to Level %i", quests[Q_SCHAMB]._qlevel);
|
|
cursmx = trigs[0]._tx;
|
|
cursmy = trigs[0]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
BOOL ForcePWaterTrig()
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; L3DownList[i] != -1; i++) {
|
|
if (dPiece[cursmx][cursmy] == L3DownList[i]) {
|
|
sprintf(infostr, "Back to Level %i", quests[Q_PWATER]._qlevel);
|
|
cursmx = trigs[0]._tx;
|
|
cursmy = trigs[0]._ty;
|
|
return(TRUE);
|
|
}
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
void CheckTrigForce()
|
|
{
|
|
trigflag = FALSE;
|
|
if (MouseY > 351) return;
|
|
if (!setlevel) {
|
|
switch (leveltype) {
|
|
case 0:
|
|
trigflag = ForceTownTrig();
|
|
break;
|
|
case 1:
|
|
trigflag = ForceL1Trig();
|
|
break;
|
|
case 2:
|
|
trigflag = ForceL2Trig();
|
|
break;
|
|
case 3:
|
|
trigflag = ForceL3Trig();
|
|
break;
|
|
case 4:
|
|
trigflag = ForceL4Trig();
|
|
break;
|
|
}
|
|
if (leveltype && !trigflag)
|
|
trigflag = ForceQuests();
|
|
} else {
|
|
switch (setlvlnum) {
|
|
case SL_SKELKING:
|
|
trigflag = ForceSKingTrig();
|
|
break;
|
|
case SL_BONECHAMB:
|
|
trigflag = ForceSChambTrig();
|
|
break;
|
|
case SL_POISONWATER:
|
|
trigflag = ForcePWaterTrig();
|
|
break;
|
|
/* case SL_VILEBETRAYER:
|
|
trigflag = ForceVBetTrig();
|
|
break;*/
|
|
}
|
|
}
|
|
if (trigflag) ClearPanel();
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
void CheckTriggers() {
|
|
|
|
// player can only work triggers in stand mode
|
|
if (plr[myplr]._pmode != PM_STAND)
|
|
return;
|
|
|
|
for (int i = 0; i < numtrigs; i++) {
|
|
if (plr[myplr]._px != trigs[i]._tx) continue;
|
|
if (plr[myplr]._py != trigs[i]._ty) continue;
|
|
|
|
switch (trigs[i]._tmsg) {
|
|
case WM_DIABNEXTLVL:
|
|
#if IS_VERSION(SHAREWARE)
|
|
if (currlevel >= 2) {
|
|
NetSendCmdLoc(TRUE,CMD_WALKXY,plr[myplr]._px,plr[myplr]._py+1);
|
|
PlaySFX(PS_WARR18); // "no way"
|
|
InitDiabloMsg(MSG_SHAREWARE);
|
|
break;
|
|
}
|
|
#endif
|
|
//Does player have item in hand? If so, drop it before going down level.
|
|
if (curs >= ICSTART) {
|
|
if(DropItemBeforeTrig()) return;
|
|
}
|
|
StartNewLvl(myplr,trigs[i]._tmsg,currlevel + 1);
|
|
break;
|
|
|
|
case WM_DIABPREVLVL:
|
|
//Does player have item in hand? If so, drop it before going up level.
|
|
if (curs >= ICSTART) {
|
|
if(DropItemBeforeTrig()) return;
|
|
}
|
|
StartNewLvl(myplr,trigs[i]._tmsg,currlevel - 1);
|
|
break;
|
|
|
|
case WM_DIABTOWNWARP:
|
|
if (gbMaxPlayers != 1) {
|
|
BOOL abortflag = FALSE;
|
|
int dx,dy;
|
|
char m;
|
|
if ((trigs[i]._tlvl == 5) && (plr[myplr]._pLevel < 8)) {
|
|
abortflag = TRUE;
|
|
dx = plr[myplr]._px;
|
|
dy = plr[myplr]._py+1;
|
|
m = MSG_TRIG1;
|
|
}
|
|
if ((trigs[i]._tlvl == 9) && (plr[myplr]._pLevel < 13)) {
|
|
abortflag = TRUE;
|
|
dx = plr[myplr]._px+1;
|
|
dy = plr[myplr]._py;
|
|
m = MSG_TRIG2;
|
|
}
|
|
if ((trigs[i]._tlvl == 13) && (plr[myplr]._pLevel < 17)) {
|
|
abortflag = TRUE;
|
|
dx = plr[myplr]._px;
|
|
dy = plr[myplr]._py+1;
|
|
m = MSG_TRIG3;
|
|
}
|
|
if (abortflag) {
|
|
if (plr[myplr]._pClass == CLASS_WARRIOR) PlaySFX(PS_WARR43);
|
|
#if !IS_VERSION(SHAREWARE)
|
|
else if (plr[myplr]._pClass == CLASS_ROGUE) PlaySFX(PS_ROGUE43);
|
|
else if (plr[myplr]._pClass == CLASS_SORCEROR) PlaySFX(PS_MAGE43);
|
|
else if (plr[myplr]._pClass == CLASS_MONK) PlaySFX(PS_MONK43);
|
|
else if (plr[myplr]._pClass == CLASS_BARD) PlaySFX(PS_BARD43);
|
|
else if (plr[myplr]._pClass == CLASS_BARBARIAN) PlaySFX(PS_BARBARIAN43);
|
|
#endif
|
|
InitDiabloMsg(m);
|
|
NetSendCmdLoc(TRUE,CMD_WALKXY,dx,dy);
|
|
return;
|
|
}
|
|
}
|
|
StartNewLvl(myplr,trigs[i]._tmsg,trigs[i]._tlvl);
|
|
break;
|
|
|
|
case WM_DIABTWARPUP:
|
|
TWarpFrom = currlevel;
|
|
StartNewLvl(myplr,trigs[i]._tmsg,0);
|
|
break;
|
|
|
|
case WM_DIABRTNLVL:
|
|
// doesn't work for multiplayer
|
|
app_assert(gbMaxPlayers == 1);
|
|
StartNewLvl(myplr,trigs[i]._tmsg,ReturnLvl);
|
|
break;
|
|
|
|
default:
|
|
app_fatal("Unknown trigger msg");
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|