rnd-20050115-1-src
[rocksndiamonds.git] / src / tools.c
index bd1ded0c740635fdf3400c55eb272d7c32c3418b..15841b17a993c0c85060d5d0ab64fd5203bb3801 100644 (file)
@@ -123,7 +123,12 @@ void SetDrawtoField(int mode)
 
 void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height)
 {
-  if (game_status == GAME_MODE_PLAYING && !game.envelope_active)
+  if (game_status == GAME_MODE_PLAYING &&
+      level.game_engine_type == GAME_ENGINE_TYPE_EM)
+  {
+    BlitScreenToBitmap_EM(backbuffer);
+  }
+  else if (game_status == GAME_MODE_PLAYING && !game.envelope_active)
   {
     if (force_redraw)
     {
@@ -2219,6 +2224,12 @@ boolean Request(char *text, unsigned int req_state)
     }
   }
 
+#if 1
+  if (game_status == GAME_MODE_PLAYING &&
+      level.game_engine_type == GAME_ENGINE_TYPE_EM)
+    BlitScreenToBitmap_EM(backbuffer);
+#endif
+
 #if 1
   /* disable deactivated drawing when quick-loading level tape recording */
   if (tape.playing && tape.deactivate_display)
@@ -4035,7 +4046,7 @@ em_object_mapping_list[] =
     EL_AMOEBA_DRY,                     ACTION_OTHER, -1
   },
   {
-    Xamoeba_5,                         FALSE,  FALSE,
+    Xamoeba_5,                         TRUE,   FALSE,
     EL_AMOEBA_WET,                     ACTION_OTHER, -1
   },
   {
@@ -5590,8 +5601,17 @@ int el2preimg(int element)
 
 int getGameFrameDelay_EM(int native_em_game_frame_delay)
 {
-  return (GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay :
-         GameFrameDelay);
+  int game_frame_delay_value;
+
+  game_frame_delay_value =
+    (tape.playing && tape.fast_forward ? FfwdFrameDelay :
+     GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay :
+     GameFrameDelay);
+
+  if (tape.playing && tape.warp_forward && !tape.pausing)
+    game_frame_delay_value = 0;
+
+  return game_frame_delay_value;
 }
 
 unsigned int InitRND(long seed)
@@ -5689,7 +5709,6 @@ void InitGraphicInfo_EM(void)
       int effective_element = (j > 5 && i == Yacid_splash_eB ? EL_EMPTY :
                               j > 5 && i == Yacid_splash_wB ? EL_EMPTY :
                               j < 7 ? element :
-                              i == Ynut_sB ? element :
                               i == Xdrip_stretch ? element :
                               i == Xdrip_stretchB ? element :
                               i == Ydrip_s1 ? element :
@@ -5714,11 +5733,12 @@ void InitGraphicInfo_EM(void)
                               i == Yspring_kill_w ? EL_SPRING :
                               i == Yemerald_stone ? EL_EMERALD :
                               i == Ydiamond_stone ? EL_ROCK :
+                              i == Xsand_stonein_4 ? EL_EMPTY :
+                              i == Xsand_stoneout_2 ? EL_ROCK :
                               is_backside ? EL_EMPTY :
                               action_removing ? EL_EMPTY :
                               element);
       int effective_action = (j < 7 ? action :
-                             i == Ynut_sB ? action :
                              i == Xdrip_stretch ? action :
                              i == Xdrip_stretchB ? action :
                              i == Ydrip_s1 ? action :
@@ -5811,22 +5831,22 @@ void InitGraphicInfo_EM(void)
                        i == Xsand_stonein_2 ? j + 9 :
                        i == Xsand_stonein_3 ? j + 17 :
                        i == Xsand_stonein_4 ? j + 25 :
-                       i == Xsand_stoneout_1 && j == 0 ? 1 :
-                       i == Xsand_stoneout_1 && j == 1 ? 1 :
-                       i == Xsand_stoneout_1 && j == 2 ? 2 :
-                       i == Xsand_stoneout_1 && j == 3 ? 4 :
-                       i == Xsand_stoneout_1 && j == 4 ? 4 :
-                       i == Xsand_stoneout_1 && j == 5 ? 6 :
-                       i == Xsand_stoneout_1 && j == 6 ? 8 :
-                       i == Xsand_stoneout_1 && j == 7 ? 8 :
-                       i == Xsand_stoneout_2 && j == 0 ? 10 :
-                       i == Xsand_stoneout_2 && j == 1 ? 12 :
-                       i == Xsand_stoneout_2 && j == 2 ? 14 :
-                       i == Xsand_stoneout_2 && j == 3 ? 16 :
-                       i == Xsand_stoneout_2 && j == 4 ? 18 :
-                       i == Xsand_stoneout_2 && j == 5 ? 22 :
-                       i == Xsand_stoneout_2 && j == 6 ? 26 :
-                       i == Xsand_stoneout_2 && j == 7 ? 30 :
+                       i == Xsand_stoneout_1 && j == 0 ? 0 :
+                       i == Xsand_stoneout_1 && j == 1 ? 0 :
+                       i == Xsand_stoneout_1 && j == 2 ? 1 :
+                       i == Xsand_stoneout_1 && j == 3 ? 2 :
+                       i == Xsand_stoneout_1 && j == 4 ? 2 :
+                       i == Xsand_stoneout_1 && j == 5 ? 3 :
+                       i == Xsand_stoneout_1 && j == 6 ? 4 :
+                       i == Xsand_stoneout_1 && j == 7 ? 4 :
+                       i == Xsand_stoneout_2 && j == 0 ? 5 :
+                       i == Xsand_stoneout_2 && j == 1 ? 6 :
+                       i == Xsand_stoneout_2 && j == 2 ? 7 :
+                       i == Xsand_stoneout_2 && j == 3 ? 8 :
+                       i == Xsand_stoneout_2 && j == 4 ? 9 :
+                       i == Xsand_stoneout_2 && j == 5 ? 11 :
+                       i == Xsand_stoneout_2 && j == 6 ? 13 :
+                       i == Xsand_stoneout_2 && j == 7 ? 15 :
                        i == Xboom_bug && j == 1 ? 2 :
                        i == Xboom_bug && j == 2 ? 2 :
                        i == Xboom_bug && j == 3 ? 4 :
@@ -5933,7 +5953,7 @@ void InitGraphicInfo_EM(void)
        int cx = ABS(dx) * TILEX / 8;
        int cy = ABS(dy) * TILEY / 8;
 
-       if (is_backside)                /* tile where movement starts */
+       if (is_backside)        /* tile where movement starts */
        {
          if (dx < 0 || dy < 0)
          {
@@ -5969,8 +5989,12 @@ void InitGraphicInfo_EM(void)
 #endif
 
       /* create unique graphic identifier to decide if tile must be redrawn */
+      /* bit 31 - 16 (16 bit): EM style element
+        bit 15 - 12 ( 4 bit): EM style frame
+        bit 11 -  6 ( 6 bit): graphic width
+        bit  5 -  0 ( 6 bit): graphic height */
       g_em->unique_identifier =
-       (i << 16) | (frame << 8) | g_em->width | g_em->height;
+       (i << 16) | (j << 12) | (g_em->width << 6) | g_em->height;
 
 #if DEBUG_EM_GFX
       if (g_em->bitmap != debug_bitmap ||
@@ -5991,9 +6015,9 @@ void InitGraphicInfo_EM(void)
          last_i = i;
        }
 
-       printf("::: EMC GFX ERROR for element %d -> %d ('%s') [%d, %d]",
+       printf("::: EMC GFX ERROR for element %d -> %d ('%s', '%s', %d)",
               i, element, element_info[element].token_name,
-              effective_action, direction);
+              element_action_info[effective_action].suffix, direction);
 
        if (element != effective_element)
          printf(" [%d ('%s')]",