fixed pushing element from left side onto conveyor belt in BD engine
authorHolger Schemel <holger.schemel@virtion.de>
Mon, 4 Nov 2024 20:10:35 +0000 (21:10 +0100)
committerHolger Schemel <holger.schemel@virtion.de>
Mon, 4 Nov 2024 20:10:35 +0000 (21:10 +0100)
This prevents game elements that are pushed onto a conveyor belt from
the left side to move two tiles at once. This is a result of the cave
scan order (already pushed element moved another tile when conveyor
belt is handled during scan of the next cave row). Although unlikely,
this change affects the game engine and therefore may break existing
caves (and will break existing replays that use this case).

So far, this is the only change that affects the game engine that was
made to fix weird behavior when using smooth movement animations.

src/game_bd/bd_caveengine.c

index 97ce3fe933f9445183e0280ea0aca022a7e43592..107441d51798de6c05b536465e00aae47b16f238 100644 (file)
@@ -3680,8 +3680,12 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                 int old_x = getx(cave, raw_x, raw_y);
                 int old_y = gety(cave, raw_x, raw_y);
 
-               store_dir(cave, x, y, GD_MV_UP, O_SPACE);        // place a space ...
-               store_dir(cave, old_x, old_y, move_dir, tile);   // and move element.
+                // only move game element if not already moving in that direction
+                if (game_bd.game->dir_buffer_to[old_y][old_x] != move_dir)
+                {
+                  store_dir(cave, x, y, GD_MV_UP, O_SPACE);        // place a space ...
+                  store_dir(cave, old_x, old_y, move_dir, tile);   // and move element.
+                }
              }
            }
 
@@ -3710,8 +3714,12 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire,
                 int old_x = getx(cave, raw_x, raw_y);
                 int old_y = gety(cave, raw_x, raw_y);
 
-               store_dir(cave, x, y, GD_MV_DOWN, O_SPACE);      // place a space ...
-               store_dir(cave, old_x, old_y, move_dir, tile);   // and move element.
+                // only move game element if not already moving in that direction
+                if (game_bd.game->dir_buffer_to[old_y][old_x] != move_dir)
+                {
+                  store_dir(cave, x, y, GD_MV_DOWN, O_SPACE);      // place a space ...
+                  store_dir(cave, old_x, old_y, move_dir, tile);   // and move element.
+                }
              }
            }
          }