Merge branch 'master' into releases
[rocksndiamonds.git] / src / editor.c
index 73a08b16baab16d80990901919ce274ca83fec5a..8c1302cc0232b150bc5c004b6bccd13bbd16df36 100644 (file)
 #define GADGET_ID_CHANGE_PLAYER                (GADGET_ID_SELECTBOX_FIRST + 19)
 #define GADGET_ID_CHANGE_PAGE          (GADGET_ID_SELECTBOX_FIRST + 20)
 #define GADGET_ID_CHANGE_REPLACE_WHEN  (GADGET_ID_SELECTBOX_FIRST + 21)
-#define GADGET_ID_ACTION_TYPE          (GADGET_ID_SELECTBOX_FIRST + 22)
-#define GADGET_ID_ACTION_MODE          (GADGET_ID_SELECTBOX_FIRST + 23)
-#define GADGET_ID_ACTION_ARG           (GADGET_ID_SELECTBOX_FIRST + 24)
-#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 25)
-#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 26)
+#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 22)
+#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 23)
 
 /* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 27)
+#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 24)
 
 #define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 0)
 #define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 1)
 #define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 33)
 #define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 34)
 #define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 38)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 39)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_SELECTBOX_ID_CHANGE_PLAYER          19
 #define ED_SELECTBOX_ID_CHANGE_PAGE            20
 #define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN    21
-#define ED_SELECTBOX_ID_ACTION_TYPE            22
-#define ED_SELECTBOX_ID_ACTION_MODE            23
-#define ED_SELECTBOX_ID_ACTION_ARG             24
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     25
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      26
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     22
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      23
 
-#define ED_NUM_SELECTBOX                       27
+#define ED_NUM_SELECTBOX                       24
 
 #define ED_SELECTBOX_ID_LEVEL_FIRST    ED_SELECTBOX_ID_TIME_OR_STEPS
 #define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_GAME_ENGINE_TYPE
 #define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   34
 #define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 35
 #define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    36
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    37
 
-#define ED_NUM_CHECKBUTTONS                    38
+#define ED_NUM_CHECKBUTTONS                    37
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_CUSTOM_LAST  ED_CHECKBUTTON_ID_CUSTOM2_LAST
 
 #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE
-#define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION
+#define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM
 
 /* values for radiobutton gadgets */
 #define ED_RADIOBUTTON_ID_PERCENTAGE   0
 
 /* values for elements with count for collecting */
 #define MIN_COLLECT_COUNT              0
-#define MAX_COLLECT_COUNT              255
+#define MAX_COLLECT_COUNT              100
 
 /* values for random placement */
 #define RANDOM_USE_PERCENTAGE          0
@@ -1056,7 +1048,7 @@ static struct
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_CUSTOM_SCORE_DOWN,       GADGET_ID_CUSTOM_SCORE_UP,
     GADGET_ID_CUSTOM_SCORE_TEXT,       GADGET_ID_NONE,
-    &custom_element.collect_score_initial,
+    &custom_element.collect_score,
     NULL,                              "score", " "
   },
   {
@@ -1064,7 +1056,7 @@ static struct
     MIN_COLLECT_COUNT,                 MAX_COLLECT_COUNT,
     GADGET_ID_CUSTOM_GEMCOUNT_DOWN,    GADGET_ID_CUSTOM_GEMCOUNT_UP,
     GADGET_ID_CUSTOM_GEMCOUNT_TEXT,    GADGET_ID_CUSTOM_SCORE_UP,
-    &custom_element.collect_count_initial,
+    &custom_element.collect_count,
     NULL,                              "count", NULL
   },
   {
@@ -1345,7 +1337,9 @@ static struct ValueTextInfo options_move_stepsize[] =
   { 4,                         "normal"                        },
   { 8,                         "fast"                          },
   { 16,                                "very fast"                     },
+#if 1
   { 32,                                "even faster"                   },
+#endif
 
   { -1,                                NULL                            }
 };
@@ -1394,6 +1388,9 @@ static struct ValueTextInfo options_explosion_type[] =
   { EXPLODES_3X3,              "3x3"                           },
   { EXPLODES_CROSS,            "3+3"                           },
   { EXPLODES_1X1,              "1x1"                           },
+#if 0
+  { EP_INDESTRUCTIBLE,         "indestructible"                },
+#endif
 
   { -1,                                NULL                            }
 };
@@ -1415,14 +1412,19 @@ static struct ValueTextInfo options_change_direct_action[] =
   { CE_LEFT_BY_PLAYER,         "left by player"                },
   { CE_DROPPED_BY_PLAYER,      "dropped/thrown by player"      },
   { CE_SWITCHED,               "switched"                      },
+#if 1
   { CE_HITTING_SOMETHING,      "hitting something"             },
   { CE_HIT_BY_SOMETHING,       "hit by something"              },
+#else
+  { CE_HITTING_SOMETHING,      "collision"                     },
+#endif
+
 #if 0
   { CE_BLOCKED,                        "blocked"                       },
 #endif
+
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
-  { CE_COUNT_AT_ZERO,          "CE count at zero"              },
 
   { -1,                                NULL                            }
 };
@@ -1438,12 +1440,13 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_PLAYER_COLLECTS_X,      "player collects"               },
   { CE_PLAYER_DROPS_X,         "player drops/throws"           },
   { CE_TOUCHING_X,             "touching"                      },
+#if 1
   { CE_HITTING_X,              "hitting"                       },
   { CE_HIT_BY_X,               "hit by"                        },
+#endif
   { CE_SWITCH_OF_X,            "switch of"                     },
   { CE_CHANGE_OF_X,            "change by page of"             },
   { CE_EXPLOSION_OF_X,         "explosion of"                  },
-  { CE_COUNT_AT_ZERO_OF_X,     "CE count at zero of"           },
 
   { -1,                                NULL                            }
 };
@@ -1523,82 +1526,6 @@ static struct ValueTextInfo options_change_replace_when[] =
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_action_type[] =
-{
-  { CA_NO_ACTION,              "no action"                     },
-  { CA_EXIT_PLAYER,            "exit player"                   },
-  { CA_KILL_PLAYER,            "kill player"                   },
-  { CA_RESTART_LEVEL,          "restart level"                 },
-  { CA_SHOW_ENVELOPE,          "show envelope"                 },
-  { CA_ADD_KEY,                        "add key"                       },
-  { CA_DEL_KEY,                        "remove key"                    },
-  { CA_SET_PLAYER_SPEED,       "set player speed"              },
-  { CA_SET_GEMS,               "set gems"                      },
-  { CA_SET_TIME,               "set time"                      },
-  { CA_SET_SCORE,              "set score"                     },
-  { CA_SET_CE_SCORE,           "set CE score"                  },
-  { CA_SET_CE_COUNT,           "set CE count"                  },
-#if 0
-  { CA_SET_DYNABOMB_NUMBER,    "set bomb number"               },
-  { CA_SET_DYNABOMB_SIZE,      "set bomb size"                 },
-  { CA_SET_DYNABOMB_POWER,     "set bomb power"                },
-#endif
-  { CA_TOGGLE_PLAYER_GRAVITY,  "toggle gravity"                },
-  { CA_ENABLE_PLAYER_GRAVITY,  "enable gravity"                },
-  { CA_DISABLE_PLAYER_GRAVITY, "disable gravity"               },
-
-  { -1,                                NULL                            }
-};
-
-static struct ValueTextInfo options_action_mode[] =
-{
-  { CA_MODE_UNDEFINED,         " "                             },
-  { CA_MODE_SET,               "="                             },
-  { CA_MODE_ADD,               "+"                             },
-  { CA_MODE_SUBTRACT,          "-"                             },
-  { CA_MODE_MULTIPLY,          "*"                             },
-  { CA_MODE_DIVIDE,            "/"                             },
-  { CA_MODE_MODULO,            "%"                             },
-
-  { -1,                                NULL                            }
-};
-
-static struct ValueTextInfo options_action_arg[] =
-{
-  { CA_ARG_PLAYER_HEADLINE,    "[player]"                      },
-  { CA_ARG_PLAYER_1,           "1"                             },
-  { CA_ARG_PLAYER_2,           "2"                             },
-  { CA_ARG_PLAYER_3,           "3"                             },
-  { CA_ARG_PLAYER_4,           "4"                             },
-  { CA_ARG_PLAYER_ANY,         "any"                           },
-  { CA_ARG_PLAYER_TRIGGER,     "trigger"                       },
-  { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_HEADLINE,    "[number]"                      },
-  { CA_ARG_0,                  "0"                             },
-  { CA_ARG_1,                  "1"                             },
-  { CA_ARG_2,                  "2"                             },
-  { CA_ARG_3,                  "3"                             },
-  { CA_ARG_4,                  "4"                             },
-  { CA_ARG_5,                  "5"                             },
-  { CA_ARG_10,                 "10"                            },
-  { CA_ARG_100,                        "100"                           },
-  { CA_ARG_1000,               "1000"                          },
-  { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_MIN,         "min"                           },
-  { CA_ARG_NUMBER_MAX,         "max"                           },
-  { CA_ARG_NUMBER_NORMAL,      "normal"                        },
-  { CA_ARG_NUMBER_RESET,       "reset"                         },
-  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
-  { CA_ARG_NUMBER_CE_COUNT,    "CE count"                      },
-  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
-  { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
-  { CA_ARG_ELEMENT_TARGET,     "target"                        },
-  { CA_ARG_ELEMENT_TRIGGER,    "trigger"                       },
-
-  { -1,                                NULL                            }
-};
-
 static char options_change_page_strings[MAX_CHANGE_PAGES][10];
 static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
 {
@@ -1814,30 +1741,6 @@ static struct
     &custom_element_change.replace_when,
     "replace when", NULL,              "which elements can be replaced"
   },
-  {
-    ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
-    GADGET_ID_ACTION_TYPE,             GADGET_ID_NONE,
-    -1,
-    options_action_type,
-    &custom_element_change.action_type,
-    NULL, NULL,                                "action on specified condition"
-  },
-  {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
-    GADGET_ID_ACTION_MODE,             GADGET_ID_ACTION_TYPE,
-    -1,
-    options_action_mode,
-    &custom_element_change.action_mode,
-    NULL, NULL,                                "action operator"
-  },
-  {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
-    GADGET_ID_ACTION_ARG,              GADGET_ID_ACTION_MODE,
-    -1,
-    options_action_arg,
-    &custom_element_change.action_arg,
-    NULL, NULL,                                "action parameter"
-  },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_SELECT_CHANGE_PAGE,      GADGET_ID_NONE,
@@ -1869,6 +1772,7 @@ static struct
   char *text_left, *text_right, *infotext;
 } textbutton_info[ED_NUM_TEXTBUTTONS] =
 {
+#if 1
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_COUNTER_YPOS(1),
     GADGET_ID_PROPERTIES_INFO,         GADGET_ID_NONE,
@@ -1899,6 +1803,26 @@ static struct
     8,                                 "Change",
     NULL, NULL,                                "Custom element change configuration"
   },
+#else
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_COUNTER_YPOS(1),
+    GADGET_ID_PROPERTIES_INFO,         GADGET_ID_NONE,
+    11,                                        "Information",                  
+    NULL, NULL,                                "Show information about element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0) + 166, ED_COUNTER_YPOS(1),
+    GADGET_ID_PROPERTIES_CONFIG,       GADGET_ID_NONE,
+    11,                                        "Configure",
+    NULL, NULL,                                "Configure element properties"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0) + 332, ED_COUNTER_YPOS(1),
+    GADGET_ID_PROPERTIES_CHANGE,       GADGET_ID_NONE,
+    11,                                        "Advanced",
+    NULL, NULL,                                "Advanced element configuration"
+  },
+#endif
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_SAVE_AS_TEMPLATE,                GADGET_ID_CUSTOM_USE_TEMPLATE,
@@ -2289,7 +2213,7 @@ static struct
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_CHANGE,       GADGET_ID_NONE,
     &custom_element_change.can_change,
-    NULL, "element changes to:",       "change element on specified condition"
+    NULL, "element changes to:",       "element can change to other element"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2333,12 +2257,6 @@ static struct
     &custom_element_change.use_random_replace,
     NULL, NULL,                                "use percentage for random replace"
   },
-  {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
-    GADGET_ID_CHANGE_HAS_ACTION,       GADGET_ID_NONE,
-    &custom_element_change.has_action,
-    NULL, NULL,                                "execute action on specified condition"
-  },
 };
 
 static struct
@@ -2575,7 +2493,6 @@ static int new_element1 = EL_WALL;
 static int new_element2 = EL_EMPTY;
 static int new_element3 = EL_SAND;
 
-#define IS_VALID_BUTTON(button) (button >= 1 && button <= 3)
 #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \
                                (button) == 2 ? new_element2 : \
                                (button) == 3 ? new_element3 : EL_EMPTY)
@@ -2754,10 +2671,17 @@ static int editor_el_emerald_mine[] =
   EL_AMOEBA_WET,
   EL_AMOEBA_DRY,
 
+#if 1
   EL_EM_KEY_1,
   EL_EM_KEY_2,
   EL_EM_KEY_3,
   EL_EM_KEY_4,
+#else
+  EL_EM_KEY_1_FILE,
+  EL_EM_KEY_2_FILE,
+  EL_EM_KEY_3_FILE,
+  EL_EM_KEY_4_FILE,
+#endif
 
   EL_EM_GATE_1,
   EL_EM_GATE_2,
@@ -2844,14 +2768,14 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_WALL_11,
   EL_EMC_WALL_12,
 
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
 #else
   EL_EMC_ANDROID,
 #endif
   EL_BALLOON,
   EL_BALLOON_SWITCH_ANY,
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
 #else
   EL_BALLOON_SWITCH_NONE,
@@ -2864,7 +2788,7 @@ static int editor_el_emerald_mine_club[] =
 
   EL_EMC_GRASS,
   EL_EMC_PLANT,
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
   EL_EMPTY,
 #else
@@ -2872,7 +2796,7 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_MAGNIFIER,
 #endif
 
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
   EL_EMPTY,
 #else
@@ -2880,13 +2804,13 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_MAGIC_BALL_SWITCH,
 #endif
   EL_SPRING,
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
 #else
   EL_EMC_SPRING_BUMPER,
 #endif
 
-#if RELEASE_311
+#if RELEASE_312
   EL_EMPTY,
 #else
   EL_EMC_DRIPPER,
@@ -3939,6 +3863,209 @@ editor_elements_info[] =
   }
 };
 
+#if 0
+
+static struct
+{
+  short element;
+  short element_mapped;
+}
+forum_sketch_element_mapping[] =
+{
+  { EL_WALL_SLIPPERY,                  EL_WALL                 },
+  { EL_EXPANDABLE_WALL,                        EL_WALL                 },
+  { EL_EXPANDABLE_WALL_HORIZONTAL,     EL_WALL                 },
+  { EL_EXPANDABLE_WALL_VERTICAL,       EL_WALL                 },
+  { EL_EXPANDABLE_WALL_ANY,            EL_WALL                 },
+  { EL_WALL_EMERALD,                   EL_WALL                 },
+  { EL_WALL_DIAMOND,                   EL_WALL                 },
+  { EL_WALL_BD_DIAMOND,                        EL_WALL                 },
+  { EL_WALL_EMERALD_YELLOW,            EL_WALL                 },
+  { EL_WALL_EMERALD_RED,               EL_WALL                 },
+  { EL_WALL_EMERALD_PURPLE,            EL_WALL                 },
+  { EL_ACID_POOL_TOPLEFT,              EL_WALL                 },
+  { EL_ACID_POOL_TOPRIGHT,             EL_WALL                 },
+  { EL_ACID_POOL_BOTTOMLEFT,           EL_WALL                 },
+  { EL_ACID_POOL_BOTTOM,               EL_WALL                 },
+  { EL_ACID_POOL_BOTTOMRIGHT,          EL_WALL                 },
+  { EL_BD_WALL,                                EL_WALL                 },
+
+  { EL_BD_ROCK,                                EL_ROCK                 },
+
+  { EL_SP_ZONK,                                EL_ROCK                 },
+  { EL_SP_BASE,                                EL_SAND                 },
+  { EL_SP_MURPHY,                      EL_PLAYER_1             },
+  { EL_SP_INFOTRON,                    EL_EMERALD              },
+  { EL_SP_HARDWARE_GRAY,               EL_STEELWALL            },
+  { EL_SP_EXIT_CLOSED,                 EL_EXIT_OPEN            },
+  { EL_SP_DISK_ORANGE,                 EL_BOMB                 },
+  { EL_SP_DISK_RED,                    EL_BOMB                 },
+  { EL_SP_DISK_YELLOW,                 EL_BOMB                 },
+  { EL_SP_PORT_RIGHT,                  EL_GATE_1_GRAY          },
+  { EL_SP_PORT_DOWN,                   EL_GATE_1_GRAY          },
+  { EL_SP_PORT_LEFT,                   EL_GATE_1_GRAY          },
+  { EL_SP_PORT_UP,                     EL_GATE_1_GRAY          },
+  { EL_SP_GRAVITY_PORT_RIGHT,          EL_GATE_1_GRAY          },
+  { EL_SP_GRAVITY_PORT_DOWN,           EL_GATE_1_GRAY          },
+  { EL_SP_GRAVITY_PORT_LEFT,           EL_GATE_1_GRAY          },
+  { EL_SP_GRAVITY_PORT_UP,             EL_GATE_1_GRAY          },
+  { EL_SP_PORT_VERTICAL,               EL_GATE_1_GRAY          },
+  { EL_SP_PORT_HORIZONTAL,             EL_GATE_1_GRAY          },
+  { EL_SP_PORT_ANY,                    EL_GATE_1_GRAY          },
+  { EL_SP_SNIKSNAK,                    EL_BUG                  },
+  { EL_SP_ELECTRON,                    EL_SPACESHIP            },
+  { EL_SP_CHIP_SINGLE,                 EL_WALL                 },
+  { EL_SP_CHIP_LEFT,                   EL_WALL                 },
+  { EL_SP_CHIP_RIGHT,                  EL_WALL                 },
+  { EL_SP_CHIP_TOP,                    EL_WALL                 },
+  { EL_SP_CHIP_BOTTOM,                 EL_WALL                 },
+  { EL_SP_HARDWARE_BASE_1,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_GREEN,              EL_STEELWALL            },
+  { EL_SP_HARDWARE_BLUE,               EL_STEELWALL            },
+  { EL_SP_HARDWARE_RED,                        EL_STEELWALL            },
+  { EL_SP_HARDWARE_YELLOW,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_2,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_3,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_3,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_4,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_5,             EL_STEELWALL            },
+  { EL_SP_HARDWARE_BASE_6,             EL_STEELWALL            },
+
+  { EL_STEELWALL_SLIPPERY,             EL_STEELWALL            },
+
+  { EL_EXIT_CLOSED,                    EL_EXIT_OPEN            },
+
+  { EL_DIAMOND,                                EL_EMERALD              },
+  { EL_BD_DIAMOND,                     EL_EMERALD              },
+  { EL_EMERALD_YELLOW,                 EL_EMERALD              },
+  { EL_EMERALD_RED,                    EL_EMERALD              },
+  { EL_EMERALD_PURPLE,                 EL_EMERALD              },
+
+  { EL_AMOEBA_DEAD,                    EL_AMOEBA               },
+  { EL_AMOEBA_DROP,                    EL_AMOEBA               },
+  { EL_AMOEBA_WET,                     EL_AMOEBA               },
+  { EL_AMOEBA_DRY,                     EL_AMOEBA               },
+  { EL_AMOEBA_FULL,                    EL_AMOEBA               },
+  { EL_BD_AMOEBA,                      EL_AMOEBA               },
+  { EL_AMOEBA_TO_DIAMOND,              EL_AMOEBA               },
+
+  { EL_DYNAMITE_ACTIVE,                        EL_DYNAMITE             },
+
+  { EL_GATE_2_GRAY,                    EL_GATE_1_GRAY          },
+  { EL_GATE_3_GRAY,                    EL_GATE_1_GRAY          },
+  { EL_GATE_4_GRAY,                    EL_GATE_1_GRAY          },
+
+  { EL_EM_KEY_1,                       EL_KEY_1                },
+  { EL_EM_KEY_2,                       EL_KEY_2                },
+  { EL_EM_KEY_3,                       EL_KEY_3                },
+  { EL_EM_KEY_4,                       EL_KEY_4                },
+
+  { EL_EM_GATE_1,                      EL_GATE_1               },
+  { EL_EM_GATE_2,                      EL_GATE_2               },
+  { EL_EM_GATE_3,                      EL_GATE_3               },
+  { EL_EM_GATE_4,                      EL_GATE_4               },
+
+  { EL_EM_GATE_1_GRAY,                 EL_GATE_1_GRAY          },
+  { EL_EM_GATE_2_GRAY,                 EL_GATE_1_GRAY          },
+  { EL_EM_GATE_3_GRAY,                 EL_GATE_1_GRAY          },
+  { EL_EM_GATE_4_GRAY,                 EL_GATE_1_GRAY          },
+
+  { EL_INVISIBLE_SAND,                 EL_EMPTY                },
+  { EL_INVISIBLE_WALL,                 EL_EMPTY                },
+  { EL_INVISIBLE_STEELWALL,            EL_EMPTY                },
+
+  { EL_PACMAN,                         EL_YAMYAM               },
+  { EL_DARK_YAMYAM,                    EL_YAMYAM               },
+
+  { EL_BD_MAGIC_WALL,                  EL_MAGIC_WALL           },
+
+  { EL_DYNABOMB_INCREASE_NUMBER,       EL_BOMB                 },
+  { EL_DYNABOMB_INCREASE_SIZE,         EL_BOMB                 },
+  { EL_DYNABOMB_INCREASE_POWER,                EL_BOMB                 },
+  { EL_BLACK_ORB,                      EL_BOMB                 },
+  { EL_DX_SUPABOMB,                    EL_BOMB                 },
+
+  { EL_SOKOBAN_OBJECT,                 EL_KEY_1                },
+  { EL_SOKOBAN_FIELD_EMPTY,            EL_GATE_1_GRAY          },
+  { EL_SOKOBAN_FIELD_FULL,             EL_GATE_1               },
+  { EL_SOKOBAN_FIELD_PLAYER,           EL_PLAYER_1             },
+
+  { EL_BD_BUTTERFLY_RIGHT,             EL_BD_BUTTERFLY         },
+  { EL_BD_BUTTERFLY_UP,                        EL_BD_BUTTERFLY         },
+  { EL_BD_BUTTERFLY_LEFT,              EL_BD_BUTTERFLY         },
+  { EL_BD_BUTTERFLY_DOWN,              EL_BD_BUTTERFLY         },
+
+  { EL_BD_FIREFLY_RIGHT,               EL_BD_FIREFLY           },
+  { EL_BD_FIREFLY_UP,                  EL_BD_FIREFLY           },
+  { EL_BD_FIREFLY_LEFT,                        EL_BD_FIREFLY           },
+  { EL_BD_FIREFLY_DOWN,                        EL_BD_FIREFLY           },
+
+  { EL_PLAYER_2,                       EL_PLAYER_1             },
+  { EL_PLAYER_3,                       EL_PLAYER_1             },
+  { EL_PLAYER_4,                       EL_PLAYER_1             },
+
+  { EL_BUG_RIGHT,                      EL_BUG                  },
+  { EL_BUG_UP,                         EL_BUG                  },
+  { EL_BUG_LEFT,                       EL_BUG                  },
+  { EL_BUG_DOWN,                       EL_BUG                  },
+
+  { EL_SPACESHIP_RIGHT,                        EL_SPACESHIP            },
+  { EL_SPACESHIP_UP,                   EL_SPACESHIP            },
+  { EL_SPACESHIP_LEFT,                 EL_SPACESHIP            },
+  { EL_SPACESHIP_DOWN,                 EL_SPACESHIP            },
+
+  { EL_PACMAN_RIGHT,                   EL_YAMYAM               },
+  { EL_PACMAN_UP,                      EL_YAMYAM               },
+  { EL_PACMAN_LEFT,                    EL_YAMYAM               },
+  { EL_PACMAN_DOWN,                    EL_YAMYAM               },
+
+  { -1,                                        -1                      }
+};
+
+static struct
+{
+  short element;
+  char *element_string;
+}
+forum_sketch_element_strings[] =
+{
+  { EL_PLAYER_1,               "p" },
+  { EL_EMPTY,                  "_" },
+  { EL_SAND,                   "s" },
+  { EL_ROCK,                   "b" },
+  { EL_EMERALD,                        "e" },
+  { EL_BUG,                    "u" },
+  { EL_SPACESHIP,              "h" },
+  { EL_BD_FIREFLY,             "f" },
+  { EL_BD_BUTTERFLY,           "b" },
+  { EL_AMOEBA,                 "a" },
+  { EL_YAMYAM,                 "y" },
+  { EL_WALL,                   "w" },
+  { EL_STEELWALL,              "t" },
+  { EL_MAGIC_WALL,             "m" },
+  { EL_EXIT_OPEN,              "x" },
+  { EL_DYNAMITE,               "d" },
+  { EL_KEY_1,                  "1" },
+  { EL_KEY_2,                  "2" },
+  { EL_KEY_3,                  "3" },
+  { EL_KEY_4,                  "4" },
+  { EL_GATE_1,                 "5" },
+  { EL_GATE_2,                 "6" },
+  { EL_GATE_3,                 "7" },
+  { EL_GATE_4,                 "8" },
+  { EL_GATE_1_GRAY,            "9" },
+  { EL_BOMB,                   "@" },
+  { EL_ROBOT,                  "r" },
+  { EL_ROBOT_WHEEL,            "0" },
+  { EL_NUT,                    "n" },
+  { EL_CUSTOM_1,               "c" },
+  { EL_CHAR_QUESTION,          "?" },
+
+  { -1,                                NULL }
+};
+
+#endif
+
 
 /*
   -----------------------------------------------------------------------------
@@ -3994,32 +4121,42 @@ static char *getElementInfoText(int element)
 
 static void ReinitializeElementList()
 {
+  static boolean initialized = FALSE;
   int pos = 0;
   int i, j;
 
   checked_free(editor_elements);
 
-  /* reload optional user defined element list for each invocation of editor */
-  LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr,
-                                  &num_editor_el_user_defined);
+#if 0
+  if (!initialized)
+#else
+  /* reload user defined element list for each invocation of level editor */
+#endif
+  {
+    /* initialize optional user defined element list */
+    LoadUserDefinedEditorElementList(&editor_el_user_defined_ptr,
+                                    &num_editor_el_user_defined);
 
-  /* initialize list of empty elements (used for padding, if needed) */
-  for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
-    editor_el_empty[i] = EL_EMPTY;
+    /* initialize list of empty elements (used for padding, if needed) */
+    for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
+      editor_el_empty[i] = EL_EMPTY;
 
-  /* do some sanity checks for each element from element list */
-  for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
-  {
-    for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
+    /* do some sanity checks for each element from element list */
+    for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
     {
-      int element = (*editor_elements_info[i].element_list)[j];
+      for (j = 0; j < *editor_elements_info[i].element_list_size; j++)
+      {
+       int element = (*editor_elements_info[i].element_list)[j];
 
-      if (element >= NUM_FILE_ELEMENTS)
-       Error(ERR_WARN, "editor element %d is runtime element", element);
+       if (element >= NUM_FILE_ELEMENTS)
+         Error(ERR_WARN, "editor element %d is runtime element", element);
 
-      if (strcmp(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT) == 0)
-       Error(ERR_WARN, "no element description for element %d", element);
+       if (strcmp(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT) == 0)
+         Error(ERR_WARN, "no element description for element %d", element);
+      }
     }
+
+    initialized = TRUE;
   }
 
   num_editor_elements = 0;
@@ -5251,6 +5388,14 @@ static void MapCounterButtons(int id)
   struct GadgetInfo *gi_down = level_editor_gadget[gadget_id_down];
   struct GadgetInfo *gi_text = level_editor_gadget[gadget_id_text];
   struct GadgetInfo *gi_up   = level_editor_gadget[gadget_id_up];
+#if 0
+  char infotext[MAX_OUTPUT_LINESIZE + 1];
+  int max_infotext_len = getMaxInfoTextLength();
+  int xoffset_left = 0;
+  int yoffset_left = ED_BORDER_SIZE;
+  int xoffset_right = getCounterGadgetWidth();
+  int yoffset_right = ED_BORDER_SIZE;
+#else
   int xoffset_left = getTextWidthForGadget(counterbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
   int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE;
@@ -5260,6 +5405,7 @@ static void MapCounterButtons(int id)
   int y_above = gi_down->y - yoffset_above;
   int x = gi_down->x;
   int y;       /* set after gadget position was modified */
+#endif
 
   /* set position for "value1/value2" counter gadgets (score in most cases) */
   if (id == ED_COUNTER_ID_ELEMENT_VALUE1 ||
@@ -5696,6 +5842,40 @@ static int setSelectboxValue(int selectbox_id, int new_value)
 
 static void copy_custom_element_settings(int element_from, int element_to)
 {
+#if 0
+  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;
@@ -5715,8 +5895,8 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
   ei_to->access_direction = ei_from->access_direction;
 
-  ei_to->collect_score_initial = ei_from->collect_score_initial;
-  ei_to->collect_count_initial = ei_from->collect_count_initial;
+  ei_to->collect_score = ei_from->collect_score;
+  ei_to->collect_count = ei_from->collect_count;
 
   ei_to->push_delay_fixed = ei_from->push_delay_fixed;
   ei_to->push_delay_random = ei_from->push_delay_random;
@@ -5757,6 +5937,8 @@ static void copy_custom_element_settings(int element_from, int element_to)
   if (ei_from->group != NULL && ei_to->group != NULL)  /* group or internal */
     *ei_to->group = *ei_from->group;
 
+#endif
+
   /* mark this custom element as modified */
   ei_to->modified_settings = TRUE;
 }
@@ -5964,6 +6146,43 @@ static void CopyCustomElementPropertiesToEditor(int element)
      DONT_COLLIDE_WITH(element) ||
      DONT_RUN_INTO(element));
 
+#if 0
+  /* set explosion type selectbox help value */
+  custom_element.explosion_type =
+    (
+#if 0
+     IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
+#endif
+     CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
+     CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
+     CAN_EXPLODE_CROSS(element) ? EP_CAN_EXPLODE_CROSS :
+     custom_element.explosion_type);
+  custom_element_properties[EP_CAN_EXPLODE_AT_ALL] =
+    (
+#if 0
+     IS_INDESTRUCTIBLE(element) ||
+#endif
+     CAN_EXPLODE_1X1(element) ||
+     CAN_EXPLODE_3X3(element) ||
+     CAN_EXPLODE_CROSS(element));
+#endif
+
+#if 0
+  /* special case: sub-settings dependent from main setting */
+#if 0
+  custom_element.can_explode_by_fire = CAN_EXPLODE_BY_FIRE(element);
+  custom_element.can_explode_smashed = CAN_EXPLODE_SMASHED(element);
+  custom_element.can_explode_impact  = CAN_EXPLODE_IMPACT(element);
+#else
+  if (CAN_EXPLODE_BY_FIRE(element))
+    custom_element.can_explode_by_fire = TRUE;
+  if (CAN_EXPLODE_SMASHED(element))
+    custom_element.can_explode_smashed = TRUE;
+  if (CAN_EXPLODE_IMPACT(element))
+    custom_element.can_explode_impact  = TRUE;
+#endif
+#endif
+
   /* ---------- element settings: advanced (custom elements) --------------- */
 
   /* set "change by direct action" selectbox help value */
@@ -5980,7 +6199,6 @@ 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_COUNT_AT_ZERO) ? CE_COUNT_AT_ZERO :
      custom_element_change.direct_action);
 
   /* set "change by other element action" selectbox help value */
@@ -5999,7 +6217,6 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_SWITCH_OF_X) ? CE_SWITCH_OF_X :
      HAS_CHANGE_EVENT(element, CE_CHANGE_OF_X) ? CE_CHANGE_OF_X :
      HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
-     HAS_CHANGE_EVENT(element, CE_COUNT_AT_ZERO_OF_X) ? CE_COUNT_AT_ZERO_OF_X :
      custom_element_change.other_action);
 }
 
@@ -6011,6 +6228,7 @@ static void CopyGroupElementPropertiesToEditor(int element)
 
 static void CopyClassicElementPropertiesToEditor(int element)
 {
+#if 1
   if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
     custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
       getMoveIntoAcidProperty(&level, element);
@@ -6018,6 +6236,17 @@ static void CopyClassicElementPropertiesToEditor(int element)
   if (MAYBE_DONT_COLLIDE_WITH(element))
     custom_element_properties[EP_DONT_COLLIDE_WITH] =
       getDontCollideWithProperty(&level, element);
+#else
+
+  if (COULD_MOVE_INTO_ACID(element))
+  {
+    int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+    if (bit_nr > -1)
+      custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
+       ((level.can_move_into_acid_bits & (1 << bit_nr)) != 0);
+  }
+#endif
 }
 
 static void CopyElementPropertiesToEditor(int element)
@@ -6034,6 +6263,9 @@ static void CopyCustomElementPropertiesToGame(int element)
 {
   int i;
   int access_type_and_layer;
+#if 0
+  boolean can_explode;
+#endif
 
   /* mark that this custom element has been modified */
   custom_element.modified_settings = TRUE;
@@ -6099,6 +6331,48 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_properties[custom_element.deadliness] =
     custom_element_properties[EP_DEADLY];
 
+#if 0
+  /* set explosion type property from checkbox and selectbox */
+#if 0
+  custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
+#endif
+  custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_CROSS] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE;
+  custom_element_properties[custom_element.explosion_type] =
+    custom_element_properties[EP_CAN_EXPLODE_AT_ALL];
+#endif
+
+#if 0
+  /* special case: sub-settings dependent from main setting */
+#if 0
+  can_explode = (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
+                custom_element_properties[EP_CAN_EXPLODE_3X3] ||
+                custom_element_properties[EP_CAN_EXPLODE_CROSS]);
+  custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
+    (can_explode && custom_element.can_explode_by_fire);
+  custom_element_properties[EP_CAN_EXPLODE_SMASHED] =
+    (can_explode && custom_element.can_explode_smashed);
+  custom_element_properties[EP_CAN_EXPLODE_IMPACT] =
+    (can_explode && custom_element.can_explode_impact);
+#else
+  if (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
+      custom_element_properties[EP_CAN_EXPLODE_3X3] ||
+      custom_element_properties[EP_CAN_EXPLODE_CROSS])
+  {
+    custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
+      custom_element.can_explode_by_fire;
+    custom_element_properties[EP_CAN_EXPLODE_SMASHED] =
+      custom_element.can_explode_smashed;
+    custom_element_properties[EP_CAN_EXPLODE_IMPACT] =
+      custom_element.can_explode_impact;
+  }
+#endif
+#endif
+
   /* ---------- element settings: advanced (custom elements) --------------- */
 
   /* set player change event from checkbox and selectbox */
@@ -6114,7 +6388,6 @@ 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_COUNT_AT_ZERO] = FALSE;
   custom_element_change_events[custom_element_change.direct_action] =
     custom_element_change_events[CE_BY_DIRECT_ACTION];
 
@@ -6133,7 +6406,6 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_SWITCH_OF_X] = FALSE;
   custom_element_change_events[CE_CHANGE_OF_X] = FALSE;
   custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
-  custom_element_change_events[CE_COUNT_AT_ZERO_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
     custom_element_change_events[CE_BY_OTHER_ACTION];
 
@@ -6160,6 +6432,7 @@ static void CopyGroupElementPropertiesToGame(int element)
 
 static void CopyClassicElementPropertiesToGame(int element)
 {
+#if 1
   if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
     setMoveIntoAcidProperty(&level, element,
                            custom_element_properties[EP_CAN_MOVE_INTO_ACID]);
@@ -6167,6 +6440,21 @@ static void CopyClassicElementPropertiesToGame(int element)
   if (MAYBE_DONT_COLLIDE_WITH(element))
     setDontCollideWithProperty(&level, element,
                              custom_element_properties[EP_DONT_COLLIDE_WITH]);
+#else
+
+  if (COULD_MOVE_INTO_ACID(element))
+  {
+    int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+    if (bit_nr > -1)
+    {
+      level.can_move_into_acid_bits &= ~(1 << bit_nr);
+
+      if (custom_element_properties[EP_CAN_MOVE_INTO_ACID])
+       level.can_move_into_acid_bits |= (1 << bit_nr);
+    }
+  }
+#endif
 }
 
 static void CopyElementPropertiesToGame(int element)
@@ -6206,6 +6494,11 @@ void DrawLevelEd()
   BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
             DOOR_GFX_PAGEX6, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
 
+#if 0
+  /* draw mouse button brush elements */
+  RedrawDrawingElements();
+#endif
+
   /* draw bigger door */
   DrawSpecialEditorDoor();
 
@@ -6216,6 +6509,9 @@ void DrawLevelEd()
   redraw_mask |= REDRAW_ALL;
 
   ReinitializeElementListButtons();    /* custom element may look different */
+#if 0
+  ModifyEditorElementList();           /* may be needed for custom elements */
+#endif
 
   UnmapTapeButtons();
   MapControlButtons();
@@ -6650,6 +6946,8 @@ static boolean PrintInfoText(char *text, int font_nr, int start_line)
   return TRUE;
 }
 
+#if 1
+
 static int PrintElementDescriptionFromFile(char *filename, int start_line)
 {
   int font_nr = FONT_TEXT_2;
@@ -6666,6 +6964,97 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line)
                          max_lines_per_screen);
 }
 
+#else
+
+static int PrintElementDescriptionFromFile(char *filename, int start_line)
+{
+  int font_nr = FONT_TEXT_2;
+  int font_width = getFontWidth(font_nr);
+  int font_height = getFontHeight(font_nr);
+  int pad_x = ED_ELEMENT_SETTINGS_XPOS(0);
+  int pad_y = ED_ELEMENT_SETTINGS_YPOS(0) + ED_BORDER_SIZE;
+  int sx = SX + pad_x;
+  int sy = SY + pad_y;
+  int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
+  int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
+  int current_line = start_line;
+  char line[MAX_LINE_LEN];
+  char buffer[max_chars_per_line + 1];
+  int buffer_len;
+  FILE *file;
+
+  if (current_line >= max_lines_per_screen)
+    return 0;
+
+  if (filename == NULL)
+    return 0;
+
+  if (!(file = fopen(filename, MODE_READ)))
+    return 0;
+
+  buffer[0] = '\0';
+  buffer_len = 0;
+
+  while (!feof(file) && current_line < max_lines_per_screen)
+  {
+    char *line_ptr;
+    boolean last_line_was_empty = TRUE;
+
+    /* read next line of input file */
+    if (!fgets(line, MAX_LINE_LEN, file))
+      break;
+
+    /* skip comments (lines directly beginning with '#') */
+    if (line[0] == '#')
+      continue;
+
+    /* cut trailing newline from input line */
+    for (line_ptr = line; *line_ptr; line_ptr++)
+    {
+      if (*line_ptr == '\n' || *line_ptr == '\r')
+      {
+       *line_ptr = '\0';
+       break;
+      }
+    }
+
+    if (strlen(line) == 0)             /* special case: force empty line */
+      strcpy(line, "\n");
+
+    line_ptr = line;
+
+    while (*line_ptr && current_line < max_lines_per_screen)
+    {
+      boolean buffer_filled = RenderLineToBuffer(&line_ptr,
+                                                buffer, &buffer_len,
+                                                last_line_was_empty,
+                                                max_chars_per_line);
+      if (buffer_filled)
+      {
+       DrawText(sx, sy + current_line * font_height, buffer, font_nr);
+       current_line++;
+
+       last_line_was_empty = (buffer_len == 0);
+
+       buffer[0] = '\0';
+       buffer_len = 0;
+      }
+    }
+  }
+
+  fclose(file);
+
+  if (buffer_len > 0 && current_line < max_lines_per_screen)
+  {
+    DrawText(sx, sy + current_line * font_height, buffer, font_nr);
+    current_line++;
+  }
+
+  return (current_line - start_line);
+}
+
+#endif
+
 static void DrawPropertiesTabulatorGadgets()
 {
   struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
@@ -6910,10 +7299,17 @@ static struct
   { EL_KEY_2,          &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_KEY_3,          &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_KEY_4,          &level.score[SC_KEY],           TEXT_COLLECTING },
+#if 1
   { EL_EM_KEY_1,       &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EM_KEY_2,       &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EM_KEY_3,       &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EM_KEY_4,       &level.score[SC_KEY],           TEXT_COLLECTING },
+#else
+  { EL_EM_KEY_1_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EM_KEY_2_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EM_KEY_3_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EM_KEY_4_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
+#endif
   { EL_EMC_KEY_5,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EMC_KEY_6,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EMC_KEY_7,      &level.score[SC_KEY],           TEXT_COLLECTING },
@@ -7472,7 +7868,6 @@ static void DrawArc(int from_x, int from_y, int to_x, int to_y,
 }
 
 #define DRAW_CIRCLES_BUTTON_AVAILABLE  0
-
 #if DRAW_CIRCLES_BUTTON_AVAILABLE
 static void DrawCircle(int from_x, int from_y, int to_x, int to_y,
                       int element, boolean change_level)
@@ -7560,6 +7955,35 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        int element = brush_buffer[x][y];
        int element_mapped = element;
 
+#if 0
+       char *element_string = "?";
+       int k;
+
+       for (k = 0; forum_sketch_element_mapping[k].element != -1; k++)
+       {
+         if (forum_sketch_element_mapping[k].element == element)
+         {
+           element_mapped = forum_sketch_element_mapping[k].element_mapped;
+           break;
+         }
+       }
+
+       if (IS_CUSTOM_ELEMENT(element))
+         element_mapped = EL_CUSTOM_1;
+
+       for (k = 0; forum_sketch_element_strings[k].element != -1; k++)
+       {
+         if (forum_sketch_element_strings[k].element == element_mapped)
+         {
+           element_string = forum_sketch_element_strings[k].element_string;
+           break;
+         }
+       }
+
+       printf("`%s", element_string);
+
+#else
+
        if (IS_CUSTOM_ELEMENT(element))
          element_mapped = EL_CUSTOM_START;
        else if (IS_GROUP_ELEMENT(element))
@@ -7568,6 +7992,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
          element_mapped = EL_UNKNOWN;
 
        printf("%c%03d", (mode == CB_DUMP_BRUSH ? '`' : 'ΒΈ'), element_mapped);
+#endif
       }
 
       printf("\n");
@@ -8029,11 +8454,6 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   if (!started_inside_drawing_area)
     return;
 
-#if 1
-  if (!IS_VALID_BUTTON(button))
-    return;
-#endif
-
   if (!button && !button_release_event)
     return;
 
@@ -8604,14 +9024,6 @@ static void HandleControlButtons(struct GadgetInfo *gi)
   int new_element = BUTTON_ELEMENT(button);
   int x, y;
 
-#if 0
-  /* MAKES PROBLEMS WITH ELEMENT LIST SCROLLBAR AND IS PROBABLY NOT NEEDED */
-  /* !!! CHECK WHAT HAPPENS WHEN MOUSE WHEEL IS USED OVER ELEMENT LIST !!! */
-
-  if (!IS_VALID_BUTTON(button))
-    return;
-#endif
-
   if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
     DrawLevelText(0, 0, 0, TEXT_END);
 
@@ -8919,9 +9331,13 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
        DrawCompleteVideoDisplay();
 
+       if (setup.autorecord)
+         TapeStartRecording();
+
        level_editor_test_game = TRUE;
+       game_status = GAME_MODE_PLAYING;
 
-       StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE);
+       InitGame();
       }
       break;
 
@@ -9237,16 +9653,35 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
            break;
        }
 
+#if 1
        if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
          sprintf(infotext, "%s: %d, %d", text, lx, ly);
        else
          sprintf(infotext, "%s: %d, %d", text,
                  ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1);
+#else
+       if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
+         DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
+                   "%s: %d, %d", infotext, lx, ly);
+       else
+         DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
+                   "%s: %d, %d", infotext,
+                   ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1);
+#endif
       }
+#if 1
       else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
        strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len);
       else
        sprintf(infotext, "Level position: %d, %d", lx, ly);
+#else
+      else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT)
+       DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
+                 "%s", getElementInfoText(Feld[lx][ly]));
+      else
+       DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2,
+                 "Level position: %d, %d", lx, ly);
+#endif
     }
 
     /* misuse this function to draw brush cursor, if needed */