Browse Source

Merge pull request #1164 from galaxyhaxz/PMonster

ProcessMonsters
pull/114/head
Robin Eklind 7 years ago committed by GitHub
parent
commit
024ebaf602
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 249
      Source/monster.cpp

249
Source/monster.cpp

@ -4530,183 +4530,142 @@ void DeleteMonsterList()
void ProcessMonsters() void ProcessMonsters()
{ {
int v0; // edi int i, mi, mx, my, _menemy;
int v1; // esi BOOL raflag;
int v2; // ecx MonsterStruct *Monst;
int v3; // eax
char *v4; // ebx
unsigned int v5; // eax
int v6; // eax
int v7; // edx
int v8; // eax
unsigned int v9; // eax
int v10; // eax
BOOLEAN v11; // zf
char *v12; // ecx
char *v13; // eax
int v14; // ecx
int v15; // eax
BYTE v16; // al
int v17; // ecx
BOOLEAN v18; // eax
int v19; // eax
int v20; // ecx
int *v21; // eax
int *v22; // eax
int v23; // [esp+0h] [ebp-Ch]
int v24; // [esp+4h] [ebp-8h]
int v25; // [esp+8h] [ebp-4h]
DeleteMonsterList(); DeleteMonsterList();
v24 = 0;
if (nummonsters <= 0) /// ASSERT: assert((DWORD)nummonsters <= MAXMONSTERS);
goto LABEL_60; for(i = 0; i < nummonsters; i++) {
do { mi = monstactive[i];
v25 = 0; Monst = &monster[mi];
v23 = monstactive[v24]; raflag = FALSE;
v0 = v23; if(gbMaxPlayers > 1) {
v1 = v23; SetRndSeed(Monst->_mAISeed);
if ((unsigned char)gbMaxPlayers > 1u) { Monst->_mAISeed = GetRndSeed();
SetRndSeed(monster[v1]._mAISeed); }
monster[v1]._mAISeed = GetRndSeed(); if(!(monster[mi]._mFlags & MFLAG_NOHEAL) && Monst->_mhitpoints < Monst->_mmaxhp && Monst->_mhitpoints >> 6 > 0) {
} if(Monst->mLevel <= 1) {
if (!(monster[v1]._mFlags & MFLAG_NOHEAL)) { Monst->_mhitpoints += Monst->mLevel;
v2 = monster[v1]._mhitpoints; } else {
if (v2 < monster[v1]._mmaxhp && v2 >> 6 > 0) { Monst->_mhitpoints += Monst->mLevel >> 1;
v3 = SLOBYTE(monster[v1].mLevel);
if ((char)v3 > 1)
v3 = (char)v3 >> 1;
monster[v1]._mhitpoints = v2 + v3;
} }
} }
v4 = &dFlags[monster[v1]._mx][monster[v1]._my]; mx = Monst->_mx;
if (*v4 & DFLAG_VISIBLE && monster[v1]._msquelch == 0 && monster[v1].MType->mtype == MT_CLEAVER) my = Monst->_my;
if(dFlags[mx][my] & DFLAG_VISIBLE && Monst->_msquelch == 0 && Monst->MType->mtype == MT_CLEAVER) {
PlaySFX(USFX_CLEAVER); PlaySFX(USFX_CLEAVER);
if (monster[v1]._mFlags & MFLAG_TARGETS_MONSTER) { }
v5 = monster[v1]._menemy; if(Monst->_mFlags & MFLAG_TARGETS_MONSTER) {
if (v5 >= MAXMONSTERS) _menemy = Monst->_menemy;
app_fatal("Illegal enemy monster %d for monster \"%s\"", v5, monster[v1].mName); if((DWORD)_menemy >= MAXMONSTERS) {
v6 = monster[v1]._menemy; app_fatal("Illegal enemy monster %d for monster \"%s\"", _menemy, Monst->mName);
v7 = monster[v6]._mfutx; }
monster[v1]._lastx = v7; Monst->_lastx = monster[Monst->_menemy]._mfutx;
monster[v1]._menemyx = v7; Monst->_menemyx = Monst->_lastx;
v8 = monster[v6]._mfuty; Monst->_lasty = monster[Monst->_menemy]._mfuty;
monster[v1]._menemyy = v8; Monst->_menemyy = Monst->_lasty;
monster[v1]._lasty = v8;
} else { } else {
v9 = monster[v1]._menemy; _menemy = Monst->_menemy;
if (v9 >= MAX_PLRS) if((DWORD)_menemy >= MAX_PLRS) {
app_fatal("Illegal enemy player %d for monster \"%s\"", v9, monster[v1].mName); app_fatal("Illegal enemy player %d for monster \"%s\"", _menemy, Monst->mName);
v10 = monster[v1]._menemy; }
v11 = (*v4 & DFLAG_VISIBLE) == 0; Monst->_menemyx = plr[Monst->_menemy]._px;
v12 = (char *)&plr[v10]._px; Monst->_menemyy = plr[Monst->_menemy]._py;
v13 = (char *)&plr[v10]._py; if(dFlags[mx][my] & DFLAG_VISIBLE) {
monster[v1]._menemyx = *v12; Monst->_msquelch = 255;
monster[v1]._menemyy = *v13; Monst->_lastx = plr[Monst->_menemy]._px;
if (v11) { Monst->_lasty = plr[Monst->_menemy]._py;
v16 = monster[v1]._msquelch; } else if(Monst->_msquelch != 0 && Monst->_mAi != MT_DIABLO) { /// BUGFIX: change '_mAi' to 'MType->mtype'
if (v16 != 0 && monster[v1]._mAi != MT_DIABLO) /// BUGFIX: test `MT_DIABLO` with 'MType->mtype' instead of '_mAi' Monst->_msquelch--;
monster[v1]._msquelch = v16 - 1;
} else {
v14 = *(_DWORD *)v12;
v15 = *(_DWORD *)v13;
monster[v1]._msquelch = UCHAR_MAX;
monster[v1]._lastx = v14;
monster[v1]._lasty = v15;
} }
v0 = v23;
} }
while (1) { do {
v17 = v0; if(!(Monst->_mFlags & MFLAG_SEARCH)) {
if (monster[v1]._mFlags & MFLAG_SEARCH) { AiProc[Monst->_mAi](mi);
v18 = MAI_Path(v0); } else if(!MAI_Path(mi)) {
if (v18) AiProc[Monst->_mAi](mi);
goto LABEL_30;
v17 = v0;
} }
AiProc[(unsigned char)monster[v1]._mAi](v17); switch(Monst->_mmode) {
LABEL_30:
switch (monster[v1]._mmode) {
case MM_STAND: case MM_STAND:
v19 = M_DoStand(v0); raflag = M_DoStand(mi);
goto LABEL_48; break;
case MM_WALK: case MM_WALK:
v19 = M_DoWalk(v0); raflag = M_DoWalk(mi);
goto LABEL_48; break;
case MM_WALK2: case MM_WALK2:
v19 = M_DoWalk2(v0); raflag = M_DoWalk2(mi);
goto LABEL_48; break;
case MM_WALK3: case MM_WALK3:
v19 = M_DoWalk3(v0); raflag = M_DoWalk3(mi);
goto LABEL_48; break;
case MM_ATTACK: case MM_ATTACK:
v19 = M_DoAttack(v0); raflag = M_DoAttack(mi);
goto LABEL_48; break;
case MM_GOTHIT: case MM_GOTHIT:
v19 = M_DoGotHit(v0); raflag = M_DoGotHit(mi);
goto LABEL_48; break;
case MM_DEATH: case MM_DEATH:
v19 = M_DoDeath(v0); raflag = M_DoDeath(mi);
goto LABEL_48; break;
case MM_SATTACK: case MM_SATTACK:
v19 = M_DoSAttack(v0); raflag = M_DoSAttack(mi);
goto LABEL_48; break;
case MM_FADEIN: case MM_FADEIN:
v19 = M_DoFadein(v0); raflag = M_DoFadein(mi);
goto LABEL_48; break;
case MM_FADEOUT: case MM_FADEOUT:
v19 = M_DoFadeout(v0); raflag = M_DoFadeout(mi);
goto LABEL_48; break;
case MM_RATTACK: case MM_RATTACK:
v19 = M_DoRAttack(v0); raflag = M_DoRAttack(mi);
goto LABEL_48; break;
case MM_SPSTAND: case MM_SPSTAND:
v19 = M_DoSpStand(v0); raflag = M_DoSpStand(mi);
goto LABEL_48; break;
case MM_RSPATTACK: case MM_RSPATTACK:
v19 = M_DoRSpAttack(v0); raflag = M_DoRSpAttack(mi);
goto LABEL_48; break;
case MM_DELAY: case MM_DELAY:
v19 = M_DoDelay(v0); raflag = M_DoDelay(mi);
goto LABEL_48; break;
case MM_CHARGE: case MM_CHARGE:
goto LABEL_51; raflag = FALSE;
break;
case MM_STONE: case MM_STONE:
v19 = M_DoStone(v0); raflag = M_DoStone(mi);
goto LABEL_48; break;
case MM_HEAL: case MM_HEAL:
v19 = M_DoHeal(v0); raflag = M_DoHeal(mi);
goto LABEL_48; break;
case MM_TALK: case MM_TALK:
v19 = M_DoTalk(v0); raflag = M_DoTalk(mi);
LABEL_48:
v25 = v19;
break; break;
} }
if (!v25) if(raflag) {
break; GroupUnity(mi);
GroupUnity(v0); }
} } while(raflag);
LABEL_51: if(Monst->_mmode != MM_STONE) {
if (monster[v1]._mmode != MM_STONE) { Monst->_mAnimCnt++;
v20 = monster[v1]._mFlags; if(!(Monst->_mFlags & MFLAG_ALLOW_SPECIAL) && Monst->_mAnimCnt >= Monst->_mAnimDelay) {
v21 = &monster[v1]._mAnimCnt; Monst->_mAnimCnt = 0;
++*v21; if(Monst->_mFlags & MFLAG_LOCK_ANIMATION) {
if (!(v20 & MFLAG_ALLOW_SPECIAL) && monster[v1]._mAnimCnt >= monster[v1]._mAnimDelay) { Monst->_mAnimFrame--;
*v21 = 0; if(Monst->_mAnimFrame == 0) {
v22 = &monster[v1]._mAnimFrame; Monst->_mAnimFrame = Monst->_mAnimLen;
if (v20 & MFLAG_LOCK_ANIMATION) { }
v11 = (*v22)-- == 1; } else {
if (v11) Monst->_mAnimFrame++;
*v22 = monster[v1]._mAnimLen; if(Monst->_mAnimFrame > Monst->_mAnimLen) {
} else if (++*v22 > monster[v1]._mAnimLen) { Monst->_mAnimFrame = 1;
*v22 = 1; }
} }
} }
} }
++v24; }
} while (v24 < nummonsters);
LABEL_60:
DeleteMonsterList(); DeleteMonsterList();
} }
// 679660: using guessed type char gbMaxPlayers; // 679660: using guessed type char gbMaxPlayers;

Loading…
Cancel
Save