rnd-20051123-1-src
[rocksndiamonds.git] / src / editor.c
index 0550f3e71131692d973f83ace88ad3bd14724aa1..9e3f01e5554c2b13a0db5c701cd0948ef6205895 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_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 22)
-#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 23)
+#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)
 
 /* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 24)
+#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 27)
 
 #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_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)
+#define GADGET_ID_CHANGE_USE_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)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 40)
 #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_SELECT_CHANGE_PAGE     22
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      23
+#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_NUM_SELECTBOX                       24
+#define ED_NUM_SELECTBOX                       27
 
 #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_USE_ACTION    37
 
-#define ED_NUM_CHECKBUTTONS                    37
+#define ED_NUM_CHECKBUTTONS                    38
 
 #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_USE_RANDOM
+#define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_USE_ACTION
 
 /* 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              100
+#define MAX_COLLECT_COUNT              255
 
 /* values for random placement */
 #define RANDOM_USE_PERCENTAGE          0
@@ -879,6 +887,9 @@ static struct
   char *text;
 } control_info[ED_NUM_CTRL_BUTTONS] =
 {
+  /* note: some additional characters are already reserved for "cheat mode"
+     shortcuts (":XYZ" style) -- for details, see "events.c" */
+
   { 's',       "draw single items"                     },
   { 'd',       "draw connected items"                  },
   { 'l',       "draw lines"                            },
@@ -1422,28 +1433,30 @@ static struct ValueTextInfo options_change_direct_action[] =
 
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+  { CE_COUNT_AT_ZERO,          "CE count at zero"              },
 
   { -1,                                NULL                            }
 };
 
 static struct ValueTextInfo options_change_other_action[] =
 {
-  { CE_OTHER_GETS_TOUCHED,     "player touches"                },
-  { CE_OTHER_GETS_PRESSED,     "player presses"                },
-  { CE_OTHER_GETS_PUSHED,      "player pushes"                 },
-  { CE_OTHER_GETS_ENTERED,     "player enters"                 },
-  { CE_OTHER_GETS_LEFT,                "player leaves"                 },
-  { CE_OTHER_GETS_DIGGED,      "player digs"                   },
-  { CE_OTHER_GETS_COLLECTED,   "player collects"               },
-  { CE_OTHER_GETS_DROPPED,     "player drops/throws"           },
-  { CE_OTHER_IS_TOUCHING,      "touching"                      },
+  { CE_PLAYER_TOUCHES_X,       "player touches"                },
+  { CE_PLAYER_PRESSES_X,       "player presses"                },
+  { CE_PLAYER_PUSHES_X,                "player pushes"                 },
+  { CE_PLAYER_ENTERS_X,                "player enters"                 },
+  { CE_PLAYER_LEAVES_X,                "player leaves"                 },
+  { CE_PLAYER_DIGS_X,          "player digs"                   },
+  { CE_PLAYER_COLLECTS_X,      "player collects"               },
+  { CE_PLAYER_DROPS_X,         "player drops/throws"           },
+  { CE_TOUCHING_X,             "touching"                      },
 #if 1
-  { CE_OTHER_IS_HITTING,       "hitting"                       },
-  { CE_OTHER_GETS_HIT,         "hit by"                        },
+  { CE_HITTING_X,              "hitting"                       },
+  { CE_HIT_BY_X,               "hit by"                        },
 #endif
-  { CE_OTHER_IS_SWITCHING,     "switch of"                     },
-  { CE_OTHER_IS_CHANGING,      "change by page of"             },
-  { CE_OTHER_IS_EXPLODING,     "explosion of"                  },
+  { 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,6 +1536,79 @@ 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"                  },
+  { CA_SET_DYNABOMB_NUMBER,    "set bomb number"               },
+  { CA_SET_DYNABOMB_SIZE,      "set bomb size"                 },
+  { CA_SET_DYNABOMB_POWER,     "set bomb power"                },
+  { 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_ADD,               "+"                             },
+  { CA_MODE_SUBTRACT,          "-"                             },
+  { CA_MODE_MULTIPLY,          "*"                             },
+  { CA_MODE_DIVIDE,            "/"                             },
+  { CA_MODE_SET,               "="                             },
+
+  { -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] =
 {
@@ -1738,6 +1824,30 @@ 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,
@@ -2210,7 +2320,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:",       "element can change to other element"
+    NULL, "element changes to:",       "change element on specified condition"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2254,6 +2364,12 @@ 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_USE_ACTION,       GADGET_ID_NONE,
+    &custom_element_change.use_action,
+    NULL, NULL,                                "execute action on specified condition"
+  },
 };
 
 static struct
@@ -2490,6 +2606,7 @@ 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)
@@ -2765,10 +2882,18 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_WALL_11,
   EL_EMC_WALL_12,
 
+#if RELEASE_311
+  EL_EMPTY,
+#else
   EL_EMC_ANDROID,
+#endif
   EL_BALLOON,
   EL_BALLOON_SWITCH_ANY,
+#if RELEASE_311
+  EL_EMPTY,
+#else
   EL_BALLOON_SWITCH_NONE,
+#endif
 
   EL_BALLOON_SWITCH_LEFT,
   EL_BALLOON_SWITCH_RIGHT,
@@ -2777,15 +2902,33 @@ static int editor_el_emerald_mine_club[] =
 
   EL_EMC_GRASS,
   EL_EMC_PLANT,
+#if RELEASE_311
+  EL_EMPTY,
+  EL_EMPTY,
+#else
   EL_EMC_LENSES,
   EL_EMC_MAGNIFIER,
+#endif
 
+#if RELEASE_311
+  EL_EMPTY,
+  EL_EMPTY,
+#else
   EL_EMC_MAGIC_BALL,
   EL_EMC_MAGIC_BALL_SWITCH,
+#endif
   EL_SPRING,
+#if RELEASE_311
+  EL_EMPTY,
+#else
   EL_EMC_SPRING_BUMPER,
+#endif
 
+#if RELEASE_311
+  EL_EMPTY,
+#else
   EL_EMC_DRIPPER,
+#endif
   EL_EMC_FAKE_GRASS,
   EL_EMPTY,
   EL_EMPTY,
@@ -6170,24 +6313,26 @@ 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 */
   custom_element_change.other_action =
-    (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_ENTERED) ? CE_OTHER_GETS_ENTERED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_LEFT) ? CE_OTHER_GETS_LEFT :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DIGGED) ? CE_OTHER_GETS_DIGGED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
+    (HAS_CHANGE_EVENT(element, CE_PLAYER_TOUCHES_X) ? CE_PLAYER_TOUCHES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_PRESSES_X) ? CE_PLAYER_PRESSES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_PUSHES_X) ? CE_PLAYER_PUSHES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_ENTERS_X) ? CE_PLAYER_ENTERS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_LEAVES_X) ? CE_PLAYER_LEAVES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_DIGS_X) ? CE_PLAYER_DIGS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_COLLECTS_X) ? CE_PLAYER_COLLECTS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_DROPS_X) ? CE_PLAYER_DROPS_X :
+     HAS_CHANGE_EVENT(element, CE_TOUCHING_X) ? CE_TOUCHING_X :
+     HAS_CHANGE_EVENT(element, CE_HITTING_X) ? CE_HITTING_X :
+     HAS_CHANGE_EVENT(element, CE_HIT_BY_X) ? CE_HIT_BY_X :
+     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);
 }
 
@@ -6359,24 +6504,26 @@ 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];
 
   /* set other element action change event from checkbox and selectbox */
-  custom_element_change_events[CE_OTHER_GETS_TOUCHED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_ENTERED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_LEFT] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_DIGGED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
+  custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_PUSHES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_ENTERS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_LEAVES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_DIGS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_COLLECTS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_DROPS_X] = FALSE;
+  custom_element_change_events[CE_TOUCHING_X] = FALSE;
+  custom_element_change_events[CE_HITTING_X] = FALSE;
+  custom_element_change_events[CE_HIT_BY_X] = FALSE;
+  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];
 
@@ -7897,6 +8044,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
 #define CB_BRUSH_TO_LEVEL      2
 #define CB_DELETE_OLD_CURSOR   3
 #define CB_DUMP_BRUSH          4
+#define CB_DUMP_BRUSH_SMALL    5
 
 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
                         int button, int mode)
@@ -7908,7 +8056,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
   int new_element = BUTTON_ELEMENT(button);
   int x, y;
 
-  if (mode == CB_DUMP_BRUSH)
+  if (mode == CB_DUMP_BRUSH ||
+      mode == CB_DUMP_BRUSH_SMALL)
   {
     if (!draw_with_brush)
     {
@@ -7955,10 +8104,12 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
 
        if (IS_CUSTOM_ELEMENT(element))
          element_mapped = EL_CUSTOM_START;
-       else if (element > EL_ENVELOPE_4)
-         element_mapped = EL_CHAR_QUESTION;    /* change to EL_UNKNOWN ... */
+       else if (IS_GROUP_ELEMENT(element))
+         element_mapped = EL_GROUP_START;
+       else if (element >= NUM_FILE_ELEMENTS)
+         element_mapped = EL_UNKNOWN;
 
-       printf("`%03d", element_mapped);
+       printf("%c%03d", (mode == CB_DUMP_BRUSH ? '`' : 'ΒΈ'), element_mapped);
 #endif
       }
 
@@ -8087,6 +8238,11 @@ void DumpBrush()
   CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH);
 }
 
+void DumpBrush_Small()
+{
+  CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH_SMALL);
+}
+
 static void FloodFill(int from_x, int from_y, int fill_element)
 {
   int i,x,y;
@@ -8416,8 +8572,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   if (!started_inside_drawing_area)
     return;
 
+#if 1
+  if (!IS_VALID_BUTTON(button) && !button_release_event)
+    return;
+#else
   if (!button && !button_release_event)
     return;
+#endif
 
   /* automatically switch to 'single item' drawing mode, if needed */
   actual_drawing_function =
@@ -8986,6 +9147,14 @@ 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);
 
@@ -9293,13 +9462,18 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
        DrawCompleteVideoDisplay();
 
+       level_editor_test_game = TRUE;
+
+#if 1
+       StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE);
+#else
        if (setup.autorecord)
          TapeStartRecording();
 
-       level_editor_test_game = TRUE;
        game_status = GAME_MODE_PLAYING;
 
        InitGame();
+#endif
       }
       break;