added support for text left/right of level editor text input gadgets
[rocksndiamonds.git] / src / editor.c
index 2e6373968240854e83ee1da1cffd6b55b5256f49..6d38861e69440a665f40b97d49a5a1921991c994 100644 (file)
 
 #define ED_SETTINGS_LEVEL_TABS_X       (editor.settings.tabs.x)
 #define ED_SETTINGS_LEVEL_TABS_Y       (editor.settings.tabs.y)
+#define ED_SETTINGS_ENGINE_TABS_X      (editor.settings.tabs.x)
+#define ED_SETTINGS_ENGINE_TABS_Y      (editor.settings.tabs.y +       \
+                                        ED_TABBUTTON_YSIZE +           \
+                                        ED_GADGET_TINY_DISTANCE +      \
+                                        ED_TAB_BAR_HEIGHT +            \
+                                        ED_GADGET_TEXT_DISTANCE)
 #define ED_SETTINGS_ELEMENT_TABS_X     (editor.settings.tabs.x)
 #define ED_SETTINGS_ELEMENT_TABS_Y     (editor.settings.tabs.y +       \
                                         editor.settings.tabs.yoffset2)
                                         ED_SETTINGS_TABS_YOFFSET +     \
                                         getFontHeight(FONT_TEXT_1) +   \
                                         ED_GADGET_TEXT_DISTANCE)
+#define ED_ENGINE_TABS_XSTART          (ED_SETTINGS_ENGINE_TABS_X)
+#define ED_ENGINE_TABS_YSTART          (ED_SETTINGS_ENGINE_TABS_Y)
+#define ED_ENGINE_SETTINGS_XSTART      (ED_SETTINGS_ENGINE_TABS_X +    \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_ENGINE_SETTINGS_YSTART      (ED_SETTINGS_ENGINE_TABS_Y +    \
+                                        ED_TABBUTTON_YSIZE +           \
+                                        ED_GADGET_TINY_DISTANCE +      \
+                                        ED_TAB_BAR_HEIGHT +            \
+                                        ED_SETTINGS_TABS_YOFFSET +     \
+                                        getFontHeight(FONT_TEXT_1) +   \
+                                        ED_GADGET_TEXT_DISTANCE)
 #define ED_ELEMENT_TABS_XSTART         (ED_SETTINGS_ELEMENT_TABS_X)
 #define ED_ELEMENT_TABS_YSTART         (ED_SETTINGS_ELEMENT_TABS_Y)
 #define ED_ELEMENT_SETTINGS_XSTART     (ED_SETTINGS_ELEMENT_TABS_X +   \
 #define ED_POS_LEVEL_TABS_LAST         (2 * ED_POS_RANGE - 1)
 #define ED_POS_LEVEL_SETTINGS_FIRST    (2 * ED_POS_RANGE)
 #define ED_POS_LEVEL_SETTINGS_LAST     (3 * ED_POS_RANGE - 1)
-#define ED_POS_ELEMENT_TABS_FIRST      (3 * ED_POS_RANGE)
-#define ED_POS_ELEMENT_TABS_LAST       (4 * ED_POS_RANGE - 1)
-#define ED_POS_ELEMENT_SETTINGS_FIRST  (4 * ED_POS_RANGE)
-#define ED_POS_ELEMENT_SETTINGS_LAST   (5 * ED_POS_RANGE - 1)
+#define ED_POS_ENGINE_TABS_FIRST       (3 * ED_POS_RANGE)
+#define ED_POS_ENGINE_TABS_LAST                (4 * ED_POS_RANGE - 1)
+#define ED_POS_ENGINE_SETTINGS_FIRST   (4 * ED_POS_RANGE)
+#define ED_POS_ENGINE_SETTINGS_LAST    (5 * ED_POS_RANGE - 1)
+#define ED_POS_ELEMENT_TABS_FIRST      (5 * ED_POS_RANGE)
+#define ED_POS_ELEMENT_TABS_LAST       (6 * ED_POS_RANGE - 1)
+#define ED_POS_ELEMENT_SETTINGS_FIRST  (6 * ED_POS_RANGE)
+#define ED_POS_ELEMENT_SETTINGS_LAST   (7 * ED_POS_RANGE - 1)
 
 #define ED_LEVEL_TABS_XPOS(n)          (ED_POS_LEVEL_TABS_FIRST + (n))
 #define ED_LEVEL_TABS_YPOS(n)          (ED_POS_LEVEL_TABS_FIRST + (n))
 #define ED_LEVEL_SETTINGS_XPOS(n)      (ED_POS_LEVEL_SETTINGS_FIRST + (n))
 #define ED_LEVEL_SETTINGS_YPOS(n)      (ED_POS_LEVEL_SETTINGS_FIRST + (n))
 
+#define ED_ENGINE_TABS_XPOS(n)         (ED_POS_ENGINE_TABS_FIRST + (n))
+#define ED_ENGINE_TABS_YPOS(n)         (ED_POS_ENGINE_TABS_FIRST + (n))
+
+#define ED_ENGINE_SETTINGS_XPOS(n)     (ED_POS_ENGINE_SETTINGS_FIRST + (n))
+#define ED_ENGINE_SETTINGS_YPOS(n)     (ED_POS_ENGINE_SETTINGS_FIRST + (n))
+
 #define ED_ELEMENT_TABS_XPOS(n)                (ED_POS_ELEMENT_TABS_FIRST + (n))
 #define ED_ELEMENT_TABS_YPOS(n)                (ED_POS_ELEMENT_TABS_FIRST + (n))
 
                                       (n) <= ED_POS_LEVEL_TABS_LAST)
 #define IS_POS_LEVEL_SETTINGS(n)      ((n) >= ED_POS_LEVEL_SETTINGS_FIRST && \
                                       (n) <= ED_POS_LEVEL_SETTINGS_LAST)
+#define IS_POS_ENGINE_TABS(n)        ((n) >= ED_POS_ENGINE_TABS_FIRST && \
+                                      (n) <= ED_POS_ENGINE_TABS_LAST)
+#define IS_POS_ENGINE_SETTINGS(n)     ((n) >= ED_POS_ENGINE_SETTINGS_FIRST && \
+                                      (n) <= ED_POS_ENGINE_SETTINGS_LAST)
 #define IS_POS_ELEMENT_TABS(n)       ((n) >= ED_POS_ELEMENT_TABS_FIRST && \
                                       (n) <= ED_POS_ELEMENT_TABS_LAST)
 #define IS_POS_ELEMENT_SETTINGS(n)    ((n) >= ED_POS_ELEMENT_SETTINGS_FIRST && \
 
 #define ED_LEVEL_TABS_LINE(n)          ((n) - ED_POS_LEVEL_TABS_FIRST)
 #define ED_LEVEL_SETTINGS_LINE(n)      ((n) - ED_POS_LEVEL_SETTINGS_FIRST)
+#define ED_ENGINE_TABS_LINE(n)         ((n) - ED_POS_ENGINE_TABS_FIRST)
+#define ED_ENGINE_SETTINGS_LINE(n)     ((n) - ED_POS_ENGINE_SETTINGS_FIRST)
 #define ED_ELEMENT_TABS_LINE(n)                ((n) - ED_POS_ELEMENT_TABS_FIRST)
 #define ED_ELEMENT_SETTINGS_LINE(n)    ((n) - ED_POS_ELEMENT_SETTINGS_FIRST)
 
 #define ED_LEVEL_SETTINGS_Y(n)         (ED_LEVEL_SETTINGS_YSTART +     \
                                         (n) * ED_SETTINGS_YOFFSET)
 
+#define ED_ENGINE_TABS_X(n)            (ED_ENGINE_TABS_XSTART +        \
+                                        (n) * ED_SETTINGS_TABS_XOFFSET)
+#define ED_ENGINE_TABS_Y(n)            (ED_ENGINE_TABS_YSTART +        \
+                                        (n) * ED_SETTINGS_TABS_YOFFSET)
+
+#define ED_ENGINE_SETTINGS_X(n)                (ED_ENGINE_SETTINGS_XSTART +    \
+                                        (n) * ED_SETTINGS_XOFFSET)
+#define ED_ENGINE_SETTINGS_Y(n)                (ED_ENGINE_SETTINGS_YSTART +    \
+                                        (n) * ED_SETTINGS_YOFFSET)
+
 #define ED_ELEMENT_TABS_X(n)           (ED_ELEMENT_TABS_XSTART +       \
                                         (n) * ED_SETTINGS_TABS_XOFFSET)
 #define ED_ELEMENT_TABS_Y(n)           (ED_ELEMENT_TABS_YSTART +       \
 #define ED_POS_TO_LEVEL_SETTINGS_Y(n)  \
   (ED_LEVEL_SETTINGS_Y(ED_LEVEL_SETTINGS_LINE(n)))
 
+#define ED_POS_TO_ENGINE_TABS_X(n)     \
+  (ED_ENGINE_TABS_X(ED_ENGINE_TABS_LINE(n)))
+#define ED_POS_TO_ENGINE_TABS_Y(n)     \
+  (ED_ENGINE_TABS_Y(ED_ENGINE_TABS_LINE(n)))
+
+#define ED_POS_TO_ENGINE_SETTINGS_X(n) \
+  (ED_ENGINE_SETTINGS_X(ED_ENGINE_SETTINGS_LINE(n)))
+#define ED_POS_TO_ENGINE_SETTINGS_Y(n) \
+  (ED_ENGINE_SETTINGS_Y(ED_ENGINE_SETTINGS_LINE(n)))
+
 #define ED_POS_TO_ELEMENT_TABS_X(n)    \
   (ED_ELEMENT_TABS_X(ED_ELEMENT_TABS_LINE(n)))
 #define ED_POS_TO_ELEMENT_TABS_Y(n)    \
                                         ED_POS_TO_LEVEL_TABS_X(n) : \
                                         IS_POS_LEVEL_SETTINGS(n) ?     \
                                         ED_POS_TO_LEVEL_SETTINGS_X(n) : \
+                                        IS_POS_ENGINE_TABS(n) ?        \
+                                        ED_POS_TO_ENGINE_TABS_X(n) : \
+                                        IS_POS_ENGINE_SETTINGS(n) ?    \
+                                        ED_POS_TO_ENGINE_SETTINGS_X(n) : \
                                         IS_POS_ELEMENT_TABS(n) ?       \
                                         ED_POS_TO_ELEMENT_TABS_X(n) : \
                                         IS_POS_ELEMENT_SETTINGS(n) ?   \
                                         ED_POS_TO_LEVEL_TABS_Y(n) : \
                                         IS_POS_LEVEL_SETTINGS(n) ?     \
                                         ED_POS_TO_LEVEL_SETTINGS_Y(n) : \
+                                        IS_POS_ENGINE_TABS(n) ?        \
+                                        ED_POS_TO_ENGINE_TABS_Y(n) : \
+                                        IS_POS_ENGINE_SETTINGS(n) ?    \
+                                        ED_POS_TO_ENGINE_SETTINGS_Y(n) : \
                                         IS_POS_ELEMENT_TABS(n) ?       \
                                         ED_POS_TO_ELEMENT_TABS_Y(n) : \
                                         IS_POS_ELEMENT_SETTINGS(n) ?   \
@@ -587,6 +648,16 @@ enum
   GADGET_ID_BD_ROCK_TURNS_TO_ON_IMPACT,
   GADGET_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,
   GADGET_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,
+  GADGET_ID_BD_FIREFLY_EXPLODES_TO,
+  GADGET_ID_BD_FIREFLY_2_EXPLODES_TO,
+  GADGET_ID_BD_BUTTERFLY_EXPLODES_TO,
+  GADGET_ID_BD_BUTTERFLY_2_EXPLODES_TO,
+  GADGET_ID_BD_STONEFLY_EXPLODES_TO,
+  GADGET_ID_BD_DRAGONFLY_EXPLODES_TO,
+  GADGET_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+  GADGET_ID_BD_BOMB_EXPLOSION_TURNS_TO,
+  GADGET_ID_BD_NITRO_EXPLOSION_TURNS_TO,
+  GADGET_ID_BD_EXPLOSION_TURNS_TO,
   GADGET_ID_START_ELEMENT,
   GADGET_ID_ARTWORK_ELEMENT,
   GADGET_ID_EXPLOSION_ELEMENT,
@@ -620,8 +691,8 @@ enum
   GADGET_ID_TIME_OR_STEPS,
   GADGET_ID_TIME_SCORE_BASE,
   GADGET_ID_GAME_ENGINE_TYPE,
-  GADGET_ID_BD_SCHEDULING_TYPE,
   GADGET_ID_LEVELSET_SAVE_MODE,
+  GADGET_ID_BD_SCHEDULING_TYPE,
   GADGET_ID_WIND_DIRECTION,
   GADGET_ID_PLAYER_SPEED,
   GADGET_ID_BD_GRAVITY_DIRECTION,
@@ -658,6 +729,8 @@ enum
   GADGET_ID_LEVELCONFIG_LEVELSET,
   GADGET_ID_LEVELCONFIG_EDITOR,
   GADGET_ID_LEVELCONFIG_ENGINE,
+  GADGET_ID_ENGINECONFIG_CONFIG,
+  GADGET_ID_ENGINECONFIG_COLORS,
   GADGET_ID_PROPERTIES_INFO,
   GADGET_ID_PROPERTIES_CONFIG,
   GADGET_ID_PROPERTIES_CONFIG_1,
@@ -739,8 +812,10 @@ enum
   GADGET_ID_BD_DIAGONAL_MOVEMENTS,
   GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
   GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE,
   GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,
   GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  GADGET_ID_BD_MAGIC_WALL_BREAK_SCAN,
   GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
   GADGET_ID_BD_AMOEBA_START_IMMEDIATELY,
   GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
@@ -755,6 +830,7 @@ enum
   GADGET_ID_BD_CONVEYOR_BELTS_CHANGED,
   GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN,
   GADGET_ID_BD_HAMMER_WALLS_REAPPEAR,
+  GADGET_ID_BD_INFINITE_ROCKETS,
   GADGET_ID_BD_CREATURES_START_BACKWARDS,
   GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,
   GADGET_ID_BD_GRAVITY_SWITCH_ACTIVE,
@@ -947,8 +1023,8 @@ enum
   ED_SELECTBOX_ID_TIME_OR_STEPS,
   ED_SELECTBOX_ID_TIME_SCORE_BASE,
   ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
-  ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
   ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
+  ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
   ED_SELECTBOX_ID_WIND_DIRECTION,
   ED_SELECTBOX_ID_PLAYER_SPEED,
   ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION,
@@ -1008,6 +1084,8 @@ enum
   ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
   ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
   ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
+  ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG,
+  ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS,
   ED_TEXTBUTTON_ID_PROPERTIES_INFO,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
@@ -1025,6 +1103,9 @@ enum
 #define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
 #define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST  ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
+#define ED_TAB_BUTTON_ID_ENGINECONFIG_FIRST ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG
+#define ED_TAB_BUTTON_ID_ENGINECONFIG_LAST  ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS
+
 #define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_TAB_BUTTON_ID_PROPERTIES_LAST  ED_TEXTBUTTON_ID_PROPERTIES_CHANGE
 
@@ -1094,8 +1175,10 @@ enum
   ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
   ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
   ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
   ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
   ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN,
   ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
   ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY,
   ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
@@ -1110,6 +1193,7 @@ enum
   ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED,
   ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN,
   ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR,
+  ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS,
   ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
   ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
   ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE,
@@ -1240,6 +1324,16 @@ enum
   ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT,
   ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,
   ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,
+  ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO,
+  ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO,
+  ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+  ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO,
+  ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO,
+  ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO,
   ED_DRAWING_ID_START_ELEMENT,
   ED_DRAWING_ID_ARTWORK_ELEMENT,
   ED_DRAWING_ID_EXPLOSION_ELEMENT,
@@ -1290,6 +1384,10 @@ enum
 #define ED_MODE_LEVELCONFIG_EDITOR     ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR
 #define ED_MODE_LEVELCONFIG_ENGINE     ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
+// sub-screens in the engine settings section
+#define ED_MODE_ENGINECONFIG_CONFIG    ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG
+#define ED_MODE_ENGINECONFIG_COLORS    ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS
+
 // sub-screens in the element properties section
 #define ED_MODE_PROPERTIES_INFO                ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_MODE_PROPERTIES_CONFIG      ED_TEXTBUTTON_ID_PROPERTIES_CONFIG
@@ -1629,7 +1727,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(3),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
     50,                                                500,
     GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,          GADGET_ID_BD_CYCLE_DELAY_MS_UP,
     GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,          GADGET_ID_NONE,
@@ -1638,7 +1736,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(3),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
     0,                                         32,
     GADGET_ID_BD_CYCLE_DELAY_C64_DOWN,         GADGET_ID_BD_CYCLE_DELAY_C64_UP,
     GADGET_ID_BD_CYCLE_DELAY_C64_TEXT,         GADGET_ID_NONE,
@@ -1647,7 +1745,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(4),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
     1,                                         40,
     GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,   GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
     GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,   GADGET_ID_NONE,
@@ -1656,7 +1754,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(4),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
     1,                                         40,
     GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,  GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
     GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,  GADGET_ID_NONE,
@@ -1966,7 +2064,7 @@ static struct
   int gadget_id;
   int size;
   char *value;
-  char *text_above, *infotext;
+  char *text_above, *text_left, *text_right, *infotext;
 } textinput_info[ED_NUM_TEXTINPUT] =
 {
   {
@@ -1975,7 +2073,7 @@ static struct
     GADGET_ID_LEVEL_NAME,
     MAX_LEVEL_NAME_LEN,
     level.name,
-    "Title:", "Title for this level"
+    "Title:", NULL, NULL,                      "Enter title for this level"
   },
   {
     ED_TEXTINPUT_ID_LEVEL_AUTHOR,
@@ -1983,7 +2081,7 @@ static struct
     GADGET_ID_LEVEL_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
     level.author,
-    "Author:", "Author for this level"
+    "Author:", NULL, NULL,                     "Enter author for this level"
   },
   {
     ED_TEXTINPUT_ID_LEVELSET_NAME,
@@ -1991,7 +2089,7 @@ static struct
     GADGET_ID_LEVELSET_NAME,
     MAX_LEVEL_NAME_LEN,
     levelset_name,
-    "Title:", "Title for this or new level set"
+    "Title:", NULL, NULL,                      "Enter title for this or new level set"
   },
   {
     ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
@@ -1999,7 +2097,7 @@ static struct
     GADGET_ID_LEVELSET_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
     levelset_author,
-    "Author:", "Author for this or new level set"
+    "Author:", NULL, NULL,                     "Enter author for this or new level set"
   },
   {
     ED_TEXTINPUT_ID_ELEMENT_NAME,
@@ -2007,7 +2105,7 @@ static struct
     GADGET_ID_ELEMENT_NAME,
     MAX_ELEMENT_NAME_LEN - 2,                  // currently 2 chars less editable
     custom_element.description,
-    NULL, "Element name"
+    NULL, NULL, NULL,                          "Enter element name"
   }
 };
 
@@ -2833,15 +2931,6 @@ static struct
     &level.game_engine_type,
     NULL, "Game engine:", NULL,                        "Select game engine"
   },
-  {
-    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(1),
-    GADGET_ID_BD_SCHEDULING_TYPE,              GADGET_ID_NONE,
-    -1,
-    options_bd_scheduling_type,
-    &level.bd_scheduling_type,
-    NULL, "Scheduling type:", NULL,            "Select level timing"
-  },
   {
     ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
     ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(10),
@@ -2852,6 +2941,20 @@ static struct
     "Action:", NULL, NULL,                     "Select action when saving level set"
   },
 
+  // ---------- engine settings: config ---------------------------------------
+
+  {
+    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
+    GADGET_ID_BD_SCHEDULING_TYPE,              GADGET_ID_NONE,
+    -1,
+    options_bd_scheduling_type,
+    &level.bd_scheduling_type,
+    NULL, "Scheduling type:", NULL,            "Select level timing"
+  },
+
+  // ---------- engine settings: colors ---------------------------------------
+
   // ---------- element settings: configure (several elements) ----------------
 
   {
@@ -3171,7 +3274,24 @@ static struct
     -1,                                                -1,
     GADGET_ID_LEVELCONFIG_ENGINE,              GADGET_ID_LEVELCONFIG_EDITOR,
     8,                                         "Engine",
-    NULL, NULL, NULL,                          "Configure engine settings"
+    NULL, NULL, NULL,                          "Configure game engine settings"
+  },
+
+  // ---------- engine settings (tabs) ----------------------------------------
+
+  {
+    ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG,
+    ED_ENGINE_TABS_XPOS(0),                    ED_ENGINE_TABS_YPOS(0),
+    GADGET_ID_ENGINECONFIG_CONFIG,             GADGET_ID_NONE,
+    8,                                         "Config",
+    NULL, NULL, NULL,                          "Configure game engine settings"
+  },
+  {
+    ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS,
+    -1,                                                -1,
+    GADGET_ID_ENGINECONFIG_COLORS,             GADGET_ID_ENGINECONFIG_CONFIG,
+    8,                                         "Colors",
+    NULL, NULL, NULL,                          "Configure game engine colors"
   },
 
   // ---------- element settings (tabs) ---------------------------------------
@@ -3488,7 +3608,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_INTERMISSION,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(0),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(0),
     GADGET_ID_BD_INTERMISSION,                 GADGET_ID_NONE,
     &level.bd_intermission,
     "Boulder Dash game engine settings:", NULL,
@@ -3496,7 +3616,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_PAL_TIMING,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(2),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(2),
     GADGET_ID_BD_PAL_TIMING,                   GADGET_ID_NONE,
     &level.bd_pal_timing,
     NULL, NULL,
@@ -3504,7 +3624,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(6),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(6),
     GADGET_ID_BD_LINE_SHIFTING_BORDERS,                GADGET_ID_NONE,
     &level.bd_line_shifting_borders,
     "Compatibility settings:", NULL,
@@ -3512,7 +3632,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(7),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(7),
     GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW,      GADGET_ID_NONE,
     &level.bd_scan_first_and_last_row,
     NULL, NULL,
@@ -3520,7 +3640,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(8),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(8),
     GADGET_ID_BD_SHORT_EXPLOSIONS,             GADGET_ID_NONE,
     &level.bd_short_explosions,
     NULL, NULL,
@@ -3802,8 +3922,16 @@ static struct
     "Mega rocks pushable with sweet",          "Push mega rocks after eating sweet"
   },
   {
-    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE,     GADGET_ID_NONE,
+    &level.bd_magic_wall_zero_infinite,
+    NULL, NULL,
+    "Run forever if duration is zero",         "Run infinitely if timer is zero"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,     GADGET_ID_NONE,
     &level.bd_magic_wall_wait_hatching,
     NULL, NULL,
@@ -3811,11 +3939,19 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
-    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(3),
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,      GADGET_ID_NONE,
     &level.bd_magic_wall_stops_amoeba,
     NULL, NULL,
-    "Turn amoeba to diamonds",                 "Activation changes amoeba to diamonds"
+    "Stop amoeba and turn to diamonds",                "Activation changes amoeba to diamonds"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(5),
+    GADGET_ID_BD_MAGIC_WALL_BREAK_SCAN,                GADGET_ID_NONE,
+    &level.bd_magic_wall_break_scan,
+    NULL, NULL,
+    "Emulate amoeba bug in BD1",               "Use buggy BD1 behavior"
   },
   {
     ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
@@ -3929,6 +4065,14 @@ static struct
     NULL, NULL,
     "Hammered walls reappear",                 "Hammered walls reappear after delay"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_INFINITE_ROCKETS,             GADGET_ID_NONE,
+    &level.bd_infinite_rockets,
+    NULL, NULL,
+    "Infinite rockets",                                "Rocket launcher has infinite rockets"
+  },
   {
     ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
@@ -3939,11 +4083,11 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
-    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,   GADGET_ID_NONE,
     &level.bd_creatures_turn_on_hatching,
     NULL, NULL,
-    "Creatures turn on hatching",              "Creatures change direction on hatching"
+    "Creatures auto turn on hatching",         "Creatures change direction on hatching"
   },
   {
     ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE,
@@ -4447,7 +4591,7 @@ static struct
 
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(4),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(6),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO,                GADGET_ID_NONE,
     &level.bd_magic_wall_diamond_to,           1, 1,
@@ -4455,7 +4599,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(5),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(7),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_ROCK_TO,           GADGET_ID_NONE,
     &level.bd_magic_wall_rock_to,              1, 1,
@@ -4463,7 +4607,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(6),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(8),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,      GADGET_ID_NONE,
     &level.bd_magic_wall_mega_rock_to,         1, 1,
@@ -4471,7 +4615,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(7),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(9),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_NUT_TO,            GADGET_ID_NONE,
     &level.bd_magic_wall_nut_to,               1, 1,
@@ -4479,7 +4623,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(8),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(10),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO,     GADGET_ID_NONE,
     &level.bd_magic_wall_nitro_pack_to,                1, 1,
@@ -4487,7 +4631,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(9),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(11),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_NONE,
     &level.bd_magic_wall_flying_diamond_to,    1, 1,
@@ -4495,7 +4639,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(10),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(12),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,    GADGET_ID_NONE,
     &level.bd_magic_wall_flying_rock_to,       1, 1,
@@ -4691,6 +4835,86 @@ static struct
     &level.bd_diamond_turns_to_on_impact,      1, 1,
     "Turns to on impact:", NULL, NULL, NULL,   "Changes to this when falling stops"
   },
+  {
+    ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_FIREFLY_EXPLODES_TO,          GADGET_ID_NONE,
+    &level.bd_firefly_explodes_to,             1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_FIREFLY_2_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_firefly_2_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_BUTTERFLY_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_butterfly_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_BUTTERFLY_2_EXPLODES_TO,      GADGET_ID_NONE,
+    &level.bd_butterfly_2_explodes_to,         1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_STONEFLY_EXPLODES_TO,         GADGET_ID_NONE,
+    &level.bd_stonefly_explodes_to,            1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_DRAGONFLY_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_dragonfly_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_DIAMOND_BIRTH_TURNS_TO,       GADGET_ID_NONE,
+    &level.bd_diamond_birth_turns_to,          1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_BOMB_EXPLOSION_TURNS_TO,      GADGET_ID_NONE,
+    &level.bd_bomb_explosion_turns_to,         1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_NITRO_EXPLOSION_TURNS_TO,     GADGET_ID_NONE,
+    &level.bd_nitro_explosion_turns_to,                1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_EXPLOSION_TURNS_TO,           GADGET_ID_NONE,
+    &level.bd_explosion_turns_to,              1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
 
   // ---------- level start element -------------------------------------------
 
@@ -4960,6 +5184,7 @@ static int redo_buffer_steps = 0;
 
 static int edit_mode;
 static int edit_mode_levelconfig;
+static int edit_mode_engineconfig;
 static int edit_mode_properties;
 
 static int element_shift = 0;
@@ -5029,9 +5254,9 @@ static int editor_el_boulderdash_native[] =
   EL_BD_ROCK,
   EL_BD_DIAMOND,
 
+  EL_BD_INBOX,
   EL_BD_STEELWALL,
   EL_BD_WALL,
-  EL_BD_SAND_2,
   EL_BD_MAGIC_WALL,
 
   EL_BD_AMOEBA,
@@ -5044,7 +5269,7 @@ static int editor_el_boulderdash_native[] =
   EL_BD_BUTTERFLY_RIGHT,
   EL_BD_FIREFLY_RIGHT,
 
-  EL_BD_INBOX,
+  EL_BD_SAND_2,
   EL_BD_BUTTERFLY_DOWN,
   EL_BD_FIREFLY_DOWN,
   EL_BD_EXIT_OPEN,
@@ -5181,8 +5406,13 @@ static int editor_el_boulderdash_native[] =
 
   EL_BD_PLAYER,
   EL_BD_PLAYER_WITH_BOMB,
+  EL_BD_PLAYER_WITH_ROCKET_LAUNCHER,
+  EL_BD_ROCKET_LAUNCHER,
+
   EL_BD_PLAYER_GLUED,
   EL_BD_PLAYER_STIRRING,
+  EL_EMPTY,
+  EL_EMPTY,
 };
 static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native;
 static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
@@ -8189,7 +8419,11 @@ static void CreateTextInputGadgets(void)
       y = ED_SETTINGS_Y(textinput_info[i].y);
     }
 
-    sprintf(infotext, "Enter %s", textinput_info[i].infotext);
+    // determine horizontal offset for leading text
+    if (textinput_info[i].text_left != NULL)
+      x += getTextWidthForGadget(textinput_info[i].text_left);
+
+    sprintf(infotext, "%s", textinput_info[i].infotext);
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
@@ -8364,6 +8598,7 @@ static void CreateTextbuttonGadgets(void)
     int type_id = textbutton_info[i].gadget_type_id;
     int is_tab_button =
       ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_ENGINE) ||
+       (id >= GADGET_ID_ENGINECONFIG_CONFIG && id <= GADGET_ID_ENGINECONFIG_COLORS) ||
        (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE));
     int graphic =
       (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON);
@@ -8939,12 +9174,23 @@ static void MapTextInputGadget(int id)
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[textinput_info[id].gadget_id];
+  int xoffset_left = getTextWidthForGadget(textinput_info[id].text_left);
+  int xoffset_right = ED_GADGET_TEXT_DISTANCE;
   int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
-  int x_above = ED_SETTINGS_X(textinput_info[id].x);
-  int y_above = ED_SETTINGS_Y(textinput_info[id].y) - yoffset_above;
+  int yoffset = (gi->height - font_height) / 2;
+  int x_left = gi->x - xoffset_left;
+  int x_right = gi->x + gi->width + xoffset_right;
+  int y_above = gi->y - yoffset_above;
+  int y = gi->y + yoffset;
 
   if (textinput_info[id].text_above)
-    DrawTextS(x_above, y_above, font_nr, textinput_info[id].text_above);
+    DrawText(x_left, y_above, textinput_info[id].text_above, font_nr);
+
+  if (textinput_info[id].text_left)
+    DrawText(x_left, y, textinput_info[id].text_left, font_nr);
+
+  if (textinput_info[id].text_right)
+    DrawText(x_right, y, textinput_info[id].text_right, font_nr);
 
   ModifyGadget(gi, GDI_TEXT_VALUE, textinput_info[id].value, GDI_END);
 
@@ -8984,11 +9230,10 @@ static void MapSelectboxGadget(int id)
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y_above = gi->y - yoffset_above;
-  int x = gi->x;
   int y = gi->y + yoffset;
 
   if (selectbox_info[id].text_above)
-    DrawText(x, y_above, selectbox_info[id].text_above, font_nr);
+    DrawText(x_left, y_above, selectbox_info[id].text_above, font_nr);
 
   if (selectbox_info[id].text_left)
     DrawText(x_left, y, selectbox_info[id].text_left, font_nr);
@@ -10281,6 +10526,7 @@ void DrawLevelEd(void)
   {
     edit_mode = ED_MODE_DRAWING;
     edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL;
+    edit_mode_engineconfig = ED_MODE_ENGINECONFIG_CONFIG;
     edit_mode_properties = ED_MODE_PROPERTIES_INFO;
 
     ResetUndoBuffer();
@@ -10671,6 +10917,39 @@ static Pixel getTabulatorBarColor(void)
   return GetPixel(gd->bitmap, gd_x, gd_y);
 }
 
+static void DrawEngineConfigTabulatorGadgets(void)
+{
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_ENGINECONFIG_CONFIG];
+  Pixel tab_color = getTabulatorBarColor();
+  int id_first = ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG;
+  int id_last  = ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS;
+  int i;
+
+  for (i = id_first; i <= id_last; i++)
+  {
+    int gadget_id = textbutton_info[i].gadget_id;
+    struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+    boolean active = (i != edit_mode_engineconfig);
+
+    // draw background line below tabulator button
+    ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1);
+
+    // draw solid line below inactive tabulator buttons
+    if (!active && tab_color != BLACK_PIXEL)   // black => transparent
+      FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width,
+                   ED_GADGET_TINY_DISTANCE, tab_color);
+
+    ModifyGadget(gi, GDI_ACTIVE, active, GDI_END);
+    MapTextbuttonGadget(i);
+  }
+
+  // draw little border line below tabulator buttons
+  if (tab_color != BLACK_PIXEL)                        // black => transparent
+    FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height +
+                 ED_GADGET_TINY_DISTANCE,
+                 getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
+}
+
 static void DrawLevelConfigTabulatorGadgets(void)
 {
   struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL];
@@ -10706,6 +10985,10 @@ static void DrawLevelConfigTabulatorGadgets(void)
     FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height +
                  ED_GADGET_TINY_DISTANCE,
                  getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
+
+  // draw second row of engine related tabulators when using native BD engine
+  if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE)
+    DrawEngineConfigTabulatorGadgets();
 }
 
 static void DrawPropertiesTabulatorGadgets(void)
@@ -10879,7 +11162,7 @@ static void DrawLevelConfigEditor(void)
   MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2);
 }
 
-static void DrawLevelConfigEngine(void)
+static void DrawEngineConfigConfig(void)
 {
   int i;
 
@@ -10904,6 +11187,19 @@ static void DrawLevelConfigEngine(void)
     MapSelectboxGadget(i);
 }
 
+static void DrawEngineConfigColors(void)
+{
+  // (no settings yet)
+}
+
+static void DrawLevelConfigEngine(void)
+{
+  if (edit_mode_engineconfig == ED_MODE_ENGINECONFIG_CONFIG)
+    DrawEngineConfigConfig();
+  else if (edit_mode_engineconfig == ED_MODE_ENGINECONFIG_COLORS)
+    DrawEngineConfigColors();
+}
+
 static void DrawLevelConfigWindow(void)
 {
   char *text = "Global Settings";
@@ -11615,6 +11911,12 @@ static boolean checkPropertiesConfig(int element)
       IS_DF_LASER(element) ||
       IS_PLAYER_ELEMENT(element) ||
       IS_BD_PLAYER_ELEMENT(element) ||
+      IS_BD_FIREFLY(properties_element) ||
+      IS_BD_FIREFLY_2(properties_element) ||
+      IS_BD_BUTTERFLY(properties_element) ||
+      IS_BD_BUTTERFLY_2(properties_element) ||
+      IS_BD_STONEFLY(properties_element) ||
+      IS_BD_DRAGONFLY(properties_element) ||
       IS_BD_EXPANDABLE_WALL(properties_element) ||
       IS_BD_EXPANDABLE_STEELWALL(properties_element) ||
       IS_BD_CONVEYOR_BELT(properties_element) ||
@@ -11627,6 +11929,9 @@ static boolean checkPropertiesConfig(int element)
       element == EL_BD_SAND ||
       element == EL_BD_ROCK ||
       element == EL_BD_MEGA_ROCK ||
+      element == EL_BD_BOMB ||
+      element == EL_BD_ROCKET_LAUNCHER ||
+      element == EL_BD_NITRO_PACK ||
       element == EL_BD_SWEET ||
       element == EL_BD_VOODOO_DOLL ||
       element == EL_BD_WATER ||
@@ -11737,6 +12042,14 @@ static void DrawPropertiesConfig(void)
        level.game_engine_type != GAME_ENGINE_TYPE_BD)
       continue;
 
+    // special case: score for smashing only available in R'n'D game engine
+    if ((IS_BD_FIREFLY(elements_with_counter[i].element) ||
+        IS_BD_BUTTERFLY(elements_with_counter[i].element)) &&
+       (elements_with_counter[i].value == &level.score[SC_BUG] ||
+        elements_with_counter[i].value == &level.score[SC_SPACESHIP]) &&
+       level.game_engine_type == GAME_ENGINE_TYPE_BD)
+      continue;
+
     // special case: some amoeba counters only available in R'n'D game engine
     if (elements_with_counter[i].element == EL_BD_AMOEBA &&
        elements_with_counter[i].value == &level.amoeba_speed &&
@@ -11754,7 +12067,7 @@ static void DrawPropertiesConfig(void)
                               (properties_element == EL_BD_SLIME           ? 1 : 0) +
                               (properties_element == EL_BD_ACID            ? 1 : 0) +
                               (properties_element == EL_BD_REPLICATOR      ? 1 : 0) +
-                              (properties_element == EL_BD_CREATURE_SWITCH ? 2 : 0) +
+                              (properties_element == EL_BD_CREATURE_SWITCH ? 1 : 0) +
                               (properties_element == EL_BD_GRAVITY_SWITCH  ? 2 : 0) +
                               (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
                               num_element_counters);
@@ -11793,8 +12106,10 @@ static void DrawPropertiesConfig(void)
     // draw stickybutton gadget
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN);
 
     MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO);
     MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO);
@@ -11830,7 +12145,9 @@ static void DrawPropertiesConfig(void)
       MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE);
     }
     else if (IS_AMOEBOID(properties_element))
+    {
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
+    }
     else if (properties_element == EL_BD_ACID)
     {
       MapDrawingArea(ED_DRAWING_ID_BD_ACID_EATS_ELEMENT);
@@ -11849,7 +12166,9 @@ static void DrawPropertiesConfig(void)
             properties_element == EL_YAMYAM_RIGHT ||
             properties_element == EL_YAMYAM_UP ||
             properties_element == EL_YAMYAM_DOWN)
+    {
       DrawYamYamContentAreas();
+    }
     else if (properties_element == EL_EMC_MAGIC_BALL)
     {
       DrawMagicBallContentAreas();
@@ -11858,7 +12177,9 @@ static void DrawPropertiesConfig(void)
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_BALL_ACTIVE);
     }
     else if (properties_element == EL_EMC_ANDROID)
+    {
       DrawAndroidElementArea();
+    }
     else if (properties_element == EL_MM_GRAY_BALL)
     {
       MapCounterButtons(ED_COUNTER_ID_MM_BALL_CONTENT);
@@ -11990,6 +12311,47 @@ static void DrawPropertiesConfig(void)
     MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT);
   }
 
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    if (IS_BD_FIREFLY(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
+    }
+    else if (IS_BD_FIREFLY_2(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
+    }
+    else if (IS_BD_BUTTERFLY(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO);
+    }
+    else if (IS_BD_BUTTERFLY_2(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO);
+    }
+    else if (IS_BD_STONEFLY(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO);
+    }
+    else if (IS_BD_DRAGONFLY(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
+    }
+    else if (properties_element == EL_BD_BOMB)
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO);
+    }
+    else if (properties_element == EL_BD_NITRO_PACK)
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO);
+    }
+  }
+
   if (properties_element == EL_BD_MEGA_ROCK ||
       properties_element == EL_BD_SWEET)
   {
@@ -12053,6 +12415,11 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR);
   }
 
+  if (properties_element == EL_BD_ROCKET_LAUNCHER)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS);
+  }
+
   if (properties_element == EL_BD_CREATURE_SWITCH)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS);
@@ -12079,7 +12446,8 @@ static void DrawPropertiesConfig(void)
   if (properties_element == EL_EM_DYNAMITE)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE);
 
-  if (COULD_MOVE_INTO_ACID(properties_element) &&
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND &&
+      COULD_MOVE_INTO_ACID(properties_element) &&
       !IS_PLAYER_ELEMENT(properties_element) &&
       (!IS_CUSTOM_ELEMENT(properties_element) ||
        edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
@@ -15722,6 +16090,13 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
 
     DrawLevelConfigWindow();
   }
+  else if (type_id >= ED_TAB_BUTTON_ID_ENGINECONFIG_FIRST &&
+          type_id <= ED_TAB_BUTTON_ID_ENGINECONFIG_LAST)
+  {
+    edit_mode_engineconfig = gi->custom_type_id;
+
+    DrawLevelConfigWindow();
+  }
   else if (type_id >= ED_TAB_BUTTON_ID_PROPERTIES_FIRST &&
           type_id <= ED_TAB_BUTTON_ID_PROPERTIES_LAST)
   {