|
|
|
@ -668,24 +668,53 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE |
|
|
|
|| mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING) |
|
|
|
|| mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING) |
|
|
|
resist = TRUE; |
|
|
|
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); |
|
|
|
hit = random_(69, 100); |
|
|
|
if (!missiledata[t].mType) { |
|
|
|
#ifdef HELLFIRE |
|
|
|
hper = plr[pnum]._pDexterity |
|
|
|
if (pnum != -1) { |
|
|
|
+ plr[pnum]._pIBonusToHit |
|
|
|
#endif |
|
|
|
+ plr[pnum]._pLevel |
|
|
|
if (missiledata[t].mType == 0) { |
|
|
|
- monster[m].mArmorClass |
|
|
|
hper = plr[pnum]._pDexterity; |
|
|
|
- (dist * dist >> 1) |
|
|
|
hper += plr[pnum]._pIBonusToHit; |
|
|
|
+ plr[pnum]._pIEnAc |
|
|
|
hper += plr[pnum]._pLevel; |
|
|
|
+ 50; |
|
|
|
hper -= monster[m].mArmorClass; |
|
|
|
if (plr[pnum]._pClass == PC_ROGUE) |
|
|
|
hper -= (dist * dist) >> 1; |
|
|
|
hper += 20; |
|
|
|
#ifdef HELLFIRE |
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR) |
|
|
|
hper -= plr[pnum]._pIEnAc; |
|
|
|
hper += 10; |
|
|
|
#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 { |
|
|
|
} else { |
|
|
|
hper = plr[pnum]._pMagic - (monster[m].mLevel << 1) - dist + 50; |
|
|
|
hper = random_(71, 75) - monster[m].mLevel * 2; |
|
|
|
if (plr[pnum]._pClass == PC_SORCERER) |
|
|
|
|
|
|
|
hper += 20; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (hper < 5) |
|
|
|
if (hper < 5) |
|
|
|
hper = 5; |
|
|
|
hper = 5; |
|
|
|
if (hper > 95) |
|
|
|
if (hper > 95) |
|
|
|
@ -695,67 +724,73 @@ BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLE |
|
|
|
if (CheckMonsterHit(m, &ret)) |
|
|
|
if (CheckMonsterHit(m, &ret)) |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
#ifdef _DEBUG |
|
|
|
#ifdef _DEBUG |
|
|
|
if (hit >= hper && !debug_mode_key_inverted_v && !debug_mode_dollar_sign) |
|
|
|
if (hit < hper || debug_mode_key_inverted_v || debug_mode_dollar_sign) { |
|
|
|
return FALSE; |
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
if (hit >= hper) |
|
|
|
if (hit < hper) { |
|
|
|
return FALSE; |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
if (t == MIS_BONESPIRIT) { |
|
|
|
if (t == MIS_BONESPIRIT) { |
|
|
|
dam = monster[m]._mhitpoints / 3 >> 6; |
|
|
|
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; |
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
M_StartKill(m, pnum); |
|
|
|
dam = mindam + random_(70, maxdam - mindam + 1); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (missiledata[t].mType == 0) { |
|
|
|
if (resist) { |
|
|
|
dam = plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100 + dam; |
|
|
|
PlayEffect(m, 1); |
|
|
|
if (plr[pnum]._pClass == PC_ROGUE) |
|
|
|
} else if (monster[m]._mmode == MM_STONE) { |
|
|
|
dam += plr[pnum]._pDamageMod; |
|
|
|
if (m > MAX_PLRS - 1) |
|
|
|
else |
|
|
|
M_StartHit(m, pnum, dam); |
|
|
|
dam += (plr[pnum]._pDamageMod >> 1); |
|
|
|
monster[m]._mmode = MM_STONE; |
|
|
|
} |
|
|
|
|
|
|
|
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 { |
|
|
|
} else { |
|
|
|
if (!missiledata[t].mType && plr[pnum]._pIFlags & ISPL_KNOCKBACK) { |
|
|
|
if (resist) { |
|
|
|
M_GetKnockback(m); |
|
|
|
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) { |
|
|
|
if (monster[m]._msquelch == 0) { |
|
|
|
monster[m]._msquelch = UCHAR_MAX; |
|
|
|
monster[m]._msquelch = UCHAR_MAX; |
|
|
|
monster[m]._lastx = plr[pnum]._px; |
|
|
|
monster[m]._lastx = plr[pnum]._px; |
|
|
|
monster[m]._lasty = plr[pnum]._py; |
|
|
|
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) |
|
|
|
BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag, BOOLEAN *blocked) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int hit, hper, tac, dam, blk, blkper, resper; |
|
|
|
int hit, hper, tac, dam, blk, blkper, resper; |
|
|
|
|
|
|
|
*blocked = false; |
|
|
|
|
|
|
|
|
|
|
|
if (plr[pnum]._pHitPoints >> 6 <= 0) { |
|
|
|
if (plr[pnum]._pHitPoints >> 6 <= 0) { |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
@ -765,7 +800,7 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (plr[pnum]._pSpellFlags & 1 && !missiledata[mtype].mType) { |
|
|
|
if (plr[pnum]._pSpellFlags & 1 && missiledata[mtype].mType == 0) { |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -774,7 +809,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) |
|
|
|
if (debug_mode_dollar_sign || debug_mode_key_inverted_v) |
|
|
|
hit = 1000; |
|
|
|
hit = 1000; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
if (!missiledata[mtype].mType) { |
|
|
|
if (missiledata[mtype].mType == 0) { |
|
|
|
tac = plr[pnum]._pIAC + plr[pnum]._pIBonusAC + plr[pnum]._pDexterity / 5; |
|
|
|
tac = plr[pnum]._pIAC + plr[pnum]._pIBonusAC + plr[pnum]._pDexterity / 5; |
|
|
|
if (m != -1) { |
|
|
|
if (m != -1) { |
|
|
|
hper = monster[m].mHit |
|
|
|
hper = monster[m].mHit |
|
|
|
@ -815,7 +850,7 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
if (mtype == MIS_ACIDPUD) |
|
|
|
if (mtype == MIS_ACIDPUD) |
|
|
|
blk = 100; |
|
|
|
blk = 100; |
|
|
|
if (m != -1) |
|
|
|
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 |
|
|
|
else |
|
|
|
blkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity; |
|
|
|
blkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity; |
|
|
|
if (blkper < 0) |
|
|
|
if (blkper < 0) |
|
|
|
@ -846,19 +881,37 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
if (shift == FALSE) { |
|
|
|
if (shift == FALSE) { |
|
|
|
|
|
|
|
|
|
|
|
dam = (mind << 6) + random_(75, (maxd - mind + 1) << 6); |
|
|
|
dam = (mind << 6) + random_(75, (maxd - mind + 1) << 6); |
|
|
|
if (m == -1 && plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) |
|
|
|
#ifndef HELLFIRE |
|
|
|
dam >>= 1; |
|
|
|
if (m == -1) |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
if (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) |
|
|
|
|
|
|
|
dam >>= 1; |
|
|
|
dam += (plr[pnum]._pIGetHit * 64); |
|
|
|
dam += (plr[pnum]._pIGetHit * 64); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
dam = mind + random_(75, maxd - mind + 1); |
|
|
|
dam = mind + random_(75, maxd - mind + 1); |
|
|
|
if (m == -1 && plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) |
|
|
|
#ifndef HELLFIRE |
|
|
|
dam >>= 1; |
|
|
|
if (m == -1) |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
if (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP) |
|
|
|
|
|
|
|
dam >>= 1; |
|
|
|
dam += plr[pnum]._pIGetHit; |
|
|
|
dam += plr[pnum]._pIGetHit; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (dam < 64) |
|
|
|
if (dam < 64) |
|
|
|
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) { |
|
|
|
if (resper > 0) { |
|
|
|
|
|
|
|
|
|
|
|
dam = dam - dam * resper / 100; |
|
|
|
dam = dam - dam * resper / 100; |
|
|
|
@ -880,10 +933,20 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
} else if (plr[pnum]._pClass == PC_SORCERER) { |
|
|
|
} else if (plr[pnum]._pClass == PC_SORCERER) { |
|
|
|
PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
|
|
|
|
#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; |
|
|
|
drawhpflag = TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return TRUE; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|
|
|
|
#ifndef HELLFIRE |
|
|
|
if (blk < blkper) { |
|
|
|
if (blk < blkper) { |
|
|
|
if (m != -1) { |
|
|
|
if (m != -1) { |
|
|
|
tac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my); |
|
|
|
tac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my); |
|
|
|
@ -891,7 +954,9 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
tac = plr[pnum]._pdir; |
|
|
|
tac = plr[pnum]._pdir; |
|
|
|
} |
|
|
|
} |
|
|
|
StartPlrBlock(pnum, tac); |
|
|
|
StartPlrBlock(pnum, tac); |
|
|
|
} else { |
|
|
|
} else |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
{ |
|
|
|
if (pnum == myplr) { |
|
|
|
if (pnum == myplr) { |
|
|
|
plr[pnum]._pHitPoints -= dam; |
|
|
|
plr[pnum]._pHitPoints -= dam; |
|
|
|
plr[pnum]._pHPBase -= dam; |
|
|
|
plr[pnum]._pHPBase -= dam; |
|
|
|
@ -906,15 +971,17 @@ BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEA |
|
|
|
StartPlrHit(pnum, dam, FALSE); |
|
|
|
StartPlrHit(pnum, dam, FALSE); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
return TRUE; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return FALSE; |
|
|
|
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, BOOLEAN *blocked) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int tac, resper, dam, blk, blkper, hper, hit; |
|
|
|
int dam, blk, blkper, hper, hit, resper; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*blocked = false; |
|
|
|
|
|
|
|
|
|
|
|
if (plr[p]._pInvincible) { |
|
|
|
if (plr[p]._pInvincible) { |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
@ -924,7 +991,7 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (plr[p]._pSpellFlags & 1 && !missiledata[mtype].mType) { |
|
|
|
if (plr[p]._pSpellFlags & 1 && missiledata[mtype].mType == 0) { |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -944,7 +1011,7 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
hper = random_(69, 100); |
|
|
|
hper = random_(69, 100); |
|
|
|
if (!missiledata[mtype].mType) { |
|
|
|
if (missiledata[mtype].mType == 0) { |
|
|
|
hit = plr[pnum]._pIBonusToHit |
|
|
|
hit = plr[pnum]._pIBonusToHit |
|
|
|
+ plr[pnum]._pLevel |
|
|
|
+ plr[pnum]._pLevel |
|
|
|
- (dist * dist >> 1) |
|
|
|
- (dist * dist >> 1) |
|
|
|
@ -954,7 +1021,11 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B |
|
|
|
+ plr[pnum]._pDexterity + 50; |
|
|
|
+ plr[pnum]._pDexterity + 50; |
|
|
|
if (plr[pnum]._pClass == PC_ROGUE) |
|
|
|
if (plr[pnum]._pClass == PC_ROGUE) |
|
|
|
hit += 20; |
|
|
|
hit += 20; |
|
|
|
|
|
|
|
#ifdef HELLFIRE |
|
|
|
|
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARD) |
|
|
|
|
|
|
|
#else |
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR) |
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR) |
|
|
|
|
|
|
|
#endif |
|
|
|
hit += 10; |
|
|
|
hit += 10; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
hit = plr[pnum]._pMagic |
|
|
|
hit = plr[pnum]._pMagic |
|
|
|
@ -963,6 +1034,10 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B |
|
|
|
+ 50; |
|
|
|
+ 50; |
|
|
|
if (plr[pnum]._pClass == PC_SORCERER) |
|
|
|
if (plr[pnum]._pClass == PC_SORCERER) |
|
|
|
hit += 20; |
|
|
|
hit += 20; |
|
|
|
|
|
|
|
#ifdef HELLFIRE |
|
|
|
|
|
|
|
else if (plr[pnum]._pClass == PC_BARD) |
|
|
|
|
|
|
|
hit += 10; |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
if (hit < 5) |
|
|
|
if (hit < 5) |
|
|
|
hit = 5; |
|
|
|
hit = 5; |
|
|
|
@ -989,36 +1064,44 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B |
|
|
|
dam = plr[p]._pHitPoints / 3; |
|
|
|
dam = plr[p]._pHitPoints / 3; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
dam = mindam + random_(70, maxdam - mindam + 1); |
|
|
|
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; |
|
|
|
dam += plr[pnum]._pIBonusDamMod + plr[pnum]._pDamageMod + dam * plr[pnum]._pIBonusDam / 100; |
|
|
|
if (!shift) |
|
|
|
if (!shift) |
|
|
|
dam <<= 6; |
|
|
|
dam <<= 6; |
|
|
|
} |
|
|
|
} |
|
|
|
if (missiledata[mtype].mType) |
|
|
|
if (missiledata[mtype].mType != 0) |
|
|
|
dam >>= 1; |
|
|
|
dam >>= 1; |
|
|
|
if (resper > 0) { |
|
|
|
if (resper > 0) { |
|
|
|
|
|
|
|
dam -= (dam * resper) / 100; |
|
|
|
if (pnum == myplr) |
|
|
|
if (pnum == myplr) |
|
|
|
NetSendCmdDamage(TRUE, p, dam - resper * dam / 100); |
|
|
|
NetSendCmdDamage(TRUE, p, dam); |
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR) { |
|
|
|
if (plr[pnum]._pClass == PC_WARRIOR) { |
|
|
|
tac = PS_WARR69; |
|
|
|
PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
} else if (plr[pnum]._pClass == PC_ROGUE) { |
|
|
|
} 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) { |
|
|
|
} else if (plr[pnum]._pClass == PC_SORCERER) { |
|
|
|
tac = PS_MAGE69; |
|
|
|
PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); |
|
|
|
} else { |
|
|
|
#ifdef HELLFIRE |
|
|
|
return TRUE; |
|
|
|
} 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 |
|
|
|
} |
|
|
|
} |
|
|
|
PlaySfxLoc(tac, plr[pnum]._px, plr[pnum]._py); |
|
|
|
return TRUE; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (blkper < blk) { |
|
|
|
if (blkper < blk) { |
|
|
|
StartPlrBlock(p, GetDirection(plr[p]._px, plr[p]._py, plr[pnum]._px, plr[pnum]._py)); |
|
|
|
StartPlrBlock(p, GetDirection(plr[p]._px, plr[p]._py, plr[pnum]._px, plr[pnum]._py)); |
|
|
|
|
|
|
|
*blocked = true; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (pnum == myplr) |
|
|
|
if (pnum == myplr) |
|
|
|
NetSendCmdDamage(TRUE, p, dam); |
|
|
|
NetSendCmdDamage(TRUE, p, dam); |
|
|
|
StartPlrHit(p, dam, FALSE); |
|
|
|
StartPlrHit(p, dam, FALSE); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
return TRUE; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return FALSE; |
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1026,8 +1109,20 @@ 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) |
|
|
|
void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, BOOLEAN nodel) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int oi; |
|
|
|
int oi; |
|
|
|
|
|
|
|
BOOLEAN blocked; |
|
|
|
|
|
|
|
#ifdef HELLFIRE |
|
|
|
|
|
|
|
int dir, mAnimFAmt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
if (missile[i]._miAnimType != MFILE_FIREWAL && missile[i]._misource != -1) { |
|
|
|
|
|
|
|
#endif |
|
|
|
if (missile[i]._micaster == TARGET_MONSTERS) { |
|
|
|
if (missile[i]._micaster == TARGET_MONSTERS) { |
|
|
|
if (dMonster[mx][my] > 0) { |
|
|
|
if (dMonster[mx][my] > 0) { |
|
|
|
if (MonsterMHit( |
|
|
|
if (MonsterMHit( |
|
|
|
@ -1067,9 +1162,24 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, |
|
|
|
maxdam, |
|
|
|
maxdam, |
|
|
|
missile[i]._midist, |
|
|
|
missile[i]._midist, |
|
|
|
missile[i]._mitype, |
|
|
|
missile[i]._mitype, |
|
|
|
shift)) { |
|
|
|
shift, |
|
|
|
if (!nodel) |
|
|
|
&blocked)) { |
|
|
|
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; |
|
|
|
missile[i]._miHitFlag = TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
@ -1090,15 +1200,34 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, |
|
|
|
maxdam, |
|
|
|
maxdam, |
|
|
|
missile[i]._mitype, |
|
|
|
missile[i]._mitype, |
|
|
|
shift, |
|
|
|
shift, |
|
|
|
0)) { |
|
|
|
0, |
|
|
|
if (!nodel) |
|
|
|
&blocked)) { |
|
|
|
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; |
|
|
|
missile[i]._miHitFlag = TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if (dMonster[mx][my] > 0) { |
|
|
|
if (dMonster[mx][my] > 0) { |
|
|
|
|
|
|
|
#ifdef HELLFIRE |
|
|
|
|
|
|
|
if (missile[i]._micaster == TARGET_BOTH) { |
|
|
|
|
|
|
|
#else |
|
|
|
if (missile[i]._miAnimType == MFILE_FIREWAL) { |
|
|
|
if (missile[i]._miAnimType == MFILE_FIREWAL) { |
|
|
|
|
|
|
|
#endif |
|
|
|
if (MonsterMHit( |
|
|
|
if (MonsterMHit( |
|
|
|
missile[i]._misource, |
|
|
|
missile[i]._misource, |
|
|
|
dMonster[mx][my] - 1, |
|
|
|
dMonster[mx][my] - 1, |
|
|
|
@ -1118,9 +1247,28 @@ void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (dPlayer[mx][my] > 0 |
|
|
|
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 |
|
|
|
if (!nodel) |
|
|
|
#ifdef HELLFIRE |
|
|
|
missile[i]._mirange = 0; |
|
|
|
|| missile[i]._miAnimType == MFILE_LGHNING |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
, |
|
|
|
|
|
|
|
&blocked)) { |
|
|
|
|
|
|
|
#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; |
|
|
|
missile[i]._miHitFlag = TRUE; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1567,46 +1715,48 @@ void missiles_steal_pots(int mi, int sx, int sy, int dx, int dy, int midir, char |
|
|
|
for (si = 0; si < MAXBELTITEMS; si++) { |
|
|
|
for (si = 0; si < MAXBELTITEMS; si++) { |
|
|
|
ii = -1; |
|
|
|
ii = -1; |
|
|
|
if (plr[pnum].SpdList[si]._itype == ITYPE_MISC) { |
|
|
|
if (plr[pnum].SpdList[si]._itype == ITYPE_MISC) { |
|
|
|
if (random_(205, 2) != 0) { |
|
|
|
if (random_(205, 2) == 0) |
|
|
|
switch (plr[pnum].SpdList[si]._iMiscId) { |
|
|
|
continue; |
|
|
|
case IMISC_FULLHEAL: |
|
|
|
switch (plr[pnum].SpdList[si]._iMiscId) { |
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
case IMISC_FULLHEAL: |
|
|
|
break; |
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
case IMISC_HEAL: |
|
|
|
break; |
|
|
|
case IMISC_MANA: |
|
|
|
case IMISC_HEAL: |
|
|
|
RemoveSpdBarItem(pnum, si); |
|
|
|
case IMISC_MANA: |
|
|
|
continue; |
|
|
|
RemoveSpdBarItem(pnum, si); |
|
|
|
case IMISC_FULLMANA: |
|
|
|
continue; |
|
|
|
|
|
|
|
case IMISC_FULLMANA: |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_MANA); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case IMISC_REJUV: |
|
|
|
|
|
|
|
if (random_(205, 2) != 0) { |
|
|
|
ii = ItemMiscIdIdx(IMISC_MANA); |
|
|
|
ii = ItemMiscIdIdx(IMISC_MANA); |
|
|
|
break; |
|
|
|
} else { |
|
|
|
case IMISC_REJUV: |
|
|
|
|
|
|
|
if (random_(205, 2) != 0) { |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_MANA); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_HEAL); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case IMISC_FULLREJUV: |
|
|
|
|
|
|
|
switch (random_(205, 3)) { |
|
|
|
|
|
|
|
case 0: |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_FULLMANA); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case IMISC_FULLREJUV: |
|
|
|
case 1: |
|
|
|
switch (random_(205, 3)) { |
|
|
|
ii = ItemMiscIdIdx(IMISC_FULLHEAL); |
|
|
|
case 0: |
|
|
|
break; |
|
|
|
ii = ItemMiscIdIdx(IMISC_FULLMANA); |
|
|
|
default: |
|
|
|
break; |
|
|
|
ii = ItemMiscIdIdx(IMISC_REJUV); |
|
|
|
case 1: |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_FULLHEAL); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
ii = ItemMiscIdIdx(IMISC_REJUV); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (ii != -1) { |
|
|
|
if (ii != -1) { |
|
|
|
SetPlrHandItem(&plr[pnum].HoldItem, ii); |
|
|
|
SetPlrHandItem(&plr[pnum].HoldItem, ii); |
|
|
|
GetPlrHandSeed(&plr[pnum].HoldItem); |
|
|
|
GetPlrHandSeed(&plr[pnum].HoldItem); |
|
|
|
plr[pnum].HoldItem._iStatFlag = 1; |
|
|
|
plr[pnum].HoldItem._iStatFlag = TRUE; |
|
|
|
plr[pnum].SpdList[si] = plr[pnum].HoldItem; |
|
|
|
plr[pnum].SpdList[si] = plr[pnum].HoldItem; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!hasPlayedSFX) { |
|
|
|
if (!hasPlayedSFX) { |
|
|
|
@ -2283,14 +2433,26 @@ void AddFirewall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy |
|
|
|
{ |
|
|
|
{ |
|
|
|
int i; |
|
|
|
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; |
|
|
|
missile[mi]._midam >>= 1; |
|
|
|
GetMissileVel(mi, sx, sy, dx, dy, 16); |
|
|
|
GetMissileVel(mi, sx, sy, dx, dy, 16); |
|
|
|
missile[mi]._mirange = 10; |
|
|
|
|
|
|
|
i = missile[mi]._mispllvl; |
|
|
|
i = missile[mi]._mispllvl; |
|
|
|
|
|
|
|
missile[mi]._mirange = 10; |
|
|
|
|
|
|
|
#ifndef HELLFIRE |
|
|
|
if (i > 0) |
|
|
|
if (i > 0) |
|
|
|
missile[mi]._mirange = 10 * (i + 1); |
|
|
|
#endif |
|
|
|
missile[mi]._mirange += (plr[id]._pISplDur * missile[mi]._mirange) >> 7; |
|
|
|
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]._mirange <<= 4; |
|
|
|
missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; |
|
|
|
missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; |
|
|
|
missile[mi]._miVar2 = 0; |
|
|
|
missile[mi]._miVar2 = 0; |
|
|
|
@ -4169,40 +4331,40 @@ void mi_light_arrow(int i) |
|
|
|
&& monster[missile[i]._misource].MType->mtype >= MT_STORM |
|
|
|
&& monster[missile[i]._misource].MType->mtype >= MT_STORM |
|
|
|
&& monster[missile[i]._misource].MType->mtype <= MT_MAEL) { |
|
|
|
&& monster[missile[i]._misource].MType->mtype <= MT_MAEL) { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
MIS_LIGHTNING2, |
|
|
|
MIS_LIGHTNING2, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._misource, |
|
|
|
missile[i]._misource, |
|
|
|
dam, |
|
|
|
missile[i]._midam, |
|
|
|
missile[i]._mispllvl); |
|
|
|
missile[i]._mispllvl); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
MIS_LIGHTNING, |
|
|
|
MIS_LIGHTNING, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._misource, |
|
|
|
missile[i]._misource, |
|
|
|
dam, |
|
|
|
missile[i]._midam, |
|
|
|
missile[i]._mispllvl); |
|
|
|
missile[i]._mispllvl); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
MIS_LIGHTNING, |
|
|
|
MIS_LIGHTNING, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._micaster, |
|
|
|
missile[i]._misource, |
|
|
|
missile[i]._misource, |
|
|
|
dam, |
|
|
|
missile[i]._midam, |
|
|
|
missile[i]._mispllvl); |
|
|
|
missile[i]._mispllvl); |
|
|
|
} |
|
|
|
} |
|
|
|
missile[i]._miVar1 = missile[i]._mix; |
|
|
|
missile[i]._miVar1 = missile[i]._mix; |
|
|
|
@ -4519,8 +4681,8 @@ void MI_Lightctrl(int i) |
|
|
|
&& monster[missile[i]._misource].MType->mtype >= MT_STORM |
|
|
|
&& monster[missile[i]._misource].MType->mtype >= MT_STORM |
|
|
|
&& monster[missile[i]._misource].MType->mtype <= MT_MAEL) { |
|
|
|
&& monster[missile[i]._misource].MType->mtype <= MT_MAEL) { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
@ -4531,8 +4693,8 @@ void MI_Lightctrl(int i) |
|
|
|
missile[i]._mispllvl); |
|
|
|
missile[i]._mispllvl); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
@ -4544,8 +4706,8 @@ void MI_Lightctrl(int i) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
AddMissile( |
|
|
|
AddMissile( |
|
|
|
mx, |
|
|
|
missile[i]._mix, |
|
|
|
my, |
|
|
|
missile[i]._miy, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misx, |
|
|
|
missile[i]._misy, |
|
|
|
missile[i]._misy, |
|
|
|
i, |
|
|
|
i, |
|
|
|
@ -5184,26 +5346,35 @@ void mi_null_32(int i) |
|
|
|
|
|
|
|
|
|
|
|
void MI_FirewallC(int i) |
|
|
|
void MI_FirewallC(int i) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int tx, ty, id; |
|
|
|
int tx, ty, id, dp, micaster; |
|
|
|
|
|
|
|
|
|
|
|
id = missile[i]._misource; |
|
|
|
|
|
|
|
missile[i]._mirange--; |
|
|
|
missile[i]._mirange--; |
|
|
|
|
|
|
|
id = missile[i]._misource; |
|
|
|
if (missile[i]._mirange == 0) { |
|
|
|
if (missile[i]._mirange == 0) { |
|
|
|
missile[i]._miDelFlag = TRUE; |
|
|
|
missile[i]._miDelFlag = TRUE; |
|
|
|
} else { |
|
|
|
} 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]; |
|
|
|
tx = missile[i]._miVar1 + XDirAdd[missile[i]._miVar3]; |
|
|
|
ty = missile[i]._miVar2 + YDirAdd[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) { |
|
|
|
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, TARGET_MONSTERS, id, 0, missile[i]._mispllvl); |
|
|
|
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]._miVar1 = tx; |
|
|
|
missile[i]._miVar2 = ty; |
|
|
|
missile[i]._miVar2 = ty; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
missile[i]._miVar8 = 1; |
|
|
|
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]; |
|
|
|
tx = missile[i]._miVar5 + XDirAdd[missile[i]._miVar4]; |
|
|
|
ty = missile[i]._miVar6 + YDirAdd[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) { |
|
|
|
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, TARGET_MONSTERS, id, 0, missile[i]._mispllvl); |
|
|
|
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]._miVar5 = tx; |
|
|
|
missile[i]._miVar6 = ty; |
|
|
|
missile[i]._miVar6 = ty; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|