rnd-20050103-1-src
[rocksndiamonds.git] / src / tools.c
index 51ed27939397bced7e7dca0a97b0aa2def554cab..1f857f6bc095190c1d27eff371dd68a85bb66d41 100644 (file)
@@ -123,6 +123,14 @@ void SetDrawtoField(int mode)
 
 void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height)
 {
+  if (game_status == GAME_MODE_PLAYING &&
+      level.game_engine_type == GAME_ENGINE_TYPE_EM)
+  {
+    RedrawPlayfield_EM();
+
+    return;
+  }
+
   if (game_status == GAME_MODE_PLAYING && !game.envelope_active)
   {
     if (force_redraw)
@@ -2219,6 +2227,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)
@@ -5495,7 +5509,7 @@ int get_next_element(int element)
   }
 }
 
-#if 1
+#if 0
 int el_act_dir2img(int element, int action, int direction)
 {
   element = GFX_ELEMENT(element);
@@ -5513,11 +5527,12 @@ int el_act_dir2img(int element, int action, int direction)
   element = GFX_ELEMENT(element);
   direction = MV_DIR_BIT(direction);   /* default: MV_NO_MOVING => MV_DOWN */
 
+  /* direction_graphic[][] == graphic[] for undefined direction graphics */
   return element_info[element].direction_graphic[action][direction];
 }
 #endif
 
-#if 1
+#if 0
 static int el_act_dir2crm(int element, int action, int direction)
 {
   element = GFX_ELEMENT(element);
@@ -5535,6 +5550,7 @@ static int el_act_dir2crm(int element, int action, int direction)
   element = GFX_ELEMENT(element);
   direction = MV_DIR_BIT(direction);   /* default: MV_NO_MOVING => MV_DOWN */
 
+  /* direction_graphic[][] == graphic[] for undefined direction graphics */
   return element_info[element].direction_crumbled[action][direction];
 }
 #endif
@@ -5588,8 +5604,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)
@@ -5687,7 +5712,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 :
@@ -5712,11 +5736,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 :
@@ -5754,6 +5779,7 @@ void InitGraphicInfo_EM(void)
                                     direction));
       int base_graphic = el_act2img(effective_element, ACTION_DEFAULT);
       int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT);
+      boolean has_crumbled_graphics = (base_crumbled != base_graphic);
       struct GraphicInfo *g = &graphic_info[graphic];
       struct GraphicInfo_EM *g_em = &graphic_info_em_object[i][7 - j];
       Bitmap *src_bitmap;
@@ -5808,22 +5834,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 :
@@ -5891,15 +5917,31 @@ void InitGraphicInfo_EM(void)
       g_em->crumbled_border_size = 0;
 #endif
 
-      if (base_crumbled != base_graphic && crumbled != IMG_EMPTY_SPACE)
+#if 0
+      if (effective_element == EL_EMC_GRASS &&
+         effective_action == ACTION_DIGGING)
+       printf("::: %d\n", crumbled);
+#endif
+
+#if 0
+      if (has_crumbled_graphics && crumbled == IMG_EMPTY_SPACE)
+       printf("::: empty crumbled: %d [%s], %d, %d\n",
+              effective_element, element_info[effective_element].token_name,
+              effective_action, direction);
+#endif
+
+      /* if element can be crumbled, but certain action graphics are just empty
+        space (like snapping sand with the original R'n'D graphics), do not
+        treat these empty space graphics as crumbled graphics in EMC engine */
+      if (has_crumbled_graphics && crumbled != IMG_EMPTY_SPACE)
       {
-       struct GraphicInfo *g_crumbled = &graphic_info[crumbled];
+       getGraphicSource(crumbled, frame, &src_bitmap, &src_x, &src_y);
 
        g_em->has_crumbled_graphics = TRUE;
-       g_em->crumbled_bitmap = g_crumbled->bitmap;
-       g_em->crumbled_src_x = g_crumbled->src_x;
-       g_em->crumbled_src_y = g_crumbled->src_y;
-       g_em->crumbled_border_size = g_crumbled->border_size;
+       g_em->crumbled_bitmap = src_bitmap;
+       g_em->crumbled_src_x = src_x;
+       g_em->crumbled_src_y = src_y;
+       g_em->crumbled_border_size = graphic_info[crumbled].border_size;
       }
 
 #if 1
@@ -5950,8 +5992,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 ||
@@ -5972,9 +6018,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')]",