moved workaround for BD runtime elements in editor to separate function
[rocksndiamonds.git] / src / editor.c
index 798fc2bbaab320109c9ed54a94fdb160aef5423f..6ec52ee30ac21c4100f3120c80d7c9d733b53696 100644 (file)
@@ -8102,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
   {
@@ -8113,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,
@@ -10602,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;
 }
@@ -11452,13 +11416,13 @@ void SetDefaultLevelColors_BD(void)
     bd_color_default[i] = *bd_color[i];
 }
 
-static void SetRandomLevelColors_BD(void)
+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, level.bd_color_type);
+  gd_cave_set_random_colors(cave, bd_color_type);
 
   // copy colors to level editor
   level.bd_color_b = cave->colorb;
@@ -11470,7 +11434,7 @@ static void SetRandomLevelColors_BD(void)
   level.bd_color_5 = cave->color5;
 }
 
-static void DrawColorBox(int nr)
+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];
@@ -11514,7 +11478,7 @@ static void DrawEngineConfigColors(void)
       else
       {
        // color type switched to different color type as default colors => use random colors
-       SetRandomLevelColors_BD();
+       SetRandomLevelColors_BD(level.bd_color_type);
       }
     }
 
@@ -11550,7 +11514,7 @@ static void DrawEngineConfigColors(void)
   }
 
   for (i = 0; i < MAX_BD_COLORS; i++)
-    DrawColorBox(i);
+    DrawColorBox_BD(i);
 
   MapTextbuttonGadget(ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS);
 }
@@ -11573,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();
@@ -11998,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
 
@@ -13088,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)
@@ -16369,6 +16352,8 @@ 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_text[pos]);
+
+    DrawColorBox_BD(pos);
   }
 
   // do not mark level as modified for certain non-level-changing gadgets
@@ -16467,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
@@ -16632,7 +16619,7 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
   }
   else if (type_id == ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS)
   {
-    SetRandomLevelColors_BD();
+    SetRandomLevelColors_BD(level.bd_color_type);
 
     // update BD color palette gadgets after setting random colors
     DrawLevelConfigWindow();