Browse Source

Merge branch 'master' of github.com:diasurgical/devilution

pull/898/head
Anders Jenbo 6 years ago
parent
commit
e90f84dd03
  1. 38
      Source/missiles.cpp
  2. 20
      Source/monster.cpp
  3. 177
      Source/msg.cpp
  4. 2
      Source/multi.cpp
  5. 74
      Source/objects.cpp
  6. 12
      Source/player.cpp
  7. 50
      Source/stores.cpp
  8. 15
      defs.h

38
Source/missiles.cpp

@ -277,7 +277,7 @@ int FindClosest(int sx, int sy, int rad)
for (i = 1; i < rad; i++) {
cr = CrawlNum[i] + 2;
#ifdef HELLFIRE
for (j = CrawlTable[CrawlNum[i]]; j > 0; j--) {
for (j = CrawlTable[CrawlNum[i]]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (j = (BYTE)CrawlTable[CrawlNum[i]]; j > 0; j--) {
#endif
@ -1120,7 +1120,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my,
missile[i]._miHitFlag = TRUE;
}
}
if (dObject[mx][my]) {
if (dObject[mx][my] != 0) {
oi = dObject[mx][my] > 0 ? dObject[mx][my] - 1 : -(dObject[mx][my] + 1);
if (!object[oi]._oMissFlag) {
if (object[oi]._oBreak == 1)
@ -1351,7 +1351,7 @@ BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad)
ty = *y + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (!nSolidTable[dp] && !dObject[tx][ty] && !dMissile[tx][ty]) {
if (!nSolidTable[dp] && dObject[tx][ty] == 0 && dMissile[tx][ty] == 0) {
missile[mi]._mix = tx;
missile[mi]._miy = ty;
*x = tx;
@ -2131,10 +2131,10 @@ void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mien
if (r1 <= MAXDUNX && r1 >= 0 && r2 <= MAXDUNY && r2 >= 0) { ///BUGFIX: < MAXDUNX / < MAXDUNY
pn = dPiece[r1][r2];
}
} while (nSolidTable[pn] || dObject[r1][r2] || dMonster[r1][r2]);
} while (nSolidTable[pn] || dObject[r1][r2] != 0 || dMonster[r1][r2] != 0);
#else
pn = dPiece[r1 + sx][sy + r2];
} while (nSolidTable[pn] || dObject[r1 + sx][sy + r2] || dMonster[r1 + sx][sy + r2]);
} while (nSolidTable[pn] || dObject[r1 + sx][sy + r2] != 0 || dMonster[r1 + sx][sy + r2] != 0);
#endif
missile[mi]._mirange = 2;
@ -2236,7 +2236,7 @@ void AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
tx = dx + CrawlTable[pn - 1];
ty = dy + CrawlTable[pn];
if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {
if (!(nSolidTable[dPiece[tx][ty]] | dMonster[tx][ty] | dObject[tx][ty] | dPlayer[tx][ty])) {
if ((nSolidTable[dPiece[tx][ty]] | dMonster[tx][ty] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) {
missile[mi]._mix = tx;
missile[mi]._miy = ty;
missile[mi]._misx = tx;
@ -2441,7 +2441,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in
for (j = 0; j < 6; j++) {
k = CrawlNum[j] + 2;
#ifdef HELLFIRE
for (i = CrawlTable[CrawlNum[j]]; i > 0; i--) {
for (i = CrawlTable[CrawlNum[j]]; i > 0; i--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (i = (BYTE)CrawlTable[CrawlNum[j]]; i > 0; i--) {
#endif
@ -2449,7 +2449,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in
ty = dy + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (!(dMissile[tx][ty] | nSolidTable[dp] | nMissileTable[dp] | dObject[tx][ty] | dPlayer[tx][ty])) {
if ((dMissile[tx][ty] | nSolidTable[dp] | nMissileTable[dp] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) {
if (!CheckIfTrig(tx, ty)) {
missile[mi]._mix = tx;
missile[mi]._miy = ty;
@ -2579,7 +2579,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
pn = CrawlNum[i];
k = pn + 2;
#ifdef HELLFIRE
for (j = CrawlTable[pn]; j > 0; j--) {
for (j = CrawlTable[pn]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (j = (BYTE)CrawlTable[pn]; j > 0; j--) {
#endif
@ -2588,7 +2588,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
pn = dPiece[tx][ty];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
if (LineClear(sx, sy, tx, ty)) {
if (!(dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty])) {
if ((dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty]) == 0) {
missile[mi]._mix = tx;
missile[mi]._miy = ty;
missile[mi]._misx = tx;
@ -2810,7 +2810,7 @@ void AddStone(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, i
k = CrawlNum[i];
l = k + 2;
#ifdef HELLFIRE
for (j = CrawlTable[k]; j > 0; j--) {
for (j = CrawlTable[k]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (j = (BYTE)CrawlTable[k]; j > 0; j--) {
#endif
@ -3034,7 +3034,7 @@ void AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir, char mienem
k = CrawlNum[i];
pn = k + 2;
#ifdef HELLFIRE
for (j = CrawlTable[k]; j > 0; j--) {
for (j = CrawlTable[k]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (j = (BYTE)CrawlTable[k]; j > 0; j--) {
#endif
@ -3043,7 +3043,7 @@ void AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir, char mienem
if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {
k = dPiece[tx][ty];
if (LineClear(sx, sy, tx, ty)) {
if ((sx != tx || sy != ty) && !(nSolidTable[k] | dObject[tx][ty])) {
if ((sx != tx || sy != ty) && (nSolidTable[k] | dObject[tx][ty]) == 0) {
missile[mi]._miVar1 = tx;
missile[mi]._miVar2 = ty;
missile[mi]._miVar5 = tx;
@ -3514,7 +3514,7 @@ void MI_Golem(int i)
k = CrawlNum[l];
tid = k + 2;
#ifdef HELLFIRE
for (m = CrawlTable[k]; m > 0; m--) {
for (m = CrawlTable[k]; m > 0; m--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (m = (BYTE)CrawlTable[k]; m > 0; m--) {
#endif
@ -3524,7 +3524,7 @@ void MI_Golem(int i)
if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (LineClear(missile[i]._miVar1, missile[i]._miVar2, tx, ty)) {
if (!(dMonster[tx][ty] | nSolidTable[dp] | dObject[tx][ty])) {
if ((dMonster[tx][ty] | nSolidTable[dp] | dObject[tx][ty]) == 0) {
l = 6;
SpawnGolum(src, tx, ty, i);
break;
@ -3934,7 +3934,7 @@ void missiles_4359A0(int i)
ty = missile[i]._miy + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (!nSolidTable[dp] && !dMonster[tx][ty] && !dPlayer[tx][ty] && !dObject[tx][ty]) {
if (!nSolidTable[dp] && dMonster[tx][ty] == 0 && dPlayer[tx][ty] == 0 && dObject[tx][ty] == 0) {
j = 6;
int mon = AddMonster(tx, ty, missile[i]._miVar1, 1, TRUE);
M_StartStand(mon, missile[i]._miVar1);
@ -4293,7 +4293,7 @@ void mi_fire_ring(int i)
ty = missile[i]._miVar2 + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (!nSolidTable[dp] && !dObject[tx][ty]) {
if (!nSolidTable[dp] && dObject[tx][ty] == 0) {
if (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) {
if (nMissileTable[dp] || missile[i]._miVar8)
missile[i]._miVar8 = 1;
@ -4324,7 +4324,7 @@ void mi_light_ring(int i)
ty = missile[i]._miVar2 + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
dp = dPiece[tx][ty];
if (!nSolidTable[dp] && !dObject[tx][ty]) {
if (!nSolidTable[dp] && dObject[tx][ty] == 0) {
if (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) {
if (nMissileTable[dp] || missile[i]._miVar8)
missile[i]._miVar8 = 1;
@ -4911,7 +4911,7 @@ void MI_Chain(int i)
k = CrawlNum[m];
l = k + 2;
#ifdef HELLFIRE
for (n = CrawlTable[k]; n > 0; n--) {
for (n = CrawlTable[k]; n > 0; n--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong
#else
for (n = (BYTE)CrawlTable[k]; n > 0; n--) {
#endif

20
Source/monster.cpp

@ -630,8 +630,8 @@ BOOL MonstPlace(int xp, int yp)
if (xp < 0 || xp >= MAXDUNX
|| yp < 0 || yp >= MAXDUNY
|| dMonster[xp][yp]
|| dPlayer[xp][yp]) {
|| dMonster[xp][yp] != 0
|| dPlayer[xp][yp] != 0) {
return FALSE;
}
@ -1300,8 +1300,8 @@ void monster_43C785(int i)
x = mx + offset_x[d];
y = my + offset_y[d];
if (!SolidLoc(x, y)) {
if (!dPlayer[x][y] && !dMonster[x][y]) {
if (!dObject[x][y])
if (dPlayer[x][y] == 0 && dMonster[x][y] == 0) {
if (dObject[x][y] == 0)
break;
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
if (!object[oi]._oSolidFlag)
@ -5667,9 +5667,9 @@ BOOL PosOkMonst(int i, int x, int y)
int oi;
BOOL ret;
ret = !SolidLoc(x, y) && !dPlayer[x][y] && !dMonster[x][y];
ret = !SolidLoc(x, y) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;
oi = dObject[x][y];
if (ret && oi) {
if (ret && oi != 0) {
oi = oi > 0 ? oi - 1 : -(oi + 1);
if (object[oi]._oSolidFlag)
ret = FALSE;
@ -5682,8 +5682,8 @@ BOOL PosOkMonst(int i, int x, int y)
BOOL ret, fire;
fire = FALSE;
ret = !SolidLoc(x, y) && !dPlayer[x][y] && !dMonster[x][y];
if (ret && dObject[x][y]) {
ret = !SolidLoc(x, y) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;
if (ret && dObject[x][y] != 0) {
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
if (object[oi]._oSolidFlag)
ret = FALSE;
@ -5758,7 +5758,7 @@ BOOL PosOkMonst2(int i, int x, int y)
oi = dObject[x][y];
ret = !SolidLoc(x, y);
if (ret && oi) {
if (ret && oi != 0) {
oi = oi > 0 ? oi - 1 : -(oi + 1);
if (object[oi]._oSolidFlag)
ret = FALSE;
@ -5771,7 +5771,7 @@ BOOL PosOkMonst2(int i, int x, int y)
fire = FALSE;
ret = !SolidLoc(x, y);
if (ret && dObject[x][y]) {
if (ret && dObject[x][y] != 0) {
oi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);
if (object[oi]._oSolidFlag)
ret = FALSE;

177
Source/msg.cpp

@ -62,7 +62,7 @@ void msg_get_next_packet()
sgpCurrPkt = (TMegaPkt *)DiabloAllocPtr(sizeof(TMegaPkt));
sgpCurrPkt->pNext = NULL;
sgpCurrPkt->dwSpaceLeft = 32000;
sgpCurrPkt->dwSpaceLeft = sizeof(result->data);
result = (TMegaPkt *)&sgpMegaPkt;
while (result->pNext) {
@ -94,7 +94,7 @@ BOOL msg_wait_resync()
return FALSE;
}
if (sgbDeltaChunks != 21) {
if (sgbDeltaChunks != MAX_CHUNKS) {
DrawDlg("Unable to get level data");
msg_free_packets();
return FALSE;
@ -117,7 +117,7 @@ int msg_wait_for_turns()
BOOL received;
DWORD turns;
if (!sgbDeltaChunks) {
if (sgbDeltaChunks == 0) {
nthread_send_and_recv_turn(0, 0);
if (!SNetGetOwnerTurnsWaiting(&turns) && SErrGetLastError() == STORM_ERROR_NOT_IN_GAME)
return 100;
@ -138,11 +138,11 @@ int msg_wait_for_turns()
gbDeltaSender = myplr;
nthread_set_turn_upper_bit();
}
if (sgbDeltaChunks == 20) {
sgbDeltaChunks = 21;
if (sgbDeltaChunks == MAX_CHUNKS - 1) {
sgbDeltaChunks = MAX_CHUNKS;
return 99;
}
return 100 * sgbDeltaChunks / 21;
return 100 * sgbDeltaChunks / MAX_CHUNKS;
}
void run_delta_info()
@ -163,9 +163,9 @@ void msg_pre_packet()
TFakeCmdPlr *cmd, *tmpCmd;
TFakeDropPlr *dropCmd;
pkt = sgpMegaPkt;
for (i = -1; pkt; pkt = pkt->pNext) {
spaceLeft = 32000;
i = -1;
for (pkt = sgpMegaPkt; pkt != NULL; pkt = pkt->pNext) {
spaceLeft = sizeof(pkt->data);
cmd = (TFakeCmdPlr *)pkt->data;
while (spaceLeft != pkt->dwSpaceLeft) {
if (cmd->bCmd == FAKE_CMD_SETID) {
@ -194,7 +194,7 @@ void DeltaExportData(int pnum)
char src;
if (sgbDeltaChanged) {
dst = (BYTE *)DiabloAllocPtr(4722);
dst = (BYTE *)DiabloAllocPtr(sizeof(DLevel) + 1);
for (i = 0; i < NUMLEVELS; i++) {
dstEnd = dst + 1;
dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item);
@ -273,7 +273,7 @@ BYTE *DeltaExportJunk(BYTE *dst)
}
mq = sgJunk.quests;
for (i = 0; i < MAXMULTIQUESTS; i++) {
for (i = 0; i < MAXQUESTS; i++) {
if (questlist[i]._qflags & QUEST_ANY) {
mq->qlog = quests[i]._qlog;
mq->qstate = quests[i]._qactive;
@ -413,9 +413,9 @@ void DeltaAddItem(int ii)
int i;
TCmdPItem *pD;
if (gbMaxPlayers == 1) {
if (gbMaxPlayers == 1)
return;
}
pD = sgLevels[currlevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd != 0xFF
@ -430,8 +430,8 @@ void DeltaAddItem(int ii)
pD = sgLevels[currlevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd == 0xFF) {
pD->bCmd = CMD_STAND;
sgbDeltaChanged = TRUE;
pD->bCmd = CMD_STAND;
pD->x = item[ii]._ix;
pD->y = item[ii]._iy;
pD->wIndx = item[ii].IDidx;
@ -443,6 +443,14 @@ void DeltaAddItem(int ii)
pD->bCh = item[ii]._iCharges;
pD->bMCh = item[ii]._iMaxCharges;
pD->wValue = item[ii]._ivalue;
#ifdef HELLFIRE
pD->wToHit = item[ii]._iPLToHit;
pD->wMaxDam = item[ii]._iMaxDam;
pD->bMinStr = item[ii]._iMinStr;
pD->bMinMag = item[ii]._iMinMag;
pD->bMinDex = item[ii]._iMinDex;
pD->bAC = item[ii]._iAC;
#endif
return;
}
}
@ -1187,7 +1195,7 @@ DWORD On_DLEVEL(int pnum, TCmd *pCmd)
}
if (sgbRecvCmd == CMD_DLEVEL_END) {
if (p->bCmd == CMD_DLEVEL_END) {
sgbDeltaChunks = 20;
sgbDeltaChunks = MAX_CHUNKS - 1;
return p->wBytes + sizeof(*p);
} else if (p->bCmd == CMD_DLEVEL_0 && p->wOffset == 0) {
sgdwRecvOffset = 0;
@ -1198,7 +1206,7 @@ DWORD On_DLEVEL(int pnum, TCmd *pCmd)
} else if (sgbRecvCmd != p->bCmd) {
DeltaImportData(sgbRecvCmd, sgdwRecvOffset);
if (p->bCmd == CMD_DLEVEL_END) {
sgbDeltaChunks = 20;
sgbDeltaChunks = MAX_CHUNKS - 1;
sgbRecvCmd = CMD_DLEVEL_END;
return p->wBytes + sizeof(*p);
} else {
@ -1218,13 +1226,17 @@ void DeltaImportData(BYTE cmd, DWORD recv_offset)
BYTE i;
BYTE *src;
if (sgRecvBuf[0])
PkwareDecompress(&sgRecvBuf[1], recv_offset, 4721);
if (sgRecvBuf[0] != 0)
PkwareDecompress(&sgRecvBuf[1], recv_offset, (sizeof(sgRecvBuf) / sizeof(sgRecvBuf[0])) - 1);
src = &sgRecvBuf[1];
if (cmd == CMD_DLEVEL_JUNK) {
DeltaImportJunk(src);
#ifdef HELLFIRE
} else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_24) {
#else
} else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_16) {
#endif
i = cmd - CMD_DLEVEL_0;
src = DeltaImportItem(src, sgLevels[i].item);
src = DeltaImportObject(src, sgLevels[i].object);
@ -1303,7 +1315,7 @@ void DeltaImportJunk(BYTE *src)
}
mq = sgJunk.quests;
for (i = 0; i < MAXMULTIQUESTS; i++) {
for (i = 0; i < MAXQUESTS; i++) {
if (questlist[i]._qflags & QUEST_ANY) {
memcpy(mq, src, sizeof(MultiQuests));
src += sizeof(MultiQuests);
@ -1386,7 +1398,8 @@ DWORD On_SBSPELL(TCmd *pCmd, int pnum)
TCmdParam1 *p = (TCmdParam1 *)pCmd;
if (gbBufferMsgs != 1) {
if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
int spell = p->wParam1;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
plr[pnum]._pSpell = p->wParam1;
plr[pnum]._pSplType = plr[pnum]._pSBkSplType;
plr[pnum]._pSplFrom = 1;
@ -1498,62 +1511,67 @@ DWORD On_GETITEM(TCmd *pCmd, int pnum)
BOOL delta_get_item(TCmdGItem *pI, BYTE bLevel)
{
BOOL result;
TCmdPItem *pD;
int i;
BOOL found;
result = TRUE;
found = FALSE;
if (gbMaxPlayers != 1) {
pD = sgLevels[bLevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd != 0xFF && pD->wIndx == pI->wIndx && pD->wCI == pI->wCI && pD->dwSeed == pI->dwSeed) {
found = TRUE;
break;
}
if (gbMaxPlayers == 1)
return TRUE;
pD = sgLevels[bLevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd == 0xFF || pD->wIndx != pI->wIndx || pD->wCI != pI->wCI || pD->dwSeed != pI->dwSeed)
continue;
if (pD->bCmd == CMD_WALKXY) {
return TRUE;
}
if (found) {
if (pD->bCmd == CMD_WALKXY) {
return result;
}
if (pD->bCmd == CMD_STAND) {
sgbDeltaChanged = 1;
pD->bCmd = CMD_WALKXY;
return result;
}
if (pD->bCmd == CMD_ACK_PLRINFO) {
pD->bCmd = 0xFF;
sgbDeltaChanged = 1;
return result;
}
app_fatal("delta:1");
if (pD->bCmd == CMD_STAND) {
sgbDeltaChanged = TRUE;
pD->bCmd = CMD_WALKXY;
return TRUE;
}
if (((pI->wCI >> 8) & 0x80) == 0)
return FALSE;
pD = sgLevels[bLevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd == 0xFF) {
sgbDeltaChanged = 1;
pD->bCmd = CMD_WALKXY;
pD->x = pI->x;
pD->y = pI->y;
pD->wIndx = pI->wIndx;
pD->wCI = pI->wCI;
pD->dwSeed = pI->dwSeed;
pD->bId = pI->bId;
pD->bDur = pI->bDur;
pD->bMDur = pI->bMDur;
pD->bCh = pI->bCh;
pD->bMCh = pI->bMCh;
pD->wValue = pI->wValue;
pD->dwBuff = pI->dwBuff;
result = TRUE;
break;
}
if (pD->bCmd == CMD_ACK_PLRINFO) {
sgbDeltaChanged = TRUE;
pD->bCmd = 0xFF;
return TRUE;
}
app_fatal("delta:1");
break;
}
return result;
if ((pI->wCI & CF_PREGEN) == 0)
return FALSE;
pD = sgLevels[bLevel].item;
for (i = 0; i < MAXITEMS; i++, pD++) {
if (pD->bCmd == 0xFF) {
sgbDeltaChanged = TRUE;
pD->bCmd = CMD_WALKXY;
pD->x = pI->x;
pD->y = pI->y;
pD->wIndx = pI->wIndx;
pD->wCI = pI->wCI;
pD->dwSeed = pI->dwSeed;
pD->bId = pI->bId;
pD->bDur = pI->bDur;
pD->bMDur = pI->bMDur;
pD->bCh = pI->bCh;
pD->bMCh = pI->bMCh;
pD->wValue = pI->wValue;
pD->dwBuff = pI->dwBuff;
#ifdef HELLFIRE
pD->wToHit = pI->wToHit;
pD->wMaxDam = pI->wMaxDam;
pD->bMinStr = pI->bMinStr;
pD->bMinMag = pI->bMinMag;
pD->bMinDex = pI->bMinDex;
pD->bAC = pI->bAC;
#endif
break;
}
}
return TRUE;
}
DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum)
@ -1803,7 +1821,8 @@ DWORD On_SPELLXYD(TCmd *pCmd, int pnum)
TCmdLocParam3 *p = (TCmdLocParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
int spell = p->wParam1;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLWALL;
plr[pnum].destParam1 = p->x;
@ -1825,7 +1844,8 @@ DWORD On_SPELLXY(TCmd *pCmd, int pnum)
TCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
int spell = p->wParam1;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELL;
plr[pnum].destParam1 = p->x;
@ -1846,7 +1866,8 @@ DWORD On_TSPELLXY(TCmd *pCmd, int pnum)
TCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
int spell = p->wParam1;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELL;
plr[pnum].destParam1 = p->x;
@ -1966,7 +1987,8 @@ DWORD On_SPELLID(TCmd *pCmd, int pnum)
TCmdParam3 *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
int spell = p->wParam2;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLMON;
plr[pnum].destParam1 = p->wParam1;
@ -1986,7 +2008,8 @@ DWORD On_SPELLPID(TCmd *pCmd, int pnum)
TCmdParam3 *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
int spell = p->wParam2;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLPLR;
plr[pnum].destParam1 = p->wParam1;
@ -2006,7 +2029,8 @@ DWORD On_TSPELLID(TCmd *pCmd, int pnum)
TCmdParam3 *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
int spell = p->wParam2;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLMON;
plr[pnum].destParam1 = p->wParam1;
@ -2026,7 +2050,8 @@ DWORD On_TSPELLPID(TCmd *pCmd, int pnum)
TCmdParam3 *p = (TCmdParam3 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
int spell = p->wParam2;
if (currlevel != 0 || spelldata[spell].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLPLR;
plr[pnum].destParam1 = p->wParam1;

2
Source/multi.cpp

@ -438,7 +438,7 @@ void multi_process_network_packets()
plr[dwID]._pBaseStr = pkt->bstr;
plr[dwID]._pBaseMag = pkt->bmag;
plr[dwID]._pBaseDex = pkt->bdex;
if (!cond && plr[dwID].plractive && plr[dwID]._pHitPoints) {
if (!cond && plr[dwID].plractive && plr[dwID]._pHitPoints != 0) {
if (currlevel == plr[dwID].plrlevel && !plr[dwID]._pLvlChanging) {
dx = abs(plr[dwID]._px - pkt->px);
dy = abs(plr[dwID]._py - pkt->py);

74
Source/objects.cpp

@ -282,11 +282,11 @@ void FreeObjectGFX()
DIABOOL RndLocOk(int xp, int yp)
{
if (dMonster[xp][yp])
if (dMonster[xp][yp] != 0)
return FALSE;
if (dPlayer[xp][yp])
if (dPlayer[xp][yp] != 0)
return FALSE;
if (dObject[xp][yp])
if (dObject[xp][yp] != 0)
return FALSE;
if (dFlags[xp][yp] & BFLAG_POPULATED)
return FALSE;
@ -1976,10 +1976,10 @@ void Obj_Door(int i)
} else {
dx = object[i]._ox;
dy = object[i]._oy;
dok = !dMonster[dx][dy];
dok = dok HFAND !dItem[dx][dy];
dok = dok HFAND !dDead[dx][dy];
dok = dok HFAND !dPlayer[dx][dy];
dok = dMonster[dx][dy] == 0;
dok = dok HFAND (dItem[dx][dy] == 0);
dok = dok HFAND (dDead[dx][dy] == 0);
dok = dok HFAND (dPlayer[dx][dy] == 0);
object[i]._oSelFlag = 2;
object[i]._oVar4 = dok ? 1 : 2;
object[i]._oMissFlag = TRUE;
@ -2027,7 +2027,7 @@ void Obj_FlameTrap(int i)
x = object[i]._ox - 2;
y = object[i]._oy;
for (j = 0; j < 5; j++) {
if (dPlayer[x][y] || dMonster[x][y])
if (dPlayer[x][y] != 0 || dMonster[x][y] != 0)
object[i]._oVar4 = 1;
x++;
}
@ -2035,7 +2035,7 @@ void Obj_FlameTrap(int i)
x = object[i]._ox;
y = object[i]._oy - 2;
for (k = 0; k < 5; k++) {
if (dPlayer[x][y] || dMonster[x][y])
if (dPlayer[x][y] != 0 || dMonster[x][y] != 0)
object[i]._oVar4 = 1;
y++;
}
@ -2099,7 +2099,7 @@ void Obj_Trap(int i)
dy = object[oti]._oy;
for (y = dy - 1; y <= object[oti]._oy + 1; y++) {
for (x = object[oti]._ox - 1; x <= object[oti]._ox + 1; x++) {
if (dPlayer[x][y]) {
if (dPlayer[x][y] != 0) {
dx = x;
dy = y;
}
@ -2522,9 +2522,9 @@ void OperateL1RDoor(int pnum, int oi, DIABOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy);
}
BOOLEAN dok = !dMonster[xp][yp];
dok = dok && !dItem[xp][yp];
dok = dok && !dDead[xp][yp];
BOOLEAN dok = dMonster[xp][yp] == 0;
dok = dok && dItem[xp][yp] == 0;
dok = dok && dDead[xp][yp] == 0;
if (dok) {
#else
if (!deltaload)
@ -2630,9 +2630,9 @@ void OperateL1LDoor(int pnum, int oi, DIABOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy);
}
BOOLEAN dok = !dMonster[xp][yp];
dok = dok && !dItem[xp][yp];
dok = dok && !dDead[xp][yp];
BOOLEAN dok = dMonster[xp][yp] == 0;
dok = dok && dItem[xp][yp] == 0;
dok = dok && dDead[xp][yp] == 0;
if (dok) {
#else
if (!deltaload)
@ -2703,9 +2703,9 @@ void OperateL2RDoor(int pnum, int oi, DIABOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
dok = !dMonster[xp][yp];
dok = dok HFAND !dItem[xp][yp];
dok = dok HFAND !dDead[xp][yp];
dok = dMonster[xp][yp] == 0;
dok = dok HFAND (dItem[xp][yp] == 0);
dok = dok HFAND (dDead[xp][yp] == 0);
if (dok) {
if (pnum == myplr && sendflag)
NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
@ -2748,9 +2748,9 @@ void OperateL2LDoor(int pnum, int oi, BOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
dok = !dMonster[xp][yp];
dok = dok HFAND !dItem[xp][yp];
dok = dok HFAND !dDead[xp][yp];
dok = dMonster[xp][yp] == 0;
dok = dok HFAND (dItem[xp][yp] == 0);
dok = dok HFAND (dDead[xp][yp] == 0);
if (dok) {
if (pnum == myplr && sendflag)
NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
@ -2794,9 +2794,9 @@ void OperateL3RDoor(int pnum, int oi, DIABOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
dok = !dMonster[xp][yp];
dok = dok HFAND !dItem[xp][yp];
dok = dok HFAND !dDead[xp][yp];
dok = dMonster[xp][yp] == 0;
dok = dok HFAND (dItem[xp][yp] == 0);
dok = dok HFAND (dDead[xp][yp] == 0);
if (dok) {
if (pnum == myplr && sendflag)
NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
@ -2840,9 +2840,9 @@ void OperateL3LDoor(int pnum, int oi, DIABOOL sendflag)
if (!deltaload)
PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
dok = !dMonster[xp][yp];
dok = dok HFAND !dItem[xp][yp];
dok = dok HFAND !dDead[xp][yp];
dok = dMonster[xp][yp] == 0;
dok = dok HFAND (dItem[xp][yp] == 0);
dok = dok HFAND (dDead[xp][yp] == 0);
if (dok) {
if (pnum == myplr && sendflag)
NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
@ -2864,14 +2864,14 @@ void MonstCheckDoors(int m)
mx = monster[m]._mx;
my = monster[m]._my;
if (dObject[mx - 1][my - 1]
|| dObject[mx][my - 1]
|| dObject[mx + 1][my - 1]
|| dObject[mx - 1][my]
|| dObject[mx + 1][my]
|| dObject[mx - 1][my + 1]
|| dObject[mx][my + 1]
|| dObject[mx + 1][my + 1]) {
if (dObject[mx - 1][my - 1] != 0
|| dObject[mx][my - 1] != 0
|| dObject[mx + 1][my - 1] != 0
|| dObject[mx - 1][my] != 0
|| dObject[mx + 1][my] != 0
|| dObject[mx - 1][my + 1] != 0
|| dObject[mx][my + 1] != 0
|| dObject[mx + 1][my + 1] != 0) {
for (i = 0; i < nobjects; ++i) {
oi = objectactive[i];
if ((object[oi]._otype == OBJ_L1LDOOR || object[oi]._otype == OBJ_L1RDOOR) && object[oi]._oVar4 == 0) {
@ -3877,7 +3877,7 @@ void OperateShrine(int pnum, int i, int sType)
if (j > MAXDUNX * 112)
break;
lv = dPiece[xx][yy];
} while (nSolidTable[lv] || dObject[xx][yy] || dMonster[xx][yy]);
} while (nSolidTable[lv] || dObject[xx][yy] != 0 || dMonster[xx][yy] != 0);
AddMissile(plr[pnum]._px, plr[pnum]._py, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);
if (pnum != myplr)
return;

12
Source/player.cpp

@ -2952,7 +2952,7 @@ BOOL PM_DoAttack(int pnum)
dx = plr[pnum]._px + offset_x[dir];
dy = plr[pnum]._py + offset_y[dir];
if (dMonster[dx][dy]) {
if (dMonster[dx][dy] != 0) {
if (dMonster[dx][dy] > 0) {
m = dMonster[dx][dy] - 1;
} else {
@ -2980,7 +2980,7 @@ BOOL PM_DoAttack(int pnum)
m = -(dMonster[dx][dy] + 1);
}
didhit = PlrHitMonst(pnum, m);
} else if (dPlayer[dx][dy] && !FriendlyMode) {
} else if (dPlayer[dx][dy] != 0 && !FriendlyMode) {
BYTE p = dPlayer[dx][dy];
if (dPlayer[dx][dy] > 0) {
p = dPlayer[dx][dy] - 1;
@ -3872,18 +3872,18 @@ BOOL PosOkPlayer(int pnum, int x, int y)
PosOK = FALSE;
if (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY && !SolidLoc(x, y) && dPiece[x][y]) {
if (dPlayer[x][y]) {
if (dPlayer[x][y] != 0) {
if (dPlayer[x][y] > 0) {
p = dPlayer[x][y] - 1;
} else {
p = -(dPlayer[x][y] + 1);
}
if (p != pnum && p < MAX_PLRS && plr[p]._pHitPoints) {
if (p != pnum && p < MAX_PLRS && plr[p]._pHitPoints != 0) {
return FALSE;
}
}
if (dMonster[x][y]) {
if (dMonster[x][y] != 0) {
if (currlevel == 0) {
return FALSE;
}
@ -3895,7 +3895,7 @@ BOOL PosOkPlayer(int pnum, int x, int y)
}
}
if (dObject[x][y]) {
if (dObject[x][y] != 0) {
if (dObject[x][y] > 0) {
bv = dObject[x][y] - 1;
} else {

50
Source/stores.cpp

@ -2246,8 +2246,8 @@ void WitchBuyItem()
StoreAutoPlace();
if (idx >= 3) {
if (idx == 19) {
witchitem[19]._itype = ITYPE_NONE;
if (idx == WITCH_ITEMS - 1) {
witchitem[WITCH_ITEMS - 1]._itype = ITYPE_NONE;
} else {
for (; witchitem[idx + 1]._itype != ITYPE_NONE; idx++) {
witchitem[idx] = witchitem[idx + 1];
@ -2388,20 +2388,14 @@ void BoyBuyItem()
void HealerBuyItem()
{
int idx;
BOOL ok;
idx = stextvhold + ((stextlhold - stextup) >> 2);
ok = FALSE;
if (gbMaxPlayers == 1) {
if (idx < 2)
ok = TRUE;
plr[myplr].HoldItem._iSeed = GetRndSeed();
} else {
if (idx < 3)
ok = TRUE;
}
if (ok) {
plr[myplr].HoldItem._iSeed = GetRndSeed();
plr[myplr].HoldItem._iSeed = GetRndSeed();
}
TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
@ -2409,26 +2403,23 @@ void HealerBuyItem()
plr[myplr].HoldItem._iIdentified = FALSE;
StoreAutoPlace();
ok = FALSE;
if (gbMaxPlayers == 1) {
if (idx >= 2)
ok = TRUE;
if (idx < 2)
return;
} else {
if (idx >= 3)
ok = TRUE;
if (idx < 3)
return;
}
if (ok) {
idx = stextvhold + ((stextlhold - stextup) >> 2);
if (idx == 19) {
healitem[19]._itype = ITYPE_NONE;
} else {
for (; healitem[idx + 1]._itype != ITYPE_NONE; idx++) {
healitem[idx] = healitem[idx + 1];
}
healitem[idx]._itype = ITYPE_NONE;
idx = stextvhold + ((stextlhold - stextup) >> 2);
if (idx == 19) {
healitem[19]._itype = ITYPE_NONE;
} else {
for (; healitem[idx + 1]._itype != ITYPE_NONE; idx++) {
healitem[idx] = healitem[idx + 1];
}
CalcPlrInv(myplr, TRUE);
healitem[idx]._itype = ITYPE_NONE;
}
CalcPlrInv(myplr, TRUE);
}
void S_BBuyEnter()
@ -2550,6 +2541,14 @@ void S_HealerEnter()
gossipend = TEXT_PEPIN11;
StartStore(STORE_GOSSIP);
break;
#ifdef HELLFIRE
case 14:
StartStore(STORE_HBUY);
break;
case 16:
stextflag = STORE_NONE;
break;
#else
case 14:
if (plr[myplr]._pHitPoints != plr[myplr]._pMaxHP)
PlaySFX(IS_CAST8);
@ -2563,6 +2562,7 @@ void S_HealerEnter()
case 18:
stextflag = STORE_NONE;
break;
#endif
}
}

15
defs.h

@ -35,17 +35,17 @@
#ifdef HELLFIRE
#define MAX_LVLS 24
#define MAX_LVLMTYPES 24
#define MAX_SPELLS 52
#else
#define MAX_LVLS 16
#define MAX_LVLMTYPES 16
#define MAX_SPELLS 37
#endif
#define MAX_CHUNKS (MAX_LVLS + 5)
// #define MAX_PATH 260
#define MAX_SEND_STR_LEN 80
#ifdef HELLFIRE
#define MAX_SPELLS 52
#else
#define MAX_SPELLS 37
#endif
#define MAXDEAD 31
#define MAXDUNX 112
@ -55,13 +55,14 @@
#define MAXLIGHTS 32
#define MAXMISSILES 125
#define MAXMONSTERS 200
#define MAXMULTIQUESTS 4
#define MAXOBJECTS 127
#define MAXPORTAL 4
#ifdef HELLFIRE
#define MAXQUESTS 24
#define MAXMULTIQUESTS 10
#else
#define MAXQUESTS 16
#define MAXMULTIQUESTS 4
#endif
#define MAXTHEMES 50
#define MAXTILES 2048
@ -95,6 +96,7 @@
// todo: enums
#ifdef HELLFIRE
#define NUMLEVELS 25
#define WITCH_ITEMS 25
#define SMITH_ITEMS 25
#define SMITH_PREMIUM_ITEMS 15
#define SMITH_MAX_VALUE 200000
@ -102,6 +104,7 @@
#define STORE_LINES 104
#else
#define NUMLEVELS 17
#define WITCH_ITEMS 20
#define SMITH_ITEMS 20
#define SMITH_PREMIUM_ITEMS 6
#define SMITH_MAX_VALUE 140000

Loading…
Cancel
Save