rnd-20060520-1-src
[rocksndiamonds.git] / src / editor.c
index 631a5756fa9584a3c4969fac84c8c39d82d03da1..57649a8c1fba450cf0cad1c63ce911c7a1e2b926 100644 (file)
 #define GADGET_ID_RANDOM_PERCENTAGE    (GADGET_ID_CHECKBUTTON_FIRST + 0)
 #define GADGET_ID_RANDOM_QUANTITY      (GADGET_ID_CHECKBUTTON_FIRST + 1)
 #define GADGET_ID_RANDOM_RESTRICTED    (GADGET_ID_CHECKBUTTON_FIRST + 2)
-#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 3)
-#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 4)
-#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 5)
-#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 6)
-#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 3)
+#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 4)
+#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 5)
+#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 6)
+#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 7)
+#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 18)
 #define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
 #define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
 #define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
 #define ED_GRAPHICBUTTON_ID_CHANGE_LAST   ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE
 
 /* values for checkbutton gadgets */
-#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      0
-#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    1
-#define ED_CHECKBUTTON_ID_STICK_ELEMENT                2
-#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     3
-#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       4
-#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     5
-#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  6
-#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   7
-#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   8
-#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  9
-#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     10
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     11
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  12
-#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   13
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    14
-#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  15
-#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        16
+#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    0
+#define ED_CHECKBUTTON_ID_STICK_ELEMENT                1
+#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     2
+#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       3
+#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     4
+#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  5
+#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   6
+#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   7
+#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  8
+#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     9
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     10
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  11
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   12
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    13
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  14
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        15
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      16
 #define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
 #define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   18
 #define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   19
 
 #define ED_NUM_CHECKBUTTONS                    46
 
-#define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
+#define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
@@ -1549,6 +1549,10 @@ static struct ValueTextInfo options_change_direct_action[] =
 #endif
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+#if 0
+  { CE_VALUE_CHANGES,          "CE value changes"              },
+  { CE_SCORE_CHANGES,          "CE score changes"              },
+#endif
   { CE_VALUE_GETS_ZERO,                "CE value gets 0"               },
   { CE_SCORE_GETS_ZERO,                "CE score gets 0"               },
 
@@ -1576,6 +1580,8 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_EXPLOSION_OF_X,         "explosion of"                  },
   { CE_MOVE_OF_X,              "move of"                       },
   { CE_CREATION_OF_X,          "creation of"                   },
+  { CE_VALUE_CHANGES_OF_X,     "CE value changes of"           },
+  { CE_SCORE_CHANGES_OF_X,     "CE score changes of"           },
   { CE_VALUE_GETS_ZERO_OF_X,   "CE value gets 0 of"            },
   { CE_SCORE_GETS_ZERO_OF_X,   "CE score gets 0 of"            },
 
@@ -1667,7 +1673,6 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_LEVEL_TIME,         "set time"                      },
   { CA_SET_LEVEL_SCORE,                "set score"                     },
   { CA_SET_LEVEL_GEMS,         "set needed gems"               },
-  { CA_SET_LEVEL_GRAVITY,      "set gravity"                   },
   { CA_SET_LEVEL_WIND,         "set wind dir."                 },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_PLAYER_ACTIONS,        "[player actions]"              },
@@ -1677,11 +1682,12 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_PLAYER_KEYS,                "set keys"                      },
   { CA_SET_PLAYER_SPEED,       "set speed"                     },
   { CA_SET_PLAYER_SHIELD,      "set shield"                    },
+  { CA_SET_PLAYER_GRAVITY,     "set gravity"                   },
   { CA_SET_PLAYER_ARTWORK,     "set artwork"                   },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_CE_ACTIONS,    "[CE actions]"                  },
-  { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_SET_CE_VALUE,           "set CE value"                  },
+  { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_ENGINE_ACTIONS,        "[engine actions]"              },
   { CA_SET_ENGINE_SCAN_MODE,   "set scan mode"                 },
@@ -1691,7 +1697,7 @@ static struct ValueTextInfo options_action_type[] =
 
 static struct ValueTextInfo options_action_mode_none[] =
 {
-  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_MODE_UNDEFINED,         " "                             },
 
   { -1,                                NULL                            }
 };
@@ -1761,9 +1767,9 @@ static struct ValueTextInfo options_action_arg_number[] =
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_RESET,       "reset"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
-  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
   { CA_ARG_NUMBER_CE_VALUE,    "CE value"                      },
+  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
+  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_LEVEL_TIME,  "time"                          },
   { CA_ARG_NUMBER_LEVEL_GEMS,  "gems"                          },
@@ -1798,9 +1804,9 @@ static struct ValueTextInfo options_action_arg_value[] =
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_RESET,       "reset"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
-  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
   { CA_ARG_NUMBER_CE_VALUE,    "CE value"                      },
+  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
+  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_LEVEL_TIME,  "time"                          },
   { CA_ARG_NUMBER_LEVEL_GEMS,  "gems"                          },
@@ -1970,14 +1976,14 @@ action_arg_options[] =
   { CA_SET_LEVEL_TIME,         3,      options_action_arg_number,      },
   { CA_SET_LEVEL_GEMS,         3,      options_action_arg_number,      },
   { CA_SET_LEVEL_SCORE,                3,      options_action_arg_number,      },
-  { CA_SET_LEVEL_GRAVITY,      1,      options_action_arg_gravity,     },
   { CA_SET_LEVEL_WIND,         1,      options_action_arg_direction,   },
   { CA_SET_PLAYER_KEYS,                2,      options_action_arg_key,         },
   { CA_SET_PLAYER_SPEED,       1,      options_action_arg_speed,       },
   { CA_SET_PLAYER_SHIELD,      1,      options_action_arg_shield,      },
+  { CA_SET_PLAYER_GRAVITY,     1,      options_action_arg_gravity,     },
   { CA_SET_PLAYER_ARTWORK,     1,      options_action_arg_artwork,     },
-  { CA_SET_CE_SCORE,           3,      options_action_arg_value,       },
   { CA_SET_CE_VALUE,           3,      options_action_arg_value,       },
+  { CA_SET_CE_SCORE,           3,      options_action_arg_value,       },
   { CA_SET_ENGINE_SCAN_MODE,   1,      options_action_arg_scan_mode,   },
 
   { -1,                                FALSE,  NULL                            }
@@ -2028,7 +2034,7 @@ static struct
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
     options_player_speed,
-    &level.initial_player_stepsize,
+    &level.initial_player_stepsize[0],
     "initial player speed:", NULL,     "initial player speed"
   },
 
@@ -2465,13 +2471,6 @@ static struct
 {
   /* ---------- level and editor settings ---------------------------------- */
 
-  {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
-    GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
-    &level.initial_gravity,
-    NULL,
-    "initial gravity",                 "set initial level gravity"
-  },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_COUNTER2_YPOS(9) - MINI_TILEY,
     GADGET_ID_RANDOM_RESTRICTED,       GADGET_ID_NONE,
@@ -2587,6 +2586,13 @@ static struct
     NULL,
     "use explosion from element:",     "use explosion properties from element"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
+    GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
+    &level.initial_player_gravity[0],
+    NULL,
+    "use initial gravity",             "set initial player gravity"
+  },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
@@ -2999,7 +3005,7 @@ static struct
   /* ---------- custom change content (extended change target) ------------- */
 
   {
-    -1,                                        ED_AREA_3X3_SETTINGS_YPOS(10),
+    -1,                                        ED_AREA_3X3_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_CHANGE_CONTENT,   GADGET_ID_NONE, /* align three rows */
     &custom_element_change.target_content.e[0][0], 3, 3,
     NULL, NULL, NULL,                  "new extended elements after change"
@@ -3671,7 +3677,7 @@ static int editor_el_diamond_caves[] =
   EL_SWITCHGATE_OPEN,
   EL_SWITCHGATE_CLOSED,
   EL_SWITCHGATE_SWITCH_UP,
-  EL_EMPTY,
+  EL_SWITCHGATE_SWITCH_DOWN,
 
   EL_ENVELOPE_1,
   EL_ENVELOPE_2,
@@ -4536,6 +4542,32 @@ static char *getElementInfoText(int element)
   return info_text;
 }
 
+char *getElementDescriptionFilename(int element)
+{
+  char *docs_dir = options.docs_directory;
+  char *elements_subdir = "elements";
+  static char *filename = NULL;
+  char basename[MAX_FILENAME_LEN];
+
+  checked_free(filename);
+
+  /* 1st try: look for element description file for exactly this element */
+  sprintf(basename, "%s.txt", element_info[element].token_name);
+  filename = getPath3(docs_dir, elements_subdir, basename);
+  if (fileExists(filename))
+    return filename;
+
+  free(filename);
+
+  /* 2nd try: look for element description file for this element's class */
+  sprintf(basename, "%s.txt", element_info[element].class_name);
+  filename = getPath3(docs_dir, elements_subdir, basename);
+  if (fileExists(filename))
+    return filename;
+
+  return NULL;
+}
+
 static void InitDynamicEditorElementList(int **elements, int *num_elements)
 {
   boolean element_found[NUM_FILE_ELEMENTS];
@@ -6340,12 +6372,22 @@ static void setSelectboxSpecialActionVariablesIfNeeded()
       /* only change if corresponding selectbox has changed */
       if (selectbox_info[ED_SELECTBOX_ID_ACTION_MODE].options !=
          action_arg_modes[mode])
+#if 0
+       custom_element_change.action_mode =
+         (action_arg_modes[mode])[0].value;
+#else
        custom_element_change.action_mode = -1;
+#endif
 
       /* only change if corresponding selectbox has changed */
       if (selectbox_info[ED_SELECTBOX_ID_ACTION_ARG].options !=
          action_arg_options[i].options)
+#if 0
+       custom_element_change.action_arg =
+         action_arg_options[i].options[0].value;
+#else
        custom_element_change.action_arg = -1;
+#endif
 
       break;
     }
@@ -6377,6 +6419,18 @@ static void setSelectboxSpecialActionOptions()
   }
 }
 
+#if 1
+
+static void copy_custom_element_settings(int element_from, int element_to)
+{
+  struct ElementInfo *ei_from = &element_info[element_from];
+  struct ElementInfo *ei_to = &element_info[element_to];
+
+  copyElementInfo(ei_from, ei_to);
+}
+
+#else
+
 static void copy_custom_element_settings(int element_from, int element_to)
 {
   struct ElementInfo *ei_from = &element_info[element_from];
@@ -6389,10 +6443,11 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
   /* ---------- copy element base properties ---------- */
 #if 1
-  ei_to->properties[EP_BITFIELD_BASE] = ei_from->properties[EP_BITFIELD_BASE];
+  ei_to->properties[EP_BITFIELD_BASE_NR] =
+    ei_from->properties[EP_BITFIELD_BASE_NR];
 #else
-  Properties[element_to][EP_BITFIELD_BASE] =
-    Properties[element_from][EP_BITFIELD_BASE];
+  Properties[element_to][EP_BITFIELD_BASE_NR] =
+    Properties[element_from][EP_BITFIELD_BASE_NR];
 #endif
 
   /* ---------- copy custom property values ---------- */
@@ -6426,14 +6481,14 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
   ei_to->slippery_type = ei_from->slippery_type;
 
-  for (y = 0; y < 3; y++)
-    for (x = 0; x < 3; x++)
-      ei_to->content.e[x][y] = ei_from->content.e[x][y];
-
   ei_to->explosion_type = ei_from->explosion_type;
   ei_to->explosion_delay = ei_from->explosion_delay;
   ei_to->ignition_delay = ei_from->ignition_delay;
 
+  for (y = 0; y < 3; y++)
+    for (x = 0; x < 3; x++)
+      ei_to->content.e[x][y] = ei_from->content.e[x][y];
+
   /* ---------- reinitialize and copy change pages ---------- */
 
   ei_to->num_change_pages = ei_from->num_change_pages;
@@ -6441,7 +6496,7 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
   setElementChangePages(ei_to, ei_to->num_change_pages);
 
-  for (i=0; i < ei_to->num_change_pages; i++)
+  for (i = 0; i < ei_to->num_change_pages; i++)
     ei_to->change_page[i] = ei_from->change_page[i];
 
   /* ---------- copy group element info ---------- */
@@ -6451,6 +6506,7 @@ static void copy_custom_element_settings(int element_from, int element_to)
   /* mark this custom element as modified */
   ei_to->modified_settings = TRUE;
 }
+#endif
 
 static void replace_custom_element_in_settings(int element_from,
                                               int element_to)
@@ -6676,6 +6732,8 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_BLOCKED) ? CE_BLOCKED :
      HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
      HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
+     HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES) ? CE_VALUE_CHANGES :
+     HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES) ? CE_SCORE_CHANGES :
      HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO) ? CE_VALUE_GETS_ZERO :
      HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO) ? CE_SCORE_GETS_ZERO :
      custom_element_change.direct_action);
@@ -6701,6 +6759,8 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
      HAS_CHANGE_EVENT(element, CE_MOVE_OF_X) ? CE_MOVE_OF_X :
      HAS_CHANGE_EVENT(element, CE_CREATION_OF_X) ? CE_CREATION_OF_X :
+     HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES_OF_X) ? CE_VALUE_CHANGES_OF_X :
+     HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES_OF_X) ? CE_SCORE_CHANGES_OF_X :
      HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X :
      HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO_OF_X) ? CE_SCORE_GETS_ZERO_OF_X :
      custom_element_change.other_action);
@@ -6819,6 +6879,8 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_BLOCKED] = FALSE;
   custom_element_change_events[CE_IMPACT] = FALSE;
   custom_element_change_events[CE_SMASHED] = FALSE;
+  custom_element_change_events[CE_VALUE_CHANGES] = FALSE;
+  custom_element_change_events[CE_SCORE_CHANGES] = FALSE;
   custom_element_change_events[CE_VALUE_GETS_ZERO] = FALSE;
   custom_element_change_events[CE_SCORE_GETS_ZERO] = FALSE;
   custom_element_change_events[custom_element_change.direct_action] =
@@ -6844,6 +6906,8 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
   custom_element_change_events[CE_MOVE_OF_X] = FALSE;
   custom_element_change_events[CE_CREATION_OF_X] = FALSE;
+  custom_element_change_events[CE_VALUE_CHANGES_OF_X] = FALSE;
+  custom_element_change_events[CE_SCORE_CHANGES_OF_X] = FALSE;
   custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE;
   custom_element_change_events[CE_SCORE_GETS_ZERO_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
@@ -6891,11 +6955,24 @@ static void CopyElementPropertiesToGame(int element)
     CopyClassicElementPropertiesToGame(element);
 }
 
+void CheckElementDescriptions()
+{
+  int i;
+
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    if (getElementDescriptionFilename(i) == NULL && !IS_OBSOLETE(i))
+      Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
+}
+
 void DrawLevelEd()
 {
   CloseDoor(DOOR_CLOSE_ALL);
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
 
+#if DEBUG
+  CheckElementDescriptions();
+#endif
+
   if (level_editor_test_game)
   {
     CopyPlayfield(level.field, Feld);
@@ -7410,7 +7487,7 @@ static void DrawEnvelopeTextArea(int envelope_nr)
   DrawBackground(gi->x, gi->y, gi->width, gi->height);
 
   if (envelope_nr != -1)
-    textarea_info[id].value = level.envelope_text[envelope_nr];
+    textarea_info[id].value = level.envelope[envelope_nr].text;
 
   ModifyGadget(gi, GDI_AREA_SIZE,
               *counterbutton_info[ED_COUNTER_ID_ENVELOPE_XSIZE].value,
@@ -7420,32 +7497,6 @@ static void DrawEnvelopeTextArea(int envelope_nr)
   MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO);
 }
 
-char *getElementDescriptionFilename(int element)
-{
-  char *docs_dir = options.docs_directory;
-  char *elements_subdir = "elements";
-  static char *filename = NULL;
-  char basename[MAX_FILENAME_LEN];
-
-  checked_free(filename);
-
-  /* 1st try: look for element description file for exactly this element */
-  sprintf(basename, "%s.txt", element_info[element].token_name);
-  filename = getPath3(docs_dir, elements_subdir, basename);
-  if (fileExists(filename))
-    return filename;
-
-  free(filename);
-
-  /* 2nd try: look for element description file for this element's class */
-  sprintf(basename, "%s.txt", element_info[element].class_name);
-  filename = getPath3(docs_dir, elements_subdir, basename);
-  if (fileExists(filename))
-    return filename;
-
-  return NULL;
-}
-
 static boolean PrintInfoText(char *text, int font_nr, int start_line)
 {
   int font_height = getFontHeight(font_nr);
@@ -7898,6 +7949,7 @@ static void DrawPropertiesConfig()
     int player_nr = GET_PLAYER_NR(properties_element);
 
     /* these properties can be set for every player individually */
+
     drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
       &level.start_element[player_nr];
     drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
@@ -7905,13 +7957,17 @@ static void DrawPropertiesConfig()
     drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
       &level.explosion_element[player_nr];
 
-    /* these properties can be set for every player individually */
     checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
       &level.use_start_element[player_nr];
     checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value =
       &level.use_artwork_element[player_nr];
     checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value =
       &level.use_explosion_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value =
+      &level.initial_player_gravity[player_nr];
+
+    selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value =
+      &level.initial_player_stepsize[player_nr];
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
@@ -7923,6 +7979,7 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_GRAVITY);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
 
     MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
@@ -7978,8 +8035,8 @@ static void DrawPropertiesConfig()
     int counter2_id = ED_COUNTER_ID_ENVELOPE_YSIZE;
     int envelope_nr = properties_element - EL_ENVELOPE_1;
 
-    counterbutton_info[counter1_id].value = &level.envelope_xsize[envelope_nr];
-    counterbutton_info[counter2_id].value = &level.envelope_ysize[envelope_nr];
+    counterbutton_info[counter1_id].value = &level.envelope[envelope_nr].xsize;
+    counterbutton_info[counter2_id].value = &level.envelope[envelope_nr].ysize;
 
     /* display counter to choose size of envelope text area */
     MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE);
@@ -9920,7 +9977,9 @@ void HandleLevelEditorKeyInput(Key key)
   }
   else if (button_status == MB_RELEASED)
   {
-    int i, id = GADGET_ID_NONE;
+    int id = GADGET_ID_NONE;
+    int new_element_shift = element_shift;
+    int i;
 
     switch (key)
     {
@@ -9960,6 +10019,32 @@ void HandleLevelEditorKeyInput(Key key)
 
       case KSYM_Insert:
       case KSYM_Delete:
+#if 1
+       /* IS_EDITOR_CASCADE */
+       for (i = 0; i < num_editor_elements; i++)
+       {
+         if ((key == KSYM_Insert && i == element_shift) ||
+             (key == KSYM_Delete && new_element_shift > element_shift))
+           break;
+
+         if (IS_EDITOR_CASCADE(editor_elements[i]))
+           new_element_shift = i;
+       }
+
+       if (i < num_editor_elements)
+         element_shift = new_element_shift;
+
+       if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+         element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+       ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
+                    GDI_SCROLLBAR_ITEM_POSITION,
+                    element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
+
+       ModifyEditorElementList();
+
+#else
+
        for (i = 0; i < num_editor_elements; i++)
        {
          int e = editor_elements[i];
@@ -9986,6 +10071,7 @@ void HandleLevelEditorKeyInput(Key key)
 
          ModifyEditorElementList();
        }
+#endif
 
        break;