Browse Source

Merge upstream branch 'devilution/master'

pull/31/head
Xadhoom 7 years ago
parent
commit
6bb95a040e
  1. 450
      Source/missiles.cpp
  2. 2
      Source/missiles.h
  3. 12
      Source/monster.cpp
  4. 6
      Source/msg.cpp
  5. 2
      Source/player.cpp
  6. 2
      structs.h

450
Source/missiles.cpp

@ -414,24 +414,21 @@ void __fastcall GetDamageAmt(int i, int *mind, int *maxd)
}
}
int __fastcall CheckBlock(int fx, int fy, int tx, int ty)
BOOL __fastcall CheckBlock(int fx, int fy, int tx, int ty)
{
int v4; // edi
int v5; // esi
int v6; // ebx
int v7; // eax
int pn;
BOOL coll;
v4 = fy;
v5 = fx;
v6 = 0;
while (v5 != tx || v4 != ty) {
v7 = GetDirection(v5, v4, tx, ty);
v5 += XDirAdd[v7];
v4 += YDirAdd[v7];
if (nSolidTable[dPiece[v5][v4]])
v6 = 1;
coll = FALSE;
while (fx != tx || fy != ty) {
pn = GetDirection(fx, fy, tx, ty);
fx += XDirAdd[pn];
fy += YDirAdd[pn];
if (nSolidTable[dPiece[fx][fy]])
coll = TRUE;
}
return v6;
return coll;
}
int __fastcall FindClosest(int sx, int sy, int rad)
@ -706,7 +703,7 @@ void __fastcall PutMissile(int i)
x = missile[i]._mix;
y = missile[i]._miy;
if (x <= 0 || y <= 0 || x >= MAXDUNX || y >= MAXDUNY)
missile[i]._miDelFlag = 1;
missile[i]._miDelFlag = TRUE;
if (!missile[i]._miDelFlag) {
dFlags[x][y] |= DFLAG_MISSILE;
if (dMissile[x][y] == 0)
@ -2018,7 +2015,7 @@ void __fastcall AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, i
CrawlNum[3] = 45;
CrawlNum[4] = 94;
CrawlNum[5] = 159;
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
do {
v10 = CrawlNum[v23];
v11 = (unsigned char)CrawlTable[v10];
@ -2047,7 +2044,7 @@ void __fastcall AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, i
if (v22 <= 0)
goto LABEL_13;
}
missile[v9]._miDelFlag = 0;
missile[v9]._miDelFlag = FALSE;
missile[v9]._mix = v13;
missile[v9]._miy = v14;
missile[v9]._misx = v13;
@ -2341,7 +2338,7 @@ void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int m
CrawlNum[5] = 159;
if (currlevel) {
_LOBYTE(v11) = dx;
missile[v10]._miDelFlag = 1;
missile[v10]._miDelFlag = TRUE;
v26 = 0;
do {
v12 = CrawlNum[v26];
@ -2367,7 +2364,7 @@ void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int m
if (v27 <= 0)
goto LABEL_14;
}
missile[v10]._miDelFlag = 0;
missile[v10]._miDelFlag = FALSE;
missile[v10]._mix = v9;
missile[v10]._miy = v11;
missile[v10]._misx = v9;
@ -2383,7 +2380,7 @@ void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int m
missile[v10]._miy = dy;
missile[v10]._misx = dx;
missile[v10]._misy = dy;
missile[v10]._miDelFlag = 0;
missile[v10]._miDelFlag = FALSE;
}
v17 = nummissiles;
missile[v10]._miVar2 = 0;
@ -2584,7 +2581,7 @@ void __fastcall AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, i
missile[v11]._midam = v12;
}
v36 = 0;
missile[v11]._miDelFlag = 1;
missile[v11]._miDelFlag = TRUE;
do {
v14 = CrawlNum[v36];
v15 = (unsigned char)CrawlTable[v14];
@ -2614,7 +2611,7 @@ void __fastcall AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, i
if (v35 <= 0)
goto LABEL_17;
}
missile[v11]._miDelFlag = 0;
missile[v11]._miDelFlag = FALSE;
missile[v11]._mix = v17;
missile[v11]._miy = v18;
missile[v11]._misx = v17;
@ -2626,7 +2623,7 @@ void __fastcall AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, i
LABEL_18:
++v36;
} while (v36 < 6);
if (missile[v11]._miDelFlag != 1) {
if (missile[v11]._miDelFlag != TRUE) {
v20 = missile[v11]._miy;
v21 = missile[v11]._mix;
missile[v11]._misource = id;
@ -2977,7 +2974,7 @@ void __fastcall AddStone(int mi, int sx, int sy, int dx, int dy, int midir, int
*v23 *= 16;
UseMana(id, 8);
} else {
missile[v9]._miDelFlag = 1;
missile[v9]._miDelFlag = TRUE;
}
}
@ -3001,7 +2998,7 @@ void __fastcall AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, int
v12 = 0;
v13 = nummissiles == 0;
v14 = nummissiles < 0;
missile[v9]._miDelFlag = 0;
missile[v9]._miDelFlag = FALSE;
if (v14 || v13) {
LABEL_6:
missile[v9]._miVar1 = sx;
@ -3024,7 +3021,7 @@ void __fastcall AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, int
if (++v12 >= v11)
goto LABEL_6;
}
missile[v9]._miDelFlag = 1;
missile[v9]._miDelFlag = TRUE;
}
}
@ -3060,7 +3057,7 @@ void __fastcall AddEtherealize(int mi, int sx, int sy, int dx, int dy, int midir
void __fastcall miss_null_1F(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
}
void __fastcall miss_null_23(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
@ -3145,13 +3142,13 @@ void __fastcall AddHeal(int mi, int sx, int sy, int dx, int dy, int midir, int m
if (*v17 > v18)
*v17 = v18;
UseMana(id, 2);
missile[i]._miDelFlag = 1;
missile[i]._miDelFlag = TRUE;
drawhpflag = TRUE;
}
void __fastcall AddHealOther(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 34);
if (id == myplr)
SetCursor_(CURSOR_HEALOTHER);
@ -3205,7 +3202,7 @@ void __fastcall AddElement(int mi, int sx, int sy, int dx, int dy, int midir, in
void __fastcall AddIdentify(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 5);
if (id == myplr) {
if (sbookflag)
@ -3243,7 +3240,7 @@ void __fastcall AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir,
CrawlNum[3] = 45;
CrawlNum[4] = 94;
CrawlNum[5] = 159;
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
do {
v10 = CrawlNum[v22];
v11 = (unsigned char)CrawlTable[v10];
@ -3272,7 +3269,7 @@ void __fastcall AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir,
if (v21 <= 0)
goto LABEL_16;
}
missile[v9]._miDelFlag = 0;
missile[v9]._miDelFlag = FALSE;
missile[v9]._miVar1 = v13;
missile[v9]._miVar2 = v14;
missile[v9]._miVar5 = v13;
@ -3281,7 +3278,7 @@ void __fastcall AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir,
LABEL_16:
++v22;
} while (v22 < 6);
if (missile[v9]._miDelFlag != 1) {
if (missile[v9]._miDelFlag != TRUE) {
missile[v9]._miVar7 = 0;
missile[v9]._miVar8 = 0;
missile[v9]._miVar3 = (midir - 2) & 7;
@ -3381,7 +3378,7 @@ void __fastcall AddNova(int mi, int sx, int sy, int dx, int dy, int midir, int m
void __fastcall AddRepair(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 26);
if (id == myplr) {
if (sbookflag)
@ -3395,7 +3392,7 @@ void __fastcall AddRepair(int mi, int sx, int sy, int dx, int dy, int midir, int
void __fastcall AddRecharge(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 27);
if (id == myplr) {
if (sbookflag)
@ -3409,7 +3406,7 @@ void __fastcall AddRecharge(int mi, int sx, int sy, int dx, int dy, int midir, i
void __fastcall AddDisarm(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 28);
if (id == myplr)
SetCursor_(CURSOR_DISARM);
@ -3450,7 +3447,7 @@ void __fastcall AddApoca(int mi, int sx, int sy, int dx, int dy, int midir, int
++v13;
} while (v13 < *v14);
}
missile[v9]._miDelFlag = 0;
missile[v9]._miDelFlag = FALSE;
missile[v9]._mirange = 255;
UseMana(id, 24);
}
@ -3603,7 +3600,7 @@ void __fastcall AddResurrect(int mi, int sx, int sy, int dx, int dy, int midir,
UseMana(id, 32);
if (id == myplr)
SetCursor_(CURSOR_RESURRECT);
missile[v9]._miDelFlag = 1;
missile[v9]._miDelFlag = TRUE;
}
void __fastcall AddResurrectBeam(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
@ -3624,7 +3621,7 @@ void __fastcall AddResurrectBeam(int mi, int sx, int sy, int dx, int dy, int mid
void __fastcall AddTelekinesis(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam)
{
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
UseMana(id, 33);
if (id == myplr)
SetCursor_(CURSOR_TELEKINESIS);
@ -3712,7 +3709,7 @@ void __fastcall AddDiabApoca(int mi, int sx, int sy, int dx, int dy, int midir,
v10 += 5430;
} while (v9 < (unsigned char)gbMaxPlayers);
}
missile[mi]._miDelFlag = 1;
missile[mi]._miDelFlag = TRUE;
}
// 679660: using guessed type char gbMaxPlayers;
@ -3776,7 +3773,7 @@ LABEL_9:
missile[v15]._miyoff = 0;
missile[v15]._mitxoff = 0;
missile[v15]._mityoff = 0;
missile[v15]._miDelFlag = 0;
missile[v15]._miDelFlag = FALSE;
missile[v15]._miLightFlag = 0;
missile[v15]._miPreFlag = 0;
missile[v15]._miUniqTrans = 0;
@ -3916,7 +3913,7 @@ void __fastcall MI_Golem(int i)
++v21;
} while (v21 < 6);
LABEL_17:
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
void __fastcall MI_SetManashield(int i)
@ -4046,7 +4043,7 @@ void __fastcall MI_LArrow(int i)
}
if (!missile[v1]._mirange) {
v29 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v29);
}
PutMissile(ia);
@ -4091,7 +4088,7 @@ void __fastcall MI_Arrow(int i)
if (v9 != missile[v1]._misx || missile[v1]._miy != missile[v1]._misy)
CheckMissileCol(ia, v6, v7, 0, v9, missile[v1]._miy, 0);
if (!missile[v1]._mirange)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
PutMissile(ia);
}
@ -4130,7 +4127,7 @@ void __fastcall MI_Firebolt(int i)
AddUnLight(v3);
v4 = missile[v2]._miy;
v5 = missile[v2]._mix;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
PlaySfxLoc(LS_BSIMPCT, v5, v4);
}
goto LABEL_39;
@ -4190,7 +4187,7 @@ LABEL_19:
}
} else {
missile[v2]._mitxoff = v22;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
missile[v2]._mityoff = v21;
GetMissilePos(v1);
v15 = missile[v2]._mitype - 1;
@ -4238,7 +4235,7 @@ LABEL_19:
case MIS_BONESPIRIT:
SetMissDir(v1, 8);
missile[v2]._mirange = 7;
missile[v2]._miDelFlag = 0;
missile[v2]._miDelFlag = FALSE;
goto LABEL_39;
}
}
@ -4283,7 +4280,7 @@ void __fastcall MI_Lightball(int i)
missile[v1]._mirange = v10;
}
if (!missile[v1]._mirange)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
PutMissile(ia);
}
@ -4302,7 +4299,7 @@ void __fastcall mi_null_33(int i)
GetMissilePos(i);
CheckMissileCol(v1, missile[v2]._midam, missile[v2]._midam, 0, missile[v2]._mix, missile[v2]._miy, 0);
if (!missile[v2]._mirange)
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
PutMissile(v1);
}
@ -4324,7 +4321,7 @@ void __fastcall MI_Acidpud(int i)
missile[v2]._mirange = v5;
if (!v5) {
if (missile[v2]._mimfnum) {
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
} else {
SetMissDir(v1, 1);
missile[v2]._mirange = missile[v2]._miAnimLen;
@ -4370,7 +4367,7 @@ void __fastcall MI_Firewall(int i)
CheckMissileCol(ia, missile[v1]._midam, missile[v1]._midam, 1, missile[v1]._mix, missile[v1]._miy, 1);
if (!missile[v1]._mirange) {
v3 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v3);
}
if (missile[v1]._mimfnum) {
@ -4391,125 +4388,80 @@ void __fastcall MI_Firewall(int i)
void __fastcall MI_Fireball(int i)
{
int v1; // esi
BOOLEAN v2; // zf
int v3; // eax
int v4; // ecx
int v5; // edi
int v6; // eax
int v7; // edx
int v8; // eax
int v9; // eax
int v10; // ecx
int v11; // eax
int v12; // edx
int v13; // eax
int v14; // ecx
int v15; // ST10_4
int fx; // [esp+Ch] [ebp-14h]
//int fxa; // [esp+Ch] [ebp-14h]
//int fxb; // [esp+Ch] [ebp-14h]
int fy; // [esp+10h] [ebp-10h]
//int fya; // [esp+10h] [ebp-10h]
//int fyb; // [esp+10h] [ebp-10h]
int ia; // [esp+14h] [ebp-Ch]
//int ib; // [esp+14h] [ebp-Ch]
int ty; // [esp+18h] [ebp-8h]
//int tya; // [esp+18h] [ebp-8h]
//int tyb; // [esp+18h] [ebp-8h]
int tx; // [esp+1Ch] [ebp-4h]
//int txa; // [esp+1Ch] [ebp-4h]
int dam, id, px, py, mx, my;
ia = i;
v1 = i;
--missile[v1]._mirange;
v2 = missile[i]._micaster == 0;
v3 = missile[i]._misource;
v4 = missile[i]._mirange;
v5 = missile[v1]._midam;
if (v2) {
v6 = v3;
v7 = plr[v6].WorldX;
v8 = plr[v6].WorldY;
dam = missile[i]._midam;
id = missile[i]._misource;
missile[i]._mirange--;
if (missile[i]._micaster == 0) {
px = plr[id].WorldX;
py = plr[id].WorldY;
} else {
v9 = v3;
v7 = monster[v9]._mx;
v8 = monster[v9]._my;
px = monster[id]._mx;
py = monster[id]._my;
}
fx = v7;
fy = v8;
if (_LOBYTE(missile[v1]._miAnimType) == MFILE_KRULL) {
if (!v4) {
v10 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
AddUnLight(v10);
if (missile[i]._miAnimType == MFILE_BIGEXP) {
if (!missile[i]._mirange) {
missile[i]._miDelFlag = TRUE;
AddUnLight(missile[i]._mlid);
}
} else {
missile[v1]._mitxoff += missile[v1]._mixvel;
missile[v1]._mityoff += missile[v1]._miyvel;
GetMissilePos(ia);
v11 = missile[v1]._mix;
if (v11 != missile[v1]._misx || missile[v1]._miy != missile[v1]._misy)
CheckMissileCol(ia, v5, v5, 0, v11, missile[v1]._miy, 0);
v12 = missile[v1]._mix;
if (missile[v1]._mirange) {
if (v12 != missile[v1]._miVar1 || missile[v1]._miy != missile[v1]._miVar2) {
v14 = missile[v1]._mlid;
missile[v1]._miVar1 = v12;
v15 = missile[v1]._miy;
missile[v1]._miVar2 = v15;
ChangeLight(v14, v12, v15, 8);
}
} else {
tx = missile[v1]._mix;
ty = missile[v1]._miy;
ChangeLight(missile[v1]._mlid, v12, ty, missile[v1]._miAnimFrame);
if (!CheckBlock(fx, fy, tx, ty))
CheckMissileCol(ia, v5, v5, 0, tx, ty, 1);
if (!CheckBlock(fx, fy, tx, ty + 1))
CheckMissileCol(ia, v5, v5, 0, tx, ty + 1, 1);
if (!CheckBlock(fx, fy, tx, ty - 1))
CheckMissileCol(ia, v5, v5, 0, tx, ty - 1, 1);
if (!CheckBlock(fx, fy, tx + 1, ty))
CheckMissileCol(ia, v5, v5, 0, tx + 1, ty, 1);
if (!CheckBlock(fx, fy, tx + 1, ty - 1))
CheckMissileCol(ia, v5, v5, 0, tx + 1, ty - 1, 1); /* check x/y */
if (!CheckBlock(fx, fy, tx + 1, ty + 1))
CheckMissileCol(ia, v5, v5, 0, tx + 1, ty + 1, 1);
if (!CheckBlock(fx, fy, tx - 1, ty))
CheckMissileCol(ia, v5, v5, 0, tx - 1, ty, 1);
if (!CheckBlock(fx, fy, tx - 1, ty + 1))
CheckMissileCol(ia, v5, v5, 0, tx - 1, ty + 1, 1);
if (!CheckBlock(fx, fy, tx - 1, ty - 1))
CheckMissileCol(ia, v5, v5, 0, tx - 1, ty - 1, 1);
v13 = 112 * tx + ty;
if (!TransList[dung_map[0][v13]] /* check */
|| missile[v1]._mixvel < 0
&& (TransList[dung_map[0][v13 + 1]] && nSolidTable[dPiece[0][v13 + 1]]
|| TransList[dung_map[0][v13 - 1]] && nSolidTable[dPiece[0][v13 - 1]])) // TransList[*(&byte_5B78EB + v13)] && nSolidTable[*(_DWORD *)&dflags[39][4 * v13 + 36]]) )
{
++missile[v1]._mix;
++missile[v1]._miy;
missile[v1]._miyoff -= 32;
missile[i]._mitxoff += missile[i]._mixvel;
missile[i]._mityoff += missile[i]._miyvel;
GetMissilePos(i);
if (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy)
CheckMissileCol(i, dam, dam, 0, missile[i]._mix, missile[i]._miy, 0);
if (!missile[i]._mirange) {
mx = missile[i]._mix;
my = missile[i]._miy;
ChangeLight(missile[i]._mlid, missile[i]._mix, my, missile[i]._miAnimFrame);
if (!CheckBlock(px, py, mx, my))
CheckMissileCol(i, dam, dam, 0, mx, my, 1);
if (!CheckBlock(px, py, mx, my + 1))
CheckMissileCol(i, dam, dam, 0, mx, my + 1, 1);
if (!CheckBlock(px, py, mx, my - 1))
CheckMissileCol(i, dam, dam, 0, mx, my - 1, 1);
if (!CheckBlock(px, py, mx + 1, my))
CheckMissileCol(i, dam, dam, 0, mx + 1, my, 1);
if (!CheckBlock(px, py, mx + 1, my - 1))
CheckMissileCol(i, dam, dam, 0, mx + 1, my - 1, 1);
if (!CheckBlock(px, py, mx + 1, my + 1))
CheckMissileCol(i, dam, dam, 0, mx + 1, my + 1, 1);
if (!CheckBlock(px, py, mx - 1, my))
CheckMissileCol(i, dam, dam, 0, mx - 1, my, 1);
if (!CheckBlock(px, py, mx - 1, my + 1))
CheckMissileCol(i, dam, dam, 0, mx - 1, my + 1, 1);
if (!CheckBlock(px, py, mx - 1, my - 1))
CheckMissileCol(i, dam, dam, 0, mx - 1, my - 1, 1);
if (!TransList[dung_map[mx][my]]
|| (missile[i]._mixvel < 0 && ((TransList[dung_map[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]) || (TransList[dung_map[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])))) {
missile[i]._mix++;
missile[i]._miy++;
missile[i]._miyoff -= 32;
}
if (missile[v1]._miyvel > 0
&& (TransList[dung_map[tx + 1][ty]] && nSolidTable[dPiece[1][v13]]
|| TransList[dung_map[tx - 1][ty]] && nSolidTable[dPiece[-1][v13]])) // TransList[block_lvid[v13 + 1940]] && nSolidTable[*(_DWORD *)&dflags[28][4 * v13 + 32]]) )
{
missile[v1]._miyoff -= 32;
if (missile[i]._miyvel > 0
&& (TransList[dung_map[mx + 1][my]] && nSolidTable[dPiece[mx + 1][my]]
|| TransList[dung_map[mx - 1][my]] && nSolidTable[dPiece[mx - 1][my]])) {
missile[i]._miyoff -= 32;
}
if (missile[v1]._mixvel > 0
&& (TransList[dung_map[0][v13 + 1]] && nSolidTable[dPiece[0][v13 + 1]]
|| TransList[dung_map[0][v13 - 1]] && nSolidTable[dPiece[0][v13 - 1]])) // TransList[*(&byte_5B78EB + v13)] && nSolidTable[*(_DWORD *)&dflags[39][4 * v13 + 36]]) )
{
missile[v1]._mixoff -= 32;
if (missile[i]._mixvel > 0
&& (TransList[dung_map[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]
|| TransList[dung_map[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])) {
missile[i]._mixoff -= 32;
}
missile[v1]._mimfnum = 0;
SetMissAnim(ia, MFILE_BIGEXP);
missile[v1]._mirange = missile[v1]._miAnimLen - 1;
missile[i]._mimfnum = 0;
SetMissAnim(i, MFILE_BIGEXP);
missile[i]._mirange = missile[i]._miAnimLen - 1;
} else if (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {
missile[i]._miVar1 = missile[i]._mix;
missile[i]._miVar2 = missile[i]._miy;
ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, 8);
}
}
PutMissile(ia);
PutMissile(i);
}
void __fastcall MI_Lightctrl(int i)
@ -4587,7 +4539,7 @@ void __fastcall MI_Lightctrl(int i)
}
LABEL_27:
if (!missile[v1]._mirange || v6 <= 0 || v7 <= 0 || v6 >= MAXDUNX || v7 > MAXDUNY)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
void __fastcall MI_Lightning(int i)
@ -4609,7 +4561,7 @@ void __fastcall MI_Lightning(int i)
missile[v2]._mirange = v4;
if (!missile[v2]._mirange) {
v5 = missile[v2]._mlid;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
AddUnLight(v5);
}
PutMissile(v1);
@ -4676,7 +4628,7 @@ void __fastcall MI_Town(int i)
} while ((signed int)v3 < (signed int)&plr[4].plrlevel);
if (!missile[v1]._mirange) {
v4 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v4);
}
PutMissile(ia);
@ -4708,7 +4660,7 @@ void __fastcall MI_Flash(int i)
CheckMissileCol(v1, missile[v2]._midam, missile[v2]._midam, 1, missile[v2]._mix + 1, missile[v2]._miy + 1, 1);
if (!missile[v2]._mirange) {
v5 = missile[v2]._micaster == 0;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
if (v5) {
v6 = missile[v2]._misource;
if (v6 != -1)
@ -4741,7 +4693,7 @@ void __fastcall MI_Flash2(int i)
CheckMissileCol(v1, missile[v2]._midam, missile[v2]._midam, 1, missile[v2]._mix + 1, missile[v2]._miy - 1, 1);
if (!missile[v2]._mirange) {
v5 = missile[v2]._micaster == 0;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
if (v5) {
v6 = missile[v2]._misource;
if (v6 != -1)
@ -4799,7 +4751,7 @@ void __fastcall MI_Manashield(int i)
}
if (arglist != myplr) {
if (currlevel != plr[v2].plrlevel)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
goto LABEL_33;
}
v8 = plr[v2]._pMana;
@ -4827,12 +4779,12 @@ void __fastcall MI_Manashield(int i)
LABEL_26:
if (arglist == myplr && !plr[v2]._pHitPoints && !missile[v1]._miVar1 && plr[v2]._pmode != PM_DEATH) {
missile[v1]._mirange = 0;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
SyncPlrKill(arglist, -1);
}
goto LABEL_31;
}
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
plr[v2]._pHitPoints = v8 + v9 - v10;
plr[v2]._pHPBase = v8 + missile[v1]._miVar2 - v10;
v12 = plr[v2]._pMaxManaBase - plr[v2]._pMaxMana;
@ -4853,7 +4805,7 @@ LABEL_31:
missile[v1]._miVar1 = plr[v2]._pHitPoints;
missile[v1]._miVar2 = plr[v2]._pHPBase;
if (v7) {
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
NetSendCmd(TRUE, CMD_ENDSHIELD);
}
LABEL_33:
@ -4904,7 +4856,7 @@ void __fastcall MI_Etherealize(int i)
_LOBYTE(plr[v4]._pSpellFlags) |= 1u;
v10 = plr[v4]._pSpellFlags;
if (!missile[v2]._mirange || plr[v4]._pHitPoints <= 0) {
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
_LOBYTE(plr[v4]._pSpellFlags) = v10 & 0xFE;
}
PutMissile(v1);
@ -4958,7 +4910,7 @@ void __fastcall MI_Firemove(int i)
missile[v1]._mirange = v5;
if (!missile[v1]._mirange) {
v6 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v6);
}
if (missile[v1]._mimfnum || !missile[v1]._mirange) {
@ -5068,7 +5020,7 @@ void __fastcall MI_Guardian(int i)
}
if (!missile[v1]._mirange) {
v13 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v13);
}
PutMissile(ia);
@ -5157,7 +5109,7 @@ void __fastcall MI_Chain(int i)
}
v15 = missile[v1]._mirange-- == 1;
if (v15)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
void __fastcall mi_null_11(int i)
@ -5169,7 +5121,7 @@ void __fastcall mi_null_11(int i)
v2 = missile[i]._mirange == 1;
--missile[v1]._mirange;
if (v2)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
if (missile[v1]._miAnimFrame == missile[v1]._miAnimLen)
missile[v1]._miPreFlag = 1;
PutMissile(i);
@ -5228,7 +5180,7 @@ void __fastcall MI_Weapexp(int i)
PutMissile(ia);
} else {
v9 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v9);
}
}
@ -5258,7 +5210,7 @@ void __fastcall MI_Misexp(int i)
ExpLight[9] = 2;
if (v3) {
v4 = missile[v2]._mlid;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
AddUnLight(v4);
} else {
v5 = missile[v2]._miVar1;
@ -5293,7 +5245,7 @@ void __fastcall MI_Acidsplat(int i)
} else {
v4 = missile[v1]._misource;
v5 = missile[v1]._mispllvl;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddMissile(
missile[v1]._mix,
missile[v1]._miy,
@ -5354,7 +5306,7 @@ void __fastcall MI_Teleport(int i)
ViewY = plr[v4].WorldY - ScrollInfo._sdy;
}
} else {
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
}
@ -5382,7 +5334,7 @@ void __fastcall MI_Stone(int i)
if (!missile[v1]._mirange) {
v4 = monster[v3]._mhitpoints == 0;
v5 = monster[v3]._mhitpoints < 0;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
if (v5 || v4)
AddDead(monster[v3]._mx, monster[v3]._my, stonendx, (direction)monster[v3]._mdir);
else
@ -5391,7 +5343,7 @@ void __fastcall MI_Stone(int i)
if (_LOBYTE(missile[v1]._miAnimType) == MFILE_MAGBALL)
PutMissile(ia);
} else {
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
}
@ -5408,7 +5360,7 @@ void __fastcall MI_Boom(int i)
if (missile[v2]._miHitFlag == 1)
missile[v2]._miVar1 = 1;
if (!missile[v2]._mirange)
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
PutMissile(v1);
}
@ -5462,7 +5414,7 @@ void __fastcall MI_Rhino(int i)
if (!PosOkMonst(a1, missile[v2]._mix, missile[v2]._miy) || monster[v4]._mAi == AI_SNAKE && !PosOkMonst(a1, a2, a3)) {
MissToMonst(arglist, x, v10);
LABEL_12:
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
return;
}
v8 = monster[v4]._uniqtype == 0;
@ -5530,7 +5482,7 @@ void __fastcall mi_null_32(int i)
&& PosOkMonst(missile[v2]._misource, v3, a3)) {
MissToMonst(arglist, v3, a3);
v10 = v16;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
} else {
v11 = x;
if (monster[v4]._mFlags & MFLAG_TARGETS_MONSTER)
@ -5576,7 +5528,7 @@ void __fastcall MI_FirewallC(int i)
--missile[v1]._mirange;
id = v2;
if (v3) {
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
} else {
v4 = missile[v1]._miVar3;
v5 = missile[v1]._miVar1 + XDirAdd[v4];
@ -5647,7 +5599,7 @@ void __fastcall MI_Infra(int i)
v4 = missile[v1]._misource;
plr[missile[v1]._misource]._pInfraFlag = 1;
if (!v3) {
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
CalcPlrItemVals(v4, 1);
}
}
@ -5698,7 +5650,7 @@ void __fastcall MI_Apoca(int i)
} while (v2 < missile[v1]._miVar3);
if (v3 != 1) {
LABEL_18:
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
} else {
missile[v1]._miVar2 = v2 - 1;
missile[v1]._miVar4 = v7;
@ -5783,7 +5735,7 @@ void __fastcall MI_Wave(int i)
}
v12 = missile[v1]._mirange-- == 1;
if (v12)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
void __fastcall MI_Nova(int i)
@ -5832,12 +5784,12 @@ void __fastcall MI_Nova(int i)
} while ((signed int)v5 < (signed int)&vCrawlTable[23][7]);
v7 = missile[v1]._mirange-- == 1;
if (v7)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
}
void __fastcall MI_Blodboil(int i)
{
missile[i]._miDelFlag = 1;
missile[i]._miDelFlag = TRUE;
}
void __fastcall MI_Flame(int i)
@ -5874,7 +5826,7 @@ void __fastcall MI_Flame(int i)
}
if (!missile[v2]._mirange) {
v9 = missile[v2]._mlid;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
AddUnLight(v9);
}
if (missile[v2]._miVar2 <= 0)
@ -5926,7 +5878,7 @@ void __fastcall MI_Flamec(int i)
missile[v2]._miVar2 = missile[v2]._miy;
}
if (!missile[v2]._mirange || missile[v2]._miVar3 == 3)
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
}
void __fastcall MI_Cbolt(int i)
@ -6000,7 +5952,7 @@ void __fastcall MI_Cbolt(int i)
}
if (!missile[v1]._mirange) {
v9 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v9);
}
PutMissile(ia);
@ -6023,7 +5975,7 @@ void __fastcall MI_Hbolt(int i)
ChangeLight(missile[v2]._mlid, missile[v2]._mix, missile[v2]._miy, missile[v2]._miAnimFrame + 7);
if (!missile[v2]._mirange) {
v7 = missile[v2]._mlid;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
AddUnLight(v7);
}
} else {
@ -6116,7 +6068,7 @@ void __fastcall MI_Element(int i)
CheckMissileCol(ia, v2, v2, 1, v5, tya, 1);
if (!missile[v1]._mirange) {
v6 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v6);
}
} else {
@ -6190,7 +6142,7 @@ void __fastcall MI_Bonespirit(int i)
ChangeLight(missile[v2]._mlid, missile[v2]._mix, missile[v2]._miy, missile[v2]._miAnimFrame);
if (!missile[v2]._mirange) {
v4 = missile[v2]._mlid;
missile[v2]._miDelFlag = 1;
missile[v2]._miDelFlag = TRUE;
AddUnLight(v4);
}
v5 = v1;
@ -6247,7 +6199,7 @@ void __fastcall MI_ResurrectBeam(int i)
v2 = missile[i]._mirange == 1;
--missile[v1]._mirange;
if (v2)
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
PutMissile(i);
}
@ -6287,7 +6239,7 @@ void __fastcall MI_Rportal(int i)
if (!missile[v1]._mirange) {
LABEL_12:
v3 = missile[v1]._mlid;
missile[v1]._miDelFlag = 1;
missile[v1]._miDelFlag = TRUE;
AddUnLight(v3);
goto LABEL_13;
}
@ -6304,81 +6256,57 @@ LABEL_13:
void __cdecl ProcessMissiles()
{
int v0; // eax
int i; // edx
int v2; // ecx
int v3; // edx
int v4; // edi
int v5; // esi
int *v6; // eax
int v7; // ecx
int *v8; // eax
int v9; // esi
int v10; // esi
int v11; // edx
int i, mi;
v0 = nummissiles;
for (i = 0; i < v0; dMissile[0][v2] = 0) {
v2 = 112 * missile[missileactive[i]]._mix + missile[missileactive[i]]._miy;
dFlags[0][v2] &= ~DFLAG_MISSILE;
++i;
for (i = 0; i < nummissiles; i++) {
dFlags[missile[missileactive[i]]._mix][missile[missileactive[i]]._miy] &= ~DFLAG_MISSILE;
dMissile[missile[missileactive[i]]._mix][missile[missileactive[i]]._miy] = 0;
}
v3 = 0;
while (v3 < v0) {
if (missile[missileactive[v3]]._miDelFlag) {
DeleteMissile(missileactive[v3], v3);
v0 = nummissiles;
v3 = 0;
i = 0;
while (i < nummissiles) {
if (missile[missileactive[i]]._miDelFlag) {
DeleteMissile(missileactive[i], i);
i = 0;
} else {
++v3;
i++;
}
}
v4 = 0;
MissilePreFlag = 0;
ManashieldFlag = 0;
if (v0 > 0) {
do {
v5 = missileactive[v4];
missiledata[missile[v5]._mitype].mProc(missileactive[v4]);
if (!(missile[v5]._miAnimFlags & 2)) {
v6 = &missile[v5]._miAnimCnt;
++*v6;
if (missile[v5]._miAnimCnt >= missile[v5]._miAnimDelay) {
v7 = missile[v5]._miAnimAdd;
*v6 = 0;
v8 = &missile[v5]._miAnimFrame;
v9 = missile[v5]._miAnimLen;
*v8 += v7;
if (*v8 > v9)
*v8 = 1;
if (*v8 < 1)
*v8 = v9;
}
for (i = 0; i < nummissiles; i++) {
mi = missileactive[i];
missiledata[missile[mi]._mitype].mProc(missileactive[i]);
if (!(missile[mi]._miAnimFlags & MFLAG_LOCK_ANIMATION)) {
missile[mi]._miAnimCnt++;
if (missile[mi]._miAnimCnt >= missile[mi]._miAnimDelay) {
missile[mi]._miAnimCnt = 0;
missile[mi]._miAnimFrame += missile[mi]._miAnimAdd;
if (missile[mi]._miAnimFrame > missile[mi]._miAnimLen)
missile[mi]._miAnimFrame = 1;
if (missile[mi]._miAnimFrame < 1)
missile[mi]._miAnimFrame = missile[mi]._miAnimLen;
}
v0 = nummissiles;
++v4;
} while (v4 < nummissiles);
if (ManashieldFlag) {
v10 = 0;
if (nummissiles > 0) {
do {
if (missile[missileactive[v10]]._mitype == MIS_MANASHIELD) {
MI_Manashield(missileactive[v10]);
v0 = nummissiles;
}
++v10;
} while (v10 < v0);
}
}
if (ManashieldFlag) {
for (i = 0; i < nummissiles; i++) {
if (missile[missileactive[i]]._mitype == MIS_MANASHIELD) {
MI_Manashield(missileactive[i]);
}
}
}
v11 = 0;
while (v11 < v0) {
if (missile[missileactive[v11]]._miDelFlag) {
DeleteMissile(missileactive[v11], v11);
v0 = nummissiles;
v11 = 0;
i = 0;
while (i < nummissiles) {
if (missile[missileactive[i]]._miDelFlag) {
DeleteMissile(missileactive[i], i);
i = 0;
} else {
++v11;
i++;
}
}
}

2
Source/missiles.h

@ -12,7 +12,7 @@ extern int MissilePreFlag; // weak
extern int numchains; // weak
void __fastcall GetDamageAmt(int i, int *mind, int *maxd);
int __fastcall CheckBlock(int fx, int fy, int tx, int ty);
BOOL __fastcall CheckBlock(int fx, int fy, int tx, int ty);
int __fastcall FindClosest(int sx, int sy, int rad);
int __fastcall GetSpellLevel(int id, int sn);
int __fastcall GetDirection8(int x1, int y1, int x2, int y2);

12
Source/monster.cpp

@ -5453,7 +5453,7 @@ void __fastcall MAI_Zhar(int i)
Monst->_mdir = md;
if (Monst->_mmode == MM_STAND)
if (monster[i]._mmode == MM_STAND)
Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];
}
@ -5503,7 +5503,7 @@ void __fastcall MAI_SnotSpil(int i)
Monst->_mdir = md;
if (Monst->_mmode == MM_STAND)
if (monster[i]._mmode == MM_STAND)
Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];
}
// 5CF330: using guessed type int setpc_h;
@ -5522,8 +5522,8 @@ void __fastcall MAI_Lazurus(int i)
return;
}
mx = Monst->_my;
my = Monst->_mx;
mx = Monst->_mx;
my = Monst->_my;
md = M_GetDir(i);
if (dFlags[mx][my] & DFLAG_VISIBLE) {
if (gbMaxPlayers == 1) {
@ -5555,7 +5555,7 @@ void __fastcall MAI_Lazurus(int i)
Monst->_mdir = md;
if (Monst->_mmode == MM_STAND || Monst->_mmode == MM_TALK)
if (monster[i]._mmode == MM_STAND || monster[i]._mmode == MM_TALK)
Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];
}
// 679660: using guessed type char gbMaxPlayers;
@ -5666,7 +5666,7 @@ void __fastcall MAI_Warlord(int i)
Monst->_mdir = md;
if (Monst->_mmode == MM_STAND || Monst->_mmode == MM_TALK)
if (monster[i]._mmode == MM_STAND || monster[i]._mmode == MM_TALK)
Monst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];
}

6
Source/msg.cpp

@ -207,15 +207,15 @@ void __fastcall DeltaExportData(int pnum)
if (sgbDeltaChanged) {
dst = (BYTE *)DiabloAllocPtr(4722);
dstEnd = dst + 1;
for (i = 0; i < NUMLEVELS; i++) {
dstEnd = dst + 1;
dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item);
dstEnd = DeltaExportObject(dstEnd, sgLevels[i].object);
dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster);
size = msg_comp_level(dst, dstEnd);
dthread_send_delta(pnum, i + CMD_DLEVEL_0, dst, size);
dstEnd = dst + 1; // BUGFIX (pending upstream)
}
dstEnd = dst + 1;
dstEnd = DeltaExportJunk(dstEnd);
size = msg_comp_level(dst, dstEnd);
dthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst, size);
@ -1291,7 +1291,7 @@ void __fastcall DeltaImportJunk(BYTE *src)
}
}
for (i = 0; i < MAXMULTIQUESTS; i++) { // BUGFIX (pending upstream)
for (i = 0; i < MAXMULTIQUESTS; i++) {
if (questlist[i]._qflags & 1) {
memcpy(&sgJunk.quests[i], src, sizeof(MultiQuests));
src += sizeof(MultiQuests);

2
Source/player.cpp

@ -1938,7 +1938,7 @@ void __fastcall SyncPlrKill(int pnum, int earflag)
for (i = 0; i < nummissiles; i++) {
ma = missileactive[i];
if (missile[ma]._mitype == MIS_MANASHIELD && missile[ma]._misource == pnum && missile[ma]._miDelFlag == 0) {
if (missile[ma]._mitype == MIS_MANASHIELD && missile[ma]._misource == pnum && missile[ma]._miDelFlag == FALSE) {
if (earflag != -1) {
missile[ma]._miVar8 = earflag;
}

2
structs.h

@ -401,7 +401,7 @@ typedef struct MissileStruct {
int _mityoff;
int _mimfnum;
int _mispllvl;
int _miDelFlag;
BOOL _miDelFlag;
BYTE _miAnimType;
int _miAnimFlags;
unsigned char *_miAnimData;

Loading…
Cancel
Save