diff --git a/Source/missiles.cpp b/Source/missiles.cpp index db84fc282..5e98e2a7c 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -588,6 +588,20 @@ void CheckMissileCol(Missile &missile, int mindam, int maxdam, bool shift, Point PlaySfxLoc(MissilesData[missile._mitype].miSFX, missile.position.tile); } +void MoveMissileAndCheckMissileCol(Missile &missile, int mindam, int maxdam, bool ignoreStart, bool ifCollidesDontMoveToHitTile) +{ + missile.position.traveled += missile.position.velocity; + UpdateMissilePos(missile); + if (ignoreStart && missile.position.start == missile.position.tile) + return; + CheckMissileCol(missile, mindam, maxdam, false, missile.position.tile, false); + if (ifCollidesDontMoveToHitTile && missile._mirange == 0) { + missile.position.traveled -= missile.position.velocity; + UpdateMissilePos(missile); + missile.position.StopMissile(); + } +} + void SetMissAnim(Missile &missile, int animtype) { int dir = missile._mimfnum; @@ -2854,8 +2868,6 @@ void MI_LArrow(Missile &missile) MissilesData[missile._mitype].mResist = rst; } else { missile._midist++; - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int mind; int maxd; @@ -2872,16 +2884,13 @@ void MI_LArrow(Missile &missile) maxd = GenerateRnd(10) + 1 + currlevel * 2; } - if (missile.position.tile != missile.position.start) { - missile_resistance rst = MissilesData[missile._mitype].mResist; - MissilesData[missile._mitype].mResist = MISR_NONE; - CheckMissileCol(missile, mind, maxd, false, missile.position.tile, false); - MissilesData[missile._mitype].mResist = rst; - } + missile_resistance rst = MissilesData[missile._mitype].mResist; + MissilesData[missile._mitype].mResist = MISR_NONE; + MoveMissileAndCheckMissileCol(missile, mind, maxd, true, true); + MissilesData[missile._mitype].mResist = rst; + if (missile._mirange == 0) { missile._mimfnum = 0; - missile.position.traveled -= missile.position.velocity; - UpdateMissilePos(missile); if (missile._mitype == MIS_LARROW) SetMissAnim(missile, MFILE_MINILTNG); else @@ -2907,8 +2916,6 @@ void MI_Arrow(Missile &missile) { missile._mirange--; missile._midist++; - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int p = missile._misource; int mind; @@ -2925,8 +2932,7 @@ void MI_Arrow(Missile &missile) mind = currlevel; maxd = 2 * currlevel; } - if (missile.position.tile != missile.position.start) - CheckMissileCol(missile, mind, maxd, false, missile.position.tile, false); + MoveMissileAndCheckMissileCol(missile, mind, maxd, true, false); if (missile._mirange == 0) missile._miDelFlag = true; PutMissile(missile); @@ -2938,10 +2944,6 @@ void MI_Firebolt(Missile &missile) missile._mirange--; if (missile._mitype != MIS_BONESPIRIT || missile._mimfnum != 8) { - int omx = missile.position.traveled.deltaX; - int omy = missile.position.traveled.deltaY; - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int p = missile._misource; if (p != -1) { if (missile._micaster == TARGET_MONSTERS) { @@ -2966,14 +2968,9 @@ void MI_Firebolt(Missile &missile) } else { d = currlevel + GenerateRnd(2 * currlevel); } - if (missile.position.tile != missile.position.start) { - CheckMissileCol(missile, d, d, false, missile.position.tile, false); - } + MoveMissileAndCheckMissileCol(missile, d, d, true, true); if (missile._mirange == 0) { missile._miDelFlag = true; - missile.position.traveled = { omx, omy }; - UpdateMissilePos(missile); - missile.position.StopMissile(); missile.var4 = -(AvailableMissiles[0] + 1); Point dst = { 0, 0 }; auto dir = static_cast(missile._mimfnum); @@ -3040,10 +3037,8 @@ void MI_Lightball(Missile &missile) int tx = missile.var1; int ty = missile.var2; missile._mirange--; - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int j = missile._mirange; - CheckMissileCol(missile, missile._midam, missile._midam, false, missile.position.tile, false); + MoveMissileAndCheckMissileCol(missile, missile._midam, missile._midam, false, false); if (missile._miHitFlag) missile._mirange = j; int8_t obj = dObject[tx][ty]; @@ -3116,10 +3111,7 @@ void MI_Fireball(Missile &missile) } } else { int dam = missile._midam; - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); - if (missile.position.tile != missile.position.start) - CheckMissileCol(missile, dam, dam, false, missile.position.tile, false); + MoveMissileAndCheckMissileCol(missile, dam, dam, true, false); if (missile._mirange == 0) { Point m = missile.position.tile; ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame); @@ -3510,10 +3502,8 @@ void MI_Firemove(Missile &missile) SetMissDir(missile, 1); missile._miAnimFrame = GenerateRnd(11) + 1; } - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int j = missile._mirange; - CheckMissileCol(missile, missile._midam, missile._midam, false, missile.position.tile, false); + MoveMissileAndCheckMissileCol(missile, missile._midam, missile._midam, false, false); if (missile._miHitFlag) missile._mirange = j; if (missile._mirange == 0) { @@ -4050,9 +4040,7 @@ void MI_Cbolt(Missile &missile) } else { missile.var3--; } - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); - CheckMissileCol(missile, missile._midam, missile._midam, false, missile.position.tile, false); + MoveMissileAndCheckMissileCol(missile, missile._midam, missile._midam, false, false); if (missile._miHitFlag) { missile.var1 = 8; missile._mimfnum = 0; @@ -4060,7 +4048,6 @@ void MI_Cbolt(Missile &missile) missile.position.velocity = {}; SetMissAnim(missile, MFILE_LGHNING); missile._mirange = missile._miAnimLen; - UpdateMissilePos(missile); } ChangeLight(missile._mlid, missile.position.tile, missile.var1); } @@ -4075,15 +4062,9 @@ void MI_Hbolt(Missile &missile) { missile._mirange--; if (missile._miAnimType != MFILE_HOLYEXPL) { - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); int dam = missile._midam; - if (missile.position.tile != missile.position.start) { - CheckMissileCol(missile, dam, dam, false, missile.position.tile, false); - } + MoveMissileAndCheckMissileCol(missile, dam, dam, true, true); if (missile._mirange == 0) { - missile.position.traveled -= missile.position.velocity; - UpdateMissilePos(missile); missile._mimfnum = 0; SetMissAnim(missile, MFILE_HOLYEXPL); missile._mirange = missile._miAnimLen - 1; @@ -4128,10 +4109,8 @@ void MI_Element(Missile &missile) AddUnLight(missile._mlid); } } else { - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); + MoveMissileAndCheckMissileCol(missile, dam, dam, false, false); Point c = missile.position.tile; - CheckMissileCol(missile, dam, dam, false, c, false); if (missile.var3 == 0 && c == Point { missile.var4, missile.var5 }) missile.var3 = 1; if (missile.var3 == 1) { @@ -4176,10 +4155,8 @@ void MI_Bonespirit(Missile &missile) } PutMissile(missile); } else { - missile.position.traveled += missile.position.velocity; - UpdateMissilePos(missile); + MoveMissileAndCheckMissileCol(missile, dam, dam, false, false); Point c = missile.position.tile; - CheckMissileCol(missile, dam, dam, false, c, false); if (missile.var3 == 0 && c == Point { missile.var4, missile.var5 }) missile.var3 = 1; if (missile.var3 == 1) {