From 91eecec686a6aed68a21edcd591bc25aba100064 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Mon, 17 Sep 2018 02:55:05 +0200 Subject: [PATCH] WIP PlrHitPlr --- Source/msg.cpp | 2 +- Source/msg.h | 2 +- Source/player.cpp | 189 +++++++++++++++++++--------------------------- Source/player.h | 2 +- 4 files changed, 82 insertions(+), 113 deletions(-) diff --git a/Source/msg.cpp b/Source/msg.cpp index b8a4b36fa..e5e25d2a1 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1323,7 +1323,7 @@ void __fastcall NetSendCmdDItem(unsigned char bHiPri, int ii) NetSendLoPri((unsigned char *)&cmd, 0x16u); } -void __fastcall NetSendCmdDamage(unsigned char bHiPri, unsigned char bPlr, unsigned int dwDam) +void __fastcall NetSendCmdDamage(BOOL bHiPri, unsigned char bPlr, unsigned int dwDam) { TCmdDamage cmd; // [esp+0h] [ebp-8h] diff --git a/Source/msg.h b/Source/msg.h index 1223d7ad0..4ff6cf7ef 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -65,7 +65,7 @@ void __fastcall NetSendCmdPItem(unsigned char bHiPri, unsigned char bCmd, unsign void __fastcall NetSendCmdChItem(unsigned char bHiPri, unsigned char bLoc); void __fastcall NetSendCmdDelItem(BOOL bHiPri, unsigned char bLoc); void __fastcall NetSendCmdDItem(unsigned char bHiPri, int ii); -void __fastcall NetSendCmdDamage(unsigned char bHiPri, unsigned char bPlr, unsigned int dwDam); +void __fastcall NetSendCmdDamage(BOOL bHiPri, unsigned char bPlr, unsigned int dwDam); void __fastcall NetSendCmdString(int a1, const char *pszStr); void __fastcall RemovePlrPortal(int pnum); int __fastcall ParseCmd(int pnum, TCmd *pCmd); diff --git a/Source/player.cpp b/Source/player.cpp index fb5e9b5a5..eaa5d86b9 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2747,126 +2747,95 @@ LABEL_85: return v42; } -bool __fastcall PlrHitPlr(int pnum, char p) +BOOL __fastcall PlrHitPlr(int pnum, char p) { - char v2; // bl - unsigned int v3; // esi - //int v4; // ST04_4 - int v5; // edi - //int v7; // ST04_4 - unsigned int v8; // esi - int v9; // ecx - int v10; // eax - int v11; // ebx - int v12; // ebx - int v13; // eax - int v14; // eax - int v15; // ecx - int v16; // eax - int v17; // ebx - int v18; // eax - int v19; // ecx - int v20; // edi - int v21; // ebx - signed int v22; // edi - int v23; // eax - int v24; // edx - int *v25; // ecx - int *v26; // ecx - int v27; // esi - int v28; // [esp+Ch] [ebp-14h] - int v29; // [esp+10h] [ebp-10h] - bool v30; // [esp+14h] [ebp-Ch] - int arglist; // [esp+18h] [ebp-8h] - char bPlr; // [esp+1Ch] [ebp-4h] - - v2 = p; - v3 = pnum; - bPlr = p; - v28 = pnum; - if ( (unsigned char)p >= 4u ) - { + if ( (DWORD)p >= MAX_PLRS ) { TermMsg("PlrHitPlr: illegal target player %d", p); - //pnum = v4; } - arglist = v2; - v5 = v2; - v30 = 0; - if ( plr[v5]._pInvincible || plr[v5]._pSpellFlags & 1 ) - return 0; - if ( v3 >= 4 ) - { - TermMsg("PlrHitPlr: illegal attacking player %d", v3); - //pnum = v7; + + BOOL rv = FALSE; + + if ( plr[p]._pInvincible ) { + return rv; } - v8 = v3; - v29 = random(4, 100); - v9 = (plr[v8]._pDexterity >> 1) - plr[v5]._pIBonusAC - plr[v5]._pIAC - plr[v5]._pDexterity / 5; - v10 = plr[v8]._pLevel; - v11 = v9 + v10 + 50; - if ( !_LOBYTE(plr[v8]._pClass) ) - v11 = v9 + v10 + 70; - v12 = plr[v8]._pIBonusToHit + v11; - if ( v12 < 5 ) - v12 = 5; - if ( v12 > 95 ) - v12 = 95; - v13 = plr[v5]._pmode; - if ( v13 && v13 != 4 || !plr[v5]._pBlockFlag ) - { - v14 = 100; + + if ( plr[p]._pSpellFlags & 1 ) { + return rv; } - else - { - v14 = random(5, 100); - } - v15 = plr[v5]._pDexterity + plr[v5]._pBaseToBlk + 2 * plr[v5]._pLevel - 2 * plr[v8]._pLevel; - if ( v15 < 0 ) - v15 = 0; - if ( v15 > 100 ) - v15 = 100; - if ( v29 < v12 ) - { - if ( v14 >= v15 ) - { - v17 = plr[v8]._pIMinDam; - v18 = random(5, plr[v8]._pIMaxDam - v17 + 1); - v19 = 100; - v20 = plr[v8]._pIBonusDamMod + plr[v8]._pDamageMod + (v17 + v18) * plr[v8]._pIBonusDam / 100 + v17 + v18; - if ( !_LOBYTE(plr[v8]._pClass) ) - { - v21 = plr[v8]._pLevel; - if ( random(6, 100) < v21 ) - v20 *= 2; + + if ( (DWORD)pnum >= MAX_PLRS ) { + TermMsg("PlrHitPlr: illegal attacking player %d", pnum); + } + + int hit = random(4, 100); + + int hper = (plr[pnum]._pDexterity >> 1) + plr[pnum]._pLevel + 50 - (plr[p]._pIBonusAC + plr[p]._pIAC + plr[p]._pDexterity / 5); + + if ( plr[pnum]._pClass == PC_WARRIOR ) { + hper += 20; + } + hper += plr[pnum]._pIBonusToHit; + if ( hper < 5 ) { + hper = 5; + } + if ( hper > 95 ) { + hper = 95; + } + + int blk; + if ( (plr[p]._pmode == PM_STAND || plr[p]._pmode == PM_ATTACK) && plr[p]._pBlockFlag ) { + blk = random(5, 100); + } else { + blk = 100; + } + + int blkper = plr[p]._pDexterity + plr[p]._pBaseToBlk + (plr[p]._pLevel << 1) - (plr[pnum]._pLevel << 1); + if ( blkper < 0 ) { + blkper = 0; + } + if ( blkper > 100 ) { + blkper = 100; + } + + if ( hit < hper ) { + if ( blk < blkper ) { + int dir = GetDirection(plr[p].WorldX, plr[p].WorldY, plr[pnum].WorldX, plr[pnum].WorldY); + StartPlrBlock(p, dir); + } else { + 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; + } } - v22 = v20 << 6; - if ( plr[v8]._pIFlags & 2 ) - { - v23 = random(7, v22 >> 3); - v24 = plr[v8]._pMaxHP; - v25 = &plr[v8]._pHitPoints; - *v25 += v23; - if ( plr[v8]._pHitPoints > v24 ) - *v25 = v24; - v26 = &plr[v8]._pHPBase; - v27 = plr[v8]._pMaxHPBase; - *v26 += v23; - if ( *v26 > v27 ) - *v26 = v27; + int skdam = dam * 64; + if ( plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE ) { + int 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 = 1; } - if ( v28 == myplr ) - NetSendCmdDamage(1u, bPlr, v22); - StartPlrHit(arglist, v22, 0); - } - else - { - v16 = GetDirection(plr[v5].WorldX, plr[v5].WorldY, plr[v8].WorldX, plr[v8].WorldY); - StartPlrBlock(arglist, v16); + if ( pnum == myplr ) { + NetSendCmdDamage(TRUE, p, skdam); + } + StartPlrHit(p, skdam, FALSE); } - v30 = 1; + + rv = TRUE; } - return v30; + + return rv; } BOOL __fastcall PlrHitObj(int pnum, int mx, int my) diff --git a/Source/player.h b/Source/player.h index 22f81d1bc..62fa2208b 100644 --- a/Source/player.h +++ b/Source/player.h @@ -75,7 +75,7 @@ BOOL __fastcall PM_DoWalk2(int pnum); BOOL __fastcall PM_DoWalk3(int pnum); BOOL __fastcall WeaponDur(int pnum, int durrnd); bool __fastcall PlrHitMonst(int pnum, int m); -bool __fastcall PlrHitPlr(int pnum, char p); +BOOL __fastcall PlrHitPlr(int pnum, char p); BOOL __fastcall PlrHitObj(int pnum, int mx, int my); int __fastcall PM_DoAttack(int pnum); BOOL __fastcall PM_DoRangeAttack(int pnum);