diff --git a/Source/missiles.cpp b/Source/missiles.cpp index cad226952..2a8f30636 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3648,83 +3648,57 @@ void MI_Apoca(int i) void MI_Wave(int i) { - int v1; // esi - int v2; // ebx - int v3; // eax - int v4; // edi - int v5; // ecx - int v6; // eax - int v7; // ebx - int v8; // eax - int v9; // ebx - int v10; // eax - int v11; // ebx - BOOLEAN v12; // zf - int v13; // [esp+Ch] [ebp-2Ch] - int v14; // [esp+10h] [ebp-28h] - int v15; // [esp+14h] [ebp-24h] - int v16; // [esp+14h] [ebp-24h] - signed int v17; // [esp+18h] [ebp-20h] - int *v18; // [esp+1Ch] [ebp-1Ch] - signed int v19; // [esp+20h] [ebp-18h] - int v20; // [esp+24h] [ebp-14h] - int v21; // [esp+24h] [ebp-14h] - int v22; // [esp+28h] [ebp-10h] - int j; // [esp+28h] [ebp-10h] - int id; // [esp+2Ch] [ebp-Ch] - int sx; // [esp+30h] [ebp-8h] - int sy; // [esp+34h] [ebp-4h] - int sya; // [esp+34h] [ebp-4h] - - v19 = 0; - v1 = i; - v17 = 0; - v2 = missile[i]._mix; + int sx, sy, sd, nxa, nxb, nya, nyb, dira, dirb; + int j, id, pn; + BOOL f1, f2; + int v1, v2; + + f1 = FALSE; + f2 = FALSE; + /// ASSERT: assert((DWORD)i < MAXMISSILES); + id = missile[i]._misource; - v14 = v2; - v20 = missile[i]._miy; - v3 = GetDirection(v2, v20, missile[i]._miVar1, missile[i]._miVar2); - v22 = ((_BYTE)v3 - 2) & 7; - v4 = v3; - v15 = ((_BYTE)v3 + 2) & 7; - v5 = YDirAdd[v3]; - v6 = XDirAdd[v3]; - v7 = v6 + v2; - sy = v5 + v20; - if (!nMissileTable[dPiece[v7][v5 + v20]]) { - v18 = &plr[id]._pdir; - AddMissile(v7, sy, v7 + v6, sy + v5, *v18, MIS_FIREMOVE, 0, id, 0, missile[v1]._mispllvl); - v13 = v22; - sya = YDirAdd[v22] + sy; - v8 = v15; - sx = XDirAdd[v22] + v7; - v16 = v8 * 4; - v9 = XDirAdd[v8]; - v10 = v20 + YDirAdd[v4] + YDirAdd[v8]; - v11 = v14 + XDirAdd[v4] + v9; - v21 = 0; - for (j = v10; v21 < (missile[v1]._mispllvl >> 1) + 2; ++v21) { - if (nMissileTable[dPiece[sx][sya]] || v19 || sx <= 0 || sx >= MAXDUNX || sya <= 0 || sya >= MAXDUNY) { - v19 = 1; + sx = missile[i]._mix; + sy = missile[i]._miy; + v1 = missile[i]._miVar1; + v2 = missile[i]._miVar2; + sd = GetDirection(sx, sy, v1, v2); + dira = (sd - 2) & 7; + dirb = (sd + 2) & 7; + nxa = sx + XDirAdd[sd]; + nya = sy + YDirAdd[sd]; + pn = dPiece[nxa][nya]; + /// ASSERT: assert((DWORD)pn <= MAXTILES); + if (nMissileTable[pn] == 0) { + AddMissile(nxa, nya, nxa + XDirAdd[sd], nya + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, 0, id, 0, missile[i]._mispllvl); + nxa += XDirAdd[dira]; + nya += YDirAdd[dira]; + nxb = sx + XDirAdd[sd] + XDirAdd[dirb]; + nyb = sy + YDirAdd[sd] + YDirAdd[dirb]; + for (j = 0; j < (missile[i]._mispllvl >> 1) + 2; j++) { + pn = dPiece[nxa][nya]; // BUGFIX: dPiece is accessed before check against dungeon size and 0 + /// ASSERT: assert((DWORD)pn <= MAXTILES); + if (nMissileTable[pn] || f1 || nxa <= 0 || nxa >= MAXDUNX || nya <= 0 || nya >= MAXDUNY) { + f1 = TRUE; } else { - AddMissile(sx, sya, sx + XDirAdd[v4], sya + YDirAdd[v4], *v18, MIS_FIREMOVE, 0, id, 0, missile[v1]._mispllvl); - sx += XDirAdd[v13]; - sya += YDirAdd[v13]; - v10 = j; + AddMissile(nxa, nya, nxa + XDirAdd[sd], nya + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, 0, id, 0, missile[i]._mispllvl); + nxa += XDirAdd[dira]; + nya += YDirAdd[dira]; } - if (nMissileTable[dPiece[v11][v10]] || v17 || v11 <= 0 || v11 >= MAXDUNX || v10 <= 0 || v10 >= MAXDUNY) { - v17 = 1; + pn = dPiece[nxb][nyb]; // BUGFIX: dPiece is accessed before check against dungeon size and 0 + /// ASSERT: assert((DWORD)pn <= MAXTILES); + if (nMissileTable[pn] || f2 || nxb <= 0 || nxb >= MAXDUNX || nyb <= 0 || nyb >= MAXDUNY) { + f2 = TRUE; } else { - AddMissile(v11, v10, v11 + XDirAdd[v4], v10 + YDirAdd[v4], *v18, MIS_FIREMOVE, 0, id, 0, missile[v1]._mispllvl); - v11 += *(int *)((char *)XDirAdd + v16); - j += *(int *)((char *)YDirAdd + v16); - v10 = j; + AddMissile(nxb, nyb, nxb + XDirAdd[sd], nyb + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, 0, id, 0, missile[i]._mispllvl); + nxb += XDirAdd[dirb]; + nyb += YDirAdd[dirb]; } } } - v12 = missile[v1]._mirange-- == 1; - if (v12) - missile[v1]._miDelFlag = TRUE; + missile[i]._mirange--; + if (missile[i]._mirange == 0) + missile[i]._miDelFlag = TRUE; } void MI_Nova(int i)