fixed single step mode for R'n'D game engine when used in team mode
authorHolger Schemel <info@artsoft.org>
Sun, 3 Jan 2021 00:18:36 +0000 (01:18 +0100)
committerHolger Schemel <info@artsoft.org>
Sun, 3 Jan 2021 00:18:36 +0000 (01:18 +0100)
src/game.c
src/game.h

index d80e828866d1663e06156d936777d15ae9f83213..5968b1ded7e0abc96e391632bb64cae47c948050 100644 (file)
@@ -11286,13 +11286,14 @@ static void CheckSingleStepMode(struct PlayerInfo *player)
 {
   if (tape.single_step && tape.recording && !tape.pausing)
   {
-    /* as it is called "single step mode", just return to pause mode when the
-       player stopped moving after one tile (or never starts moving at all) */
-    if (!player->is_moving &&
-       !player->is_pushing &&
-       !player->is_dropping_pressed &&
-       !player->effective_mouse_action.button)
-      TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+    // as it is called "single step mode", just return to pause mode when the
+    // player stopped moving after one tile (or never starts moving at all)
+    // (reverse logic needed here in case single step mode used in team mode)
+    if (player->is_moving ||
+       player->is_pushing ||
+       player->is_dropping_pressed ||
+       player->effective_mouse_action.button)
+      game.enter_single_step_mode = FALSE;
   }
 
   CheckSaveEngineSnapshot(player);
@@ -11955,6 +11956,10 @@ void GameActions_RND(void)
     DrawGameDoorValues();
   }
 
+  // check single step mode (set flag and clear again if any player is active)
+  game.enter_single_step_mode =
+    (tape.single_step && tape.recording && !tape.pausing);
+
   for (i = 0; i < MAX_PLAYERS; i++)
   {
     int actual_player_action = stored_player[i].effective_action;
@@ -11979,6 +11984,10 @@ void GameActions_RND(void)
     ScrollPlayer(&stored_player[i], SCROLL_GO_ON);
   }
 
+  // single step pause mode may already have been toggled by "ScrollPlayer()"
+  if (game.enter_single_step_mode && !tape.pausing)
+    TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+
   ScrollScreen(NULL, SCROLL_GO_ON);
 
   /* for backwards compatibility, the following code emulates a fixed bug that
index b34d43445620b13f77d4dd924cfb75a6054f3efd..d1323f0e4589aaaac4cf41292dcb56d7f7a4123f 100644 (file)
@@ -244,6 +244,9 @@ struct GameInfo
   boolean set_centered_player;
   boolean set_centered_player_wrap;
 
+  // values for single step mode control
+  boolean enter_single_step_mode;
+
   // values for random number generator initialization after snapshot
   unsigned int num_random_calls;