diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 56ab5ebb6..3a5e3ef91 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1450,7 +1450,7 @@ void AddFireball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy } if (!mienemy) { missile[mi]._midam = 2 * (plr[id]._pLevel + random(60, 10) + random(60, 10)) + 4; - for (i = 0; i < missile[mi]._mispllvl; i++) { + for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._midam += missile[mi]._midam >> 3; } i = 2 * missile[mi]._mispllvl + 16; @@ -1566,10 +1566,9 @@ BOOL CheckIfTrig(int x, int y) void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam) { - int i, j, k, mx, tx, ty; + int i, j, k, mx, tx, ty, dp; int CrawlNum[6] = { 0, 3, 12, 45, 94, 159 }; - tx = dx; if (currlevel) { missile[mi]._miDelFlag = TRUE; for (j = 0; j < 6; j++) { @@ -1578,13 +1577,14 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in tx = dx + CrawlTable[k - 1]; ty = dy + CrawlTable[k]; if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { - if (!(dObject[tx][ty] | dPlayer[tx][ty] | dMissile[tx][ty] | nSolidTable[dPiece[tx][ty]] | nMissileTable[dPiece[tx][ty]])) { + dp = dPiece[tx][ty]; + if (!(dMissile[tx][ty] | nSolidTable[dp] | nMissileTable[dp] | dObject[tx][ty] | dPlayer[tx][ty])) { if (!CheckIfTrig(tx, ty)) { - missile[mi]._miDelFlag = FALSE; missile[mi]._mix = tx; missile[mi]._miy = ty; missile[mi]._misx = tx; missile[mi]._misy = ty; + missile[mi]._miDelFlag = FALSE; j = 6; break; } @@ -1594,6 +1594,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in } } } else { + tx = dx; ty = dy; missile[mi]._mix = tx; missile[mi]._miy = ty; @@ -1602,7 +1603,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in missile[mi]._miDelFlag = FALSE; } missile[mi]._mirange = 100; - missile[mi]._miVar1 = 100 - missile[mi]._miAnimLen; + missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; missile[mi]._miVar2 = 0; for (i = 0; i < nummissiles; i++) { mx = missileactive[i]; @@ -1653,7 +1654,7 @@ void AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, for (i = 0; i <= plr[id]._pLevel; i++) { missile[mi]._midam += random(56, 2) + 1; } - for (i = 0; i < missile[mi]._mispllvl; i++) { + for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._midam += missile[mi]._midam >> 3; } missile[mi]._midam += missile[mi]._midam >> 1; @@ -1712,12 +1713,12 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy pn = dPiece[tx][ty]; if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { if (LineClear(sx, sy, tx, ty)) { - if (!(dMonster[tx][ty] | dObject[tx][ty] | dMissile[tx][ty] | nSolidTable[pn] | nMissileTable[pn])) { - missile[mi]._miDelFlag = FALSE; + if (!(dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty])) { missile[mi]._mix = tx; missile[mi]._miy = ty; missile[mi]._misx = tx; missile[mi]._misy = ty; + missile[mi]._miDelFlag = FALSE; UseMana(id, SPL_GUARDIAN); i = 6; break; @@ -1731,9 +1732,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy if (missile[mi]._miDelFlag != TRUE) { missile[mi]._misource = id; missile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 1); - - missile[mi]._mirange = plr[id]._pLevel >> 1; - missile[mi]._mirange += missile[mi]._mispllvl; + missile[mi]._mirange = missile[mi]._mispllvl + (plr[id]._pLevel >> 1); missile[mi]._mirange += (missile[mi]._mirange * plr[id]._pISplDur) >> 7; if (missile[mi]._mirange > 30) @@ -1743,8 +1742,8 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy missile[mi]._mirange = 30; missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; - missile[mi]._miVar3 = 1; missile[mi]._miVar2 = 0; + missile[mi]._miVar3 = 1; } } @@ -1901,10 +1900,10 @@ void AddAcid(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in void miss_null_1D(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam) { missile[mi]._midam = dam; - missile[mi]._mirange = 50; missile[mi]._mixvel = 0; missile[mi]._miyvel = 0; - missile[mi]._miVar1 = 50 - missile[mi]._miAnimLen; + missile[mi]._mirange = 50; + missile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen; missile[mi]._miVar2 = 0; } @@ -1912,12 +1911,12 @@ void AddAcidpud(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, { int monst; - monst = missile[mi]._misource; missile[mi]._mixvel = 0; missile[mi]._miyvel = 0; missile[mi]._mixoff = 0; missile[mi]._miyoff = 0; missile[mi]._miLightFlag = TRUE; + monst = missile[mi]._misource; missile[mi]._mirange = random(50, 15) + 40 * (monster[monst]._mint + 1); missile[mi]._miPreFlag = TRUE; } @@ -1999,7 +1998,7 @@ void AddEtherealize(int mi, int sx, int sy, int dx, int dy, int midir, char mien int i; missile[mi]._mirange = 16 * plr[id]._pLevel >> 1; - for (i = 0; i < missile[mi]._mispllvl; i++) { + for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._mirange += missile[mi]._mirange >> 3; } missile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur >> 7; @@ -2100,7 +2099,7 @@ void AddElement(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, dy += YDirAdd[midir]; } missile[mi]._midam = 2 * (plr[id]._pLevel + random(60, 10) + random(60, 10)) + 4; - for (i = 0; i < missile[mi]._mispllvl; i++) { + for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._midam += missile[mi]._midam >> 3; } missile[mi]._midam >>= 1; @@ -2180,7 +2179,7 @@ void AddInfra(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, i int i; missile[mi]._mirange = 1584; - for (i = 0; i < missile[mi]._mispllvl; i++) { + for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._mirange += missile[mi]._mirange >> 3; } missile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur >> 7; @@ -2206,8 +2205,10 @@ void AddNova(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in missile[mi]._miVar1 = dx; missile[mi]._miVar2 = dy; if (id != -1) { - missile[mi]._midam = (random(66, 6) + random(66, 6) + random(66, 6) + random(66, 6) + random(66, 6) + plr[id]._pLevel + 5) >> 1; - for (k = 0; k < missile[mi]._mispllvl; k++) { + missile[mi]._midam = (random(66, 6) + random(66, 6) + random(66, 6) + random(66, 6) + random(66, 6)); + missile[mi]._midam += plr[id]._pLevel + 5; + missile[mi]._midam >>= 1; + for (k = missile[mi]._mispllvl; k > 0; k--) { missile[mi]._midam += missile[mi]._midam >> 3; } if (!mienemy) @@ -2257,24 +2258,24 @@ void AddApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, i int i; missile[mi]._miVar1 = 8; - missile[mi]._miVar2 = sy - 8; - missile[mi]._miVar3 = sy + 8; - missile[mi]._miVar4 = sx - 8; - missile[mi]._miVar5 = sx + 8; - missile[mi]._miVar6 = sx - 8; - if (sy - 8 <= 0) + missile[mi]._miVar2 = sy - missile[mi]._miVar1; + missile[mi]._miVar3 = missile[mi]._miVar1 + sy; + missile[mi]._miVar4 = sx - missile[mi]._miVar1; + missile[mi]._miVar5 = missile[mi]._miVar1 + sx; + missile[mi]._miVar6 = missile[mi]._miVar4; + if (missile[mi]._miVar2 <= 0) missile[mi]._miVar2 = 1; - if (sy + 8 >= MAXDUNY) + if (missile[mi]._miVar3 >= MAXDUNY) missile[mi]._miVar3 = MAXDUNY - 1; - if (sx - 8 <= 0) + if (missile[mi]._miVar4 <= 0) missile[mi]._miVar4 = 1; - if (sx + 8 >= MAXDUNX) + if (missile[mi]._miVar5 >= MAXDUNX) missile[mi]._miVar5 = MAXDUNX - 1; for (i = 0; i < plr[id]._pLevel; i++) { missile[mi]._midam += random(67, 6) + 1; } - missile[mi]._miDelFlag = FALSE; missile[mi]._mirange = 255; + missile[mi]._miDelFlag = FALSE; UseMana(id, SPL_APOCA); } @@ -2283,8 +2284,9 @@ void AddFlame(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, i int i; missile[mi]._miVar2 = 0; - if (dam > 0) - missile[mi]._miVar2 = 5 * dam; + for (i = dam; i > 0; i--) { + missile[mi]._miVar2 += 5; + } missile[mi]._misx = dx; missile[mi]._misy = dy; missile[mi]._mixoff = missile[midir]._mixoff; @@ -2310,9 +2312,9 @@ void AddFlamec(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, GetMissileVel(mi, sx, sy, dx, dy, 32); if (!mienemy) UseMana(id, SPL_FLAME); - missile[mi]._miVar3 = 0; - missile[mi]._miVar2 = sy; missile[mi]._miVar1 = sx; + missile[mi]._miVar2 = sy; + missile[mi]._miVar3 = 0; missile[mi]._mirange = 256; } @@ -2529,10 +2531,12 @@ int Sentfire(int i, int sx, int sy) missile[i]._miVar3 = missileavail[0]; AddMissile(missile[i]._mix, missile[i]._miy, sx, sy, dir, MIS_FIREBOLT, 0, missile[i]._misource, missile[i]._midam, GetSpellLevel(missile[i]._misource, SPL_FIREBOLT)); ex = -1; - SetMissDir(i, 2); - missile[i]._miVar2 = 3; } } + if (ex == -1) { + SetMissDir(i, 2); + missile[i]._miVar2 = 3; + } return ex; } @@ -2774,9 +2778,9 @@ void MI_Lightball(int i) char obj; tx = missile[i]._miVar1; - missile[i]._mitxoff += missile[i]._mixvel; ty = missile[i]._miVar2; missile[i]._mirange--; + missile[i]._mitxoff += missile[i]._mixvel; missile[i]._mityoff += missile[i]._miyvel; GetMissilePos(i); j = missile[i]._mirange; @@ -3195,8 +3199,8 @@ void MI_Etherealize(int i) { int src; - src = missile[i]._misource; missile[i]._mirange--; + src = missile[i]._misource; missile[i]._mix = plr[src].WorldX; missile[i]._miy = plr[src].WorldY; missile[i]._mitxoff = plr[src]._pxoff << 16; @@ -3205,8 +3209,8 @@ void MI_Etherealize(int i) missile[i]._misx = plr[src]._px; missile[i]._misy = plr[src]._py; } else { - missile[i]._misx = missile[i]._mix; - missile[i]._misy = missile[i]._miy; + missile[i]._misx = plr[src].WorldX; + missile[i]._misy = plr[src].WorldY; } GetMissilePos(i); if (plr[src]._pmode == PM_WALK3) { @@ -3251,7 +3255,7 @@ void MI_Firemove(int i) if (missile[i]._mix != missile[i]._miVar3 || missile[i]._miy != missile[i]._miVar4) { missile[i]._miVar3 = missile[i]._mix; missile[i]._miVar4 = missile[i]._miy; - ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, 8); + ChangeLight(missile[i]._mlid, missile[i]._miVar3, missile[i]._miVar4, 8); } } else { if (!missile[i]._miVar2) @@ -3451,9 +3455,9 @@ void MI_Acidsplat(int i) } missile[i]._mirange--; if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; monst = missile[i]._misource; dam = missile[i]._mispllvl; - missile[i]._miDelFlag = TRUE; AddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_ACIDPUD, 1, monst, (monster[monst].MData->mLevel >= 2) + 1, dam); } else { PutMissile(i); @@ -3473,11 +3477,11 @@ void MI_Teleport(int i) PlrClrTrans(plr[id].WorldX, plr[id].WorldY); plr[id].WorldX = missile[i]._mix; plr[id].WorldY = missile[i]._miy; - plr[id]._px = missile[i]._mix; - plr[id]._py = missile[i]._miy; - plr[id]._poldx = missile[i]._mix; - plr[id]._poldy = missile[i]._miy; - PlrDoTrans(missile[i]._mix, missile[i]._miy); + plr[id]._px = plr[id].WorldX; + plr[id]._py = plr[id].WorldY; + plr[id]._poldx = plr[id].WorldX; + plr[id]._poldy = plr[id].WorldY; + PlrDoTrans(plr[id].WorldX, plr[id].WorldY); missile[i]._miVar1 = 1; dPlayer[plr[id].WorldX][plr[id].WorldY] = id + 1; if (leveltype != DTYPE_TOWN) { @@ -3791,8 +3795,8 @@ void MI_Flame(int i) int k; missile[i]._mirange--; - k = missile[i]._mirange; missile[i]._miVar2--; + k = missile[i]._mirange; CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 1, missile[i]._mix, missile[i]._miy, 0); if (missile[i]._mirange == 0 && missile[i]._miHitFlag == TRUE) missile[i]._mirange = k; @@ -3817,8 +3821,8 @@ void MI_Flamec(int i) int id, src; missile[i]._mirange--; - missile[i]._mitxoff += missile[i]._mixvel; src = missile[i]._misource; + missile[i]._mitxoff += missile[i]._mixvel; missile[i]._mityoff += missile[i]._miyvel; GetMissilePos(i); if (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) { @@ -3907,7 +3911,7 @@ void MI_Hbolt(int i) 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); + ChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8); } } } else { diff --git a/Source/player.cpp b/Source/player.cpp index 0269d363a..2b965e281 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -862,8 +862,10 @@ void AddPlrMonstExper(int lvl, int exp, char pmask) } } - if (totplrs && (1 << myplr) & pmask) { - AddPlrExperience(myplr, lvl, exp / totplrs); + if (totplrs) { + exp = exp / totplrs; + if (pmask & (1 << myplr)) + AddPlrExperience(myplr, lvl, exp); } } diff --git a/Source/themes.cpp b/Source/themes.cpp index 61239deb0..6585ec883 100644 --- a/Source/themes.cpp +++ b/Source/themes.cpp @@ -734,9 +734,12 @@ void Theme_Library(int t) } } - if (!QuestStatus(QTYPE_ZHAR)) { + if (QuestStatus(QTYPE_ZHAR)) { + if (t == zharlib) { + return; + } PlaceThemeMonsts(t, monstrnd[leveltype]); /// BUGFIX: `leveltype - 1` - } else if (t != zharlib) { + } else { PlaceThemeMonsts(t, monstrnd[leveltype]); /// BUGFIX: `leveltype - 1` } }