diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index 5b10ce5bc..9238413cd 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -135,16 +135,12 @@ void UpdateMissileRendererData(Missile &m) float fProgress = gfProgressToNextGameTick; Displacement velocity = m.position.velocity * fProgress; - Displacement traveled = m.position.traveled + velocity; - - int mx = traveled.deltaX >> 16; - int my = traveled.deltaY >> 16; - int dx = (mx + 2 * my) / 64; - int dy = (2 * my - mx) / 64; + Displacement pixelsTravelled = (m.position.traveled + velocity) >> 16; + Displacement tileOffset = pixelsTravelled.screenToMissile(); // calculcate the future missile position - m.position.tileForRendering = m.position.start + Displacement { dx, dy }; - m.position.offsetForRendering = { mx + (dy * 32) - (dx * 32), my - (dx * 16) - (dy * 16) }; + m.position.tileForRendering = m.position.start + tileOffset; + m.position.offsetForRendering = pixelsTravelled + tileOffset.worldToScreen(); // In some cases this calculcated position is invalid. // For example a missile shouldn't move inside a wall. @@ -172,15 +168,11 @@ void UpdateMissileRendererData(Missile &m) } velocity = m.position.velocity * fProgress; - traveled = m.position.traveled + velocity; - - mx = traveled.deltaX >> 16; - my = traveled.deltaY >> 16; - dx = (mx + 2 * my) / 64; - dy = (2 * my - mx) / 64; + pixelsTravelled = (m.position.traveled + velocity) >> 16; + tileOffset = pixelsTravelled.screenToMissile(); - m.position.tileForRendering = m.position.start + Displacement { dx, dy }; - m.position.offsetForRendering = { mx + (dy * 32) - (dx * 32), my - (dx * 16) - (dy * 16) }; + m.position.tileForRendering = m.position.start + tileOffset; + m.position.offsetForRendering = pixelsTravelled + tileOffset.worldToScreen(); } } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 0af74c04a..073369bb7 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -477,12 +477,9 @@ bool MoveMissile(Missile &missile, const std::function &checkTile, traveled += incVelocity; // calculate in-between tile - int mx = traveled.deltaX >> 16; - int my = traveled.deltaY >> 16; - int dx = (mx + 2 * my) / 64; - int dy = (2 * my - mx) / 64; - - auto tile = missile.position.start + Displacement { dx, dy }; + Displacement pixelsTraveled = traveled >> 16; + Displacement tileOffset = pixelsTraveled.screenToMissile(); + Point tile = missile.position.start + tileOffset; // we are at the original calculated position => resume with normal logic if (tile == missile.position.tile)