diff --git a/Source/player.cpp b/Source/player.cpp index 480289ecd..aeaf411c6 100644 --- a/Source/player.cpp +++ b/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; diff --git a/structs.h b/structs.h index f67e88993..3218cb832 100644 --- a/structs.h +++ b/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;