added scrolling without iterating BD engine if player out of sight
authorHolger Schemel <info@artsoft.org>
Sun, 10 Mar 2024 20:26:56 +0000 (21:26 +0100)
committerHolger Schemel <info@artsoft.org>
Mon, 11 Mar 2024 07:49:07 +0000 (08:49 +0100)
This is needed to prevent broken tapes in case of viewport or tile
size changes and may occur in case of wrap-around at level borders.

Before, recording tape events was continued during scrolling, even
though the BD game engine did not iterate while scrolling the cave
to the visual player position. This could result in broken tapes if
the tape was replayed with a different playing viewport or with a
different tile size (like using "small game elements" from the setup
menu), as this would have an effect on the duration of scrolling,
causing tape events and game engine running out of sync.

src/game_bd/main_bd.c

index fcd2a23dd4287ecb768c202c33afceea142c77c8..a854786e3a868e429a3431f4c6c3cd6de4435c74 100644 (file)
@@ -386,6 +386,19 @@ void GameActions_BD(byte action[MAX_PLAYERS])
 
   play_game_func(game_bd.game, action[0]);
 
+  // scroll without iterating engine if player out of sight (mainly due to wrap-around)
+  // (this is needed to prevent broken tapes in case of viewport or tile size changes)
+  while (game_bd.game->out_of_window)
+  {
+    RedrawPlayfield_BD(TRUE);
+
+    BlitScreenToBitmap_BD(backbuffer);
+
+    BackToFront();
+
+    play_game_func(game_bd.game, action[0]);
+  }
+
   RedrawPlayfield_BD(FALSE);
 
   UpdateGameDoorValues_BD();