removed unused setup option 'soft_scrolling'
[rocksndiamonds.git] / src / tools.c
index e98ac35b9476491b9b6192a282f16c8c447d99e0..9c8263b60c801a55eea4a89febbd1e134f895c42 100644 (file)
@@ -233,7 +233,7 @@ void DumpTile(int x, int y)
 
 void SetDrawtoField(int mode)
 {
-  if (mode == DRAW_BUFFERED && setup.soft_scrolling)
+  if (mode == DRAW_FIELDBUFFER)
   {
     FX = 2 * TILEX_VAR;
     FY = 2 * TILEY_VAR;
@@ -951,10 +951,10 @@ void ClearField()
   DrawBackground(REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
 
   /* !!! maybe this should be done before clearing the background !!! */
-  if (setup.soft_scrolling && game_status == GAME_MODE_PLAYING)
+  if (game_status == GAME_MODE_PLAYING)
   {
     ClearRectangle(fieldbuffer, 0, 0, FXSIZE, FYSIZE);
-    SetDrawtoField(DRAW_BUFFERED);
+    SetDrawtoField(DRAW_FIELDBUFFER);
   }
   else
     SetDrawtoField(DRAW_BACKBUFFER);
@@ -2127,7 +2127,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
   boolean no_delay = (tape.warp_forward);
   unsigned int anim_delay = 0;
   int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
-  int anim_delay_value = (no_delay ? 0 : frame_delay_value);
+  int anim_delay_value = (no_delay ? 0 : frame_delay_value) / 2;
   int font_nr = FONT_ENVELOPE_1 + envelope_nr;
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
@@ -2139,17 +2139,22 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
   int yend = (anim_mode != ANIM_DEFAULT ? max_ysize : 0);
   int xstep = (xstart < xend ? 1 : 0);
   int ystep = (ystart < yend || xstep == 0 ? 1 : 0);
-  int x, y;
+  int start = 0;
+  int end = MAX(xend - xstart, yend - ystart);
+  int i;
 
-  for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep)
+  for (i = start; i <= end; i++)
   {
+    int last_frame = end;      // last frame of this "for" loop
+    int x = xstart + i * xstep;
+    int y = ystart + i * ystep;
     int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
     int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
     int sx = SX + (SXSIZE - xsize * font_width)  / 2;
     int sy = SY + (SYSIZE - ysize * font_height) / 2;
     int xx, yy;
 
-    SetDrawtoField(DRAW_BUFFERED);
+    SetDrawtoField(DRAW_FIELDBUFFER);
 
     BlitScreenToBitmap(backbuffer);
 
@@ -2168,7 +2173,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action)
     redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER;
     BackToFront();
 
-    WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
+    SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame);
   }
 }
 
@@ -2210,7 +2215,7 @@ void ShowEnvelope(int envelope_nr)
 
   game.envelope_active = FALSE;
 
-  SetDrawtoField(DRAW_BUFFERED);
+  SetDrawtoField(DRAW_FIELDBUFFER);
 
   redraw_mask |= REDRAW_FIELD;
   BackToFront();
@@ -2319,7 +2324,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action)
   boolean ffwd_delay = (tape.playing && tape.fast_forward);
   boolean no_delay = (tape.warp_forward);
   int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal);
-  int anim_delay_value = (no_delay ? 0 : delay_value + 500 * 0);
+  int anim_delay_value = (no_delay ? 0 : delay_value + 500 * 0) / 2;
   unsigned int anim_delay = 0;
 
   int width = request.width;
@@ -2336,12 +2341,15 @@ void AnimateEnvelopeRequest(int anim_mode, int action)
   int yend = (anim_mode != ANIM_DEFAULT ? max_ysize_inner : 0);
   int xstep = (xstart < xend ? 1 : 0);
   int ystep = (ystart < yend || xstep == 0 ? 1 : 0);
-  int x, y;
+  int start = 0;
+  int end = MAX(xend - xstart, yend - ystart);
+  int i;
 
   if (setup.quick_doors)
   {
     xstart = xend;
     ystart = yend;
+    end = 0;
   }
   else
   {
@@ -2351,8 +2359,11 @@ void AnimateEnvelopeRequest(int anim_mode, int action)
       PlayMenuSoundStereo(SND_DOOR_CLOSING, SOUND_MIDDLE);
   }
 
-  for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep)
+  for (i = start; i <= end; i++)
   {
+    int last_frame = end;      // last frame of this "for" loop
+    int x = xstart + i * xstep;
+    int y = ystart + i * ystep;
     int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2;
     int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2;
     int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2);
@@ -2394,7 +2405,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action)
     DoAnimation();
     BackToFront();
 
-    WaitUntilDelayReached(&anim_delay, anim_delay_value / 2);
+    SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame);
   }
 }
 
@@ -2456,7 +2467,6 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action)
       AnimateEnvelopeRequest(ANIM_DEFAULT, ACTION_OPENING);
 
     AnimateEnvelopeRequest(main_anim_mode, ACTION_OPENING);
-
   }
   else
   {
@@ -2493,7 +2503,7 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action)
   if (action == ACTION_CLOSING &&
       game_status == GAME_MODE_PLAYING &&
       level.game_engine_type == GAME_ENGINE_TYPE_RND)
-    SetDrawtoField(DRAW_BUFFERED);
+    SetDrawtoField(DRAW_FIELDBUFFER);
 }
 
 void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize)
@@ -3138,9 +3148,6 @@ void DrawPlayer(struct PlayerInfo *player)
       syy = player->GfxPos;
   }
 
-  if (!setup.soft_scrolling && ScreenMovPos)
-    sxx = syy = 0;
-
   if (player_is_opaque)
     DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING);
   else
@@ -3246,9 +3253,6 @@ void DrawPlayer(struct PlayerInfo *player)
       syy = player->GfxPos;
   }
 
-  if (!setup.soft_scrolling && ScreenMovPos)
-    sxx = syy = 0;
-
   if (player_is_opaque)
     DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING);
   else
@@ -4207,6 +4211,8 @@ unsigned int MoveDoor(unsigned int door_state)
 
     for (k = start; k < num_move_steps; k++)
     {
+      int last_frame = num_move_steps - 1;     // last frame of this "for" loop
+
       door_part_done_all = TRUE;
 
       for (i = 0; i < NUM_DOORS; i++)
@@ -4365,7 +4371,7 @@ unsigned int MoveDoor(unsigned int door_state)
        if (game_status == GAME_MODE_MAIN)
          DoAnimation();
 
-       WaitUntilDelayReached(&door_delay, door_delay_value);
+       SkipUntilDelayReached(&door_delay, door_delay_value, &k, last_frame);
 
        current_move_delay += max_step_delay;
       }
@@ -7801,14 +7807,12 @@ void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame,
 {
   static boolean player_was_waiting = TRUE;
 
-  if (!tape.recording)
-    return;
-
   if (frame == 0 && !any_player_dropping)
   {
     if (!player_was_waiting)
     {
-      SaveEngineSnapshotToList();
+      if (!SaveEngineSnapshotToList())
+       return;
 
       player_was_waiting = TRUE;
     }
@@ -7822,16 +7826,14 @@ void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame,
 void CheckSaveEngineSnapshot_SP(boolean murphy_is_waiting,
                                boolean murphy_is_dropping)
 {
-  static boolean player_was_waiting = FALSE;
-
-  if (!tape.recording)
-    return;
+  static boolean player_was_waiting = TRUE;
 
   if (murphy_is_waiting)
   {
     if (!player_was_waiting)
     {
-      SaveEngineSnapshotToList();
+      if (!SaveEngineSnapshotToList())
+       return;
 
       player_was_waiting = TRUE;
     }