fixed changing viewport properties not before fading out last screen (more)
[rocksndiamonds.git] / src / game.c
index 29303a7e2f75eb069f2d18bb80d21beae9f9b3a3..9b20bd43fe64a51fb22a8d0bea525b4529a2884c 100644 (file)
@@ -19,6 +19,7 @@
 #include "files.h"
 #include "tape.h"
 #include "network.h"
+#include "anim.h"
 
 
 /* DEBUG SETTINGS */
@@ -3102,9 +3103,6 @@ void InitGame()
 
   SetGameStatus(GAME_MODE_PLAYING);
 
-  /* needed if different viewport properties defined for playing */
-  ChangeViewportPropertiesIfNeeded();
-
   if (level_editor_test_game)
     FadeSkipNextFadeIn();
   else
@@ -3113,10 +3111,15 @@ void InitGame()
   if (CheckIfGlobalBorderHasChanged())
     fade_mask = REDRAW_ALL;
 
+  FadeSoundsAndMusic();
+
   ExpireSoundLoops(TRUE);
 
   FadeOut(fade_mask);
 
+  /* needed if different viewport properties defined for playing */
+  ChangeViewportPropertiesIfNeeded();
+
   ClearField();
 
   OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
@@ -4892,6 +4895,7 @@ static void setScreenCenteredToAllPlayers(int *sx, int *sy)
 void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir,
                        boolean center_screen, boolean quick_relocation)
 {
+  unsigned int frame_delay_value_old = GetVideoFrameDelay();
   boolean ffwd_delay = (tape.playing && tape.fast_forward);
   boolean no_delay = (tape.warp_forward);
   int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
@@ -4959,6 +4963,8 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir,
 
   ScrollScreen(NULL, SCROLL_GO_ON);    /* scroll last frame to full tile */
 
+  SetVideoFrameDelay(wait_delay_value);
+
   while (scroll_x != new_scroll_x || scroll_y != new_scroll_y)
   {
     int dx = 0, dy = 0;
@@ -4981,16 +4987,15 @@ void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir,
 
     /* scroll in two steps of half tile size to make things smoother */
     BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
-    Delay(wait_delay_value);
 
     /* scroll second step to align at full tile size */
-    BackToFront();
-    Delay(wait_delay_value);
+    BlitScreenToBitmap(window);
   }
 
   DrawAllPlayers();
   BackToFront();
-  Delay(wait_delay_value);
+
+  SetVideoFrameDelay(frame_delay_value_old);
 }
 
 void RelocatePlayer(int jx, int jy, int el_player_raw)
@@ -5040,8 +5045,7 @@ void RelocatePlayer(int jx, int jy, int el_player_raw)
 
       DrawPlayer(player);
 
-      BackToFront();
-      Delay(wait_delay_value);
+      BackToFront_WithFrameDelay(wait_delay_value);
     }
 
     DrawPlayer(player);                /* needed here only to cleanup last field */
@@ -10956,7 +10960,9 @@ void StartGameActions(boolean init_network_game, boolean record_tape,
 
 void GameActions()
 {
+#if 0
   static unsigned int game_frame_delay = 0;
+#endif
   unsigned int game_frame_delay_value;
   byte *recorded_player_action;
   byte summarized_player_action = 0;
@@ -11034,6 +11040,9 @@ void GameActions()
   if (tape.playing && tape.warp_forward && !tape.pausing)
     game_frame_delay_value = 0;
 
+  SetVideoFrameDelay(game_frame_delay_value);
+
+#if 0
 #if 0
   /* ---------- main game synchronization point ---------- */
 
@@ -11045,6 +11054,7 @@ void GameActions()
   /* ---------- main game synchronization point ---------- */
 
   WaitUntilDelayReached(&game_frame_delay, game_frame_delay_value);
+#endif
 #endif
 
   if (network_playing && !network_player_action_received)
@@ -12057,7 +12067,7 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy)
       AdvanceFrameAndPlayerCounters(player->index_nr);
 
       DrawAllPlayers();
-      BackToFront();
+      BackToFront_WithFrameDelay(0);
     }
 
     player->move_delay_value = original_move_delay_value;
@@ -14853,47 +14863,47 @@ static struct
 } gamebutton_info[NUM_GAME_BUTTONS] =
 {
   {
-    IMG_GAME_BUTTON_GFX_STOP,          &game.button.stop,
+    IMG_GFX_GAME_BUTTON_STOP,          &game.button.stop,
     GAME_CTRL_ID_STOP,                 "stop game"
   },
   {
-    IMG_GAME_BUTTON_GFX_PAUSE,         &game.button.pause,
+    IMG_GFX_GAME_BUTTON_PAUSE,         &game.button.pause,
     GAME_CTRL_ID_PAUSE,                        "pause game"
   },
   {
-    IMG_GAME_BUTTON_GFX_PLAY,          &game.button.play,
+    IMG_GFX_GAME_BUTTON_PLAY,          &game.button.play,
     GAME_CTRL_ID_PLAY,                 "play game"
   },
   {
-    IMG_GAME_BUTTON_GFX_UNDO,          &game.button.undo,
+    IMG_GFX_GAME_BUTTON_UNDO,          &game.button.undo,
     GAME_CTRL_ID_UNDO,                 "undo step"
   },
   {
-    IMG_GAME_BUTTON_GFX_REDO,          &game.button.redo,
+    IMG_GFX_GAME_BUTTON_REDO,          &game.button.redo,
     GAME_CTRL_ID_REDO,                 "redo step"
   },
   {
-    IMG_GAME_BUTTON_GFX_SAVE,          &game.button.save,
+    IMG_GFX_GAME_BUTTON_SAVE,          &game.button.save,
     GAME_CTRL_ID_SAVE,                 "save game"
   },
   {
-    IMG_GAME_BUTTON_GFX_PAUSE2,                &game.button.pause2,
+    IMG_GFX_GAME_BUTTON_PAUSE2,                &game.button.pause2,
     GAME_CTRL_ID_PAUSE2,               "pause game"
   },
   {
-    IMG_GAME_BUTTON_GFX_LOAD,          &game.button.load,
+    IMG_GFX_GAME_BUTTON_LOAD,          &game.button.load,
     GAME_CTRL_ID_LOAD,                 "load game"
   },
   {
-    IMG_GAME_BUTTON_GFX_SOUND_MUSIC,   &game.button.sound_music,
+    IMG_GFX_GAME_BUTTON_SOUND_MUSIC,   &game.button.sound_music,
     SOUND_CTRL_ID_MUSIC,               "background music on/off"
   },
   {
-    IMG_GAME_BUTTON_GFX_SOUND_LOOPS,   &game.button.sound_loops,
+    IMG_GFX_GAME_BUTTON_SOUND_LOOPS,   &game.button.sound_loops,
     SOUND_CTRL_ID_LOOPS,               "sound loops on/off"
   },
   {
-    IMG_GAME_BUTTON_GFX_SOUND_SIMPLE,  &game.button.sound_simple,
+    IMG_GFX_GAME_BUTTON_SOUND_SIMPLE,  &game.button.sound_simple,
     SOUND_CTRL_ID_SIMPLE,              "normal sounds on/off"
   }
 };
@@ -15084,8 +15094,7 @@ void GameUndoRedoExt()
   DrawCompleteVideoDisplay();
   DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime);
   DrawVideoDisplay(VIDEO_STATE_FRAME_ON, FrameCounter);
-  DrawVideoDisplay((tape.single_step ? VIDEO_STATE_1STEP_ON :
-                   VIDEO_STATE_1STEP_OFF), 0);
+  DrawVideoDisplay(VIDEO_STATE_1STEP(tape.single_step), 0);
 
   BackToFront();
 }