Browse Source

Clean up PlrHitMonst (#305)

pull/4/head
Anders Jenbo 8 years ago committed by Robin Eklind
parent
commit
5cea7f9f95
  1. 359
      Source/player.cpp
  2. 4
      structs.h

359
Source/player.cpp

@ -2389,234 +2389,179 @@ BOOL __fastcall WeaponDur(int pnum, int durrnd)
BOOL __fastcall PlrHitMonst(int pnum, int m) BOOL __fastcall PlrHitMonst(int pnum, int m)
{ {
int v2; // ebx if ( (DWORD)m >= MAXMONSTERS ) {
unsigned int v3; // esi
//int v4; // ST04_4
int v5; // ebx
//int v7; // ST04_4
int v8; // eax
unsigned int v9; // esi
int v10; // ecx
int v11; // eax
int v12; // edi
int v13; // edi
//int v14; // eax
int v16; // edx
int v17; // eax
int v18; // ecx
int v19; // edi
int v20; // eax
int v21; // eax
char v22; // dl
bool v23; // zf
int v24; // eax
int v25; // ecx
int v26; // edi
int v27; // eax
int v28; // edx
int *v29; // ecx
int v30; // edx
int *v31; // ecx
int v32; // ecx
int v33; // edx
int *v34; // ecx
int v35; // edx
int *v36; // ecx
int v37; // edx
int *v38; // ecx
int *v39; // ecx
int v40; // esi
BOOL ret; // [esp+Ch] [ebp-18h]
bool v42; // [esp+10h] [ebp-14h]
int v48;
int v43; // [esp+14h] [ebp-10h]
int pnuma; // [esp+18h] [ebp-Ch]
int arglist; // [esp+1Ch] [ebp-8h]
int v46; // [esp+20h] [ebp-4h]
v2 = m;
v3 = pnum;
arglist = m;
pnuma = pnum;
if ( (unsigned int)m >= 0xC8 )
{
TermMsg("PlrHitMonst: illegal monster %d", m); TermMsg("PlrHitMonst: illegal monster %d", m);
//pnum = v4;
} }
v5 = 228 * v2;
v43 = v5; if ( (monster[m]._mhitpoints >> 6) <= 0 ) {
if ( (signed int)(*(int *)((_BYTE *)&monster[0]._mhitpoints + v5) & 0xFFFFFFC0) <= 0 return FALSE;
|| **(_BYTE **)((char *)&monster[0].MType + v5) == MT_ILLWEAV && *((_BYTE *)&monster[0]._mgoal + v5) == 2
|| *(MON_MODE *)((char *)&monster[0]._mmode + v5) == MM_CHARGE )
{
return 0;
} }
if ( v3 >= 4 )
{ if ( monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == 2 ) {
TermMsg("PlrHitMonst: illegal player %d", v3); return FALSE;
//pnum = v7; }
}
v42 = 0; if ( monster[m]._mmode == MM_CHARGE ) {
v8 = random(4, 100); return FALSE;
v23 = *(MON_MODE *)((char *)&monster[0]._mmode + v5) == MM_STONE; }
v46 = v8;
if ( v23 ) if ( (DWORD)pnum >= MAX_PLRS ) {
v46 = 0; TermMsg("PlrHitMonst: illegal player %d", pnum);
v9 = v3; }
v10 = plr[v9]._pLevel;
v11 = plr[v9]._pIEnAc + (plr[v9]._pDexterity >> 1) - *((unsigned char *)&monster[0].mArmorClass + v5); BOOL rv = FALSE;
v12 = v11 + v10 + 50;
if ( !_LOBYTE(plr[v9]._pClass) ) int hit = random(4, 100);
v12 = v11 + v10 + 70; if ( monster[m]._mmode == MM_STONE ) {
v13 = plr[v9]._pIBonusToHit + v12; hit = 0;
if ( v13 < 5 ) }
v13 = 5;
if ( v13 > 95 ) int hper = (plr[pnum]._pDexterity >> 1) + plr[pnum]._pLevel + 50 - (monster[m].mArmorClass - plr[pnum]._pIEnAc);
v13 = 95; if ( plr[pnum]._pClass == PC_WARRIOR ) {
if ( CheckMonsterHit(arglist, &ret) ) hper += 20;
}
hper += plr[pnum]._pIBonusToHit;
if ( hper < 5 ) {
hper = 5;
}
if ( hper > 95 ) {
hper = 95;
}
BOOL ret;
if ( CheckMonsterHit(m, &ret) ) {
return ret; return ret;
}
#ifdef _DEBUG #ifdef _DEBUG
if ( (signed int)v46 < v13 || debug_mode_key_inverted_v || debug_mode_dollar_sign ) if ( hit < hper || debug_mode_key_inverted_v || debug_mode_dollar_sign ) {
#else #else
if ( (signed int)v46 < v13 ) if ( hit < hper ) {
#endif #endif
{ int mind = plr[pnum]._pIMinDam;
v16 = plr[v9]._pIMaxDam - plr[v9]._pIMinDam + 1; int maxd = random(5, plr[pnum]._pIMaxDam - mind + 1);
v48 = plr[v9]._pIMinDam; int dam = maxd + mind;
v17 = random(5, v16); dam += plr[pnum]._pDamageMod + plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100;
v18 = 100; if ( plr[pnum]._pClass == PC_WARRIOR ) {
v19 = plr[v9]._pIBonusDamMod + plr[v9]._pDamageMod + (v48 + v17) * plr[v9]._pIBonusDam / 100 + v48 + v17; int lvl = plr[pnum]._pLevel;
if ( !_LOBYTE(plr[v9]._pClass) ) if ( random(6, 100) < lvl ) {
{ dam *= 2;
v48 = plr[v9]._pLevel; }
v20 = random(6, 100);
if ( v20 < v48 )
v19 *= 2;
} }
v21 = plr[v9].InvBody[4]._itype;
v46 = -1; int phanditype = ITYPE_NONE;
if ( v21 == 1 || plr[v9].InvBody[5]._itype == 1 ) if ( plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD ) {
v46 = 1; phanditype = ITYPE_SWORD;
if ( v21 == ITYPE_MACE || plr[v9].InvBody[5]._itype == ITYPE_MACE )
v46 = ITYPE_MACE;
v22 = (*(MonsterData **)((char *)&monster[0].MData + v5))->mMonstClass;
if ( v22 )
{
if ( v22 != 2 )
goto LABEL_40;
if ( v46 == ITYPE_MACE )
v19 -= v19 >> 1;
v23 = v46 == 1;
} }
else if ( plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_MACE ) {
{ phanditype = ITYPE_MACE;
if ( v46 == 1 )
v19 -= v19 >> 1;
v23 = v46 == ITYPE_MACE;
} }
if ( v23 )
v19 += v19 >> 1; int mClass = monster[m].MData->mMonstClass;
LABEL_40: switch (mClass ) {
v24 = plr[v9]._pIFlags; case MC_UNDEAD:
if ( v24 & 0x40000000 && v22 == 1 ) if ( phanditype == ITYPE_SWORD ) {
v19 *= 3; dam -= dam >> 1;
v25 = pnuma; }
v26 = v19 << 6; if ( phanditype == ITYPE_MACE ) {
if ( pnuma == myplr ) dam += dam >> 1;
*(int *)((char *)&monster[0]._mhitpoints + v5) -= v26; }
if ( v24 & 2 ) break;
{ case MC_ANIMAL:
v27 = random(7, v26 >> 3); if ( phanditype == ITYPE_MACE ) {
v28 = plr[v9]._pMaxHP; dam -= dam >> 1;
v29 = &plr[v9]._pHitPoints; }
*v29 += v27; if ( phanditype == ITYPE_SWORD ) {
if ( plr[v9]._pHitPoints > v28 ) dam += dam >> 1;
*v29 = v28; }
v30 = plr[v9]._pMaxHPBase; break;
v31 = &plr[v9]._pHPBase;
*v31 += v27;
if ( plr[v9]._pHPBase > v30 )
*v31 = v30;
v5 = v43;
drawhpflag = TRUE;
} }
else
{ if ( plr[pnum]._pIFlags & ISPL_3XDAMVDEM && monster[m].MData->mMonstClass == MC_DEMON ) {
v27 = ret; dam *= 3;
} }
v46 = plr[v9]._pIFlags;
v32 = v46; int skdam = dam << 6;
if ( v32 & 0x6000 && !(v46 & 0x8000000) ) if ( pnum == myplr ) {
{ monster[m]._mhitpoints -= skdam;
if ( v32 & 0x2000 )
v27 = 3 * v26 / 100;
if ( v32 & 0x4000 )
v27 = 5 * v26 / 100;
v33 = plr[v9]._pMaxMana;
v34 = &plr[v9]._pMana;
*v34 += v27;
if ( plr[v9]._pMana > v33 )
*v34 = v33;
v35 = plr[v9]._pMaxManaBase;
v36 = &plr[v9]._pManaBase;
*v36 += v27;
if ( plr[v9]._pManaBase > v35 )
*v36 = v35;
v5 = v43;
v32 = v46;
drawmanaflag = TRUE;
} }
if ( v32 & 0x18000 )
{ int tac;
if ( (v32 & 0x8000) != 0 ) if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) {
v27 = 3 * v26 / 100; tac = random(7, skdam >> 3);
if ( v32 & 0x10000 ) plr[pnum]._pHitPoints += tac;
v27 = 5 * v26 / 100; if ( plr[pnum]._pHitPoints > plr[pnum]._pMaxHP ) {
v37 = plr[v9]._pMaxHP; plr[pnum]._pHitPoints = plr[pnum]._pMaxHP;
v38 = &plr[v9]._pHitPoints; }
*v38 += v27; plr[pnum]._pHPBase += tac;
if ( plr[v9]._pHitPoints > v37 ) if ( plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase ) {
*v38 = v37; plr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;
v39 = &plr[v9]._pHPBase; }
v40 = plr[v9]._pMaxHPBase;
*v39 += v27;
if ( *v39 > v40 )
*v39 = v40;
BYTE1(v32) = BYTE1(v46);
v5 = v43;
drawhpflag = TRUE; drawhpflag = TRUE;
} }
if ( v32 & 0x100 ) if ( plr[pnum]._pIFlags & (ISPL_STEALMANA_3 | ISPL_STEALMANA_5) && !(plr[pnum]._pIFlags & ISPL_NOMANA) ) {
*(int *)((char *)&monster[0]._mFlags + v5) |= 8u; if ( plr[pnum]._pIFlags & ISPL_STEALMANA_3 ) {
tac = 3 * skdam / 100;
}
if ( plr[pnum]._pIFlags & ISPL_STEALMANA_5 ) {
tac = 5 * skdam / 100;
}
plr[pnum]._pMana += tac;
if ( plr[pnum]._pMana > plr[pnum]._pMaxMana ) {
plr[pnum]._pMana = plr[pnum]._pMaxMana;
}
plr[pnum]._pManaBase += tac;
if ( plr[pnum]._pManaBase > plr[pnum]._pMaxManaBase ) {
plr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;
}
drawmanaflag = 1;
}
if ( plr[pnum]._pIFlags & (ISPL_STEALLIFE_3 | ISPL_STEALLIFE_5) ) {
if ( plr[pnum]._pIFlags & ISPL_STEALLIFE_3 ) {
tac = 3 * skdam / 100;
}
if ( plr[pnum]._pIFlags & ISPL_STEALLIFE_5 ) {
tac = 5 * skdam / 100;
}
plr[pnum]._pHitPoints += tac;
if ( plr[pnum]._pHitPoints > plr[pnum]._pMaxHP ) {
plr[pnum]._pHitPoints = plr[pnum]._pMaxHP;
}
plr[pnum]._pHPBase += tac;
if ( plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase ) {
plr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;
}
drawhpflag = TRUE;
}
if ( plr[pnum]._pIFlags & ISPL_NOHEALPLR ) {
monster[m]._mFlags |= 8;
}
#ifdef _DEBUG #ifdef _DEBUG
if ( debug_mode_dollar_sign || debug_mode_key_inverted_v ) if ( debug_mode_dollar_sign || debug_mode_key_inverted_v ) {
monster[m]._mhitpoints = 0; /* double check */ monster[m]._mhitpoints = 0; /* double check */
}
#endif #endif
if ( (signed int)(*(int *)((_BYTE *)&monster[0]._mhitpoints + v5) & 0xFFFFFFC0) > 0 ) if ( (monster[m]._mhitpoints >> 6) <= 0) {
{ if ( monster[m]._mmode == MM_STONE ) {
if ( *(MON_MODE *)((char *)&monster[0]._mmode + v5) != MM_STONE ) M_StartKill(m, pnum);
{ monster[m]._mmode = MM_STONE;
if ( v32 & 0x800 ) } else {
M_GetKnockback(arglist); M_StartKill(m, pnum);
M_StartHit(arglist, pnuma, v26);
goto LABEL_85;
} }
M_StartHit(arglist, pnuma, v26); } else {
} if ( monster[m]._mmode == MM_STONE ) {
else M_StartHit(m, pnum, skdam);
{ monster[m]._mmode = MM_STONE;
if ( *(MON_MODE *)((char *)&monster[0]._mmode + v5) != MM_STONE ) } else {
{ if ( plr[pnum]._pIFlags & ISPL_KNOCKBACK ) {
M_StartKill(arglist, pnuma); M_GetKnockback(m);
goto LABEL_85; }
M_StartHit(m, pnum, skdam);
} }
M_StartKill(arglist, pnuma);
} }
*(MON_MODE *)((char *)&monster[0]._mmode + v5) = MM_STONE; rv = TRUE;
LABEL_85:
v42 = 1;
} }
return v42;
return rv;
} }
BOOL __fastcall PlrHitPlr(int pnum, char p) BOOL __fastcall PlrHitPlr(int pnum, char p)
@ -2685,7 +2630,7 @@ BOOL __fastcall PlrHitPlr(int pnum, char p)
dam *= 2; dam *= 2;
} }
} }
int skdam = dam * 64; int skdam = dam << 6;
if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) { if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) {
int tac = random(7, skdam >> 3); int tac = random(7, skdam >> 3);
plr[pnum]._pHitPoints += tac; plr[pnum]._pHitPoints += tac;

4
structs.h

@ -519,7 +519,7 @@ struct MonsterData
unsigned char mAFNum2; unsigned char mAFNum2;
unsigned char mMinDamage2; unsigned char mMinDamage2;
unsigned char mMaxDamage2; unsigned char mMaxDamage2;
char mArmorClass; unsigned char mArmorClass;
char mMonstClass; char mMonstClass;
unsigned short mMagicRes; unsigned short mMagicRes;
unsigned short mMagicRes2; unsigned short mMagicRes2;
@ -613,7 +613,7 @@ struct MonsterStruct // note: missing field _mAFNum
unsigned char mHit2; unsigned char mHit2;
unsigned char mMinDamage2; unsigned char mMinDamage2;
unsigned char mMaxDamage2; unsigned char mMaxDamage2;
char mArmorClass; unsigned char mArmorClass;
char falign_CB; char falign_CB;
unsigned short mMagicRes; unsigned short mMagicRes;
int mtalkmsg; int mtalkmsg;

Loading…
Cancel
Save