Browse Source

MonsterMHit bin exact

pull/114/head
qndel 7 years ago committed by Anders Jenbo
parent
commit
7e1bd5a1f2
  1. 215
      Source/missiles.cpp
  2. 2
      Source/missiles.h

215
Source/missiles.cpp

@ -555,148 +555,119 @@ BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, int shift)
return 1; return 1;
} }
BOOLEAN MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, int shift) BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift)
{ {
int v7; // edi int hit, hper, dam, mor, mir;
BOOLEAN v8; // zf BOOL resist, ret;
short v9; // ax
int v10; // ecx
int v11; // eax
int v12; // esi
int v13; // ebx
int v15; // eax
//int v16; // eax
int v19; // ebx
int v20; // ebx
int v21; // edx
int v22; // eax
int v23; // [esp+Ch] [ebp-18h]
BOOL ret; // [esp+10h] [ebp-14h]
int v25; // [esp+14h] [ebp-10h]
int v26; // [esp+18h] [ebp-Ch]
int pnuma; // [esp+1Ch] [ebp-8h]
int arglist; // [esp+20h] [ebp-4h]
unsigned char dist_3; // [esp+37h] [ebp+13h]
arglist = m; resist = FALSE;
v7 = m; if (monster[m].mtalkmsg
v26 = 0; || monster[m]._mhitpoints >> 6 <= 0
v8 = monster[m].mtalkmsg == 0; || t == MIS_HBOLT && monster[m].MType->mtype != MT_DIABLO && monster[m].MData->mMonstClass) {
pnuma = pnum; return FALSE;
if (!v8
|| monster[v7]._mhitpoints >> 6 <= 0
|| t == MIS_HBOLT && monster[v7].MType->mtype != MT_DIABLO && monster[v7].MData->mMonstClass) {
return 0;
}
if (monster[v7].MType->mtype == MT_ILLWEAV && _LOBYTE(monster[v7]._mgoal) == MGOAL_RETREAT)
return 0;
if (monster[v7]._mmode == MM_CHARGE)
return 0;
v9 = monster[v7].mMagicRes;
v10 = missiledata[t].mResist;
v23 = t;
if (v9 & IMUNE_MAGIC) {
if (v10 == MISR_MAGIC)
return 0;
} }
if (v9 & IMUNE_FIRE && v10 == MISR_FIRE || v9 & IMUNE_LIGHTNING && v10 == MISR_LIGHTNING || (v9 & IMUNE_ACID) != 0 && v10 == MISR_ACID) if (monster[m].MType->mtype == MT_ILLWEAV && _LOBYTE(monster[m]._mgoal) == MGOAL_RETREAT)
return 0; return FALSE;
if (v9 & RESIST_MAGIC && v10 == MISR_MAGIC || v9 & RESIST_FIRE && v10 == MISR_FIRE || v9 & RESIST_LIGHTNING && v10 == MISR_LIGHTNING) if (monster[m]._mmode == MM_CHARGE)
v26 = 1; return FALSE;
v11 = random(69, 100);
v8 = missiledata[t].mType == 0; mor = monster[m].mMagicRes;
v25 = v11; mir = missiledata[t].mResist;
if (v8) {
v12 = pnuma; if (mor & IMUNE_MAGIC && mir == MISR_MAGIC
v13 = plr[v12]._pDexterity || mor & IMUNE_FIRE && mir == MISR_FIRE
+ plr[v12]._pIBonusToHit || mor & IMUNE_LIGHTNING && mir == MISR_LIGHTNING
+ plr[v12]._pLevel || (mor & IMUNE_ACID) && mir == MISR_ACID)
- (unsigned char)monster[v7].mArmorClass return FALSE;
if (mor & RESIST_MAGIC && mir == MISR_MAGIC
|| mor & RESIST_FIRE && mir == MISR_FIRE
|| mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING)
resist = TRUE;
hit = random(69, 100);
if (!missiledata[t].mType) {
hper = plr[pnum]._pDexterity
+ plr[pnum]._pIBonusToHit
+ plr[pnum]._pLevel
- monster[m].mArmorClass
- (dist * dist >> 1) - (dist * dist >> 1)
+ plr[pnuma]._pIEnAc + plr[pnum]._pIEnAc
+ 50; + 50;
if (plr[pnuma]._pClass == PC_ROGUE) if (plr[pnum]._pClass == PC_ROGUE)
v13 = plr[v12]._pDexterity hper += 20;
+ plr[v12]._pIBonusToHit if (plr[pnum]._pClass == PC_WARRIOR)
+ plr[v12]._pLevel hper += 10;
- (unsigned char)monster[v7].mArmorClass
- (dist * dist >> 1)
+ plr[pnuma]._pIEnAc
+ 70;
if (plr[pnuma]._pClass == PC_WARRIOR)
v13 += 10;
} else { } else {
v12 = pnuma; hper = plr[pnum]._pMagic - (monster[m].mLevel << 1) - dist + 50;
v15 = 2 * SLOBYTE(monster[v7].mLevel); if (plr[pnum]._pClass == PC_SORCERER)
v13 = plr[pnuma]._pMagic - v15 - dist + 50; hper += 20;
if (plr[pnuma]._pClass == PC_SORCERER) }
v13 = plr[v12]._pMagic - v15 - dist + 70; if (hper < 5)
} hper = 5;
if (v13 < 5) if (hper > 95)
v13 = 5; hper = 95;
if (v13 > 95) if (monster[m]._mmode == MM_STONE)
v13 = 95; hit = 0;
if (monster[v7]._mmode == MM_STONE) if (CheckMonsterHit(m, &ret))
v25 = 0;
if (CheckMonsterHit(arglist, &ret))
return ret; return ret;
#ifdef _DEBUG #ifdef _DEBUG
if (v25 >= v13 && !debug_mode_key_inverted_v && !debug_mode_dollar_sign) if (hit >= hper && !debug_mode_key_inverted_v && !debug_mode_dollar_sign)
return 0; return 0;
#else #else
if (v25 >= v13) if (hit >= hper)
return 0; return 0;
#endif #endif
if (t == MIS_BONESPIRIT) { if (t == MIS_BONESPIRIT) {
v19 = monster[v7]._mhitpoints / 3 >> 6; dam = monster[m]._mhitpoints / 3 >> 6;
} else { } else {
v19 = mindam + random(70, maxdam - mindam + 1); dam = mindam + random(70, maxdam - mindam + 1);
} }
dist_3 = missiledata[v23].mType; if (!missiledata[t].mType) {
if (!missiledata[v23].mType) { dam = plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100 + dam;
v20 = plr[v12]._pIBonusDamMod + v19 * plr[v12]._pIBonusDam / 100 + v19; if (plr[pnum]._pClass == PC_ROGUE)
if (plr[v12]._pClass == PC_ROGUE) dam += plr[pnum]._pDamageMod;
v19 = plr[v12]._pDamageMod + v20;
else else
v19 = (plr[v12]._pDamageMod >> 1) + v20; dam += (plr[pnum]._pDamageMod >> 1);
} }
if (!(_BYTE)shift) if (!shift)
v19 <<= 6; dam <<= 6;
if (v26) if (resist)
v19 >>= 2; dam >>= 2;
v21 = pnuma; if (pnum == myplr)
if (pnuma == myplr) monster[m]._mhitpoints -= dam;
monster[v7]._mhitpoints -= v19; if (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS)
v22 = plr[v12]._pIFlags; monster[m]._mFlags |= MFLAG_NOHEAL;
if (v22 & 8)
monster[v7]._mFlags |= MFLAG_NOHEAL; if (monster[m]._mhitpoints >> 6 <= 0) {
if (monster[v7]._mhitpoints >> 6 > 0) { if (monster[m]._mmode == MM_STONE) {
if (v26) { M_StartKill(m, pnum);
PlayEffect(arglist, 1); monster[m]._mmode = MM_STONE;
} else if (monster[v7]._mmode == MM_STONE) {
if (arglist > 3)
M_StartHit(arglist, v21, v19);
monster[v7]._mmode = MM_STONE;
} else { } else {
if (!dist_3 && v22 & 0x800) { M_StartKill(m, pnum);
M_GetKnockback(arglist);
v21 = pnuma;
}
if (arglist > 3)
M_StartHit(arglist, v21, v19);
} }
} else if (monster[v7]._mmode == MM_STONE) {
M_StartKill(arglist, v21);
monster[v7]._mmode = MM_STONE;
} else { } else {
M_StartKill(arglist, v21); if (resist) {
PlayEffect(m, 1);
} else if (monster[m]._mmode == MM_STONE) {
if (m > 3)
M_StartHit(m, pnum, dam);
monster[m]._mmode = MM_STONE;
} else {
if (!missiledata[t].mType && plr[pnum]._pIFlags & ISPL_KNOCKBACK) {
M_GetKnockback(m);
}
if (m > 3)
M_StartHit(m, pnum, dam);
}
} }
if (!monster[v7]._msquelch) {
monster[v7]._msquelch = UCHAR_MAX; if (!monster[m]._msquelch) {
monster[v7]._lastx = plr[v12].WorldX; monster[m]._msquelch = UCHAR_MAX;
monster[v7]._lasty = plr[v12].WorldY; monster[m]._lastx = plr[pnum].WorldX;
monster[m]._lasty = plr[pnum].WorldY;
} }
return 1; return TRUE;
} }
BOOLEAN PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, int shift, int earflag) BOOLEAN PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, int shift, int earflag)

2
Source/missiles.h

@ -23,7 +23,7 @@ void PutMissile(int i);
void GetMissilePos(int i); void GetMissilePos(int i);
void MoveMissilePos(int i); void MoveMissilePos(int i);
BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, int shift); BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, int shift);
BOOLEAN MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, int shift); BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift);
BOOLEAN PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, int shift, int earflag); BOOLEAN PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, int shift, int earflag);
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);
void CheckMissileCol(int i, int mindam, int maxdam, BOOLEAN shift, int mx, int my, int nodel); void CheckMissileCol(int i, int mindam, int maxdam, BOOLEAN shift, int mx, int my, int nodel);

Loading…
Cancel
Save