rnd-20040117-1-src
[rocksndiamonds.git] / src / editor.c
index c15014899d9ff269ee308e2a57caaac54939014e..6dd5fd3fd62f502147301b1568c8e1b364a1b8c7 100644 (file)
                                         ED_GADGET_DISTANCE)
 /* custom element content */
 #define ED_AREA_ELEM_CONTENT4_XPOS     (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4_YPOS     (ED_SETTINGS_YPOS(12) + \
+#define ED_AREA_ELEM_CONTENT4_YPOS     (ED_SETTINGS_YPOS(13) + \
                                         ED_GADGET_DISTANCE - MINI_TILEY)
+/* movement enter/leave element */
+#define ED_AREA_ELEM_CONTENT4a_XPOS    (29 * MINI_TILEX)
+#define ED_AREA_ELEM_CONTENT4a_YPOS    (ED_SETTINGS_YPOS(7) + \
+                                        ED_GADGET_DISTANCE)
+#define ED_AREA_ELEM_CONTENT4b_XPOS    (29 * MINI_TILEX)
+#define ED_AREA_ELEM_CONTENT4b_YPOS    (ED_SETTINGS_YPOS(7) + \
+                                        ED_GADGET_DISTANCE)
 /* custom change trigger element */
 #define ED_AREA_ELEM_CONTENT5_YPOS     (ED_SETTINGS_YPOS(6) + \
                                         ED_GADGET_DISTANCE)
 #define GADGET_ID_AMOEBA_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 9)
 #define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 10)
 #define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 11)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 13)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 14)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 15)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 16)
+#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 12)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 13)
+#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 14)
+#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 15)
+#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 16)
+#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 17)
+#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 18)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 17)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 19)
 
 #define GADGET_ID_LEVEL_NAME           (GADGET_ID_TEXT_INPUT_FIRST + 0)
 #define GADGET_ID_LEVEL_AUTHOR         (GADGET_ID_TEXT_INPUT_FIRST + 1)
 #define ED_DRAWING_ID_AMOEBA_CONTENT           9
 #define ED_DRAWING_ID_CUSTOM_GRAPHIC           10
 #define ED_DRAWING_ID_CUSTOM_CONTENT           11
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     12
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    13
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    14
-#define ED_DRAWING_ID_GROUP_CONTENT            15
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                16
+#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                12
+#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                13
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     14
+#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    15
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    16
+#define ED_DRAWING_ID_GROUP_CONTENT            17
+#define ED_DRAWING_ID_RANDOM_BACKGROUND                18
 
-#define ED_NUM_DRAWING_AREAS                   17
+#define ED_NUM_DRAWING_AREAS                   19
 
 
 /*
@@ -947,7 +958,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(7),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_FIX_DOWN,     GADGET_ID_MOVE_DELAY_FIX_UP,
     GADGET_ID_MOVE_DELAY_FIX_TEXT,     GADGET_ID_NONE,
@@ -955,7 +966,7 @@ static struct
     NULL,                              "move delay", NULL
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(7),
+    -1,                                        ED_SETTINGS_YPOS(9),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_RND_DOWN,     GADGET_ID_MOVE_DELAY_RND_UP,
     GADGET_ID_MOVE_DELAY_RND_TEXT,     GADGET_ID_MOVE_DELAY_FIX_UP,
@@ -1296,7 +1307,7 @@ static struct
     "move/fall speed", NULL,           "speed of element movement"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(9),
+    -1,                                        ED_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_SMASH_TARGETS,    GADGET_ID_CUSTOM_CAN_SMASH,
     -1,
     options_smash_targets,
@@ -1304,7 +1315,7 @@ static struct
     "can smash", NULL,                 "elements that can be smashed"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(10),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_SLIPPERY_TYPE,    GADGET_ID_NONE,
     -1,
     options_slippery_type,
@@ -1312,7 +1323,7 @@ static struct
     "slippery", NULL,                  "where other elements fall down"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_DEADLINESS,       GADGET_ID_NONE,
     -1,
     options_deadliness,
@@ -1320,7 +1331,7 @@ static struct
     "deadly when", NULL,               "deadliness of element"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_CONSISTENCY,      GADGET_ID_NONE,
     -1,
     options_consistency,
@@ -1632,49 +1643,49 @@ static struct
     NULL, NULL,                                "element can move in some direction"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(9),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_CAN_FALL,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_FALL],
     NULL, "can fall",                  "element can fall down"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(9),
+    -1,                                        ED_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_CAN_SMASH,                GADGET_ID_CUSTOM_CAN_FALL,
     &custom_element_properties[EP_CAN_SMASH],
     " ", NULL,                         "element can smash other elements"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(10),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_SLIPPERY,         GADGET_ID_NONE,
     &custom_element_properties[EP_SLIPPERY],
     NULL, NULL,                                "other elements can fall down from it"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_DEADLY,           GADGET_ID_NONE,
     &custom_element_properties[EP_DEADLY],
     NULL, NULL,                                "element can kill the player"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_EXPLODE_RESULT,   GADGET_ID_NONE,
     &custom_element_properties[EP_EXPLODE_RESULT],
     NULL, NULL,                                "set consistency/destructibility"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_EXPLODE_FIRE,     GADGET_ID_NONE,
     &custom_element.can_explode_by_fire,
     NULL, "by fire",                   "element can explode by fire/explosion"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(13),
+    -1,                                        ED_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_EXPLODE_SMASH,    GADGET_ID_CUSTOM_EXPLODE_FIRE,
     &custom_element.can_explode_smashed,
     " ", "smashed",                    "element can explode when smashed"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(13),
+    -1,                                        ED_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_EXPLODE_IMPACT,   GADGET_ID_CUSTOM_EXPLODE_SMASH,
     &custom_element.can_explode_impact,
     " ", "impact",                     "element can explode on impact"
@@ -1840,6 +1851,22 @@ static struct
     "content:", NULL,                  NULL
   },
 
+  /* ---------- custom enter and leave element (when moving) --------------- */
+
+  {
+    ED_SETTINGS_XPOS(1),               ED_AREA_ELEM_CONTENT4a_YPOS,
+    1, 1,
+    GADGET_ID_CUSTOM_MOVE_ENTER,       GADGET_ID_NONE,
+    "can dig:", " ",                   NULL
+  },
+
+  {
+    -1,                                        ED_AREA_ELEM_CONTENT4b_YPOS,
+    1, 1,
+    GADGET_ID_CUSTOM_MOVE_LEAVE,       GADGET_ID_CUSTOM_MOVE_ENTER,
+    "can leave behind:", NULL,         NULL
+  },
+
   /* ---------- custom change target --------------------------------------- */
 
   {
@@ -2182,11 +2209,7 @@ static int editor_el_more[] =
   EL_BD_FIREFLY,
 
   EL_MOLE_LEFT,
-#if 0
-  EL_MAZE_RUNNER,
-#else
   EL_EMPTY,
-#endif
   EL_MOLE_RIGHT,
   EL_PACMAN,
 
@@ -2243,7 +2266,7 @@ static int editor_el_sokoban[] =
   EL_SOKOBAN_OBJECT,
   EL_SOKOBAN_FIELD_EMPTY,
   EL_SOKOBAN_FIELD_FULL,
-  EL_STEELWALL,
+  EL_SOKOBAN_FIELD_PLAYER,
 };
 static int *editor_hl_sokoban_ptr = editor_hl_sokoban;
 static int *editor_el_sokoban_ptr = editor_el_sokoban;
@@ -3381,6 +3404,12 @@ static void DrawDrawingArea(int id)
        DrawMiniGraphicExt(drawto,
                           gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
                           el2edimg(custom_element.content[x][y]));
+  else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER)
+    DrawMiniGraphicExt(drawto, gi->x, gi->y,
+                      el2edimg(custom_element.move_enter_element));
+  else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE)
+    DrawMiniGraphicExt(drawto, gi->x, gi->y,
+                      el2edimg(custom_element.move_leave_element));
   else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET)
     DrawMiniGraphicExt(drawto, gi->x, gi->y,
                       el2edimg(custom_element_change.target_element));
@@ -4847,6 +4876,40 @@ static int setSelectboxValue(int selectbox_id, int new_value)
 
 static void copy_custom_element_settings(int element_from, int element_to)
 {
+#if 1
+  struct ElementInfo ei_to_old = element_info[element_to];
+  struct ElementInfo *ei_from = &element_info[element_from];
+  struct ElementInfo *ei_to = &element_info[element_to];
+  int i;
+
+  /* ---------- copy whole element structure ---------- */
+  *ei_to = *ei_from;
+
+  /* ---------- restore structure pointers which cannot be copied ---------- */
+  ei_to->token_name         = ei_to_old.token_name;
+  ei_to->class_name         = ei_to_old.class_name;
+  ei_to->editor_description = ei_to_old.editor_description;
+  ei_to->custom_description = ei_to_old.custom_description;
+  ei_to->change_page        = ei_to_old.change_page;
+  ei_to->change             = ei_to_old.change;
+  ei_to->group              = ei_to_old.group;
+
+  /* ---------- copy element base properties ---------- */
+  Properties[element_to][EP_BITFIELD_BASE] =
+    Properties[element_from][EP_BITFIELD_BASE];
+
+  /* ---------- reinitialize and copy change pages ---------- */
+  setElementChangePages(ei_to, ei_to->num_change_pages);
+
+  for (i=0; i < ei_to->num_change_pages; i++)
+    ei_to->change_page[i] = ei_from->change_page[i];
+
+  /* ---------- copy group element info ---------- */
+  if (ei_from->group != NULL && ei_to->group != NULL)  /* group or internal */
+    *ei_to->group = *ei_from->group;
+
+#else
+
   struct ElementInfo *ei_from = &element_info[element_from];
   struct ElementInfo *ei_to = &element_info[element_to];
   int i, x, y;
@@ -4919,6 +4982,7 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
     change_to->sides = change_from->sides;
   }
+#endif
 
   /* mark this custom element as modified */
   ei_to->modified_settings = TRUE;
@@ -4938,7 +5002,7 @@ static void replace_custom_element_in_settings(int element_from,
        if (ei->content[x][y] == element_from)
          ei->content[x][y] = element_to;
 
-    for (j=0; j < ei->num_change_pages; j++)
+    for (j = 0; j < ei->num_change_pages; j++)
     {
       struct ElementChangeInfo *change = &ei->change_page[j];
 
@@ -4953,6 +5017,11 @@ static void replace_custom_element_in_settings(int element_from,
          if (change->content[x][y] == element_from)
            change->content[x][y] = element_to;
     }
+
+    if (ei->group != NULL)                             /* group or internal */
+      for (j = 0; j < MAX_ELEMENTS_IN_GROUP; j++)
+       if (ei->group->element[j] == element_from)
+         ei->group->element[j] = element_to;
   }
 }
 
@@ -4967,8 +5036,22 @@ static void replace_custom_element_in_playfield(int element_from,
        Feld[x][y] = element_to;
 }
 
-static void CopyCustomElement(int element_old, int element_new, int copy_mode)
+static boolean CopyCustomElement(int element_old, int element_new,
+                                int copy_mode)
 {
+  if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
+  {
+    Request("Please choose custom element !", REQ_CONFIRM);
+
+    return FALSE;
+  }
+  else if (IS_GROUP_ELEMENT(element_old) && !IS_GROUP_ELEMENT(element_new))
+  {
+    Request("Please choose group element !", REQ_CONFIRM);
+
+    return FALSE;
+  }
+
   if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM)
   {
     copy_custom_element_settings(element_new, element_old);
@@ -4979,21 +5062,23 @@ static void CopyCustomElement(int element_old, int element_new, int copy_mode)
   }
   else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE)
   {
-    copy_custom_element_settings(element_old, EL_DUMMY);
+    copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR);
     copy_custom_element_settings(element_new, element_old);
-    copy_custom_element_settings(EL_DUMMY, element_new);
+    copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new);
 
-    replace_custom_element_in_settings(element_old, EL_DUMMY);
+    replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR);
     replace_custom_element_in_settings(element_new, element_old);
-    replace_custom_element_in_settings(EL_DUMMY, element_new);
+    replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new);
 
-    replace_custom_element_in_playfield(element_old, EL_DUMMY);
+    replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR);
     replace_custom_element_in_playfield(element_new, element_old);
-    replace_custom_element_in_playfield(EL_DUMMY, element_new);
+    replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new);
   }
 
   UpdateCustomElementGraphicGadgets();
   DrawPropertiesWindow();
+
+  return TRUE;
 }
 
 static void CopyCustomElementPropertiesToEditor(int element)
@@ -6218,6 +6303,8 @@ static void DrawPropertiesConfig()
 
     /* draw drawing area gadgets */
     DrawCustomContentArea();
+    MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_ENTER);
+    MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_LEAVE);
 
     /* draw text input gadgets */
     MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME);
@@ -6369,7 +6456,8 @@ static void DrawPropertiesWindow()
   UnmapLevelEditorToolboxDrawingGadgets();
   UnmapLevelEditorToolboxCustomGadgets();
 
-  if (IS_CUSTOM_ELEMENT(properties_element))
+  if (IS_CUSTOM_ELEMENT(properties_element) ||
+      IS_GROUP_ELEMENT(properties_element))
     MapLevelEditorToolboxCustomGadgets();
 
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
@@ -7161,6 +7249,18 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
 
          CopyCustomElementPropertiesToGame(properties_element);
        }
+       else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
+       {
+         custom_element.move_enter_element = new_element;
+
+         CopyCustomElementPropertiesToGame(properties_element);
+       }
+       else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
+       {
+         custom_element.move_leave_element = new_element;
+
+         CopyCustomElementPropertiesToGame(properties_element);
+       }
        else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
        {
          custom_element_change.target_element = new_element;
@@ -7295,6 +7395,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        PickDrawingElement(button, custom_element.gfx_element);
       else if (id == GADGET_ID_CUSTOM_CONTENT)
        PickDrawingElement(button, custom_element.content[sx][sy]);
+      else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
+       PickDrawingElement(button, custom_element.move_enter_element);
+      else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
+       PickDrawingElement(button, custom_element.move_leave_element);
       else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
        PickDrawingElement(button, custom_element_change.target_element);
       else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
@@ -7580,6 +7684,10 @@ static void HandleControlButtons(struct GadgetInfo *gi)
     edit_mode = ED_MODE_DRAWING;
   }
 
+  /* element copy mode active, but no element button pressed => deactivate */
+  if (last_custom_copy_mode != -1 && id < ED_NUM_CTRL_BUTTONS)
+    last_custom_copy_mode = -1;
+
   switch (id)
   {
     case GADGET_ID_SCROLL_LEFT:
@@ -7878,13 +7986,14 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
        if (last_custom_copy_mode != -1)
        {
-         CopyCustomElement(properties_element, new_element,
-                           last_custom_copy_mode);
-
-         ClickOnGadget(level_editor_gadget[last_drawing_function],
-                       MB_LEFTBUTTON);
+         if (CopyCustomElement(properties_element, new_element,
+                               last_custom_copy_mode))
+         {
+           ClickOnGadget(level_editor_gadget[last_drawing_function],
+                         MB_LEFTBUTTON);
 
-         last_custom_copy_mode = -1;
+           last_custom_copy_mode = -1;
+         }
 
          break;
        }
@@ -8189,8 +8298,6 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
        strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len);
       else
        sprintf(infotext, "Level position: %d, %d", lx, ly);
-
-      infotext[max_infotext_len] = '\0';
 #else
       else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
        DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
@@ -8212,32 +8319,33 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
   }
   else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
   {
+    int element = EL_EMPTY;
+
     if (id == GADGET_ID_AMOEBA_CONTENT)
-      text = getElementInfoText(level.amoeba_content);
+      element = level.amoeba_content;
     else if (id == GADGET_ID_CUSTOM_GRAPHIC)
-      text = getElementInfoText(custom_element.gfx_element);
+      element = custom_element.gfx_element;
     else if (id == GADGET_ID_CUSTOM_CONTENT)
-      text = getElementInfoText(custom_element.content[sx][sy]);
+      element = custom_element.content[sx][sy];
+    else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
+      element = custom_element.move_enter_element;
+    else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
+      element = custom_element.move_leave_element;
     else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
-      text = getElementInfoText(custom_element_change.target_element);
+      element = custom_element_change.target_element;
     else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-      text = getElementInfoText(custom_element_change.content[sx][sy]);
+      element = custom_element_change.content[sx][sy];
     else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
-      text = getElementInfoText(custom_element_change.trigger_element);
+      element = custom_element_change.trigger_element;
     else if (id == GADGET_ID_GROUP_CONTENT)
-      text = getElementInfoText(group_element_info.element[sx]);
+      element = group_element_info.element[sx];
     else if (id == GADGET_ID_RANDOM_BACKGROUND)
-      text = getElementInfoText(random_placement_background_element);
+      element = random_placement_background_element;
     else if (id >= GADGET_ID_ELEMENT_CONTENT_0 &&
             id <= GADGET_ID_ELEMENT_CONTENT_7)
-    {
-      int i = id - GADGET_ID_ELEMENT_CONTENT_0;
+      element = level.yamyam_content[id - GADGET_ID_ELEMENT_CONTENT_0][sx][sy];
 
-      text = getElementInfoText(level.yamyam_content[i][sx][sy]);
-    }
-
-    strncpy(infotext, text, max_infotext_len);
-    infotext[max_infotext_len] = '\0';
+    strncpy(infotext, getElementInfoText(element), max_infotext_len);
   }
   else
   {
@@ -8247,6 +8355,10 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
       strcpy(infotext, "Custom graphic element");
     else if (id == GADGET_ID_CUSTOM_CONTENT)
       sprintf(infotext, "Custom element content position: %d, %d", sx, sy);
+    else if (id == GADGET_ID_CUSTOM_MOVE_ENTER)
+      strcpy(infotext, "Element that can be digged/collected");
+    else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE)
+      strcpy(infotext, "Element that will be left behind");
     else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
       strcpy(infotext, "New element after change");
     else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
@@ -8263,6 +8375,8 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
              id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy);
   }
 
+  infotext[max_infotext_len] = '\0';
+
   if (strlen(infotext) > 0)
     DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext);
 }