extended functions to map between R'n'D and BD cave and game elements
[rocksndiamonds.git] / src / tools.c
index b92cf01b747cd3dbd61a90c4d85790f88f2b7001..fa991030d9ccaa7882e59fc2cc49b9eb953dbdd8 100644 (file)
@@ -3465,11 +3465,27 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y)
   redraw_mask |= REDRAW_FIELD;
 }
 
+static int getPreviewLevelWidth(void)
+{
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    return (level.native_bd_level->cave->x2 - level.native_bd_level->cave->x1 + 1);
+
+  return lev_fieldx;
+}
+
+static int getPreviewLevelHeight(void)
+{
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    return (level.native_bd_level->cave->y2 - level.native_bd_level->cave->y1 + 1);
+
+  return lev_fieldy;
+}
+
 static void DrawPreviewLevelPlayfield(int from_x, int from_y)
 {
   boolean show_level_border = (BorderElement != EL_EMPTY);
-  int level_xsize = lev_fieldx + (show_level_border ? 2 : 0);
-  int level_ysize = lev_fieldy + (show_level_border ? 2 : 0);
+  int level_xsize = getPreviewLevelWidth()  + (show_level_border ? 2 : 0);
+  int level_ysize = getPreviewLevelHeight() + (show_level_border ? 2 : 0);
   int tile_size = preview.tile_size;
   int preview_width  = preview.xsize * tile_size;
   int preview_height = preview.ysize * tile_size;
@@ -5564,8 +5580,8 @@ unsigned int MoveDoor(unsigned int door_state)
 
        if (!door_panel_drawn[door_index])
        {
-         ClearRectangle(drawto, door_rect->x, door_rect->y,
-                        door_rect->width, door_rect->height);
+         ClearRectangleOnBackground(drawto, door_rect->x, door_rect->y,
+                                    door_rect->width, door_rect->height);
 
          door_panel_drawn[door_index] = TRUE;
        }
@@ -6268,7 +6284,7 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_SWITCH,                     TRUE,
-    EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,           -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH_NORMAL,          -1, -1
   },
   {
     O_ACID,                                    TRUE,
@@ -7015,11 +7031,11 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_NORMAL,                     FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,           -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH_NORMAL,          -1, -1
   },
   {
     O_CONVEYOR_DIR_CHANGED,                    FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_LEFT,            -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH_CHANGED,         -1, -1
   },
   {
     O_CONVEYOR_SWITCH_OFF,                     FALSE,
@@ -7068,7 +7084,7 @@ bd_object_mapping_list[] =
   }
 };
 
-int map_element_RND_to_BD(int element_rnd)
+int map_element_RND_to_BD_cave(int element_rnd)
 {
   static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS];
   static boolean mapping_initialized = FALSE;
@@ -7099,7 +7115,38 @@ int map_element_RND_to_BD(int element_rnd)
   return mapping_RND_to_BD[element_rnd];
 }
 
-int map_element_BD_to_RND(int element_bd)
+int map_element_BD_to_RND_cave(int element_bd)
+{
+  static unsigned short mapping_BD_to_RND[O_MAX_ALL];
+  static boolean mapping_initialized = FALSE;
+
+  if (!mapping_initialized)
+  {
+    int i;
+
+    // return "EL_UNKNOWN" for all undefined elements in mapping array
+    for (i = 0; i < O_MAX_ALL; i++)
+      mapping_BD_to_RND[i] = EL_UNKNOWN;
+
+    for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+      if (bd_object_mapping_list[i].is_rnd_to_bd_mapping)
+       mapping_BD_to_RND[bd_object_mapping_list[i].element_bd] =
+         bd_object_mapping_list[i].element_rnd;
+
+    mapping_initialized = TRUE;
+  }
+
+  if (element_bd < 0 || element_bd >= O_MAX_ALL)
+  {
+    Warn("invalid BD element %d", element_bd);
+
+    return EL_UNKNOWN;
+  }
+
+  return mapping_BD_to_RND[element_bd];
+}
+
+int map_element_BD_to_RND_game(int element_bd)
 {
   static unsigned short mapping_BD_to_RND[O_MAX_ALL];
   static boolean mapping_initialized = FALSE;