From 4769ba7df01304ac17eb17e285de72fe713f139b Mon Sep 17 00:00:00 2001 From: Sergey Semushin Date: Sun, 12 May 2019 11:32:20 +0300 Subject: [PATCH] Clean up DirOK. --- Source/monster.cpp | 151 ++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 106 deletions(-) diff --git a/Source/monster.cpp b/Source/monster.cpp index bffa3c5e9..f2310ba77 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -4689,118 +4689,57 @@ void FreeMonsters() BOOL DirOK(int i, int mdir) { - int v2; // ebx - int v3; // esi - int v4; // ebx - int v5; // edi - int v6; // esi - int v7; // edi - BOOLEAN v8; // zf - int v9; // edx - unsigned char *v11; // ebx - unsigned char v12; // al - int v13; // edx - int v14; // eax - int v15; // edi - int v16; // ecx - signed int j; // esi - int v18; // eax - BOOLEAN v19; // zf - int v20; // eax - int v21; // [esp+Ch] [ebp-14h] - int v22; // [esp+10h] [ebp-10h] - int v23; // [esp+14h] [ebp-Ch] - int a1; // [esp+18h] [ebp-8h] - int v25; // [esp+1Ch] [ebp-4h] - int v26; // [esp+1Ch] [ebp-4h] - - v2 = i; - v3 = mdir; - v25 = mdir; - a1 = i; + int fx, fy; + int x, y; + int mcount, mi; + if ((DWORD)i >= MAXMONSTERS) app_fatal("DirOK: Invalid monster %d", i); - v4 = v2; - v5 = offset_y[v3]; - v6 = monster[v4]._mx + offset_x[v3]; - v7 = monster[v4]._my + v5; - if (v7 < 0 || v7 >= MAXDUNY || v6 < 0 || v6 >= MAXDUNX || !PosOkMonst(a1, v6, v7)) - return 0; - if (v25 == DIR_E) { - if (!SolidLoc(v6, v7 + 1)) { - v8 = (dFlags[v6][v7 + 1] & DFLAG_MONSTER) == 0; - goto LABEL_18; - } - return 0; - } - if (v25 == DIR_W) { - if (SolidLoc(v6 + 1, v7)) - return 0; - v8 = (dFlags[v6 + 1][v7] & DFLAG_MONSTER) == 0; - } else { - if (v25 == DIR_N) { - if (SolidLoc(v6 + 1, v7)) - return 0; - v9 = v7 + 1; - } else { - if (v25) - goto LABEL_24; - if (SolidLoc(v6 - 1, v7)) - return 0; - v9 = v7 - 1; - } - v8 = SolidLoc(v6, v9) == 0; - } -LABEL_18: - if (!v8) - return 0; -LABEL_24: - if (monster[v4].leaderflag == 1) { - v11 = &monster[v4].leader; - if (abs(v6 - monster[(unsigned char)*v11]._mfutx) >= 4 - || abs(v7 - monster[(unsigned char)*v11]._mfuty) >= 4) { - return 0; + fx = monster[i]._mx + offset_x[mdir]; + fy = monster[i]._my + offset_y[mdir]; + if (fy < 0 || fy >= MAXDUNY || fx < 0 || fx >= MAXDUNX || !PosOkMonst(i, fx, fy)) + return FALSE; + if (mdir == DIR_E) { + if (SolidLoc(fx, fy + 1) || dFlags[fx][fy + 1] & DFLAG_MONSTER) + return FALSE; + } + if (mdir == DIR_W) { + if (SolidLoc(fx + 1, fy) || dFlags[fx + 1][fy] & DFLAG_MONSTER) + return FALSE; + } + if (mdir == DIR_N) { + if (SolidLoc(fx + 1, fy) || SolidLoc(fx, fy + 1)) + return FALSE; + } + if (mdir == DIR_S) + if (SolidLoc(fx - 1, fy) || SolidLoc(fx, fy - 1)) + return FALSE; + if (monster[i].leaderflag == 1) { + if (abs(fx - monster[monster[i].leader]._mfutx) >= 4 + || abs(fy - monster[monster[i].leader]._mfuty) >= 4) { + return FALSE; } - return 1; + return TRUE; } - v12 = monster[v4]._uniqtype; - if (v12 == 0 || !(UniqMonst[v12 - 1].mUnqAttr & 2)) - return 1; - v26 = 0; - v13 = v6 - 3; - v21 = v6 + 3; - if (v6 - 3 <= v6 + 3) { - v14 = v7 - 3; - v15 = v7 + 3; - v23 = v14; - v22 = v15; - v16 = 112 * v13; - do { - for (j = v23; j <= v15; ++j) { - if (j >= 0 && j < MAXDUNY && v16 >= 0 && v16 < MAXDUNX * 112) { - v18 = dMonster[0][v16 + j]; - v19 = v18 == 0; - if (v18 < 0) { - v18 = -v18; - v19 = v18 == 0; - } - if (!v19) - --v18; - v20 = v18; - if (monster[v20].leaderflag == 1 - && (unsigned char)monster[v20].leader == a1 - && monster[v20]._mfutx == v13 - && monster[v20]._mfuty == j) { - ++v26; - } - } - v15 = v22; + if (monster[i]._uniqtype == 0 || !(UniqMonst[monster[i]._uniqtype - 1].mUnqAttr & 2)) + return TRUE; + mcount = 0; + for (x = fx - 3; x <= fx + 3; x++) { + for (y = fy - 3; y <= fy + 3; y++) { + if (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX) + continue; + mi = dMonster[x][y]; + if (mi < 0) mi = -mi; + if (mi != 0) mi--; + if (monster[mi].leaderflag == 1 + && monster[mi].leader == i + && monster[mi]._mfutx == x + && monster[mi]._mfuty == y) { + mcount++; } - ++v13; - v16 += 112; - } while (v13 <= v21); + } } - return v26 == (unsigned char)monster[v4].packsize; + return mcount == monster[i].packsize; } BOOL PosOkMissile(int x, int y)