moved workaround for BD runtime elements in editor to separate function
[rocksndiamonds.git] / src / editor.c
index 69e57de2c7638a0d9dacaccabb55245dcf6e4e84..6ec52ee30ac21c4100f3120c80d7c9d733b53696 100644 (file)
@@ -680,13 +680,13 @@ enum
   GADGET_ID_LEVEL_AUTHOR,
   GADGET_ID_LEVELSET_NAME,
   GADGET_ID_LEVELSET_AUTHOR,
-  GADGET_ID_BD_COLOR_RGB_B,
-  GADGET_ID_BD_COLOR_RGB_0,
-  GADGET_ID_BD_COLOR_RGB_1,
-  GADGET_ID_BD_COLOR_RGB_2,
-  GADGET_ID_BD_COLOR_RGB_3,
-  GADGET_ID_BD_COLOR_RGB_4,
-  GADGET_ID_BD_COLOR_RGB_5,
+  GADGET_ID_BD_COLOR_TEXT_B,
+  GADGET_ID_BD_COLOR_TEXT_0,
+  GADGET_ID_BD_COLOR_TEXT_1,
+  GADGET_ID_BD_COLOR_TEXT_2,
+  GADGET_ID_BD_COLOR_TEXT_3,
+  GADGET_ID_BD_COLOR_TEXT_4,
+  GADGET_ID_BD_COLOR_TEXT_5,
   GADGET_ID_ELEMENT_NAME,
 
   // text area identifiers
@@ -756,6 +756,7 @@ enum
   GADGET_ID_SAVE_LEVELSET,
   GADGET_ID_ADD_CHANGE_PAGE,
   GADGET_ID_DEL_CHANGE_PAGE,
+  GADGET_ID_BD_SET_RANDOM_COLORS,
 
   // graphicbutton identifiers
 
@@ -1010,13 +1011,13 @@ enum
   ED_TEXTINPUT_ID_LEVEL_AUTHOR,
   ED_TEXTINPUT_ID_LEVELSET_NAME,
   ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_B,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_0,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_1,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_2,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_3,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_4,
-  ED_TEXTINPUT_ID_BD_COLOR_RGB_5,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_B,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_0,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_1,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_2,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_3,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_4,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_5,
   ED_TEXTINPUT_ID_ELEMENT_NAME,
 
   ED_NUM_TEXTINPUT
@@ -1028,8 +1029,8 @@ enum
 #define ED_TEXTINPUT_ID_LEVELSET_FIRST ED_TEXTINPUT_ID_LEVELSET_NAME
 #define ED_TEXTINPUT_ID_LEVELSET_LAST  ED_TEXTINPUT_ID_LEVELSET_AUTHOR
 
-#define ED_TEXTINPUT_ID_COLORS_FIRST   ED_TEXTINPUT_ID_BD_COLOR_RGB_B
-#define ED_TEXTINPUT_ID_COLORS_LAST    ED_TEXTINPUT_ID_BD_COLOR_RGB_5
+#define ED_TEXTINPUT_ID_COLORS_FIRST   ED_TEXTINPUT_ID_BD_COLOR_TEXT_B
+#define ED_TEXTINPUT_ID_COLORS_LAST    ED_TEXTINPUT_ID_BD_COLOR_TEXT_5
 
 // values for text area gadgets
 enum
@@ -1132,6 +1133,7 @@ enum
   ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1,
   ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE,
   ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE,
+  ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS,
 
   ED_NUM_TEXTBUTTONS
 };
@@ -1664,11 +1666,12 @@ static boolean levelset_copy_level_template = FALSE;
 static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 
 #define MAX_BD_COLORS                  7
-#define MAX_BD_COLOR_RGB_TEXT_LEN      7
+#define MAX_BD_COLOR_TEXT_LEN          10
 
 static boolean bd_color_type_changed = FALSE;
+static int bd_color_type_default = GD_COLOR_TYPE_RGB;
 static int bd_color_c64[MAX_BD_COLORS];
-static char bd_color_rgb[MAX_BD_COLORS][MAX_BD_COLOR_RGB_TEXT_LEN + 1];
+static char bd_color_text[MAX_BD_COLORS][MAX_BD_COLOR_TEXT_LEN + 1];
 static int bd_color_default[MAX_BD_COLORS];
 static int *bd_color[MAX_BD_COLORS] =
 {
@@ -2159,60 +2162,60 @@ static struct
   // ---------- engine settings: colors ---------------------------------------
 
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_B,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_B,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
-    GADGET_ID_BD_COLOR_RGB_B,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[0],
-    NULL, "Border color:    ", NULL,           "Enter border color (not used)"
+    GADGET_ID_BD_COLOR_TEXT_B,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[0],
+    NULL, "Border color:      ", NULL,         "Enter border color (not used)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_0,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_0,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(2),
-    GADGET_ID_BD_COLOR_RGB_0,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[1],
-    NULL, "Background color:", NULL,           "Enter background color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_0,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[1],
+    NULL, "Background color:  ", NULL,         "Enter background color (C64 graphics)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_1,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_1,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
-    GADGET_ID_BD_COLOR_RGB_1,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[2],
-    NULL, "Sand color:      ", NULL,           "Enter sand color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_1,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[2],
+    NULL, "Sand color:        ", NULL,         "Enter sand color (C64 graphics)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_2,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_2,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
-    GADGET_ID_BD_COLOR_RGB_2,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[3],
-    NULL, "Steel wall color:", NULL,           "Enter steel wall color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_2,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[3],
+    NULL, "Steel wall color:  ", NULL,         "Enter steel wall color (C64 graphics)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_3,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_3,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(5),
-    GADGET_ID_BD_COLOR_RGB_3,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[4],
-    NULL, "Wall color:      ", NULL,           "Enter wall color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_3,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[4],
+    NULL, "Wall color:        ", NULL,         "Enter wall color (C64 graphics)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_4,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_4,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(6),
-    GADGET_ID_BD_COLOR_RGB_4,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[5],
-    NULL, "Amoeba color:    ", NULL,           "Enter amoeba color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_4,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[5],
+    NULL, "Amoeba color:      ", NULL,         "Enter amoeba color (C64 graphics)"
   },
   {
-    ED_TEXTINPUT_ID_BD_COLOR_RGB_5,
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_5,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(7),
-    GADGET_ID_BD_COLOR_RGB_5,
-    MAX_BD_COLOR_RGB_TEXT_LEN,
-    bd_color_rgb[6],
-    NULL, "Slime color:     ", NULL,           "Enter slime color (C64 graphics)"
+    GADGET_ID_BD_COLOR_TEXT_5,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[6],
+    NULL, "Slime color:       ", NULL,         "Enter slime color (C64 graphics)"
   },
 
   // ---------- element settings: configure (several elements) ----------------
@@ -2968,8 +2971,10 @@ static struct ValueTextInfo options_bd_scheduling_type[] =
 
 static struct ValueTextInfo options_bd_color_type[] =
 {
-  { GD_COLOR_TYPE_C64,                 "C64 colors"                    },
   { GD_COLOR_TYPE_RGB,                 "RGB colors"                    },
+  { GD_COLOR_TYPE_C64,                 "C64 colors"                    },
+  { GD_COLOR_TYPE_C64DTV,              "C64DTV colors"                 },
+  { GD_COLOR_TYPE_ATARI,               "Atari colors"                  },
 
   { -1,                                          NULL                          }
 };
@@ -3120,7 +3125,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[0],
-    NULL, "Border color:    ", NULL,           "Select border color (not used)"
+    NULL, "Border color:      ", NULL,         "Select border color (not used)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_0,
@@ -3129,7 +3134,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[1],
-    NULL, "Background color:", NULL,           "Select background color (C64 graphics)"
+    NULL, "Background color:  ", NULL,         "Select background color (C64 graphics)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_1,
@@ -3138,7 +3143,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[2],
-    NULL, "Sand color:      ", NULL,           "Select sand color (C64 graphics)"
+    NULL, "Sand color:        ", NULL,         "Select sand color (C64 graphics)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_2,
@@ -3147,7 +3152,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[3],
-    NULL, "Steel wall color:", NULL,           "Select steel wall color (C64 graphics)"
+    NULL, "Steel wall color:  ", NULL,         "Select steel wall color (C64 graphics)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_3,
@@ -3156,7 +3161,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[4],
-    NULL, "Wall color:      ", NULL,           "Select wall color (C64 graphics)"
+    NULL, "Wall color:        ", NULL,         "Select wall color (C64 graphics)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_4,
@@ -3165,7 +3170,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[5],
-    NULL, "Amoeba color:    ", NULL,           "Select amoeba color (C64 graphics)"
+    NULL, "Amoeba color:      ", NULL,         "Select amoeba color (C64 graphics)"
   },
   {
     ED_SELECTBOX_ID_BD_COLOR_C64_5,
@@ -3174,7 +3179,7 @@ static struct
     -1,
     options_bd_color_c64_name,
     &bd_color_c64[6],
-    NULL, "Slime color:     ", NULL,           "Select slime color (C64 graphics)"
+    NULL, "Slime color:       ", NULL,         "Select slime color (C64 graphics)"
   },
 
   // ---------- element settings: configure (several elements) ----------------
@@ -3596,6 +3601,16 @@ static struct
     -1,                                                "Delete",
     NULL, NULL, NULL,                          "Delete current change page"
   },
+
+  // ---------- engine settings (buttons) -------------------------------------
+
+  {
+    ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(8),
+    GADGET_ID_BD_SET_RANDOM_COLORS,            GADGET_ID_NONE,
+    -1,                                                "Set random colors",
+    NULL, NULL, NULL,                          "Create and set random level colors"
+  },
 };
 
 static struct
@@ -8087,8 +8102,7 @@ static void getEditorGraphicAndFrame(int element, int *graphic, int *frame, bool
 {
   if (use_editor_gfx)
   {
-    *graphic = el2edimg(element);
-    *frame = 0;
+    el2edimg_with_frame(element, graphic, frame);
   }
   else
   {
@@ -8098,21 +8112,6 @@ static void getEditorGraphicAndFrame(int element, int *graphic, int *frame, bool
              ANIM_MODE(*graphic) == ANIM_CE_SCORE ?
              custom_element.collect_score_initial : FrameCounter);
   }
-
-  if (*graphic == IMG_UNKNOWN)
-  {
-    // no graphic defined -- if BD style, try to get runtime ("effect") element graphics
-    // (normal BD style elements have graphics, but runtime ("effects") elements do not)
-    int element_bd = map_element_RND_to_BD_cave(element);
-
-    if (element_bd != O_UNKNOWN)
-    {
-      struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0];
-
-      *graphic = g_bd->graphic;
-      *frame   = g_bd->frame;
-    }
-  }
 }
 
 static void getEditorGraphicSource(int element, int tile_size, Bitmap **bitmap,
@@ -10587,30 +10586,10 @@ static void InitDrawingElements(void)
   if (level.game_engine_type == game_engine_type_last)
     return;
 
-  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
-  {
-    new_element1 = EL_BD_WALL;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_BD_SAND;
-  }
-  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
-  {
-    new_element1 = EL_SP_CHIP_SINGLE;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_SP_BASE;
-  }
-  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
-  {
-    new_element1 = EL_MM_MIRROR_START;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_MM_WOODEN_WALL;
-  }
-  else
-  {
-    new_element1 = EL_WALL;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_SAND;
-  }
+  // select drawing elements according to game engine type
+  new_element1 = getDrawingElement(EL_WALL);
+  new_element2 = getDrawingElement(EL_EMPTY);
+  new_element3 = getDrawingElement(EL_SAND);
 
   game_engine_type_last = level.game_engine_type;
 }
@@ -11409,32 +11388,75 @@ static void DrawEngineConfigConfig(void)
     MapSelectboxGadget(i);
 }
 
-static boolean CheckLevelColorsRGB_BD(void)
+static int GetCommonColorType_BD(void)
 {
-  boolean rgb_colors = FALSE;
+  int bd_color_type = *bd_color[0] >> 24;
   int i;
 
-  // check if any level color is not a C64-style color index
-  for (i = 0; i < MAX_BD_COLORS; i++)
-    if (!gd_color_is_c64(*bd_color[i]))
-      rgb_colors = TRUE;
+  // check if all colors have the same color type
+  for (i = 1; i < MAX_BD_COLORS; i++)
+    if ((*bd_color[i] >> 24) != bd_color_type)
+      return GD_COLOR_TYPE_RGB;
 
-  return rgb_colors;
+  return bd_color_type;
 }
 
 void SetDefaultLevelColorType_BD(void)
 {
-  level.bd_color_type = (CheckLevelColorsRGB_BD() ? GD_COLOR_TYPE_RGB : GD_COLOR_TYPE_C64);
+  bd_color_type_default = GetCommonColorType_BD();
+
+  level.bd_color_type = bd_color_type_default;
 }
 
 void SetDefaultLevelColors_BD(void)
 {
   int i;
 
-  // only set default colors if C64 style palette
-  if (level.bd_color_type == GD_COLOR_TYPE_C64)
-    for (i = 0; i < MAX_BD_COLORS; i++)
-      bd_color_default[i] = *bd_color[i];
+  for (i = 0; i < MAX_BD_COLORS; i++)
+    bd_color_default[i] = *bd_color[i];
+}
+
+void SetRandomLevelColors_BD(int bd_color_type)
+{
+  struct LevelInfo_BD *level_bd = level.native_bd_level;
+  GdCave *cave = level_bd->cave;
+
+  // create random cave colors
+  gd_cave_set_random_colors(cave, bd_color_type);
+
+  // copy colors to level editor
+  level.bd_color_b = cave->colorb;
+  level.bd_color_0 = cave->color0;
+  level.bd_color_1 = cave->color1;
+  level.bd_color_2 = cave->color2;
+  level.bd_color_3 = cave->color3;
+  level.bd_color_4 = cave->color4;
+  level.bd_color_5 = cave->color5;
+}
+
+static void DrawColorBox_BD(int nr)
+{
+  int id = ED_SELECTBOX_ID_COLORS_FIRST + nr;
+  struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id];
+  int graphic = IMG_EDITOR_CHECKBOX;
+  struct GraphicInfo *gd = &graphic_info[graphic];
+  int offset = ED_GADGET_TEXT_DISTANCE;
+  int x1 = gi->x - offset - gd->width;
+  int y1 = gi->y;
+  int x2 = x1 + offset;
+  int y2 = y1 + offset;
+  int xsize1 = gd->width;
+  int ysize1 = gd->height;
+  int xsize2 = xsize1 - 2 * offset;
+  int ysize2 = ysize1 - 2 * offset;
+  int bd_color_x = *bd_color[nr];
+  int r = gd_color_get_r(bd_color_x);
+  int g = gd_color_get_g(bd_color_x);
+  int b = gd_color_get_b(bd_color_x);
+  Pixel color = SDL_MapRGB(drawto->surface->format, r, g, b);
+
+  BlitBitmap(gd->bitmap, drawto, gd->src_x, gd->src_y, xsize1, ysize1, x1, y1);
+  FillRectangle(drawto, x2, y2, xsize2, ysize2, color);
 }
 
 static void DrawEngineConfigColors(void)
@@ -11443,39 +11465,58 @@ static void DrawEngineConfigColors(void)
 
   if (bd_color_type_changed)
   {
-    if (level.bd_color_type == GD_COLOR_TYPE_C64 && CheckLevelColorsRGB_BD())
+    if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD())
     {
-      // color palette switched to C64 colors, but using RGB colors => reset to defaults
-      for (i = 0; i < MAX_BD_COLORS; i++)
-       *bd_color[i] = bd_color_default[i];
+      // color type switched to non-RGB colors, but using different color type => reset colors
+
+      if (level.bd_color_type == bd_color_type_default)
+      {
+       // color type switched to same color type as default colors => reset to defaults
+       for (i = 0; i < MAX_BD_COLORS; i++)
+         *bd_color[i] = bd_color_default[i];
+      }
+      else
+      {
+       // color type switched to different color type as default colors => use random colors
+       SetRandomLevelColors_BD(level.bd_color_type);
+      }
     }
 
     bd_color_type_changed = FALSE;
   }
 
-  // copy level colors to either C64-style color index or RGB color value
+  // copy level colors to either C64-style color index or color text
   for (i = 0; i < MAX_BD_COLORS; i++)
   {
-    if (level.bd_color_type == GD_COLOR_TYPE_RGB)
-      snprintf(bd_color_rgb[i], sizeof(bd_color_rgb[i]), "#%06x", gd_color_get_rgb(*bd_color[i]));
+    int bd_color_x = (level.bd_color_type == GD_COLOR_TYPE_C64 ? *bd_color[i] & 0x0f :
+                     level.bd_color_type == GD_COLOR_TYPE_RGB ? gd_color_get_rgb(*bd_color[i]) :
+                     *bd_color[i]);
+
+    if (level.bd_color_type == GD_COLOR_TYPE_C64)
+      bd_color_c64[i] = bd_color_x;
     else
-      bd_color_c64[i] = *bd_color[i] & 0x0f;
+      snprintf(bd_color_text[i], sizeof(bd_color_text[i]), "%s", gd_color_get_string(bd_color_x));
   }
 
   MapSelectboxGadget(ED_SELECTBOX_ID_BD_COLOR_TYPE);
 
-  if (level.bd_color_type == GD_COLOR_TYPE_RGB)
-  {
-    // draw text input gadgets
-    for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++)
-      MapTextInputGadget(i);
-  }
-  else
+  if (level.bd_color_type == GD_COLOR_TYPE_C64)
   {
     // draw selectbox gadgets
     for (i = ED_SELECTBOX_ID_COLORS_FIRST; i <= ED_SELECTBOX_ID_COLORS_LAST; i++)
       MapSelectboxGadget(i);
   }
+  else
+  {
+    // draw text input gadgets
+    for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++)
+      MapTextInputGadget(i);
+  }
+
+  for (i = 0; i < MAX_BD_COLORS; i++)
+    DrawColorBox_BD(i);
+
+  MapTextbuttonGadget(ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS);
 }
 
 static void DrawLevelConfigEngine(void)
@@ -11496,6 +11537,11 @@ static void DrawLevelConfigWindow(void)
 
   stick_element_properties_window = FALSE;
 
+  // make sure that previous level config edit mode exists for this level
+  if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE &&
+      level.game_engine_type != GAME_ENGINE_TYPE_BD)
+    edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL;
+
   SetAutomaticNumberOfGemsNeeded();
 
   UnmapLevelEditorFieldGadgets();
@@ -11921,33 +11967,38 @@ static void DrawPropertiesInfo(void)
 
   ypos += 2 * MAX(font1_height, font2_height);
 
-  // ----- print standard properties of this element
+  // ----- print standard properties of this element (only for certain game engines)
 
-  DrawTextS(xpos, ypos, font1_nr, properties_text);
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND ||
+      level.game_engine_type == GAME_ENGINE_TYPE_EM ||
+      level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    DrawTextS(xpos, ypos, font1_nr, properties_text);
 
-  ypos += line1_height;
+    ypos += line1_height;
 
-  for (i = 0; properties[i].value != -1; i++)
-  {
-    if (!HAS_PROPERTY(properties_element, properties[i].value))
-      continue;
+    for (i = 0; properties[i].value != -1; i++)
+    {
+      if (!HAS_PROPERTY(properties_element, properties[i].value))
+       continue;
 
-    DrawTextS(xpos, ypos, font2_nr, properties[i].text);
+      DrawTextS(xpos, ypos, font2_nr, properties[i].text);
 
-    ypos += font2_height;
+      ypos += font2_height;
 
-    num_standard_properties++;
-  }
+      num_standard_properties++;
+    }
 
-  if (num_standard_properties == 0)
-  {
-    DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset,
-             font2_nr, none_text);
+    if (num_standard_properties == 0)
+    {
+      DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset,
+               font2_nr, none_text);
 
-    ypos -= (line1_height - font1_height);
-  }
+      ypos -= (line1_height - font1_height);
+    }
 
-  ypos += MAX(font1_height, font2_height);
+    ypos += MAX(font1_height, font2_height);
+  }
 
   // ----- print special description of this element
 
@@ -13011,9 +13062,18 @@ static void DrawEditorElementAnimation(int x, int y)
   int graphic;
   int frame;
 
-  getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE);
+  if (IS_BD_RUNTIME_ELEMENT(properties_element))
+  {
+    getEditorGraphicAndFrame(properties_element, &graphic, &frame, TRUE);
+
+    DrawFixedGraphicExt(drawto, x, y, graphic, frame);
+  }
+  else
+  {
+    getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE);
 
-  DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+    DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+  }
 }
 
 static void DrawEditorElementName(int x, int y, int font_nr)
@@ -16291,7 +16351,9 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi)
   {
     int pos = type_id - ED_TEXTINPUT_ID_COLORS_FIRST;
 
-    *bd_color[pos] = gd_color_get_from_string(bd_color_rgb[pos]);
+    *bd_color[pos] = gd_color_get_from_string(bd_color_text[pos]);
+
+    DrawColorBox_BD(pos);
   }
 
   // do not mark level as modified for certain non-level-changing gadgets
@@ -16366,10 +16428,14 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
   {
     bd_color_type_changed = TRUE;
 
-    if (level.bd_color_type == GD_COLOR_TYPE_C64 && CheckLevelColorsRGB_BD())
+    if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD())
     {
-      // color palette switched to C64 colors, but using RGB colors => reset to defaults
-      if (!Request("This will reset C64 colors to defaults! Continue?", REQ_ASK))
+      // color type switched to non-RGB colors, but using different color type => reset colors
+      char *message = (level.bd_color_type == bd_color_type_default ?
+                      "This will reset colors to defaults! Continue?" :
+                      "This will reset colors to random colors! Continue?");
+
+      if (!Request(message, REQ_ASK))
       {
        // keep current RGB colors
        level.bd_color_type = GD_COLOR_TYPE_RGB;
@@ -16386,6 +16452,8 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     int pos = type_id - ED_SELECTBOX_ID_COLORS_FIRST;
 
     *bd_color[pos] = gd_c64_color(bd_color_c64[pos]);
+
+    DrawColorBox_BD(pos);
   }
 
   // do not mark level as modified for certain non-level-changing gadgets
@@ -16549,6 +16617,13 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
 
     level.changed = TRUE;
   }
+  else if (type_id == ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS)
+  {
+    SetRandomLevelColors_BD(level.bd_color_type);
+
+    // update BD color palette gadgets after setting random colors
+    DrawLevelConfigWindow();
+  }
 }
 
 static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)