Browse Source

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
pull/25/head
Anders Jenbo 8 years ago committed by Robin Eklind
parent
commit
b162e22ae7
  1. 478
      Source/monster.cpp
  2. 10
      Source/monster.h

478
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)

10
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);

Loading…
Cancel
Save