From 1dfa50589523832d751186dbbdd98e8542705c25 Mon Sep 17 00:00:00 2001 From: qndel Date: Mon, 28 Dec 2020 15:42:40 +0100 Subject: [PATCH 01/15] [hellfire] CheckPlrSpell bin exact --- Source/player.cpp | 51 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/Source/player.cpp b/Source/player.cpp index e08c20c1d..1be0d0a51 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -4059,7 +4059,7 @@ void MakePlrPath(int pnum, int xx, int yy, BOOL endspace) void CheckPlrSpell() { - BOOL addflag; + BOOL addflag = FALSE; int rspell, sd, sl; if ((DWORD)myplr >= MAX_PLRS) { @@ -4075,6 +4075,14 @@ void CheckPlrSpell() PlaySFX(PS_ROGUE34); } else if (plr[myplr]._pClass == PC_SORCERER) { PlaySFX(PS_MAGE34); +#endif +#ifdef HELLFIRE + } else if (plr[myplr]._pClass == PC_MONK) { + PlaySFX(PS_MONK34); + } else if (plr[myplr]._pClass == PC_BARD) { + PlaySFX(PS_ROGUE34); + } else if (plr[myplr]._pClass == PC_BARBARIAN) { + PlaySFX(PS_WARR34); #endif } return; @@ -4088,23 +4096,32 @@ void CheckPlrSpell() PlaySFX(PS_ROGUE27); } else if (plr[myplr]._pClass == PC_SORCERER) { PlaySFX(PS_MAGE27); +#endif +#ifdef HELLFIRE + } else if (plr[myplr]._pClass == PC_MONK) { + PlaySFX(PS_MONK27); + } else if (plr[myplr]._pClass == PC_BARD) { + PlaySFX(PS_ROGUE27); + } else if (plr[myplr]._pClass == PC_BARBARIAN) { + PlaySFX(PS_WARR27); #endif } return; } - if (pcurs != CURSOR_HAND - || MouseY >= PANEL_TOP - || (chrflag && MouseX < SPANEL_WIDTH || invflag && MouseX > RIGHT_PANEL) - && rspell != SPL_HEAL - && rspell != SPL_IDENTIFY - && rspell != SPL_REPAIR - && rspell != SPL_INFRA - && rspell != SPL_RECHARGE) { + if (pcurs != CURSOR_HAND) + return; + + if (((MouseY >= PANEL_TOP) + || (chrflag && MouseX < SPANEL_WIDTH) || (invflag && MouseX > RIGHT_PANEL)) + && ((MouseY >= PANEL_TOP) || ( + rspell != SPL_HEAL && + rspell != SPL_IDENTIFY && + rspell != SPL_REPAIR && + rspell != SPL_INFRA && rspell != SPL_RECHARGE))) { return; } - addflag = FALSE; switch (plr[myplr]._pRSplType) { case RSPLTYPE_SKILL: case RSPLTYPE_SPELL: @@ -4119,7 +4136,11 @@ void CheckPlrSpell() } if (addflag) { - if (plr[myplr]._pRSpell == SPL_FIREWALL) { + if (plr[myplr]._pRSpell == SPL_FIREWALL +#ifdef HELLFIRE + || plr[myplr]._pRSpell == SPL_LIGHTWALL +#endif + ) { sd = GetDirection(plr[myplr]._px, plr[myplr]._py, cursmx, cursmy); sl = GetSpellLevel(myplr, plr[myplr]._pRSpell); NetSendCmdLocParam3(TRUE, CMD_SPELLXYD, cursmx, cursmy, plr[myplr]._pRSpell, sd, sl); @@ -4144,6 +4165,14 @@ void CheckPlrSpell() PlaySFX(PS_ROGUE35); } else if (plr[myplr]._pClass == PC_SORCERER) { PlaySFX(PS_MAGE35); +#endif +#ifdef HELLFIRE + } else if (plr[myplr]._pClass == PC_MONK) { + PlaySFX(PS_MONK35); + } else if (plr[myplr]._pClass == PC_BARD) { + PlaySFX(PS_ROGUE35); + } else if (plr[myplr]._pClass == PC_BARBARIAN) { + PlaySFX(PS_WARR35); #endif } } From e1406e241ad339404bc911a0d15be0289a39c7c7 Mon Sep 17 00:00:00 2001 From: qndel Date: Mon, 28 Dec 2020 16:40:57 +0100 Subject: [PATCH 02/15] mpqapi_new_block bin exact --- Source/mpqapi.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index 90cdd6dcc..57cb203d6 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -157,24 +157,26 @@ void mpqapi_store_creation_time(const char *pszArchive, DWORD dwChar) static _BLOCKENTRY *mpqapi_new_block(int *block_index) { - _BLOCKENTRY *blockEntry; - DWORD i; + _BLOCKENTRY *blockEntry = sgpBlockTbl; - blockEntry = sgpBlockTbl; + for (DWORD i = 0; i < 2048; i++, blockEntry++) { + if (blockEntry->offset != 0) + continue; + if (blockEntry->sizealloc != 0) + continue; + if (blockEntry->flags != 0) + continue; + if (blockEntry->sizefile != 0) + continue; - i = 0; - while (blockEntry->offset || blockEntry->sizealloc || blockEntry->flags || blockEntry->sizefile) { - i++; - blockEntry++; - if (i >= 2048) { - app_fatal("Out of free block entries"); - return NULL; - } + if (block_index) + *block_index = i; + + return blockEntry; } - if (block_index) - *block_index = i; - return blockEntry; + app_fatal("Out of free block entries"); + return NULL; } static void mpqapi_alloc_block(int block_offset, int block_size) From 8255c27f21482e250c3fd8f25d0554747005c346 Mon Sep 17 00:00:00 2001 From: qndel Date: Mon, 28 Dec 2020 16:51:22 +0100 Subject: [PATCH 03/15] mpqapi_find_free_block bin exact (#2182) --- Source/mpqapi.cpp | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index 57cb203d6..54539e620 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -220,32 +220,34 @@ static void mpqapi_alloc_block(int block_offset, int block_size) static int mpqapi_find_free_block(int size, int *block_size) { - _BLOCKENTRY *pBlockTbl; - int i, result; + int result; - pBlockTbl = sgpBlockTbl; - i = 2048; - while (1) { - i--; - if (pBlockTbl->offset && !pBlockTbl->flags && !pBlockTbl->sizefile && (DWORD)pBlockTbl->sizealloc >= size) - break; - pBlockTbl++; - if (!i) { - *block_size = size; - result = sgdwMpqOffset; - sgdwMpqOffset += size; - return result; - } - } + _BLOCKENTRY *pBlockTbl = sgpBlockTbl; + for (int i = 2048; i--; pBlockTbl++) { + if (pBlockTbl->offset == 0) + continue; + if (pBlockTbl->flags != 0) + continue; + if (pBlockTbl->sizefile != 0) + continue; + if ((DWORD)pBlockTbl->sizealloc < size) + continue; - result = pBlockTbl->offset; - *block_size = size; - pBlockTbl->offset += size; - pBlockTbl->sizealloc -= size; + result = pBlockTbl->offset; + *block_size = size; + pBlockTbl->offset += size; + pBlockTbl->sizealloc -= size; + + if (pBlockTbl->sizealloc == 0) + memset(pBlockTbl, 0, sizeof(*pBlockTbl)); - if (!pBlockTbl->sizealloc) - memset(pBlockTbl, 0, sizeof(*pBlockTbl)); + return result; + } + + *block_size = size; + result = sgdwMpqOffset; + sgdwMpqOffset += size; return result; } From bb54ed00e422a7b6feeee244bbc18714a434c2cc Mon Sep 17 00:00:00 2001 From: qndel Date: Mon, 28 Dec 2020 16:58:09 +0100 Subject: [PATCH 04/15] mpqapi_get_hash_index bin exact --- Source/mpqapi.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index 54539e620..0d97a07bc 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -251,16 +251,24 @@ static int mpqapi_find_free_block(int size, int *block_size) return result; } -static int mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale) +static int mpqapi_get_hash_index(int index, int hash_a, int hash_b, int locale) { - int idx, i; + DWORD idx, i; i = 2048; for (idx = index & 0x7FF; sgpHashTbl[idx].block != -1; idx = (idx + 1) & 0x7FF) { - if (!i--) + if (i-- == 0) break; - if (sgpHashTbl[idx].hashcheck[0] == hash_a && sgpHashTbl[idx].hashcheck[1] == hash_b && sgpHashTbl[idx].lcid == locale && sgpHashTbl[idx].block != -2) - return idx; + if (sgpHashTbl[idx].hashcheck[0] != hash_a) + continue; + if (sgpHashTbl[idx].hashcheck[1] != hash_b) + continue; + if (sgpHashTbl[idx].lcid != locale) + continue; + if (sgpHashTbl[idx].block != -2) + continue; + + return idx; } return -1; From 0bf9b1bfe643e3adc3f137fcc8c391cb49f8d7fb Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 29 Dec 2020 05:36:06 +0100 Subject: [PATCH 05/15] Fix mpqapi_get_hash_index --- Source/mpqapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index 0d97a07bc..0cffb34a8 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -265,7 +265,7 @@ static int mpqapi_get_hash_index(int index, int hash_a, int hash_b, int locale) continue; if (sgpHashTbl[idx].lcid != locale) continue; - if (sgpHashTbl[idx].block != -2) + if (sgpHashTbl[idx].block == -2) continue; return idx; From 167ce2a3d5313f2009fedee3981aaca6b87957c3 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 20:35:21 +0100 Subject: [PATCH 06/15] [hellfire] MI_FirewallC --- Source/missiles.cpp | 21 +++++++++++++++------ defs.h | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 9c99a09bb..2ed111ac8 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -5172,26 +5172,35 @@ void mi_null_32(int i) void MI_FirewallC(int i) { - int tx, ty, id; + int tx, ty, id, dp, micaster; - id = missile[i]._misource; missile[i]._mirange--; + id = missile[i]._misource; if (missile[i]._mirange == 0) { missile[i]._miDelFlag = TRUE; } else { +#ifdef HELLFIRE + micaster = TARGET_BOTH; +#else + micaster = TARGET_MONSTERS; +#endif + dp = dPiece[missile[i]._miVar1][missile[i]._miVar2]; + assert(dp <= MAXTILES && dp >= 0); tx = missile[i]._miVar1 + XDirAdd[missile[i]._miVar3]; ty = missile[i]._miVar2 + YDirAdd[missile[i]._miVar3]; - if (!nMissileTable[dPiece[missile[i]._miVar1][missile[i]._miVar2]] && missile[i]._miVar8 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { - AddMissile(missile[i]._miVar1, missile[i]._miVar2, missile[i]._miVar1, missile[i]._miVar2, plr[id]._pdir, MIS_FIREWALL, TARGET_MONSTERS, id, 0, missile[i]._mispllvl); + if (!nMissileTable[dp] && missile[i]._miVar8 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { + AddMissile(missile[i]._miVar1, missile[i]._miVar2, missile[i]._miVar1, missile[i]._miVar2, plr[id]._pdir, MIS_FIREWALL, micaster, id, 0, missile[i]._mispllvl); missile[i]._miVar1 = tx; missile[i]._miVar2 = ty; } else { missile[i]._miVar8 = 1; } + dp = dPiece[missile[i]._miVar5][missile[i]._miVar6]; + assert(dp <= MAXTILES && dp >= 0); tx = missile[i]._miVar5 + XDirAdd[missile[i]._miVar4]; ty = missile[i]._miVar6 + YDirAdd[missile[i]._miVar4]; - if (!nMissileTable[dPiece[missile[i]._miVar5][missile[i]._miVar6]] && missile[i]._miVar7 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { - AddMissile(missile[i]._miVar5, missile[i]._miVar6, missile[i]._miVar5, missile[i]._miVar6, plr[id]._pdir, MIS_FIREWALL, TARGET_MONSTERS, id, 0, missile[i]._mispllvl); + if (!nMissileTable[dp] && missile[i]._miVar7 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { + AddMissile(missile[i]._miVar5, missile[i]._miVar6, missile[i]._miVar5, missile[i]._miVar6, plr[id]._pdir, MIS_FIREWALL, micaster, id, 0, missile[i]._mispllvl); missile[i]._miVar5 = tx; missile[i]._miVar6 = ty; } else { diff --git a/defs.h b/defs.h index 02038ed3a..cf4d2469c 100644 --- a/defs.h +++ b/defs.h @@ -235,7 +235,7 @@ #undef assert #ifndef _DEBUG -#define assert(exp) ((void)0) +#define assert(exp) ((void)(exp)) #else #define assert(exp) (void)((exp) || (assert_fail(__LINE__, __FILE__, #exp), 0)) #endif From 74849d48bd61ecd23b5b78f5ae46ce4f46dae3a2 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 29 Dec 2020 04:57:41 +0100 Subject: [PATCH 07/15] [hellfire] PlayerMHit --- Source/missiles.cpp | 75 +++++++++++++++++++++++++++++++++++++-------- Source/missiles.h | 7 ++++- Source/objects.cpp | 6 ++++ 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 2ed111ac8..feb2996f2 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -752,9 +752,17 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE return TRUE; } -BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag) +BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag +#ifdef HELLFIRE + , + BOOLEAN *blocked +#endif +) { int hit, hper, tac, dam, blk, blkper, resper; +#ifdef HELLFIRE + *blocked = false; +#endif if (plr[pnum]._pHitPoints >> 6 <= 0) { return FALSE; @@ -764,7 +772,7 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA return FALSE; } - if (plr[pnum]._pSpellFlags & 1 && !missiledata[mtype].mType) { + if (plr[pnum]._pSpellFlags & 1 && missiledata[mtype].mType == 0) { return FALSE; } @@ -773,7 +781,7 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA if (debug_mode_dollar_sign || debug_mode_key_inverted_v) hit = 1000; #endif - if (!missiledata[mtype].mType) { + if (missiledata[mtype].mType == 0) { tac = plr[pnum]._pIAC + plr[pnum]._pIBonusAC + plr[pnum]._pDexterity / 5; if (m != -1) { hper = monster[m].mHit @@ -814,7 +822,7 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA if (mtype == MIS_ACIDPUD) blk = 100; if (m != -1) - blkper = plr[pnum]._pBaseToBlk + (plr[pnum]._pLevel << 1) - (monster[m].mLevel << 1) + plr[pnum]._pDexterity; + blkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity - ((monster[m].mLevel - plr[pnum]._pLevel) << 1); else blkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity; if (blkper < 0) @@ -845,19 +853,37 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA if (shift == FALSE) { dam = (mind << 6) + random_(75, (maxd - mind + 1) << 6); - if (m == -1 && plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) - dam >>= 1; +#ifndef HELLFIRE + if (m == -1) +#endif + if (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) + dam >>= 1; dam += (plr[pnum]._pIGetHit << 6); } else { dam = mind + random_(75, maxd - mind + 1); - if (m == -1 && plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) - dam >>= 1; +#ifndef HELLFIRE + if (m == -1) +#endif + if (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) + dam >>= 1; dam += plr[pnum]._pIGetHit; } if (dam < 64) dam = 64; } +#ifdef HELLFIRE + if (blk < blkper) { + if (m != -1) { + tac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my); + } else { + tac = plr[pnum]._pdir; + } + *blocked = true; + StartPlrBlock(pnum, tac); + return TRUE; + } +#endif if (resper > 0) { dam = dam - dam * resper / 100; @@ -880,11 +906,21 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); } else if (plr[pnum]._pClass == PC_SORCERER) { PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); +#endif +#ifdef HELLFIRE + } else if (plr[pnum]._pClass == PC_MONK) { + PlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py); + } else if (plr[pnum]._pClass == PC_BARD) { + PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); + } else if (plr[pnum]._pClass == PC_BARBARIAN) { + PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); #endif } drawhpflag = TRUE; } + return TRUE; } else { +#ifndef HELLFIRE if (blk < blkper) { if (m != -1) { tac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my); @@ -892,7 +928,9 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA tac = plr[pnum]._pdir; } StartPlrBlock(pnum, tac); - } else { + } else +#endif + { if (pnum == myplr) { plr[pnum]._pHitPoints -= dam; plr[pnum]._pHPBase -= dam; @@ -907,8 +945,8 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA StartPlrHit(pnum, dam, FALSE); } } + return TRUE; } - return TRUE; } return FALSE; } @@ -1029,6 +1067,9 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, BOOLEAN nodel) { int oi; +#ifdef HELLFIRE + BOOLEAN blocked; +#endif if (missile[i]._miAnimType != MFILE_FIREWAL && missile[i]._misource != -1) { if (missile[i]._micaster == TARGET_MONSTERS) { @@ -1093,7 +1134,12 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, maxdam, missile[i]._mitype, shift, - 0)) { + 0 +#ifdef HELLFIRE + , + &blocked +#endif + )) { if (!nodel) missile[i]._mirange = 0; missile[i]._miHitFlag = TRUE; @@ -1121,7 +1167,12 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, } } if (dPlayer[mx][my] > 0 - && PlayerMHit(dPlayer[mx][my] - 1, -1, missile[i]._midist, mindam, maxdam, missile[i]._mitype, shift, missile[i]._miAnimType == MFILE_FIREWAL)) { + && PlayerMHit(dPlayer[mx][my] - 1, -1, missile[i]._midist, mindam, maxdam, missile[i]._mitype, shift, missile[i]._miAnimType == MFILE_FIREWAL +#ifdef HELLFIRE + , + &blocked +#endif + )) { if (!nodel) missile[i]._mirange = 0; missile[i]._miHitFlag = TRUE; diff --git a/Source/missiles.h b/Source/missiles.h index 122cad7e7..c7ad6e3e7 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -16,7 +16,12 @@ void GetDamageAmt(int i, int *mind, int *maxd); int GetSpellLevel(int id, int sn); void DeleteMissile(int mi, int i); BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift); -BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag); +BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag +#ifdef HELLFIRE + , + BOOLEAN *blocked +#endif +); void SetMissAnim(int mi, int animtype); void SetMissDir(int mi, int dir); void LoadMissileGFX(BYTE mi); diff --git a/Source/objects.cpp b/Source/objects.cpp index 94458e105..b212ca42f 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -4962,8 +4962,14 @@ void BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, BOOL sendmsg) for (xp = object[i]._ox - 1; xp <= object[i]._ox + 1; xp++) { if (dMonster[xp][yp] > 0) MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, MIS_FIREBOLT, FALSE); +#ifdef HELLFIRE + BOOLEAN unused; + if (dPlayer[xp][yp] > 0) + PlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, MIS_FIREBOLT, FALSE, 0, &unused); +#else if (dPlayer[xp][yp] > 0) PlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, MIS_FIREBOLT, FALSE, 0); +#endif if (dObject[xp][yp] > 0) { oi = dObject[xp][yp] - 1; if (object[oi]._otype == OBJ_BARRELEX && object[oi]._oBreak != -1) From 1b2ebd1ce31bed0d9acaf3490c3161da3dcb9ade Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 29 Dec 2020 20:45:27 +0100 Subject: [PATCH 08/15] [hellfire] CheckMissileCol --- Source/missiles.cpp | 85 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 10 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index feb2996f2..3d3129830 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -951,7 +951,12 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA return FALSE; } -BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, BOOLEAN shift) +BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, BOOLEAN shift +#ifdef HELLFIRE + , + BOOLEAN *blocked +#endif +) { int tac, resper, dam, blk, blkper, hper, hit; @@ -1068,10 +1073,19 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, { int oi; #ifdef HELLFIRE + int dir, mAnimFAmt; BOOLEAN blocked; -#endif + if (i >= MAXMISSILES || i < 0) + return; + if (mx >= MAXDUNX || mx < 0) + return; + if (my >= MAXDUNY || my < 0) + return; + if (missile[i]._micaster != TARGET_BOTH && missile[i]._misource != -1) { +#else if (missile[i]._miAnimType != MFILE_FIREWAL && missile[i]._misource != -1) { +#endif if (missile[i]._micaster == TARGET_MONSTERS) { if (dMonster[mx][my] > 0) { if (MonsterMHit( @@ -1111,9 +1125,28 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, maxdam, missile[i]._midist, missile[i]._mitype, - shift)) { - if (!nodel) - missile[i]._mirange = 0; + shift +#ifdef HELLFIRE + , + &blocked +#endif + )) { +#ifdef HELLFIRE + if (blocked) { + dir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1); + mAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt; + if (dir < 0) + dir = mAnimFAmt - 1; + else if (dir > mAnimFAmt) + dir = 0; + + SetMissDir(i, dir); + } else +#endif + { + if (!nodel) + missile[i]._mirange = 0; + } missile[i]._miHitFlag = TRUE; } } else { @@ -1140,14 +1173,32 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, &blocked #endif )) { - if (!nodel) - missile[i]._mirange = 0; +#ifdef HELLFIRE + if (blocked) { + dir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1); + mAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt; + if (dir < 0) + dir = mAnimFAmt - 1; + else if (dir > mAnimFAmt) + dir = 0; + + SetMissDir(i, dir); + } else +#endif + { + if (!nodel) + missile[i]._mirange = 0; + } missile[i]._miHitFlag = TRUE; } } } else { if (dMonster[mx][my] > 0) { +#ifdef HELLFIRE + if (missile[i]._micaster == TARGET_BOTH) { +#else if (missile[i]._miAnimType == MFILE_FIREWAL) { +#endif if (MonsterMHit( missile[i]._misource, dMonster[mx][my] - 1, @@ -1169,12 +1220,26 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, if (dPlayer[mx][my] > 0 && PlayerMHit(dPlayer[mx][my] - 1, -1, missile[i]._midist, mindam, maxdam, missile[i]._mitype, shift, missile[i]._miAnimType == MFILE_FIREWAL #ifdef HELLFIRE - , + || missile[i]._miAnimType == MFILE_LGHNING, &blocked #endif )) { - if (!nodel) - missile[i]._mirange = 0; +#ifdef HELLFIRE + if (blocked) { + dir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1); + mAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt; + if (dir < 0) + dir = mAnimFAmt - 1; + else if (dir > mAnimFAmt) + dir = 0; + + SetMissDir(i, dir); + } else +#endif + { + if (!nodel) + missile[i]._mirange = 0; + } missile[i]._miHitFlag = TRUE; } } From f7c2007567101a335dc6bb52babaad3ca5f11e31 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 00:21:24 +0100 Subject: [PATCH 09/15] [hellfire] Plr2PlrMHit --- Source/missiles.cpp | 47 ++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 3d3129830..9c07edca7 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -958,8 +958,11 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B #endif ) { - int tac, resper, dam, blk, blkper, hper, hit; + int dam, blk, blkper, hper, hit, resper; +#ifdef HELLFIRE + *blocked = false; +#endif if (plr[p]._pInvincible) { return FALSE; } @@ -968,7 +971,7 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B return FALSE; } - if (plr[p]._pSpellFlags & 1 && !missiledata[mtype].mType) { + if (plr[p]._pSpellFlags & 1 && missiledata[mtype].mType == 0) { return FALSE; } @@ -988,7 +991,7 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B break; } hper = random_(69, 100); - if (!missiledata[mtype].mType) { + if (missiledata[mtype].mType == 0) { hit = plr[pnum]._pIBonusToHit + plr[pnum]._pLevel - (dist * dist >> 1) @@ -998,7 +1001,11 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B + plr[pnum]._pDexterity + 50; if (plr[pnum]._pClass == PC_ROGUE) hit += 20; +#ifdef HELLFIRE + if (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARD) +#else if (plr[pnum]._pClass == PC_WARRIOR) +#endif hit += 10; } else { hit = plr[pnum]._pMagic @@ -1007,6 +1014,10 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B + 50; if (plr[pnum]._pClass == PC_SORCERER) hit += 20; +#ifdef HELLFIRE + else if (plr[pnum]._pClass == PC_BARD) + hit += 10; +#endif } if (hit < 5) hit = 5; @@ -1033,38 +1044,48 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B dam = plr[p]._pHitPoints / 3; } else { dam = mindam + random_(70, maxdam - mindam + 1); - if (!missiledata[mtype].mType) + if (missiledata[mtype].mType == 0) dam += plr[pnum]._pIBonusDamMod + plr[pnum]._pDamageMod + dam * plr[pnum]._pIBonusDam / 100; if (!shift) dam <<= 6; } - if (missiledata[mtype].mType) + if (missiledata[mtype].mType != 0) dam >>= 1; if (resper > 0) { + dam -= (dam * resper) / 100; if (pnum == myplr) - NetSendCmdDamage(TRUE, p, dam - resper * dam / 100); + NetSendCmdDamage(TRUE, p, dam); if (plr[pnum]._pClass == PC_WARRIOR) { - tac = PS_WARR69; + PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); #ifndef SPAWN } else if (plr[pnum]._pClass == PC_ROGUE) { - tac = PS_ROGUE69; + PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); } else if (plr[pnum]._pClass == PC_SORCERER) { - tac = PS_MAGE69; + PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); +#endif +#ifdef HELLFIRE + } else if (plr[pnum]._pClass == PC_MONK) { + PlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py); + } else if (plr[pnum]._pClass == PC_BARD) { + PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); + } else if (plr[pnum]._pClass == PC_BARBARIAN) { + PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); #endif - } else { - return TRUE; } - PlaySfxLoc(tac, plr[pnum]._px, plr[pnum]._py); + return TRUE; } else { if (blkper < blk) { StartPlrBlock(p, GetDirection(plr[p]._px, plr[p]._py, plr[pnum]._px, plr[pnum]._py)); +#ifdef HELLFIRE + *blocked = true; +#endif } else { if (pnum == myplr) NetSendCmdDamage(TRUE, p, dam); StartPlrHit(p, dam, FALSE); } + return TRUE; } - return TRUE; } return FALSE; } From cd468f682a72f7deec1044020a9353a078883490 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 18:32:46 +0100 Subject: [PATCH 10/15] Clean up missiles_steal_pots --- Source/missiles.cpp | 62 +++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 9c07edca7..1f70ce0de 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1705,46 +1705,48 @@ void missiles_steal_pots(int mi, int sx, int sy, int dx, int dy, int midir, char for (si = 0; si < MAXBELTITEMS; si++) { ii = -1; if (plr[pnum].SpdList[si]._itype == ITYPE_MISC) { - if (random_(205, 2) != 0) { - switch (plr[pnum].SpdList[si]._iMiscId) { - case IMISC_FULLHEAL: - ii = ItemMiscIdIdx(IMISC_HEAL); - break; - case IMISC_HEAL: - case IMISC_MANA: - RemoveSpdBarItem(pnum, si); - continue; - case IMISC_FULLMANA: + if (random_(205, 2) == 0) + continue; + switch (plr[pnum].SpdList[si]._iMiscId) { + case IMISC_FULLHEAL: + ii = ItemMiscIdIdx(IMISC_HEAL); + break; + case IMISC_HEAL: + case IMISC_MANA: + RemoveSpdBarItem(pnum, si); + continue; + case IMISC_FULLMANA: + ii = ItemMiscIdIdx(IMISC_MANA); + break; + case IMISC_REJUV: + if (random_(205, 2) != 0) { ii = ItemMiscIdIdx(IMISC_MANA); - break; - case IMISC_REJUV: - if (random_(205, 2) != 0) { - ii = ItemMiscIdIdx(IMISC_MANA); - } else { - ii = ItemMiscIdIdx(IMISC_HEAL); - } + } else { ii = ItemMiscIdIdx(IMISC_HEAL); + } + ii = ItemMiscIdIdx(IMISC_HEAL); + break; + case IMISC_FULLREJUV: + switch (random_(205, 3)) { + case 0: + ii = ItemMiscIdIdx(IMISC_FULLMANA); break; - case IMISC_FULLREJUV: - switch (random_(205, 3)) { - case 0: - ii = ItemMiscIdIdx(IMISC_FULLMANA); - break; - case 1: - ii = ItemMiscIdIdx(IMISC_FULLHEAL); - break; - default: - ii = ItemMiscIdIdx(IMISC_REJUV); - break; - } + case 1: + ii = ItemMiscIdIdx(IMISC_FULLHEAL); + break; + default: + ii = ItemMiscIdIdx(IMISC_REJUV); break; } + break; + default: + continue; } } if (ii != -1) { SetPlrHandItem(&plr[pnum].HoldItem, ii); GetPlrHandSeed(&plr[pnum].HoldItem); - plr[pnum].HoldItem._iStatFlag = 1; + plr[pnum].HoldItem._iStatFlag = TRUE; plr[pnum].SpdList[si] = plr[pnum].HoldItem; } if (!hasPlayedSFX) { From 3f91aea15796b0b10f90160bf5c933dad79e8c1e Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 19:08:36 +0100 Subject: [PATCH 11/15] [hellfire] AddFirewall --- Source/missiles.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 1f70ce0de..3655d3cb3 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2423,14 +2423,26 @@ void AddFirewall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy { int i; - missile[mi]._midam = (random_(53, 10) + random_(53, 10) + plr[id]._pLevel + 2) << 4; +#ifdef HELLFIRE + missile[mi]._midam = (random_(53, 10) + random_(53, 10) + 2 + (id > 0) ? plr[id]._pLevel : currlevel); // BUGFIX: missing parenthesis around ternary +#else + missile[mi]._midam = (random_(53, 10) + random_(53, 10) + 2 + plr[id]._pLevel); +#endif + missile[mi]._midam <<= 4; missile[mi]._midam >>= 1; GetMissileVel(mi, sx, sy, dx, dy, 16); - missile[mi]._mirange = 10; i = missile[mi]._mispllvl; + missile[mi]._mirange = 10; +#ifndef HELLFIRE if (i > 0) - missile[mi]._mirange = 10 * (i + 1); - missile[mi]._mirange += (plr[id]._pISplDur * missile[mi]._mirange) >> 7; +#endif + missile[mi]._mirange *= i + 1; +#ifdef HELLFIRE + if (mienemy != TARGET_MONSTERS || id < 0) + missile[mi]._mirange += currlevel; + else +#endif + missile[mi]._mirange += (plr[id]._pISplDur * missile[mi]._mirange) >> 7; missile[mi]._mirange <<= 4; missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; missile[mi]._miVar2 = 0; From 711dd642e9bf0570949fec44515c4641a8d323cf Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 21:48:39 +0100 Subject: [PATCH 12/15] [hellfire] MI_Lightctrl --- Source/missiles.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 3655d3cb3..246245bb2 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4658,8 +4658,8 @@ void MI_Lightctrl(int i) && monster[missile[i]._misource].MType->mtype >= MT_STORM && monster[missile[i]._misource].MType->mtype <= MT_MAEL) { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, @@ -4670,8 +4670,8 @@ void MI_Lightctrl(int i) missile[i]._mispllvl); } else { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, @@ -4683,8 +4683,8 @@ void MI_Lightctrl(int i) } } else { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, From 5a13677437d182fc43df9c52af8d90ccb19155d9 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 22:35:26 +0100 Subject: [PATCH 13/15] [hellfire] mi_light_arrow --- Source/missiles.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 246245bb2..f0ae59c4e 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4308,40 +4308,40 @@ void mi_light_arrow(int i) && monster[missile[i]._misource].MType->mtype >= MT_STORM && monster[missile[i]._misource].MType->mtype <= MT_MAEL) { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, MIS_LIGHTNING2, missile[i]._micaster, missile[i]._misource, - dam, + missile[i]._midam, missile[i]._mispllvl); } else { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, MIS_LIGHTNING, missile[i]._micaster, missile[i]._misource, - dam, + missile[i]._midam, missile[i]._mispllvl); } } else { AddMissile( - mx, - my, + missile[i]._mix, + missile[i]._miy, missile[i]._misx, missile[i]._misy, i, MIS_LIGHTNING, missile[i]._micaster, missile[i]._misource, - dam, + missile[i]._midam, missile[i]._mispllvl); } missile[i]._miVar1 = missile[i]._mix; From c833d55cc11cd8b8e9f2b58ee91d92c6a6b6d00d Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 30 Dec 2020 22:57:47 +0100 Subject: [PATCH 14/15] Clean up mpqapi_write_file_contents --- Source/mpqapi.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index 0cffb34a8..931f18d31 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -242,7 +242,6 @@ static int mpqapi_find_free_block(int size, int *block_size) memset(pBlockTbl, 0, sizeof(*pBlockTbl)); return result; - } *block_size = size; @@ -442,19 +441,16 @@ static BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, { DWORD *sectoroffsettable; DWORD destsize, num_bytes, block_size, nNumberOfBytesToWrite; - const BYTE *src; - const char *tmp, *str_ptr; + const char *tmp; int i, j; - str_ptr = pszName; - src = pbData; - while ((tmp = strchr(str_ptr, ':'))) { - str_ptr = tmp + 1; + while ((tmp = strchr(pszName, ':'))) { + pszName = tmp + 1; } - while ((tmp = strchr(str_ptr, '\\'))) { - str_ptr = tmp + 1; + while ((tmp = strchr(pszName, '\\'))) { + pszName = tmp + 1; } - Hash(str_ptr, 3); + Hash(pszName, 3); num_bytes = (dwLen + 4095) >> 12; nNumberOfBytesToWrite = 4 * num_bytes + 4; pBlk->offset = mpqapi_find_free_block(dwLen + nNumberOfBytesToWrite, &pBlk->sizealloc); @@ -472,8 +468,8 @@ static BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, len = dwLen; if (dwLen >= 4096) len = 4096; - memcpy(mpq_buf, src, len); - src += len; + memcpy(mpq_buf, pbData, len); + pbData += len; len = PkwareCompress(mpq_buf, len); if (j == 0) { nNumberOfBytesToWrite = 4 * num_bytes + 4; From e06259a69192037279a523d70bad79dec29720c9 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 29 Dec 2020 02:27:20 +0100 Subject: [PATCH 15/15] [hellfire] MonsterMHit --- Source/missiles.cpp | 158 +++++++++++++++++++++++++++----------------- structs.h | 4 ++ 2 files changed, 100 insertions(+), 62 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 9c99a09bb..ea1f6fe2a 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -667,24 +667,53 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE || mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING) resist = TRUE; +#ifdef HELLFIRE + if (t == MIS_HBOLT && (monster[m].MType->mtype == MT_DIABLO || monster[m].MType->mtype == MT_BONEDEMN)) + resist = TRUE; +#endif + hit = random_(69, 100); - if (!missiledata[t].mType) { - hper = plr[pnum]._pDexterity - + plr[pnum]._pIBonusToHit - + plr[pnum]._pLevel - - monster[m].mArmorClass - - (dist * dist >> 1) - + plr[pnum]._pIEnAc - + 50; - if (plr[pnum]._pClass == PC_ROGUE) - hper += 20; - if (plr[pnum]._pClass == PC_WARRIOR) - hper += 10; +#ifdef HELLFIRE + if (pnum != -1) { +#endif + if (missiledata[t].mType == 0) { + hper = plr[pnum]._pDexterity; + hper += plr[pnum]._pIBonusToHit; + hper += plr[pnum]._pLevel; + hper -= monster[m].mArmorClass; + hper -= (dist * dist) >> 1; +#ifdef HELLFIRE + hper -= plr[pnum]._pIEnAc; +#endif +#ifndef HELLFIRE + hper += plr[pnum]._pIEnAc; +#endif + hper += 50; + if (plr[pnum]._pClass == PC_ROGUE) + hper += 20; +#ifdef HELLFIRE + if (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARD) + hper += 10; +#endif +#ifndef HELLFIRE + if (plr[pnum]._pClass == PC_WARRIOR) + hper += 10; +#endif + } else { + hper = plr[pnum]._pMagic - (monster[m].mLevel << 1) - dist + 50; + if (plr[pnum]._pClass == PC_SORCERER) + hper += 20; +#ifdef HELLFIRE + else if (plr[pnum]._pClass == PC_BARD) + hper += 10; +#endif + } +#ifdef HELLFIRE } else { - hper = plr[pnum]._pMagic - (monster[m].mLevel << 1) - dist + 50; - if (plr[pnum]._pClass == PC_SORCERER) - hper += 20; + hper = random_(71, 75) - monster[m].mLevel * 2; } +#endif + if (hper < 5) hper = 5; if (hper > 95) @@ -694,62 +723,67 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE if (CheckMonsterHit(m, ret)) return ret; #ifdef _DEBUG - if (hit >= hper && !debug_mode_key_inverted_v && !debug_mode_dollar_sign) - return FALSE; + if (hit < hper || debug_mode_key_inverted_v || debug_mode_dollar_sign) { #else - if (hit >= hper) - return FALSE; + if (hit < hper) { #endif - if (t == MIS_BONESPIRIT) { - dam = monster[m]._mhitpoints / 3 >> 6; - } else { - dam = mindam + random_(70, maxdam - mindam + 1); - } - if (!missiledata[t].mType) { - dam = plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100 + dam; - if (plr[pnum]._pClass == PC_ROGUE) - dam += plr[pnum]._pDamageMod; - else - dam += (plr[pnum]._pDamageMod >> 1); - } - if (!shift) - dam <<= 6; - if (resist) - dam >>= 2; - if (pnum == myplr) - monster[m]._mhitpoints -= dam; - if (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS) - monster[m]._mFlags |= MFLAG_NOHEAL; - - if (monster[m]._mhitpoints >> 6 <= 0) { - if (monster[m]._mmode == MM_STONE) { - M_StartKill(m, pnum); - monster[m]._mmode = MM_STONE; + if (t == MIS_BONESPIRIT) { + dam = monster[m]._mhitpoints / 3 >> 6; } else { - M_StartKill(m, pnum); + dam = mindam + random_(70, maxdam - mindam + 1); } - } else { - if (resist) { - PlayEffect(m, 1); - } else if (monster[m]._mmode == MM_STONE) { - if (m > MAX_PLRS - 1) - M_StartHit(m, pnum, dam); - monster[m]._mmode = MM_STONE; + if (missiledata[t].mType == 0) { + dam = plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100 + dam; + if (plr[pnum]._pClass == PC_ROGUE) + dam += plr[pnum]._pDamageMod; + else + dam += (plr[pnum]._pDamageMod >> 1); + } + if (!shift) + dam <<= 6; + if (resist) + dam >>= 2; + if (pnum == myplr) + monster[m]._mhitpoints -= dam; +#ifdef HELLFIRE + if (plr[pnum]._pIFlags & ISPL_NOHEALMON) +#else + if (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS) +#endif + monster[m]._mFlags |= MFLAG_NOHEAL; + + if (monster[m]._mhitpoints >> 6 <= 0) { + if (monster[m]._mmode == MM_STONE) { + M_StartKill(m, pnum); + monster[m]._mmode = MM_STONE; + } else { + M_StartKill(m, pnum); + } } else { - if (!missiledata[t].mType && plr[pnum]._pIFlags & ISPL_KNOCKBACK) { - M_GetKnockback(m); + if (resist) { + PlayEffect(m, 1); + } else if (monster[m]._mmode == MM_STONE) { + if (m > MAX_PLRS - 1) + M_StartHit(m, pnum, dam); + monster[m]._mmode = MM_STONE; + } else { + if (missiledata[t].mType == 0 && plr[pnum]._pIFlags & ISPL_KNOCKBACK) { + M_GetKnockback(m); + } + if (m > MAX_PLRS - 1) + M_StartHit(m, pnum, dam); } - if (m > MAX_PLRS - 1) - M_StartHit(m, pnum, dam); } - } - if (!monster[m]._msquelch) { - monster[m]._msquelch = UCHAR_MAX; - monster[m]._lastx = plr[pnum]._px; - monster[m]._lasty = plr[pnum]._py; + if (monster[m]._msquelch == 0) { + monster[m]._msquelch = UCHAR_MAX; + monster[m]._lastx = plr[pnum]._px; + monster[m]._lasty = plr[pnum]._py; + } + return TRUE; } - return TRUE; + + return FALSE; } BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag) diff --git a/structs.h b/structs.h index dbcc3ab2e..30dd4ea5a 100644 --- a/structs.h +++ b/structs.h @@ -626,7 +626,11 @@ typedef struct MonsterStruct { // note: missing field _mAFNum unsigned char mHit2; unsigned char mMinDamage2; unsigned char mMaxDamage2; +#ifdef HELLFIRE + char mArmorClass; +#else unsigned char mArmorClass; +#endif char falign_CB; unsigned short mMagicRes; int mtalkmsg;