diff --git a/Source/monster.cpp b/Source/monster.cpp index 04ad475ce..5bc1058fe 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -4129,159 +4129,73 @@ void MAI_Rhino(int i) void MAI_Counselor(int i) { - int v1; // ebx - int v2; // esi - int v3; // ecx - int v4; // edi - int v5; // edx - int v6; // ebp - char v9; // al - int v10; // ecx - BOOLEAN v11; // zf - BOOLEAN v12; // sf - //unsigned char v13; // of - int v14; // edx - int v15; // ecx - int v16; // ebx - int v17; // eax - int v18; // ebx - int v19; // edx - int v20; // ecx - //int v21; // eax - int v22; // eax - //int v23; // ST1C_4 - int v25; // eax - //int v26; // ST1C_4 - int v27; // edx - int v28; // eax - int v29; // eax - int v30; // ecx - //int v31; // eax - int v32; // eax - int v33; // eax - int v34; // eax - int md; // [esp+8h] [ebp-14h] - int arglist; // [esp+Ch] [ebp-10h] - int y2; // [esp+10h] [ebp-Ch] - int x2; // [esp+14h] [ebp-8h] - int v39; // [esp+18h] [ebp-4h] + int mx, my, fx, fy; + int dist, md, v; + MonsterStruct *Monst; - v1 = i; - arglist = i; if ((DWORD)i >= MAXMONSTERS) app_fatal("MAI_Counselor: Invalid monster %d", i); - v2 = v1; - if (monster[v1]._mmode == MM_STAND && monster[v2]._msquelch != 0) { - v3 = monster[v2]._mx; - x2 = (unsigned char)monster[v2]._menemyx; - v4 = v3 - x2; - v5 = monster[v2]._my; - y2 = (unsigned char)monster[v2]._menemyy; - v6 = v5 - y2; - md = GetDirection(v3, v5, monster[v2]._lastx, monster[v2]._lasty); - if (monster[v2]._msquelch < UCHAR_MAX) /* check sign */ - MonstCheckDoors(v1); - v39 = random(121, 100); - v9 = monster[v2]._mgoal; - if (v9 == MGOAL_RETREAT) { - v10 = monster[v2]._mgoalvar1; - //v13 = __OFSUB__(v10, 3); - v11 = v10 == 3; - v12 = v10 - 3 < 0; - v14 = v10 + 1; - v15 = v1; - monster[v2]._mgoalvar1 = v14; - if (v12 | v11) { //if ((unsigned char)(v12 ^ v13) | v11) { - M_CallWalk(v1, opposite[md]); - goto LABEL_39; + if (monster[i]._mmode == MM_STAND && monster[i]._msquelch != 0) { + Monst = monster + i; + fx = Monst->_menemyx; + fy = Monst->_menemyy; + mx = Monst->_mx - fx; + my = Monst->_my - fy; + md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty); + if (Monst->_msquelch < UCHAR_MAX) + MonstCheckDoors(i); + v = random(121, 100); + if (Monst->_mgoal == MGOAL_RETREAT) { + if (Monst->_mgoalvar1++ <= 3) + M_CallWalk(i, opposite[md]); + else { + Monst->_mgoal = MGOAL_NORMAL; + M_StartFadein(i, md, TRUE); } - goto LABEL_21; - } - if (v9 == MGOAL_MOVE) { - v16 = abs(v6); - if (abs(v4) <= v16) - v17 = abs(v6); + } else if (Monst->_mgoal == MGOAL_MOVE) { + if (abs(mx) > abs(my)) + dist = abs(mx); else - v17 = abs(v4); - v18 = v17; - if (abs(v4) < 2 && abs(v6) < 2 - || monster[v2]._msquelch != UCHAR_MAX - || dTransVal[monster[v2]._mx][monster[v2]._my] != dTransVal[x2][y2]) { - v1 = arglist; - LABEL_20: - v15 = v1; - LABEL_21: - _LOBYTE(monster[v2]._mgoal) = MGOAL_NORMAL; - M_StartFadein(v15, md, TRUE); - goto LABEL_39; - } - v19 = 2 * v18; - v1 = arglist; - v20 = monster[v2]._mgoalvar1; - monster[v2]._mgoalvar1 = v20 + 1; - if (v20 >= v19) { - //_LOBYTE(v21) = DirOK(arglist, md); - if (DirOK(arglist, md)) - goto LABEL_20; - } - M_RoundWalk(arglist, md, &monster[v2]._mgoalvar2); - LABEL_39: - if (monster[v2]._mmode == MM_STAND) { - v34 = random(125, 10); - M_StartDelay(v1, v34 + 5); - } - return; - } - if (v9 != MGOAL_NORMAL) - goto LABEL_39; - v22 = abs(v4); - //v24 = v23; - if (v22 >= 2 || (v25 = abs(v6), v25 >= 2)) /* v24 = v26, */ - { - if (v39 < 5 * ((unsigned char)monster[v2]._mint + 10)) { - //_LOBYTE(v31) = LineClear(monster[v2]._mx, monster[v2]._my, x2, y2); - if (LineClear(monster[v2]._mx, monster[v2]._my, x2, y2)) { - v32 = random( - 77, - (unsigned char)monster[v2].mMaxDamage - (unsigned char)monster[v2].mMinDamage + 1); - M_StartRAttack( - v1, - (unsigned char)counsmiss[(unsigned char)monster[v2]._mint], /* counsmiss is local */ - (unsigned char)monster[v2].mMinDamage + v32); - goto LABEL_39; + dist = abs(my); + if ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) { + if (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) { + M_RoundWalk(i, md, &Monst->_mgoalvar2); + } else { + Monst->_mgoal = MGOAL_NORMAL; + M_StartFadein(i, md, TRUE); } + } else { + Monst->_mgoal = MGOAL_NORMAL; + M_StartFadein(i, md, TRUE); } - if (random(124, 100) < 30) { - v27 = md; - _LOBYTE(monster[v2]._mgoal) = MGOAL_MOVE; - goto LABEL_29; - } - } else { - v27 = md; - v28 = monster[v2]._mmaxhp >> 1; - //v13 = __OFSUB__(monster[v2]._mhitpoints, v28); - v12 = monster[v2]._mhitpoints - v28 < 0; - monster[v2]._mdir = md; - if (v12) { //if (v12 ^ v13) { - _LOBYTE(monster[v2]._mgoal) = MGOAL_RETREAT; - LABEL_29: - monster[v2]._mgoalvar1 = 0; - M_StartFadeout(v1, v27, FALSE); - goto LABEL_39; - } - if (monster[v2]._mVar1 == MM_DELAY - || (v29 = random(105, 100), - v30 = 2 * (unsigned char)monster[v2]._mint + 20, - v29 < v30)) { - M_StartRAttack(v1, -1, 0); - AddMissile(monster[v2]._mx, monster[v2]._my, 0, 0, monster[v2]._mdir, MIS_FLASH, 1, v1, 4, 0); - AddMissile(monster[v2]._mx, monster[v2]._my, 0, 0, monster[v2]._mdir, MIS_FLASH2, 1, v1, 4, 0); - goto LABEL_39; + } else if (Monst->_mgoal == MGOAL_NORMAL) { + if (abs(mx) >= 2 || abs(my) >= 2) { + if (v < 5 * (Monst->_mint + 10) && LineClear(Monst->_mx, Monst->_my, fx, fy)) { + M_StartRAttack(i, counsmiss[Monst->_mint], Monst->mMinDamage + random(77, Monst->mMaxDamage - Monst->mMinDamage + 1)); + } else if (random(124, 100) < 30) { + Monst->_mgoal = MGOAL_MOVE; + Monst->_mgoalvar1 = 0; + M_StartFadeout(i, md, FALSE); + } else + M_StartDelay(i, random(105, 10) + 2 * (5 - Monst->_mint)); + } else { + Monst->_mdir = md; + if (Monst->_mhitpoints < (Monst->_mmaxhp >> 1)) { + Monst->_mgoal = MGOAL_RETREAT; + Monst->_mgoalvar1 = 0; + M_StartFadeout(i, md, FALSE); + } else if (Monst->_mVar1 == MM_DELAY + || random(105, 100) < 2 * Monst->_mint + 20) { + M_StartRAttack(i, -1, 0); + AddMissile(Monst->_mx, Monst->_my, 0, 0, Monst->_mdir, MIS_FLASH, 1, i, 4, 0); + AddMissile(Monst->_mx, Monst->_my, 0, 0, Monst->_mdir, MIS_FLASH2, 1, i, 4, 0); + } else + M_StartDelay(i, random(105, 10) + 2 * (5 - Monst->_mint)); } } - v33 = random(105, 10); - M_StartDelay(v1, v33 + 2 * (5 - (unsigned char)monster[v2]._mint)); - goto LABEL_39; + if (Monst->_mmode == MM_STAND) { + M_StartDelay(i, random(125, 10) + 5); + } } }