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)
{
int v2; // ebx
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 )
{
if ( (DWORD)m >= MAXMONSTERS ) {
TermMsg("PlrHitMonst: illegal monster %d", m);
//pnum = v4;
}
v5 = 228 * v2;
v43 = v5;
if ( (signed int)(*(int *)((_BYTE *)&monster[0]._mhitpoints + v5) & 0xFFFFFFC0) <= 0
|| **(_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 ( (monster[m]._mhitpoints >> 6) <= 0 ) {
return FALSE;
}
if ( v3 >= 4 )
{
TermMsg("PlrHitMonst: illegal player %d", v3);
//pnum = v7;
}
v42 = 0;
v8 = random(4, 100);
v23 = *(MON_MODE *)((char *)&monster[0]._mmode + v5) == MM_STONE;
v46 = v8;
if ( v23 )
v46 = 0;
v9 = v3;
v10 = plr[v9]._pLevel;
v11 = plr[v9]._pIEnAc + (plr[v9]._pDexterity >> 1) - *((unsigned char *)&monster[0].mArmorClass + v5);
v12 = v11 + v10 + 50;
if ( !_LOBYTE(plr[v9]._pClass) )
v12 = v11 + v10 + 70;
v13 = plr[v9]._pIBonusToHit + v12;
if ( v13 < 5 )
v13 = 5;
if ( v13 > 95 )
v13 = 95;
if ( CheckMonsterHit(arglist, &ret) )
if ( monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == 2 ) {
return FALSE;
}
if ( monster[m]._mmode == MM_CHARGE ) {
return FALSE;
}
if ( (DWORD)pnum >= MAX_PLRS ) {
TermMsg("PlrHitMonst: illegal player %d", pnum);
}
BOOL rv = FALSE;
int hit = random(4, 100);
if ( monster[m]._mmode == MM_STONE ) {
hit = 0;
}
int hper = (plr[pnum]._pDexterity >> 1) + plr[pnum]._pLevel + 50 - (monster[m].mArmorClass - plr[pnum]._pIEnAc);
if ( plr[pnum]._pClass == PC_WARRIOR ) {
hper += 20;
}
hper += plr[pnum]._pIBonusToHit;
if ( hper < 5 ) {
hper = 5;
}
if ( hper > 95 ) {
hper = 95;
}
BOOL ret;
if ( CheckMonsterHit(m, &ret) ) {
return ret;
}
#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
if ( (signed int)v46 < v13 )
if ( hit < hper ) {
#endif
{
v16 = plr[v9]._pIMaxDam - plr[v9]._pIMinDam + 1;
v48 = plr[v9]._pIMinDam;
v17 = random(5, v16);
v18 = 100;
v19 = plr[v9]._pIBonusDamMod + plr[v9]._pDamageMod + (v48 + v17) * plr[v9]._pIBonusDam / 100 + v48 + v17;
if ( !_LOBYTE(plr[v9]._pClass) )
{
v48 = plr[v9]._pLevel;
v20 = random(6, 100);
if ( v20 < v48 )
v19 *= 2;
int mind = plr[pnum]._pIMinDam;
int maxd = random(5, plr[pnum]._pIMaxDam - mind + 1);
int dam = maxd + mind;
dam += plr[pnum]._pDamageMod + plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100;
if ( plr[pnum]._pClass == PC_WARRIOR ) {
int lvl = plr[pnum]._pLevel;
if ( random(6, 100) < lvl ) {
dam *= 2;
}
}
v21 = plr[v9].InvBody[4]._itype;
v46 = -1;
if ( v21 == 1 || plr[v9].InvBody[5]._itype == 1 )
v46 = 1;
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;
int phanditype = ITYPE_NONE;
if ( plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD ) {
phanditype = ITYPE_SWORD;
}
else
{
if ( v46 == 1 )
v19 -= v19 >> 1;
v23 = v46 == ITYPE_MACE;
if ( plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_MACE ) {
phanditype = ITYPE_MACE;
}
if ( v23 )
v19 += v19 >> 1;
LABEL_40:
v24 = plr[v9]._pIFlags;
if ( v24 & 0x40000000 && v22 == 1 )
v19 *= 3;
v25 = pnuma;
v26 = v19 << 6;
if ( pnuma == myplr )
*(int *)((char *)&monster[0]._mhitpoints + v5) -= v26;
if ( v24 & 2 )
{
v27 = random(7, v26 >> 3);
v28 = plr[v9]._pMaxHP;
v29 = &plr[v9]._pHitPoints;
*v29 += v27;
if ( plr[v9]._pHitPoints > v28 )
*v29 = v28;
v30 = plr[v9]._pMaxHPBase;
v31 = &plr[v9]._pHPBase;
*v31 += v27;
if ( plr[v9]._pHPBase > v30 )
*v31 = v30;
v5 = v43;
drawhpflag = TRUE;
int mClass = monster[m].MData->mMonstClass;
switch (mClass ) {
case MC_UNDEAD:
if ( phanditype == ITYPE_SWORD ) {
dam -= dam >> 1;
}
if ( phanditype == ITYPE_MACE ) {
dam += dam >> 1;
}
break;
case MC_ANIMAL:
if ( phanditype == ITYPE_MACE ) {
dam -= dam >> 1;
}
if ( phanditype == ITYPE_SWORD ) {
dam += dam >> 1;
}
break;
}
else
{
v27 = ret;
if ( plr[pnum]._pIFlags & ISPL_3XDAMVDEM && monster[m].MData->mMonstClass == MC_DEMON ) {
dam *= 3;
}
v46 = plr[v9]._pIFlags;
v32 = v46;
if ( v32 & 0x6000 && !(v46 & 0x8000000) )
{
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;
int skdam = dam << 6;
if ( pnum == myplr ) {
monster[m]._mhitpoints -= skdam;
}
if ( v32 & 0x18000 )
{
if ( (v32 & 0x8000) != 0 )
v27 = 3 * v26 / 100;
if ( v32 & 0x10000 )
v27 = 5 * v26 / 100;
v37 = plr[v9]._pMaxHP;
v38 = &plr[v9]._pHitPoints;
*v38 += v27;
if ( plr[v9]._pHitPoints > v37 )
*v38 = v37;
v39 = &plr[v9]._pHPBase;
v40 = plr[v9]._pMaxHPBase;
*v39 += v27;
if ( *v39 > v40 )
*v39 = v40;
BYTE1(v32) = BYTE1(v46);
v5 = v43;
int tac;
if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) {
tac = random(7, skdam >> 3);
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 ( v32 & 0x100 )
*(int *)((char *)&monster[0]._mFlags + v5) |= 8u;
if ( plr[pnum]._pIFlags & (ISPL_STEALMANA_3 | ISPL_STEALMANA_5) && !(plr[pnum]._pIFlags & ISPL_NOMANA) ) {
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
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 */
}
#endif
if ( (signed int)(*(int *)((_BYTE *)&monster[0]._mhitpoints + v5) & 0xFFFFFFC0) > 0 )
{
if ( *(MON_MODE *)((char *)&monster[0]._mmode + v5) != MM_STONE )
{
if ( v32 & 0x800 )
M_GetKnockback(arglist);
M_StartHit(arglist, pnuma, v26);
goto LABEL_85;
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);
}
M_StartHit(arglist, pnuma, v26);
}
else
{
if ( *(MON_MODE *)((char *)&monster[0]._mmode + v5) != MM_STONE )
{
M_StartKill(arglist, pnuma);
goto LABEL_85;
} else {
if ( monster[m]._mmode == MM_STONE ) {
M_StartHit(m, pnum, skdam);
monster[m]._mmode = MM_STONE;
} else {
if ( plr[pnum]._pIFlags & ISPL_KNOCKBACK ) {
M_GetKnockback(m);
}
M_StartHit(m, pnum, skdam);
}
M_StartKill(arglist, pnuma);
}
*(MON_MODE *)((char *)&monster[0]._mmode + v5) = MM_STONE;
LABEL_85:
v42 = 1;
rv = TRUE;
}
return v42;
return rv;
}
BOOL __fastcall PlrHitPlr(int pnum, char p)
@ -2685,7 +2630,7 @@ BOOL __fastcall PlrHitPlr(int pnum, char p)
dam *= 2;
}
}
int skdam = dam * 64;
int skdam = dam << 6;
if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) {
int tac = random(7, skdam >> 3);
plr[pnum]._pHitPoints += tac;

4
structs.h

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

Loading…
Cancel
Save