From b162e22ae7836767edd40ca44f947793fc0715ed Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 27 Oct 2018 16:07:39 +0200 Subject: [PATCH] monster.cpp (#436) * Clean up M_StartHeal and M_ChangeLightOffset * Clean up M_DoStand * Clean up M_DoSAttack * Clean up M_DoWalk* * Clean up M_TryM2MHit --- Source/monster.cpp | 478 +++++++++++++++++---------------------------- Source/monster.h | 10 +- 2 files changed, 188 insertions(+), 300 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index d1a9264d2..265f3de5b 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2257,298 +2257,198 @@ void __fastcall M_StartFadeout(int i, int md, BOOL backwards) void __fastcall M_StartHeal(int i) { - int v1; // edi - int v2; // esi - CMonster *v3; // eax - unsigned char *v4; // ecx - int v5; // eax - - v1 = i; if ((DWORD)i >= MAXMONSTERS) TermMsg("M_StartHeal: Invalid monster %d", i); - v2 = v1; - if (monster[v1].MType == NULL) - TermMsg("M_StartHeal: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v3 = monster[v2].MType; - v4 = v3->Anims[MA_SPECIAL].Data[monster[v2]._mdir]; - monster[v2]._mAnimData = v4; - v5 = v3->Anims[MA_SPECIAL].Frames; - monster[v2]._mFlags |= 2u; - monster[v2]._mAnimFrame = v5; - monster[v2]._mmode = MM_HEAL; - monster[v2]._mVar1 = monster[v2]._mmaxhp / (16 * (random(97, 5) + 4)); + if (monster[i].MType == NULL) + TermMsg("M_StartHeal: Monster %d \"%s\" MType NULL", i, monster[i].mName); + + MonsterStruct *Monst = &monster[i]; + Monst->_mAnimData = Monst->MType->Anims[MA_SPECIAL].Data[Monst->_mdir]; + Monst->_mAnimFrame = Monst->MType->Anims[MA_SPECIAL].Frames; + Monst->_mFlags |= 2; + Monst->_mmode = MM_HEAL; + Monst->_mVar1 = Monst->_mmaxhp / (16 * (random(97, 5) + 4)); } void __fastcall M_ChangeLightOffset(int monst) { - int v1; // esi - int v2; // ecx - int v3; // eax - int v4; // esi - int v5; // edx - int v6; // eax - signed int v7; // esi - int v8; // edx - signed int v9; // esi - - v1 = monst; - if ((unsigned int)monst >= MAXMONSTERS) + if ((DWORD)monst >= MAXMONSTERS) TermMsg("M_ChangeLightOffset: Invalid monster %d", monst); - v2 = v1; - v3 = monster[v1]._myoff; - v4 = monster[v1]._mxoff; - v3 *= 2; - v5 = v4 + v3; - v6 = v3 - v4; - if (v5 >= 0) { - v7 = 1; + + int lx = monster[monst]._mxoff + 2 * monster[monst]._myoff; + int ly = 2 * monster[monst]._myoff - monster[monst]._mxoff; + + int sign; + if (lx < 0) { + sign = -1; + lx = -lx; } else { - v7 = -1; - v5 = -v5; + sign = 1; } - v8 = v7 * (v5 >> 3); - if (v6 >= 0) { - v9 = 1; + + int _mxoff = sign * (lx >> 3); + int _myoff; + if (ly < 0) { + _myoff = -1; + ly = -ly; } else { - v9 = -1; - v6 = -v6; + _myoff = 1; } - ChangeLightOff((unsigned char)monster[v2].mlid, v8, v9 * (v6 >> 3)); + + ChangeLightOff(monster[monst].mlid, _mxoff, _myoff * (ly >> 3)); } int __fastcall M_DoStand(int i) { - int v1; // edi - int v2; // esi - CMonster *v3; // eax - int v4; // ecx - unsigned char *v5; // eax - - v1 = i; if ((DWORD)i >= MAXMONSTERS) TermMsg("M_DoStand: Invalid monster %d", i); - v2 = v1; - if (monster[v1].MType == NULL) - TermMsg("M_DoStand: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v3 = monster[v2].MType; - v4 = monster[v2]._mdir; - if (v3->mtype == MT_GOLEM) - v5 = v3->Anims[MA_WALK].Data[v4]; - else - v5 = v3->Anims[MA_STAND].Data[v4]; - monster[v2]._mAnimData = v5; - if (monster[v2]._mAnimFrame == monster[v2]._mAnimLen) - M_Enemy(v1); - ++monster[v2]._mVar2; - return 0; -} - -int __fastcall M_DoWalk(int i) -{ - int v1; // ebx - int v2; // esi - int v3; // edi - int v4; // eax - int v5; // edi - int v6; // ecx - int v7; // edx - int v8; // eax - bool v9; // zf - int v10; // ecx - int v11; // edx - int v12; // eax - int v13; // ecx - - v1 = i; - if ((DWORD)i >= MAXMONSTERS) - TermMsg("M_DoWalk: Invalid monster %d", i); - v2 = v1; - v3 = 0; - if (monster[v1].MType == NULL) - TermMsg("M_DoWalk: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v4 = monster[v2]._mVar8; - if (v4 == monster[v2].MType->Anims[MA_WALK].Frames) { - v5 = monster[v2]._my; - v6 = monster[v2]._mx; - dMonster[0][v5 + 112 * monster[v2]._mx] = 0; - v7 = v6 + monster[v2]._mVar1; - monster[v2]._mx = v7; - v8 = v5 + monster[v2]._mVar2; - v9 = monster[v2]._uniqtype == 0; - monster[v2]._my = v8; - dMonster[0][v8 + 112 * v7] = v1 + 1; - if (!v9) - ChangeLightXY((unsigned char)monster[v2].mlid, v7, v8); - M_StartStand(v1, monster[v2]._mdir); - v3 = 1; - } else if (!monster[v2]._mAnimCnt) { - v10 = monster[v2]._mxvel; - v11 = monster[v2]._myvel; - monster[v2]._mVar8 = v4 + 1; - monster[v2]._mVar6 += v10; - v12 = monster[v2]._mVar6 >> 4; - monster[v2]._mVar7 += v11; - v13 = monster[v2]._mVar7 >> 4; - monster[v2]._mxoff = v12; - monster[v2]._myoff = v13; - } - if (monster[v2]._uniqtype != 0) - M_ChangeLightOffset(v1); - return v3; -} - -int __fastcall M_DoWalk2(int i) -{ - int v1; // ebp - int v2; // esi - int v3; // eax - bool v4; // zf - int v5; // edi - int v6; // ecx - int v7; // edx - int v8; // eax - int v9; // ecx - - v1 = i; - if ((DWORD)i >= MAXMONSTERS) - TermMsg("M_DoWalk2: Invalid monster %d", i); - v2 = v1; - if (monster[v1].MType == NULL) - TermMsg("M_DoWalk2: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v3 = monster[v2]._mVar8; - if (v3 == monster[v2].MType->Anims[MA_WALK].Frames) { - v4 = monster[v2]._uniqtype == 0; - dMonster[0][monster[v2]._mVar2 + 112 * monster[v2]._mVar1] = 0; - if (!v4) - ChangeLightXY((unsigned char)monster[v2].mlid, monster[v2]._mx, monster[v2]._my); - M_StartStand(v1, monster[v2]._mdir); - v5 = 1; - } else { - if (!monster[v2]._mAnimCnt) { - v6 = monster[v2]._mxvel; - v7 = monster[v2]._myvel; - monster[v2]._mVar8 = v3 + 1; - monster[v2]._mVar6 += v6; - v8 = monster[v2]._mVar6 >> 4; - monster[v2]._mVar7 += v7; - v9 = monster[v2]._mVar7 >> 4; - monster[v2]._mxoff = v8; - monster[v2]._myoff = v9; - } - v5 = 0; - } - if (monster[v2]._uniqtype != 0) - M_ChangeLightOffset(v1); - return v5; -} + if (monster[i].MType == NULL) + TermMsg("M_DoStand: Monster %d \"%s\" MType NULL", i, monster[i].mName); -int __fastcall M_DoWalk3(int i) -{ - int v1; // ebp - int v2; // esi - int v3; // eax - int v4; // edi - int v5; // edx - int v6; // ecx - int v7; // edx - char *v8; // eax - bool v9; // zf - int v10; // edi - int v11; // ecx - int v12; // edx - int v13; // eax - int v14; // ecx + MonsterStruct *Monst = &monster[i]; + if (Monst->MType->mtype == MT_GOLEM) + Monst->_mAnimData = Monst->MType->Anims[MA_WALK].Data[Monst->_mdir]; + else + Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir]; - v1 = i; - if ((DWORD)i >= MAXMONSTERS) - TermMsg("M_DoWalk3: Invalid monster %d", i); - v2 = v1; - if (monster[v1].MType == NULL) - TermMsg("M_DoWalk3: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v3 = monster[v2]._mVar8; - if (v3 == monster[v2].MType->Anims[MA_WALK].Frames) { - v4 = monster[v2]._mVar2; - v5 = monster[v2]._my + 112 * monster[v2]._mx; - monster[v2]._my = v4; - v6 = monster[v2]._mVar5; - dMonster[0][v5] = 0; - v7 = monster[v2]._mVar1; - monster[v2]._mx = v7; - v8 = &dFlags[monster[v2]._mVar4][v6]; - *v8 &= ~DFLAG_MONSTER; - v9 = monster[v2]._uniqtype == 0; - dMonster[0][v4 + 112 * v7] = v1 + 1; - if (!v9) - ChangeLightXY((unsigned char)monster[v2].mlid, v7, v4); - M_StartStand(v1, monster[v2]._mdir); - v10 = 1; - } else { - if (!monster[v2]._mAnimCnt) { - v11 = monster[v2]._mxvel; - v12 = monster[v2]._myvel; - monster[v2]._mVar8 = v3 + 1; - monster[v2]._mVar6 += v11; - v13 = monster[v2]._mVar6 >> 4; - monster[v2]._mVar7 += v12; - v14 = monster[v2]._mVar7 >> 4; - monster[v2]._mxoff = v13; - monster[v2]._myoff = v14; - } - v10 = 0; - } - if (monster[v2]._uniqtype != 0) - M_ChangeLightOffset(v1); - return v10; + if (Monst->_mAnimFrame == Monst->_mAnimLen) + M_Enemy(i); + + Monst->_mVar2++; + + return FALSE; +} + +BOOL __fastcall M_DoWalk(int i) +{ + if ((DWORD)i >= MAXMONSTERS) + TermMsg("M_DoWalk: Invalid monster %d", i); + + if (monster[i].MType == NULL) + TermMsg("M_DoWalk: Monster %d \"%s\" MType NULL", i, monster[i].mName); + + BOOL rv = FALSE; + if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { + dMonster[monster[i]._mx][monster[i]._my] = 0; + monster[i]._mx += monster[i]._mVar1; + monster[i]._my += monster[i]._mVar2; + dMonster[monster[i]._mx][monster[i]._my] = i + 1; + if (monster[i]._uniqtype != 0) + ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); + M_StartStand(i, monster[i]._mdir); + rv = TRUE; + } else if (!monster[i]._mAnimCnt) { + monster[i]._mVar8++; + monster[i]._mVar6 += monster[i]._mxvel; + monster[i]._mVar7 += monster[i]._myvel; + monster[i]._mxoff = monster[i]._mVar6 >> 4; + monster[i]._myoff = monster[i]._mVar7 >> 4; + } + + if (monster[i]._uniqtype != 0) + M_ChangeLightOffset(i); + + return rv; +} + +BOOL __fastcall M_DoWalk2(int i) +{ + if ((DWORD)i >= MAXMONSTERS) + TermMsg("M_DoWalk2: Invalid monster %d", i); + + if (monster[i].MType == NULL) + TermMsg("M_DoWalk2: Monster %d \"%s\" MType NULL", i, monster[i].mName); + + BOOL rv; + if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { + dMonster[monster[i]._mVar1][monster[i]._mVar2] = 0; + if (monster[i]._uniqtype != 0) + ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); + M_StartStand(i, monster[i]._mdir); + rv = TRUE; + } else { + if (!monster[i]._mAnimCnt) { + monster[i]._mVar8++; + monster[i]._mVar6 += monster[i]._mxvel; + monster[i]._mVar7 += monster[i]._myvel; + monster[i]._mxoff = monster[i]._mVar6 >> 4; + monster[i]._myoff = monster[i]._mVar7 >> 4; + } + rv = FALSE; + } + if (monster[i]._uniqtype != 0) + M_ChangeLightOffset(i); + + return rv; +} + +BOOL __fastcall M_DoWalk3(int i) +{ + if ((DWORD)i >= MAXMONSTERS) + TermMsg("M_DoWalk3: Invalid monster %d", i); + + if (monster[i].MType == NULL) + TermMsg("M_DoWalk3: Monster %d \"%s\" MType NULL", i, monster[i].mName); + + BOOL rv; + if (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) { + dMonster[monster[i]._mx][monster[i]._my] = 0; + monster[i]._mx = monster[i]._mVar1; + monster[i]._my = monster[i]._mVar2; + dFlags[monster[i]._mVar4][monster[i]._mVar5] &= ~DFLAG_MONSTER; + dMonster[monster[i]._mx][monster[i]._my] = i + 1; + if ( monster[i]._uniqtype ) + ChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my); + M_StartStand(i, monster[i]._mdir); + rv = TRUE; + } else { + if (!monster[i]._mAnimCnt) { + monster[i]._mVar8++; + monster[i]._mVar6 += monster[i]._mxvel; + monster[i]._mVar7 += monster[i]._myvel; + monster[i]._mxoff = monster[i]._mVar6 >> 4; + monster[i]._myoff = monster[i]._mVar7 >> 4; + } + rv = FALSE; + } + if (monster[i]._uniqtype != 0) + M_ChangeLightOffset(i); + + return rv; } void __fastcall M_TryM2MHit(int i, int mid, int hper, int mind, int maxd) { - int v5; // edi - //int v6; // ST08_4 - int v7; // esi - int v8; // ebx - //int v9; // eax - int v11; // eax - BOOL ret; // [esp+Ch] [ebp-Ch] - char v13[4]; // [esp+10h] [ebp-8h] - char arglist[4]; // [esp+14h] [ebp-4h] - - v5 = mid; - *(_DWORD *)arglist = mid; - *(_DWORD *)v13 = i; - if ((unsigned int)mid >= MAXMONSTERS) { - TermMsg("M_TryM2MHit: Invalid monster %d", mid); - //i = v6; - } - v7 = v5; - if (monster[v5].MType == NULL) - TermMsg("M_TryM2MHit: Monster %d \"%s\" MType NULL", v5, monster[v7].mName); - if (monster[v7]._mhitpoints >> 6 > 0 - && (monster[v7].MType->mtype != MT_ILLWEAV || _LOBYTE(monster[v7]._mgoal) != 2)) { - v8 = random(4, 100); - if (monster[v7]._mmode == MM_STONE) - v8 = 0; - //_LOBYTE(v9) = CheckMonsterHit(*(int *)arglist, &ret); - if (!CheckMonsterHit(*(int *)arglist, &ret) && v8 < hper) { - v11 = (mind + random(5, maxd - mind + 1)) << 6; - monster[v7]._mhitpoints -= v11; - if (monster[v7]._mhitpoints >> 6 > 0) { - if (monster[v7]._mmode == MM_STONE) { - M2MStartHit(*(int *)arglist, *(int *)v13, v11); - goto LABEL_15; - } - M2MStartHit(*(int *)arglist, *(int *)v13, v11); - } else { - if (monster[v7]._mmode == MM_STONE) { - M2MStartKill(*(int *)v13, *(int *)arglist); - LABEL_15: - monster[v7]._mmode = MM_STONE; - return; - } - M2MStartKill(*(int *)v13, *(int *)arglist); - } - } - } + if ((DWORD)mid >= MAXMONSTERS) { + TermMsg("M_TryM2MHit: Invalid monster %d", mid); + } + if (monster[mid].MType == NULL) + TermMsg("M_TryM2MHit: Monster %d \"%s\" MType NULL", mid, monster[mid].mName); + if (monster[mid]._mhitpoints >> 6 > 0 && (monster[mid].MType->mtype != MT_ILLWEAV || monster[mid]._mgoal != 2)) { + int hit = random(4, 100); + if (monster[mid]._mmode == MM_STONE) + hit = 0; + BOOL ret; + if (!CheckMonsterHit(mid, &ret) && hit < hper) { + int dam = (mind + random(5, maxd - mind + 1)) << 6; + monster[mid]._mhitpoints -= dam; + if (monster[mid]._mhitpoints >> 6 <= 0) { + if (monster[mid]._mmode == MM_STONE) { + M2MStartKill(i, mid); + monster[mid]._mmode = MM_STONE; + } else { + M2MStartKill(i, mid); + } + } else { + if (monster[mid]._mmode == MM_STONE) { + M2MStartHit(mid, i, dam); + monster[mid]._mmode = MM_STONE; + } else { + M2MStartHit(mid, i, dam); + } + } + } + } } void __fastcall M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam) @@ -2900,36 +2800,24 @@ int __fastcall M_DoRSpAttack(int i) return 1; } -int __fastcall M_DoSAttack(int i) +BOOL __fastcall M_DoSAttack(int i) { - int v1; // ebx - int v2; // esi - CMonster **v3; // edi - bool v4; // zf - - v1 = i; if ((DWORD)i >= MAXMONSTERS) TermMsg("M_DoSAttack: Invalid monster %d", i); - v2 = v1; - v3 = &monster[v1].MType; - v4 = *v3 == NULL; - if (*v3 == NULL) { - TermMsg("M_DoSAttack: Monster %d \"%s\" MType NULL", v1, monster[v2].mName); - v4 = *v3 == NULL; + if (monster[i].MType == NULL) + TermMsg("M_DoSAttack: Monster %d \"%s\" MType NULL", i, monster[i].mName); + if (monster[i].MType == NULL) // BUGFIX: should check MData + TermMsg("M_DoSAttack: Monster %d \"%s\" MData NULL", i, monster[i].mName); + + if (monster[i]._mAnimFrame == monster[i].MData->mAFNum2) + M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit2, monster[i].mMinDamage2, monster[i].mMaxDamage2); + + if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + M_StartStand(i, monster[i]._mdir); + return TRUE; } - if (v4) - TermMsg("M_DoSAttack: Monster %d \"%s\" MData NULL", v1, monster[v2].mName); - if (monster[v2]._mAnimFrame == monster[v2].MData->mAFNum2) - M_TryH2HHit( - v1, - monster[v2]._menemy, - (unsigned char)monster[v2].mHit2, - (unsigned char)monster[v2].mMinDamage2, - (unsigned char)monster[v2].mMaxDamage2); - if (monster[v2]._mAnimFrame != monster[v2]._mAnimLen) - return 0; - M_StartStand(v1, monster[v2]._mdir); - return 1; + + return FALSE; } int __fastcall M_DoFadein(int i) diff --git a/Source/monster.h b/Source/monster.h index ea6c1d22f..5fb3bf978 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -66,16 +66,16 @@ void __fastcall M_StartFadein(int i, int md, BOOL backwards); void __fastcall M_StartFadeout(int i, int md, BOOL backwards); void __fastcall M_StartHeal(int i); void __fastcall M_ChangeLightOffset(int monst); -int __fastcall M_DoStand(int i); -int __fastcall M_DoWalk(int i); -int __fastcall M_DoWalk2(int i); -int __fastcall M_DoWalk3(int i); +BOOL __fastcall M_DoStand(int i); +BOOL __fastcall M_DoWalk(int i); +BOOL __fastcall M_DoWalk2(int i); +BOOL __fastcall M_DoWalk3(int i); void __fastcall M_TryM2MHit(int i, int mid, int hper, int mind, int maxd); void __fastcall M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam); int __fastcall M_DoAttack(int i); int __fastcall M_DoRAttack(int i); int __fastcall M_DoRSpAttack(int i); -int __fastcall M_DoSAttack(int i); +BOOL __fastcall M_DoSAttack(int i); int __fastcall M_DoFadein(int i); int __fastcall M_DoFadeout(int i); int __fastcall M_DoHeal(int i);