diff --git a/Source/missiles.cpp b/Source/missiles.cpp index f60d22361..ed2a7d5de 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -477,9 +477,15 @@ bool MoveMissile(Missile &missile, tl::function_ref checkTile, bool // Did the missile skip a tile? if (possibleVisitTiles > 1) { - // Implementation note: If someone knows the correct math to calculate this without this step for step increase loop, I would really appreciate it. - auto incVelocity = missile.position.velocity * (0.01f / (float)(possibleVisitTiles - 1)); + auto speed = abs(missile.position.velocity); + float denominator = (2 * speed.deltaY >= speed.deltaX) ? 2 * speed.deltaY : speed.deltaX; + auto incVelocity = missile.position.velocity * ((32 << 16) / denominator); auto traveled = missile.position.traveled - missile.position.velocity; + // Adjust the traveled vector to start on the next smallest multiple of incVelocity + if (incVelocity.deltaY != 0) + traveled.deltaY = (traveled.deltaY / incVelocity.deltaY) * incVelocity.deltaY; + if (incVelocity.deltaX != 0) + traveled.deltaX = (traveled.deltaX / incVelocity.deltaX) * incVelocity.deltaX; do { traveled += incVelocity; @@ -492,6 +498,13 @@ bool MoveMissile(Missile &missile, tl::function_ref checkTile, bool if (tile == missile.position.tile) break; + // skip collision logic if the missile is on a corner between tiles + if (pixelsTraveled.deltaY % 16 == 0 + && pixelsTraveled.deltaX % 32 == 0 + && (pixelsTraveled.deltaY / 16) % 2 != (pixelsTraveled.deltaX / 32) % 2) { + continue; + } + // don't call checkTile more than once for a tile if (prevTile == tile) continue; diff --git a/test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo b/test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo index b17835f7e..2327ed687 100644 Binary files a/test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo and b/test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo differ diff --git a/test/fixtures/timedemo/WarriorLevel1to2/demo_0_reference_spawn_0.sv b/test/fixtures/timedemo/WarriorLevel1to2/demo_0_reference_spawn_0.sv index 25dcbfebb..47018c710 100644 Binary files a/test/fixtures/timedemo/WarriorLevel1to2/demo_0_reference_spawn_0.sv and b/test/fixtures/timedemo/WarriorLevel1to2/demo_0_reference_spawn_0.sv differ