#define ED_CTRL1_BUTTONS_GFX_YPOS 236
#define ED_CTRL2_BUTTONS_GFX_YPOS 236
#define ED_CTRL3_BUTTONS_GFX_YPOS 324
+#define ED_CTRL4_BUTTONS_GFX_XPOS 44
+#define ED_CTRL4_BUTTONS_GFX_YPOS 214
#define ED_CTRL1_BUTTONS_ALT_GFX_YPOS 142
#define ED_CTRL3_BUTTONS_ALT_GFX_YPOS 302
#define ED_CTRL3_BUTTON_YSIZE 22
#define ED_CTRL3_BUTTONS_XPOS 6
#define ED_CTRL3_BUTTONS_YPOS 6
+#define ED_CTRL4_BUTTON_XSIZE 22
+#define ED_CTRL4_BUTTON_YSIZE 22
+#define ED_CTRL4_BUTTONS_XPOS 6
+#define ED_CTRL4_BUTTONS_YPOS 6
#define ED_CTRL1_BUTTONS_HORIZ 4
#define ED_CTRL1_BUTTONS_VERT 4
#define ED_CTRL2_BUTTONS_VERT 2
#define ED_CTRL3_BUTTONS_HORIZ 3
#define ED_CTRL3_BUTTONS_VERT 1
+#define ED_CTRL4_BUTTONS_HORIZ 2
+#define ED_CTRL4_BUTTONS_VERT 1
#define ED_NUM_CTRL1_BUTTONS (ED_CTRL1_BUTTONS_HORIZ * ED_CTRL1_BUTTONS_VERT)
#define ED_NUM_CTRL2_BUTTONS (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT)
#define ED_NUM_CTRL3_BUTTONS (ED_CTRL3_BUTTONS_HORIZ * ED_CTRL3_BUTTONS_VERT)
-#define ED_NUM_CTRL1_2_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
-#define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_BUTTONS + \
- ED_NUM_CTRL2_BUTTONS + \
- ED_NUM_CTRL3_BUTTONS)
+#define ED_NUM_CTRL4_BUTTONS (ED_CTRL4_BUTTONS_HORIZ * ED_CTRL4_BUTTONS_VERT)
+#define ED_NUM_CTRL1_2_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
+#define ED_NUM_CTRL1_3_BUTTONS (ED_NUM_CTRL1_2_BUTTONS + ED_NUM_CTRL3_BUTTONS)
+#define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_BUTTONS + \
+ ED_NUM_CTRL2_BUTTONS + \
+ ED_NUM_CTRL3_BUTTONS + \
+ ED_NUM_CTRL4_BUTTONS)
/* values for the element list */
#define ED_ELEMENTLIST_XPOS 5
#define ED_ELEMENTLIST_YSIZE 20
#define ED_ELEMENTLIST_BUTTONS_HORIZ 4
#define ED_ELEMENTLIST_BUTTONS_VERT 11
-#define ED_NUM_ELEMENTLIST_BUTTONS (ED_ELEMENTLIST_BUTTONS_HORIZ * \
+#define ED_NUM_ELEMENTLIST_BUTTONS (ED_ELEMENTLIST_BUTTONS_HORIZ * \
ED_ELEMENTLIST_BUTTONS_VERT)
/* standard distances */
#define ED_GADGET_DISTANCE 2
#define ED_GADGET_TEXT_DISTANCE (2 * ED_GADGET_DISTANCE)
-#define ED_DRAWINGAREA_TEXT_DISTANCE (ED_GADGET_TEXT_DISTANCE + \
+#define ED_DRAWINGAREA_TEXT_DISTANCE (ED_GADGET_TEXT_DISTANCE + \
MINI_TILEX / 2)
-/* values for the setting windows */
+/* values for the settings windows */
#define ED_SETTINGS_XSTART (3 * MINI_TILEX / 2)
#define ED_SETTINGS_YSTART (MINI_TILEY * 10)
-#define ED_XOFFSET_CHECKBOX (ED_CHECKBUTTON_XSIZE + \
+#define ED_XOFFSET_CHECKBOX (ED_CHECKBUTTON_XSIZE + \
2 * ED_GADGET_DISTANCE)
#define ED_SETTINGS_XOFFSET ED_XOFFSET_CHECKBOX
#define ED_SETTINGS_YOFFSET (3 * MINI_TILEY / 2)
-#define ED_SETTINGS_XPOS(n) (ED_SETTINGS_XSTART + \
+#define ED_SETTINGS_XPOS(n) (ED_SETTINGS_XSTART + \
(n) * ED_SETTINGS_XOFFSET)
-#define ED_SETTINGS_YPOS(n) (ED_SETTINGS_YSTART + \
+#define ED_SETTINGS_YPOS(n) (ED_SETTINGS_YSTART + \
(n) * ED_SETTINGS_YOFFSET)
#define ED_SETTINGS1_YPOS MINI_TILEY
/* values for counter gadgets */
#define ED_COUNTER_YSTART (ED_SETTINGS1_YPOS + 2 * TILEY)
#define ED_COUNTER_YDISTANCE (3 * MINI_TILEY)
-#define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \
+#define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \
(n) * ED_COUNTER_YDISTANCE)
-#define ED_COUNTER2_YPOS(n) (ED_COUNTER_YSTART + \
+#define ED_COUNTER2_YPOS(n) (ED_COUNTER_YSTART + \
(n) * ED_COUNTER_YDISTANCE - 2)
/* values for element content drawing areas */
-/* amoeba content */
-#define ED_AREA_AMOEBA_CONTENT_XPOS ED_SETTINGS_XPOS(0)
-#define ED_AREA_AMOEBA_CONTENT_YPOS (ED_SETTINGS_YPOS(2) + \
+#define ED_AREA_1X1_SETTINGS_XPOS(n) (ED_SETTINGS_XPOS(n))
+#define ED_AREA_1X1_SETTINGS_YPOS(n) (ED_SETTINGS_YPOS(n) + \
ED_GADGET_DISTANCE)
+#define ED_AREA_3X3_SETTINGS_XPOS(n) (ED_SETTINGS_XPOS(n))
+#define ED_AREA_3X3_SETTINGS_YPOS(n) (ED_SETTINGS_YPOS(n) + \
+ ED_GADGET_DISTANCE - MINI_TILEY)
+
/* yamyam content */
-#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (2 * MINI_TILEX + \
+#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (2 * MINI_TILEX + \
5 * ((n) % 4) * MINI_TILEX)
-#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (17 * MINI_TILEY + \
+#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (17 * MINI_TILEY + \
6 * ((n) / 4) * MINI_TILEY)
-/* custom change target */
-#define ED_AREA_ELEM_CONTENT2_YPOS (ED_SETTINGS_YPOS(1) + \
- ED_GADGET_DISTANCE)
-/* optional custom graphic */
-#define ED_AREA_ELEM_CONTENT3_YPOS (ED_SETTINGS_YPOS(1) + \
- ED_GADGET_DISTANCE)
-/* custom element content */
-#define ED_AREA_ELEM_CONTENT4_XPOS (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(2) + \
- ED_GADGET_DISTANCE - MINI_TILEY)
-/* movement enter/leave element */
-#define ED_AREA_ELEM_CONTENT4a_XPOS (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4a_YPOS (ED_SETTINGS_YPOS(10) + \
- ED_GADGET_DISTANCE)
-#define ED_AREA_ELEM_CONTENT4b_XPOS (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4b_YPOS (ED_SETTINGS_YPOS(10) + \
- ED_GADGET_DISTANCE)
-/* custom change trigger element */
-#define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(5) + \
- ED_GADGET_DISTANCE)
-/* extended custom change target */
-#define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT6_YPOS (ED_SETTINGS_YPOS(10) + \
- ED_GADGET_DISTANCE - MINI_TILEY)
-/* group element content */
-#define ED_AREA_GROUP_CONTENT_XPOS ED_SETTINGS_XPOS(0)
-#if 1
-#define ED_AREA_GROUP_CONTENT_YPOS (ED_SETTINGS_YPOS(4) + \
- ED_GADGET_DISTANCE)
-#else
-#define ED_AREA_GROUP_CONTENT_YPOS (22 * MINI_TILEY)
-#endif
-
-/* values for random placement background drawing area */
-#define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY)
-
/* values for scrolling gadgets for drawing area */
#define ED_SCROLLBUTTON_XPOS 24
#define ED_SCROLLBUTTON_YPOS 0
#define ED_SCROLL_LEFT_YPOS (SYSIZE - 2 * ED_SCROLLBUTTON_YSIZE)
#define ED_SCROLL_RIGHT_XPOS (SXSIZE - 2 * ED_SCROLLBUTTON_XSIZE)
#define ED_SCROLL_RIGHT_YPOS ED_SCROLL_LEFT_YPOS
-#define ED_SCROLL_HORIZONTAL_XPOS (ED_SCROLL_LEFT_XPOS + ED_SCROLLBUTTON_XSIZE)
+#define ED_SCROLL_HORIZONTAL_XPOS (ED_SCROLL_LEFT_XPOS + \
+ ED_SCROLLBUTTON_XSIZE)
#define ED_SCROLL_HORIZONTAL_YPOS ED_SCROLL_LEFT_YPOS
#define ED_SCROLL_HORIZONTAL_XSIZE (SXSIZE - 3 * ED_SCROLLBUTTON_XSIZE)
#define ED_SCROLL_HORIZONTAL_YSIZE ED_SCROLLBUTTON_YSIZE
#define ED_SCROLL_VERTICAL_XPOS ED_SCROLL_UP_XPOS
-#define ED_SCROLL_VERTICAL_YPOS (ED_SCROLL_UP_YPOS + ED_SCROLLBUTTON_YSIZE)
+#define ED_SCROLL_VERTICAL_YPOS (ED_SCROLL_UP_YPOS + \
+ ED_SCROLLBUTTON_YSIZE)
#define ED_SCROLL_VERTICAL_XSIZE ED_SCROLLBUTTON_XSIZE
#define ED_SCROLL_VERTICAL_YSIZE (SYSIZE - 4 * ED_SCROLLBUTTON_YSIZE)
#define ED_SCROLL2_UP_XPOS 85
#define ED_SCROLL2_UP_YPOS 30
#define ED_SCROLL2_DOWN_XPOS ED_SCROLL2_UP_XPOS
-#define ED_SCROLL2_DOWN_YPOS (ED_SCROLL2_UP_YPOS + \
- ED_ELEMENTLIST_BUTTONS_VERT * \
- ED_ELEMENTLIST_YSIZE - \
+#define ED_SCROLL2_DOWN_YPOS (ED_SCROLL2_UP_YPOS + \
+ ED_ELEMENTLIST_BUTTONS_VERT * \
+ ED_ELEMENTLIST_YSIZE - \
ED_SCROLLBUTTON2_YSIZE)
#define ED_SCROLL2_VERTICAL_XPOS ED_SCROLL2_UP_XPOS
-#define ED_SCROLL2_VERTICAL_YPOS (ED_SCROLL2_UP_YPOS + \
+#define ED_SCROLL2_VERTICAL_YPOS (ED_SCROLL2_UP_YPOS + \
ED_SCROLLBUTTON2_YSIZE)
#define ED_SCROLL2_VERTICAL_XSIZE ED_SCROLLBUTTON2_XSIZE
-#define ED_SCROLL2_VERTICAL_YSIZE (ED_ELEMENTLIST_BUTTONS_VERT * \
- ED_ELEMENTLIST_YSIZE - \
+#define ED_SCROLL2_VERTICAL_YSIZE (ED_ELEMENTLIST_BUTTONS_VERT * \
+ ED_ELEMENTLIST_YSIZE - \
2 * ED_SCROLLBUTTON2_YSIZE)
/* values for checkbutton gadgets */
#define ED_RADIOBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 44)
#define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 66)
-/* some positions in the editor control window */
-#define ED_BUTTON_ELEM_XPOS 6
-#define ED_BUTTON_ELEM_YPOS 30
-#define ED_BUTTON_ELEM_XSIZE 22
-#define ED_BUTTON_ELEM_YSIZE 22
+/* values for some special graphic buttons */
+#define ED_COPY_CHANGE_PAGE_XPOS 25
+#define ED_COPY_CHANGE_PAGE_YPOS 50
+#define ED_PASTE_CHANGE_PAGE_XPOS 25
+#define ED_PASTE_CHANGE_PAGE_YPOS 70
/* some values for text input, selectbox and counter gadgets */
#define ED_BUTTON_COUNT_YPOS 60
#define ED_BUTTON_MINUS_YPOS ED_BUTTON_COUNT_YPOS
#define ED_BUTTON_MINUS_XSIZE ED_BUTTON_COUNT_XSIZE
#define ED_BUTTON_MINUS_YSIZE ED_BUTTON_COUNT_YSIZE
-#define ED_BUTTON_PLUS_XPOS (ED_WIN_COUNT_XPOS + \
+#define ED_BUTTON_PLUS_XPOS (ED_WIN_COUNT_XPOS + \
ED_WIN_COUNT_XSIZE + 2)
#define ED_BUTTON_PLUS_YPOS ED_BUTTON_COUNT_YPOS
#define ED_BUTTON_PLUS_XSIZE ED_BUTTON_COUNT_XSIZE
#define ED_BUTTON_PLUS_YSIZE ED_BUTTON_COUNT_YSIZE
#define ED_SELECTBOX_XPOS ED_WIN_COUNT_XPOS
-#define ED_SELECTBOX_YPOS (ED_WIN_COUNT_YPOS + \
+#define ED_SELECTBOX_YPOS (ED_WIN_COUNT_YPOS + \
2 + ED_WIN_COUNT_YSIZE)
#define ED_SELECTBOX_XSIZE ED_WIN_COUNT_XSIZE
#define ED_SELECTBOX_YSIZE ED_WIN_COUNT_YSIZE
#define ED_SELECTBOX_BUTTON_XSIZE 14
#define ED_TEXTBUTTON_XPOS ED_WIN_COUNT_XPOS
-#define ED_TEXTBUTTON_YPOS (ED_WIN_COUNT_YPOS + \
+#define ED_TEXTBUTTON_YPOS (ED_WIN_COUNT_YPOS + \
4 * (2 + ED_WIN_COUNT_YSIZE))
#define ED_TEXTBUTTON_INACTIVE_YPOS ED_TEXTBUTTON_YPOS
#define ED_TEXTBUTTON_TAB_XPOS ED_WIN_COUNT_XPOS
-#define ED_TEXTBUTTON_TAB_YPOS (ED_WIN_COUNT_YPOS + \
+#define ED_TEXTBUTTON_TAB_YPOS (ED_WIN_COUNT_YPOS + \
2 * (2 + ED_WIN_COUNT_YSIZE))
-#define ED_TEXTBUTTON_TAB_INACTIVE_YPOS (ED_WIN_COUNT_YPOS + \
+#define ED_TEXTBUTTON_TAB_INACTIVE_YPOS (ED_WIN_COUNT_YPOS + \
3 * (2 + ED_WIN_COUNT_YSIZE))
#define ED_TEXTBUTTON_XSIZE ED_WIN_COUNT_XSIZE
#define GADGET_ID_CUSTOM_COPY_FROM (GADGET_ID_TOOLBOX_FIRST + 22)
#define GADGET_ID_CUSTOM_COPY_TO (GADGET_ID_TOOLBOX_FIRST + 23)
#define GADGET_ID_CUSTOM_EXCHANGE (GADGET_ID_TOOLBOX_FIRST + 24)
+#define GADGET_ID_CUSTOM_COPY (GADGET_ID_TOOLBOX_FIRST + 25)
+#define GADGET_ID_CUSTOM_PASTE (GADGET_ID_TOOLBOX_FIRST + 26)
/* counter button identifiers */
-#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 25)
+#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 27)
#define GADGET_ID_SELECT_LEVEL_DOWN (GADGET_ID_COUNTER_FIRST + 0)
#define GADGET_ID_SELECT_LEVEL_TEXT (GADGET_ID_COUNTER_FIRST + 1)
#define GADGET_ID_PUSH_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 42)
#define GADGET_ID_PUSH_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 43)
#define GADGET_ID_PUSH_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 62)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64)
-#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 65)
-#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 66)
-#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 67)
-#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_DROP_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_DROP_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_DROP_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_DROP_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_DROP_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_DROP_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_MOVE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_MOVE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_EXPLOSION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_IGNITION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_IGNITION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_IGNITION_DELAY_UP (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70)
+#define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 71)
+#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 72)
+#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 73)
+#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 74)
/* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 75)
#define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0)
#define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1)
/* selectbox identifiers */
#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_AREA_FIRST + 1)
-#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 0)
-#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 1)
-#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 2)
-#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 3)
-#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4)
-#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 6)
-#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 7)
-#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 8)
-#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 9)
-#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 10)
-#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 11)
-#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 12)
-#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 13)
-#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 14)
-#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 15)
-#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 16)
-#define GADGET_ID_CHANGE_PLAYERS (GADGET_ID_SELECTBOX_FIRST + 17)
-#define GADGET_ID_CHANGE_PAGES (GADGET_ID_SELECTBOX_FIRST + 18)
-#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 19)
-#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 20)
-#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 21)
+#define GADGET_ID_TIME_OR_STEPS (GADGET_ID_SELECTBOX_FIRST + 0)
+#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 1)
+#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 2)
+#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 3)
+#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 4)
+#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 5)
+#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 6)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 7)
+#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 8)
+#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 9)
+#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 10)
+#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 11)
+#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 12)
+#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 13)
+#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_CHANGE_SIDE (GADGET_ID_SELECTBOX_FIRST + 17)
+#define GADGET_ID_CHANGE_PLAYER (GADGET_ID_SELECTBOX_FIRST + 18)
+#define GADGET_ID_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 19)
+#define GADGET_ID_CHANGE_REPLACE_WHEN (GADGET_ID_SELECTBOX_FIRST + 20)
+#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 21)
+#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 22)
/* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 22)
+#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 23)
#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0)
#define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1)
#define GADGET_ID_PREV_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 0)
#define GADGET_ID_NEXT_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 1)
+#define GADGET_ID_COPY_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 2)
+#define GADGET_ID_PASTE_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 3)
/* gadgets for scrolling of drawing area */
-#define GADGET_ID_SCROLLING_FIRST (GADGET_ID_GRAPHICBUTTON_FIRST + 2)
+#define GADGET_ID_SCROLLING_FIRST (GADGET_ID_GRAPHICBUTTON_FIRST + 4)
#define GADGET_ID_SCROLL_UP (GADGET_ID_SCROLLING_FIRST + 0)
#define GADGET_ID_SCROLL_DOWN (GADGET_ID_SCROLLING_FIRST + 1)
#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 5)
#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 6)
#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 36)
/* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 37)
#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \
ED_NUM_ELEMENTLIST_BUTTONS - 1)
#define ED_COUNTER_ID_CUSTOM_GEMCOUNT 12
#define ED_COUNTER_ID_PUSH_DELAY_FIX 13
#define ED_COUNTER_ID_PUSH_DELAY_RND 14
-#define ED_COUNTER_ID_MOVE_DELAY_FIX 15
-#define ED_COUNTER_ID_MOVE_DELAY_RND 16
-#define ED_COUNTER_ID_EXPLOSION_DELAY 17
-#define ED_COUNTER_ID_IGNITION_DELAY 18
-#define ED_COUNTER_ID_GROUP_CONTENT 19
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 20
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 21
-#define ED_COUNTER_ID_CHANGE_CONT_RND 22
-
-#define ED_NUM_COUNTERBUTTONS 23
+#define ED_COUNTER_ID_DROP_DELAY_FIX 15
+#define ED_COUNTER_ID_DROP_DELAY_RND 16
+#define ED_COUNTER_ID_MOVE_DELAY_FIX 17
+#define ED_COUNTER_ID_MOVE_DELAY_RND 18
+#define ED_COUNTER_ID_EXPLOSION_DELAY 19
+#define ED_COUNTER_ID_IGNITION_DELAY 20
+#define ED_COUNTER_ID_GROUP_CONTENT 21
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 22
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 23
+#define ED_COUNTER_ID_CHANGE_CONT_RND 24
+
+#define ED_NUM_COUNTERBUTTONS 25
#define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE
#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM
#define ED_TEXTAREA_ID_LEVEL_LAST ED_TEXTAREA_ID_ENVELOPE
/* values for selectbox gadgets */
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 2
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 3
-#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 4
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 5
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 6
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 7
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 8
-#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 9
-#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 10
-#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 11
-#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 12
-#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 13
-#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 14
-#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 15
-#define ED_SELECTBOX_ID_CHANGE_SIDES 16
-#define ED_SELECTBOX_ID_CHANGE_PLAYERS 17
-#define ED_SELECTBOX_ID_CHANGE_PAGES 18
-#define ED_SELECTBOX_ID_CHANGE_POWER 19
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 20
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 21
-
-#define ED_NUM_SELECTBOX 22
+#define ED_SELECTBOX_ID_TIME_OR_STEPS 0
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 1
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 2
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 3
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 4
+#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 5
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 6
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 7
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 8
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 9
+#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 10
+#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 11
+#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 12
+#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 13
+#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 14
+#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 15
+#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 16
+#define ED_SELECTBOX_ID_CHANGE_SIDE 17
+#define ED_SELECTBOX_ID_CHANGE_PLAYER 18
+#define ED_SELECTBOX_ID_CHANGE_PAGE 19
+#define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN 20
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 21
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 22
+
+#define ED_NUM_SELECTBOX 23
+
+#define ED_SELECTBOX_ID_LEVEL_FIRST ED_SELECTBOX_ID_TIME_OR_STEPS
+#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_TIME_OR_STEPS
#define ED_SELECTBOX_ID_CUSTOM1_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
-#define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE
-#define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_DEADLINESS
+#define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE
+#define ED_SELECTBOX_ID_CUSTOM2_FIRST ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS
#define ED_SELECTBOX_ID_CUSTOM2_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
#define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM1_FIRST
#define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM2_LAST
/* values for graphicbutton gadgets */
#define ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE 0
#define ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE 1
+#define ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE 2
+#define ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE 3
-#define ED_NUM_GRAPHICBUTTONS 2
+#define ED_NUM_GRAPHICBUTTONS 4
-#define ED_GRAPHICBUTTON_ID_CHANGE_FIRST ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE
-#define ED_GRAPHICBUTTON_ID_CHANGE_LAST ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE
+#define ED_GRAPHICBUTTON_ID_CHANGE_FIRST ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE
+#define ED_GRAPHICBUTTON_ID_CHANGE_LAST ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE
/* values for checkbutton gadgets */
#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 0
#define ED_CHECKBUTTON_ID_STICK_ELEMENT 3
#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4
#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 5
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 6
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 7
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 8
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 9
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 10
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 11
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 12
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 13
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 14
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 15
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 16
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 17
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 18
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 19
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 20
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 21
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 22
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY 23
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 24
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 25
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 26
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 27
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 28
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 29
-
-#define ED_NUM_CHECKBUTTONS 30
+#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 6
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 7
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 8
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 9
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 10
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 11
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 12
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 13
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 14
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 15
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 16
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 17
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 18
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 19
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 20
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 21
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 22
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 23
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 24
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 25
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 26
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 27
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY 28
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 29
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 30
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 31
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 32
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 33
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 34
+
+#define ED_NUM_CHECKBUTTONS 35
#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED
#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
#define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
-#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY
-#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_DEADLY
+#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
+#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL
#define ED_CHECKBUTTON_ID_CUSTOM2_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT
#define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM1_FIRST
#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM2_LAST
{ '\0', "copy settings from other element" },
{ '\0', "copy settings to other element" },
- { '\0', "exchange settings with other element" },
+ { '\0', "exchange element with other element" },
+
+ { '\0', "copy settings from this element" },
+ { '\0', "paste settings to this element" },
};
static int random_placement_value = 10;
GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP,
GADGET_ID_LEVEL_GEMSLIMIT_TEXT, GADGET_ID_NONE,
&level.gems_needed,
- "number of emeralds to collect:", NULL, NULL
+ "number of gems to collect:", NULL, NULL
},
{
ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4),
GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP,
GADGET_ID_LEVEL_TIMELIMIT_TEXT, GADGET_ID_NONE,
&level.time,
- "time available to solve level:", NULL, "(0 => no time limit)"
+ "time or step limit to solve level:", NULL, NULL
},
{
ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(5),
GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE,
&level.score[SC_TIME_BONUS],
- "score for each 10 seconds left:", NULL, NULL
+ "score for each 10 sec/steps left:", NULL, NULL
},
{
ED_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8),
},
{
ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7),
- 0, 999,
+ 0, 255,
GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP,
GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE,
&custom_element.push_delay_fixed,
},
{
-1, ED_SETTINGS_YPOS(7),
- 0, 999,
+ 0, 255,
GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP,
GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP,
&custom_element.push_delay_random,
NULL, "+random", NULL
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8),
+ 0, 255,
+ GADGET_ID_DROP_DELAY_FIX_DOWN, GADGET_ID_DROP_DELAY_FIX_UP,
+ GADGET_ID_DROP_DELAY_FIX_TEXT, GADGET_ID_NONE,
+ &custom_element.drop_delay_fixed,
+ NULL, "drop delay", NULL
+ },
+ {
+ -1, ED_SETTINGS_YPOS(8),
+ 0, 255,
+ GADGET_ID_DROP_DELAY_RND_DOWN, GADGET_ID_DROP_DELAY_RND_UP,
+ GADGET_ID_DROP_DELAY_RND_TEXT, GADGET_ID_DROP_DELAY_FIX_UP,
+ &custom_element.drop_delay_random,
+ NULL, "+random", NULL
+ },
+ {
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13),
0, 999,
GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP,
GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE,
NULL, "move delay", NULL
},
{
- -1, ED_SETTINGS_YPOS(12),
+ -1, ED_SETTINGS_YPOS(13),
0, 999,
GADGET_ID_MOVE_DELAY_RND_DOWN, GADGET_ID_MOVE_DELAY_RND_UP,
GADGET_ID_MOVE_DELAY_RND_TEXT, GADGET_ID_MOVE_DELAY_FIX_UP,
0, 100,
GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP,
GADGET_ID_CHANGE_CONT_RND_TEXT, GADGET_ID_NONE,
- &custom_element_change.random,
+ &custom_element_change.random_percentage,
NULL, "use random replace:", "%"
},
};
}
};
+static struct ValueTextInfo options_time_or_steps[] =
+{
+ { 0, "seconds" },
+ { 1, "steps" },
+
+ { -1, NULL }
+};
+
static struct ValueTextInfo options_access_type[] =
{
{ EP_WALKABLE, "walkable" },
{ EP_PASSABLE, "passable" },
+
{ -1, NULL }
};
{ EP_ACCESSIBLE_OVER, "over" },
{ EP_ACCESSIBLE_INSIDE, "inside" },
{ EP_ACCESSIBLE_UNDER, "under" },
+
{ -1, NULL }
};
{
{ 0, "unprotected" },
{ 1, "protected" },
+
{ -1, NULL }
};
{ MV_VERTICAL | MV_LEFT, "vertical + left" },
{ MV_VERTICAL | MV_RIGHT, "vertical + right" },
{ MV_ALL_DIRECTIONS, "all directions" },
+
{ -1, NULL }
};
{ EP_DIGGABLE, "diggable" },
{ EP_COLLECTIBLE_ONLY, "collectible" },
{ EP_DROPPABLE, "collectible & droppable" },
+ { EP_THROWABLE, "collectible & throwable" },
{ EP_PUSHABLE, "pushable" },
+
{ -1, NULL }
};
{ MV_TURNING_LEFT_RIGHT, "turning left, right" },
{ MV_TURNING_RIGHT_LEFT, "turning right, left" },
{ MV_TURNING_RANDOM, "turning random" },
- { MV_WHEN_PUSHED, "when pushed" },
- { MV_WHEN_DROPPED, "when dropped" },
{ MV_MAZE_RUNNER, "maze runner style" },
{ MV_MAZE_HUNTER, "maze hunter style" },
+ { MV_WHEN_PUSHED, "when pushed" },
+ { MV_WHEN_DROPPED, "when dropped/thrown" },
+
{ -1, NULL }
};
{ MV_START_DOWN, "down" },
{ MV_START_RANDOM, "random" },
{ MV_START_PREVIOUS, "previous" },
+
{ -1, NULL }
};
{ 4, "normal" },
{ 8, "fast" },
{ 16, "very fast" },
+#if 1
+ { 32, "even faster" },
+#endif
+
{ -1, NULL }
};
{
{ LEAVE_TYPE_UNLIMITED, "leave behind" },
{ LEAVE_TYPE_LIMITED, "change it to" },
+
{ -1, NULL }
};
{ EP_CAN_SMASH_ENEMIES, "enemies" },
#endif
{ EP_CAN_SMASH_EVERYTHING, "everything" },
+
{ -1, NULL }
};
{ SLIPPERY_ANY_RIGHT_LEFT, "right, left" },
{ SLIPPERY_ONLY_LEFT, "only left" },
{ SLIPPERY_ONLY_RIGHT, "only right" },
+
{ -1, NULL }
};
{ EP_DONT_RUN_INTO, "running into" },
{ EP_DONT_COLLIDE_WITH, "colliding with" },
{ EP_DONT_TOUCH, "touching" },
+
{ -1, NULL }
};
static struct ValueTextInfo options_consistency[] =
{
{ EP_CAN_EXPLODE_3X3, "can explode 3x3" },
- { EP_CAN_EXPLODE_DYNA, "can explode 3+3" },
+ { EP_CAN_EXPLODE_CROSS, "can explode 3+3" },
{ EP_CAN_EXPLODE_1X1, "can explode 1x1" },
{ EP_INDESTRUCTIBLE, "indestructible" },
+
{ -1, NULL }
};
{
{ 1, "frames" },
{ FRAMES_PER_SECOND, "seconds" },
+
{ -1, NULL }
};
static struct ValueTextInfo options_change_direct_action[] =
{
- { CE_TOUCHED_BY_PLAYER, "touched by player ..." },
- { CE_PRESSED_BY_PLAYER, "pressed by player ..." },
- { CE_PUSHED_BY_PLAYER, "pushed by player ..." },
- { CE_ENTERED_BY_PLAYER, "entered by player ..." },
- { CE_LEFT_BY_PLAYER, "left by player ..." },
- { CE_DROPPED_BY_PLAYER, "dropped by player" },
- { CE_SWITCHED, "switched ..." },
+ { CE_TOUCHED_BY_PLAYER, "touched by player" },
+ { CE_PRESSED_BY_PLAYER, "pressed by player" },
+ { CE_PUSHED_BY_PLAYER, "pushed by player" },
+ { CE_ENTERED_BY_PLAYER, "entered by player" },
+ { 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 ..." },
+ { CE_HITTING_SOMETHING, "hitting something" },
+ { CE_HIT_BY_SOMETHING, "hit by something" },
#else
- { CE_HITTING_SOMETHING, "collision ..." },
+ { CE_HITTING_SOMETHING, "collision" },
+#endif
+#if 1
+ { CE_BLOCKED, "blocked" },
#endif
{ CE_IMPACT, "impact (on something)" },
{ CE_SMASHED, "smashed (from above)" },
+
{ -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_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" },
- { CE_OTHER_IS_TOUCHING, "touching ..." },
+ { CE_OTHER_GETS_DROPPED, "player drops/throws" },
+ { CE_OTHER_IS_TOUCHING, "touching" },
#if 1
- { CE_OTHER_IS_HITTING, "hitting ..." },
- { CE_OTHER_GETS_HIT, "hit by ..." },
+ { CE_OTHER_IS_HITTING, "hitting" },
+ { CE_OTHER_GETS_HIT, "hit by" },
#endif
- { CE_OTHER_IS_SWITCHING, "switch of ..." },
- { CE_OTHER_IS_CHANGING, "change of" },
+ { CE_OTHER_IS_SWITCHING, "switch of" },
+ { CE_OTHER_IS_CHANGING, "change by page of" },
{ CE_OTHER_IS_EXPLODING, "explosion of" },
+
{ -1, NULL }
};
-static struct ValueTextInfo options_change_sides[] =
+static struct ValueTextInfo options_change_trigger_side[] =
{
{ CH_SIDE_LEFT, "left" },
{ CH_SIDE_RIGHT, "right" },
{ CH_SIDE_LEFT_RIGHT, "left/right" },
{ CH_SIDE_TOP_BOTTOM, "top/bottom" },
{ CH_SIDE_ANY, "any" },
+
{ -1, NULL }
};
static struct ValueTextInfo options_change_trigger_player[] =
{
- { 0, "any" },
- { 1, "1" },
- { 2, "2" },
- { 3, "3" },
- { 4, "4" },
+ { CH_PLAYER_1, "1" },
+ { CH_PLAYER_2, "2" },
+ { CH_PLAYER_3, "3" },
+ { CH_PLAYER_4, "4" },
+ { CH_PLAYER_ANY, "any" },
+
{ -1, NULL }
};
static struct ValueTextInfo options_change_trigger_page[] =
{
- { 0, "any" },
- { 1, "1" },
- { 2, "2" },
- { 3, "3" },
- { 4, "4" },
- { 5, "5" },
- { 6, "6" },
- { 7, "7" },
- { 8, "8" },
- { 9, "9" },
- { 10, "10" },
- { 11, "11" },
- { 12, "12" },
- { 13, "13" },
- { 14, "14" },
- { 15, "15" },
- { 16, "16" },
- { 17, "17" },
- { 18, "18" },
- { 19, "19" },
- { 20, "20" },
- { 21, "21" },
- { 22, "22" },
- { 23, "23" },
- { 24, "24" },
- { 25, "25" },
- { 26, "26" },
- { 27, "27" },
- { 28, "28" },
- { 29, "29" },
- { 30, "30" },
- { 31, "31" },
- { 32, "32" },
+ { (1 << 0), "1" },
+ { (1 << 1), "2" },
+ { (1 << 2), "3" },
+ { (1 << 3), "4" },
+ { (1 << 4), "5" },
+ { (1 << 5), "6" },
+ { (1 << 6), "7" },
+ { (1 << 7), "8" },
+ { (1 << 8), "9" },
+ { (1 << 9), "10" },
+ { (1 << 10), "11" },
+ { (1 << 11), "12" },
+ { (1 << 12), "13" },
+ { (1 << 13), "14" },
+ { (1 << 14), "15" },
+ { (1 << 15), "16" },
+ { (1 << 16), "17" },
+ { (1 << 17), "18" },
+ { (1 << 18), "19" },
+ { (1 << 19), "20" },
+ { (1 << 20), "21" },
+ { (1 << 21), "22" },
+ { (1 << 22), "23" },
+ { (1 << 23), "24" },
+ { (1 << 24), "25" },
+ { (1 << 25), "26" },
+ { (1 << 26), "27" },
+ { (1 << 27), "28" },
+ { (1 << 28), "29" },
+ { (1 << 29), "30" },
+ { (1 << 30), "31" },
+ { (1 << 31), "32" },
+ { CH_PAGE_ANY, "any" },
+
{ -1, NULL }
};
-static struct ValueTextInfo options_change_power[] =
+static struct ValueTextInfo options_change_replace_when[] =
{
- { CP_NON_DESTRUCTIVE, "empty" },
- { CP_HALF_DESTRUCTIVE, "diggable" },
- { CP_FULL_DESTRUCTIVE, "destructible" },
+ { CP_WHEN_EMPTY, "empty" },
+ { CP_WHEN_WALKABLE, "walkable" },
+ { CP_WHEN_DIGGABLE, "diggable" },
+ { CP_WHEN_COLLECTIBLE, "collectible" },
+ { CP_WHEN_REMOVABLE, "removable" },
+ { CP_WHEN_DESTRUCTIBLE, "destructible" },
+
{ -1, NULL }
};
{ ANIM_LINEAR, "linear" },
{ ANIM_PINGPONG, "pingpong" },
{ ANIM_PINGPONG2, "pingpong 2" },
+
{ -1, NULL }
};
char *text_left, *text_right, *infotext;
} selectbox_info[ED_NUM_SELECTBOX] =
{
+ /* ---------- level and editor settings ---------------------------------- */
+
+ {
+ -1, ED_COUNTER_YPOS(4),
+ GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP,
+ -1,
+ options_time_or_steps,
+ &level.use_step_counter,
+ NULL, "(0 => no limit)", "time or step limit"
+ },
+
/* ---------- element settings: configure 1 (custom elements) ----------- */
{
NULL, NULL, "diggable/collectible/pushable"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE,
-1,
options_move_pattern,
"can move", NULL, "element move direction"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10),
GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE,
-1,
options_move_direction,
"starts moving", NULL, "initial element move direction"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12),
GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE,
-1,
options_move_stepsize,
"move/fall speed", NULL, "speed of element movement"
},
{
- ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10),
+ ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11),
GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE,
-1,
options_move_leave_type,
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6),
- GADGET_ID_CHANGE_SIDES, GADGET_ID_NONE,
+ GADGET_ID_CHANGE_SIDE, GADGET_ID_NONE,
-1,
- options_change_sides,
- &custom_element_change.sides,
- "... at", "side", "element side that causes change"
+ options_change_trigger_side,
+ &custom_element_change.trigger_side,
+ "at", "side", "element side that causes change"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7),
- GADGET_ID_CHANGE_PLAYERS, GADGET_ID_NONE,
+ GADGET_ID_CHANGE_PLAYER, GADGET_ID_NONE,
-1,
options_change_trigger_player,
&custom_element_change.trigger_player,
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7),
- GADGET_ID_CHANGE_PAGES, GADGET_ID_CHANGE_PLAYERS,
+ GADGET_ID_CHANGE_PAGE, GADGET_ID_CHANGE_PLAYER,
-1,
options_change_trigger_page,
&custom_element_change.trigger_page,
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10),
- GADGET_ID_CHANGE_POWER, GADGET_ID_NONE,
+ GADGET_ID_CHANGE_REPLACE_WHEN, GADGET_ID_NONE,
-1,
- options_change_power,
- &custom_element_change.power,
+ options_change_replace_when,
+ &custom_element_change.replace_when,
"replace when", NULL, "which elements can be replaced"
},
{
},
{
-1, ED_SETTINGS_YPOS(14),
- GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE,
+ GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_PASTE_CHANGE_PAGE,
-1, "New",
- " ", NULL, "Add new change page"
+ NULL, NULL, "Add new change page"
},
{
-1, ED_SETTINGS_YPOS(14),
GADGET_ID_NEXT_CHANGE_PAGE, GADGET_ID_SELECT_CHANGE_PAGE,
NULL, "change page", "select next change page"
},
+ {
+ ED_COPY_CHANGE_PAGE_XPOS, ED_COPY_CHANGE_PAGE_YPOS,
+ -1, ED_SETTINGS_YPOS(14),
+ ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE,
+ GADGET_ID_COPY_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE,
+ " ", NULL, "copy settings from this change page"
+ },
+ {
+ ED_PASTE_CHANGE_PAGE_XPOS, ED_PASTE_CHANGE_PAGE_YPOS,
+ -1, ED_SETTINGS_YPOS(14),
+ ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE,
+ GADGET_ID_PASTE_CHANGE_PAGE, GADGET_ID_COPY_CHANGE_PAGE,
+ NULL, NULL, "paste settings to this change page"
+ },
};
static struct
},
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0),
+ GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE,
+ &level.grow_into_diggable,
+ NULL,
+ "can grow into anything diggable", "grow into more than just sand"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE,
&level.block_last_field,
NULL,
"block last field when moving", "player blocks last field when moving"
},
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0),
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
GADGET_ID_SP_BLOCK_LAST_FIELD, GADGET_ID_NONE,
&level.sp_block_last_field,
NULL,
"block last field when moving", "player blocks last field when moving"
},
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(2),
+ GADGET_ID_INSTANT_RELOCATION, GADGET_ID_NONE,
+ &level.instant_relocation,
+ NULL,
+ "no scrolling when relocating", "player gets relocated without delay"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(3),
+ GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE,
+ &level.can_pass_to_walkable,
+ NULL,
+ "can pass to walkable element", "player can pass to empty or walkable"
+ },
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0),
+ GADGET_ID_CAN_FALL_INTO_ACID, GADGET_ID_NONE,
+ &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
+ NULL,
+ "can fall into acid (with gravity)","player can fall into acid pool"
+ },
{
ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0),
GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE,
NULL,
"can move into acid", "element can move into acid pool"
},
+ {
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1),
+ GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_NONE,
+ &custom_element_properties[EP_DONT_COLLIDE_WITH],
+ NULL,
+ "deadly when colliding with", "element is deadly when hitting player"
+ },
/* ---------- element settings: configure 1 (custom elements) ----------- */
NULL, NULL, "player can dig/collect/push element"
},
{
- ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(8),
+ ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9),
GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE,
&custom_element_properties[EP_CAN_MOVE],
NULL, NULL, "element can move in some direction"
{
ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9),
GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE,
- &custom_element_change.use_content,
+ &custom_element_change.use_target_content,
NULL, "use extended change target:","element changes to more elements"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11),
GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE,
- &custom_element_change.only_complete,
+ &custom_element_change.only_if_complete,
NULL, "replace all or nothing", "only replace when all can be changed"
},
{
ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12),
GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE,
- &custom_element_change.use_random_change,
+ &custom_element_change.use_random_replace,
NULL, NULL, "use percentage for random replace"
},
};
/* ---------- amoeba content --------------------------------------------- */
{
- ED_AREA_AMOEBA_CONTENT_XPOS, ED_AREA_AMOEBA_CONTENT_YPOS,
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(3),
1, 1,
GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE,
"content:", NULL, NULL
/* ---------- custom graphic --------------------------------------------- */
{
- -1, ED_AREA_ELEM_CONTENT3_YPOS,
+ -1, ED_AREA_1X1_SETTINGS_YPOS(1),
1, 1,
GADGET_ID_CUSTOM_GRAPHIC, GADGET_ID_CUSTOM_USE_GRAPHIC,
NULL, NULL, NULL
/* ---------- custom content (when exploding) ---------------------------- */
{
- ED_AREA_ELEM_CONTENT4_XPOS, ED_AREA_ELEM_CONTENT4_YPOS,
+ -1, ED_AREA_3X3_SETTINGS_YPOS(2),
3, 3,
GADGET_ID_CUSTOM_CONTENT, GADGET_ID_NONE, /* align three rows */
"content:", NULL, NULL
/* ---------- custom enter and leave element (when moving) --------------- */
{
- ED_SETTINGS_XPOS(1), ED_AREA_ELEM_CONTENT4a_YPOS,
+ ED_AREA_1X1_SETTINGS_XPOS(1), ED_AREA_1X1_SETTINGS_YPOS(11),
1, 1,
GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE,
"can dig:", " ", NULL
},
{
- -1, ED_AREA_ELEM_CONTENT4b_YPOS,
+ -1, ED_AREA_1X1_SETTINGS_YPOS(11),
1, 1,
GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
NULL, NULL, NULL
/* ---------- custom change target --------------------------------------- */
{
- -1, ED_AREA_ELEM_CONTENT2_YPOS,
+ -1, ED_AREA_1X1_SETTINGS_YPOS(1),
1, 1,
GADGET_ID_CUSTOM_CHANGE_TARGET, GADGET_ID_CUSTOM_CAN_CHANGE,
NULL, "after/when:", NULL
/* ---------- custom change content (extended change target) ------------- */
{
- ED_AREA_ELEM_CONTENT6_XPOS, ED_AREA_ELEM_CONTENT6_YPOS,
+ -1, ED_AREA_3X3_SETTINGS_YPOS(10),
3, 3,
GADGET_ID_CUSTOM_CHANGE_CONTENT, GADGET_ID_NONE, /* align three rows */
NULL, NULL, NULL
/* ---------- custom change trigger (element causing change) ------------- */
{
- -1, ED_AREA_ELEM_CONTENT5_YPOS,
+ -1, ED_AREA_1X1_SETTINGS_YPOS(5),
1, 1,
GADGET_ID_CUSTOM_CHANGE_TRIGGER, GADGET_ID_CHANGE_OTHER_ACTION,
NULL, NULL, NULL
/* ---------- group element content -------------------------------------- */
{
- ED_AREA_GROUP_CONTENT_XPOS, ED_AREA_GROUP_CONTENT_YPOS,
+ ED_AREA_1X1_SETTINGS_XPOS(0), ED_AREA_1X1_SETTINGS_YPOS(4),
MAX_ELEMENTS_IN_GROUP, 1,
GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE,
"content:", NULL, NULL
/* ---------- random background (for random painting) -------------------- */
{
- -1, ED_AREA_RANDOM_BACKGROUND_YPOS,
+ -1, ED_SETTINGS_YPOS(14),
1, 1,
GADGET_ID_RANDOM_BACKGROUND, GADGET_ID_RANDOM_RESTRICTED,
NULL, NULL, NULL
static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more);
static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
+static int editor_hl_custom_special[] =
+{
+};
+
+static int editor_el_custom_special[] =
+{
+ EL_TRIGGER_ELEMENT,
+ EL_TRIGGER_PLAYER,
+ EL_EMPTY,
+ EL_EMPTY
+};
+static int *editor_hl_custom_special_ptr = editor_hl_custom_special;
+static int *editor_el_custom_special_ptr = editor_el_custom_special;
+static int num_editor_hl_custom_special = SIZEOF_ARRAY_INT(editor_hl_custom_special);
+static int num_editor_el_custom_special = SIZEOF_ARRAY_INT(editor_el_custom_special);
+
static int editor_hl_group[] =
{
EL_CHAR('G'),
&editor_hl_custom_more_ptr, &num_editor_hl_custom_more,
&editor_el_custom_more_ptr, &num_editor_el_custom_more
},
+ {
+ &setup.editor.el_custom,
+ &editor_hl_custom_special_ptr, &num_editor_hl_custom_special,
+ &editor_el_custom_special_ptr, &num_editor_el_custom_special
+ },
{
&setup.editor.el_custom,
&editor_hl_group_ptr, &num_editor_hl_group,
for (x = 0; x < 3; x++)
DrawMiniGraphicExt(drawto,
gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
- el2edimg(custom_element_change.content[x][y]));
+ el2edimg(custom_element_change.target_content[x][y]));
else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER)
DrawMiniGraphicExt(drawto, gi->x, gi->y,
el2edimg(custom_element_change.trigger_element));
gd_xoffset = ED_CTRL1_BUTTONS_XPOS + x * ED_CTRL1_BUTTON_XSIZE;
gd_yoffset = ED_CTRL1_BUTTONS_YPOS + y * ED_CTRL1_BUTTON_YSIZE;
- width = ED_CTRL1_BUTTON_XSIZE;
+ width = ED_CTRL1_BUTTON_XSIZE;
height = ED_CTRL1_BUTTON_YSIZE;
gd_x1 = DOOR_GFX_PAGEX8 + gd_xoffset;
gd_xoffset = ED_CTRL2_BUTTONS_XPOS + x * ED_CTRL2_BUTTON_XSIZE;
gd_yoffset = ED_CTRL2_BUTTONS_YPOS + y * ED_CTRL2_BUTTON_YSIZE;
- width = ED_CTRL2_BUTTON_XSIZE;
+ width = ED_CTRL2_BUTTON_XSIZE;
height = ED_CTRL2_BUTTON_YSIZE;
gd_x1 = DOOR_GFX_PAGEX8 + gd_xoffset;
gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL2_BUTTONS_GFX_YPOS + gd_yoffset;
gd_y2 = 0; /* no alternative graphic for these buttons */
}
- else
+ else if (id < ED_NUM_CTRL1_3_BUTTONS)
{
int x = (i - ED_NUM_CTRL1_2_BUTTONS) % ED_CTRL3_BUTTONS_HORIZ + 1;
int y = (i - ED_NUM_CTRL1_2_BUTTONS) / ED_CTRL3_BUTTONS_HORIZ;
gd_xoffset = ED_CTRL3_BUTTONS_XPOS + x * ED_CTRL3_BUTTON_XSIZE;
gd_yoffset = ED_CTRL3_BUTTONS_YPOS + y * ED_CTRL3_BUTTON_YSIZE;
- width = ED_CTRL3_BUTTON_XSIZE;
+ width = ED_CTRL3_BUTTON_XSIZE;
height = ED_CTRL3_BUTTON_YSIZE;
gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset;
gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL3_BUTTONS_GFX_YPOS + gd_yoffset;
gd_y2 = DOOR_GFX_PAGEY1 + ED_CTRL3_BUTTONS_ALT_GFX_YPOS + gd_yoffset;
}
+ else
+ {
+ int x = (i - ED_NUM_CTRL1_3_BUTTONS) % ED_CTRL4_BUTTONS_HORIZ;
+ int y = (i - ED_NUM_CTRL1_3_BUTTONS) / ED_CTRL4_BUTTONS_HORIZ + 3;
+
+ gd_xoffset = ED_CTRL4_BUTTONS_XPOS + x * ED_CTRL4_BUTTON_XSIZE;
+ gd_yoffset = ED_CTRL4_BUTTONS_YPOS + y * ED_CTRL4_BUTTON_YSIZE;
+ width = ED_CTRL4_BUTTON_XSIZE;
+ height = ED_CTRL4_BUTTON_YSIZE;
+
+ gd_x1 = DOOR_GFX_PAGEX6 + ED_CTRL4_BUTTONS_GFX_XPOS + gd_xoffset;
+ gd_x2 = DOOR_GFX_PAGEX5 + ED_CTRL4_BUTTONS_GFX_XPOS + gd_xoffset;
+ gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL4_BUTTONS_GFX_YPOS + gd_yoffset;
+ gd_y2 = 0; /* no alternative graphic for these buttons */
+ }
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_CUSTOM_TYPE_ID, i,
event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
- gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
- gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
- gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
- gd_y2 = gd_y1;
+ if (i <= ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE)
+ {
+ gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
+ gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
+ gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
+ gd_y2 = gd_y1;
+ }
+ else /* (i <= ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE) */
+ {
+ gd_x1 = DOOR_GFX_PAGEX6 + graphicbutton_info[i].gd_x;
+ gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
+ gd_x2 = gd_x1 - ED_BUTTON_COUNT_XSIZE;
+ gd_y2 = gd_y1;
+ }
/* determine horizontal position to the right of specified gadget */
if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
int x_right = gi->x + gi->width + xoffset_right;
int y; /* set after gadget position was modified */
- /* set position for "stickybutton" and "can move into acid" gadgets */
- if (id == ED_CHECKBUTTON_ID_STICK_ELEMENT ||
- id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID)
- ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
+ /* set position for gadgets with dynamically determined vertical position */
+ ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
y = gi->y + yoffset;
{
if (i == GADGET_ID_CUSTOM_COPY_FROM ||
i == GADGET_ID_CUSTOM_COPY_TO ||
- i == GADGET_ID_CUSTOM_EXCHANGE)
+ i == GADGET_ID_CUSTOM_EXCHANGE ||
+ i == GADGET_ID_CUSTOM_COPY ||
+ i == GADGET_ID_CUSTOM_PASTE)
{
if (map)
MapGadget(level_editor_gadget[i]);
static void copy_custom_element_settings(int element_from, int element_to)
{
-#if 1
+#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];
for (i = 0; i < MAX_ELEMENT_NAME_LEN + 1; i++)
ei_to->description[i] = ei_from->description[i];
- /* ---------- copy element properties ---------- */
+ /* ---------- copy element base properties ---------- */
Properties[element_to][EP_BITFIELD_BASE] =
Properties[element_from][EP_BITFIELD_BASE];
ei_to->use_gfx_element = ei_from->use_gfx_element;
ei_to->gfx_element = ei_from->gfx_element;
+ ei_to->access_direction = ei_from->access_direction;
+
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;
+ ei_to->drop_delay_fixed = ei_from->drop_delay_fixed;
+ ei_to->drop_delay_random = ei_from->drop_delay_random;
ei_to->move_delay_fixed = ei_from->move_delay_fixed;
ei_to->move_delay_random = ei_from->move_delay_random;
ei_to->move_direction_initial = ei_from->move_direction_initial;
ei_to->move_stepsize = ei_from->move_stepsize;
+ ei_to->move_enter_element = ei_from->move_enter_element;
+ ei_to->move_leave_element = ei_from->move_leave_element;
+ ei_to->move_leave_type = ei_from->move_leave_type;
+
ei_to->slippery_type = ei_from->slippery_type;
for (y = 0; y < 3; y++)
for (x = 0; x < 3; x++)
ei_to->content[x][y] = ei_from->content[x][y];
- ei_to->num_change_pages = ei_from->num_change_pages;
- setElementChangePages(ei_to, ei_to->num_change_pages);
-
- for (i=0; i < ei_to->num_change_pages; i++)
- {
- struct ElementChangeInfo *change_to = &ei_to->change_page[i];
- struct ElementChangeInfo *change_from = &ei_from->change_page[i];
-
- /* always start with reliable default values */
- setElementChangeInfoToDefaults(change_to);
-
- change_to->events = change_from->events;
+ ei_to->explosion_delay = ei_from->explosion_delay;
+ ei_to->ignition_delay = ei_from->ignition_delay;
- change_to->target_element = change_from->target_element;
-
- change_to->delay_fixed = change_from->delay_fixed;
- change_to->delay_random = change_from->delay_random;
- change_to->delay_frames = change_from->delay_frames;
-
- change_to->trigger_element = change_from->trigger_element;
+ /* ---------- reinitialize and copy change pages ---------- */
- change_to->explode = change_from->explode;
- change_to->use_content = change_from->use_content;
- change_to->only_complete = change_from->only_complete;
- change_to->use_random_change = change_from->use_random_change;
+ ei_to->num_change_pages = ei_from->num_change_pages;
+ ei_to->current_change_page = ei_from->current_change_page;
- change_to->random = change_from->random;
- change_to->power = change_from->power;
+ setElementChangePages(ei_to, ei_to->num_change_pages);
- for (y = 0; y < 3; y++)
- for (x = 0; x < 3; x++)
- change_to->content[x][y] = change_from->content[x][y];
+ for (i=0; i < ei_to->num_change_pages; i++)
+ ei_to->change_page[i] = ei_from->change_page[i];
- change_to->can_change = change_from->can_change;
+ /* ---------- copy group element info ---------- */
+ if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */
+ *ei_to->group = *ei_from->group;
- change_to->sides = change_from->sides;
- }
#endif
/* mark this custom element as modified */
for (y = 0; y < 3; y++)
for (x = 0; x < 3; x++)
- if (change->content[x][y] == element_from)
- change->content[x][y] = element_to;
+ if (change->target_content[x][y] == element_from)
+ change->target_content[x][y] = element_to;
}
if (ei->group != NULL) /* group or internal */
static boolean CopyCustomElement(int element_old, int element_new,
int copy_mode)
{
- if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
+ if (copy_mode == GADGET_ID_CUSTOM_COPY)
+ {
+ element_new = (IS_CUSTOM_ELEMENT(element_old) ?
+ EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP);
+ copy_mode = GADGET_ID_CUSTOM_COPY_TO;
+ }
+ else if (copy_mode == GADGET_ID_CUSTOM_PASTE)
+ {
+ element_old = (IS_CUSTOM_ELEMENT(element_new) ?
+ EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP);
+ copy_mode = GADGET_ID_CUSTOM_COPY_TO;
+ }
+ else if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
{
Request("Please choose custom element !", REQ_CONFIRM);
}
else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE)
{
- copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR);
+ copy_custom_element_settings(element_old, EL_INTERNAL_DUMMY);
copy_custom_element_settings(element_new, element_old);
- copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new);
+ copy_custom_element_settings(EL_INTERNAL_DUMMY, element_new);
- replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR);
+ replace_custom_element_in_settings(element_old, EL_INTERNAL_DUMMY);
replace_custom_element_in_settings(element_new, element_old);
- replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new);
+ replace_custom_element_in_settings(EL_INTERNAL_DUMMY, element_new);
- replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR);
+ replace_custom_element_in_playfield(element_old, EL_INTERNAL_DUMMY);
replace_custom_element_in_playfield(element_new, element_old);
- replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new);
+ replace_custom_element_in_playfield(EL_INTERNAL_DUMMY, element_new);
}
UpdateCustomElementGraphicGadgets();
(IS_DIGGABLE(element) ? EP_DIGGABLE :
IS_COLLECTIBLE_ONLY(element) ? EP_COLLECTIBLE_ONLY :
IS_DROPPABLE(element) ? EP_DROPPABLE :
+ IS_THROWABLE(element) ? EP_THROWABLE :
IS_PUSHABLE(element) ? EP_PUSHABLE :
custom_element.walk_to_action);
custom_element_properties[EP_WALK_TO_OBJECT] =
(IS_DIGGABLE(element) ||
IS_COLLECTIBLE_ONLY(element) ||
IS_DROPPABLE(element) ||
+ IS_THROWABLE(element) ||
IS_PUSHABLE(element));
/* set smash targets selectbox help value */
(IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
- CAN_EXPLODE_DYNA(element) ? EP_CAN_EXPLODE_DYNA :
+ CAN_EXPLODE_CROSS(element) ? EP_CAN_EXPLODE_CROSS :
custom_element.consistency);
custom_element_properties[EP_EXPLODE_RESULT] =
(IS_INDESTRUCTIBLE(element) ||
CAN_EXPLODE_1X1(element) ||
CAN_EXPLODE_3X3(element) ||
- CAN_EXPLODE_DYNA(element));
+ CAN_EXPLODE_CROSS(element));
/* 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
/* ---------- element settings: advanced (custom elements) --------------- */
HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED :
HAS_CHANGE_EVENT(element, CE_HITTING_SOMETHING) ? CE_HITTING_SOMETHING :
HAS_CHANGE_EVENT(element, CE_HIT_BY_SOMETHING) ? CE_HIT_BY_SOMETHING :
+ HAS_CHANGE_EVENT(element, CE_BLOCKED) ? CE_BLOCKED :
HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
custom_element_change.direct_action);
static void CopyClassicElementPropertiesToEditor(int element)
{
#if 1
- if (COULD_MOVE_INTO_ACID(element))
+ if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
getMoveIntoAcidProperty(&level, element);
+ if (MAYBE_DONT_COLLIDE_WITH(element))
+ custom_element_properties[EP_DONT_COLLIDE_WITH] =
+ getDontCollideWithProperty(&level, element);
#else
if (COULD_MOVE_INTO_ACID(element))
if (bit_nr > -1)
custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
- ((level.can_move_into_acid & (1 << bit_nr)) != 0);
+ ((level.can_move_into_acid_bits & (1 << bit_nr)) != 0);
}
#endif
}
{
int i;
int access_type_and_layer;
+ boolean can_explode;
/* mark that this custom element has been modified */
custom_element.modified_settings = TRUE;
custom_element_properties[EP_DIGGABLE] = FALSE;
custom_element_properties[EP_COLLECTIBLE_ONLY] = FALSE;
custom_element_properties[EP_DROPPABLE] = FALSE;
+ custom_element_properties[EP_THROWABLE] = FALSE;
custom_element_properties[EP_PUSHABLE] = FALSE;
custom_element_properties[custom_element.walk_to_action] =
custom_element_properties[EP_WALK_TO_OBJECT];
custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
- custom_element_properties[EP_CAN_EXPLODE_DYNA] = 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[EP_EXPLODE_RESULT];
/* 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_DYNA])
+ 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_IMPACT] =
custom_element.can_explode_impact;
}
+#endif
/* ---------- element settings: advanced (custom elements) --------------- */
custom_element_change_events[CE_SWITCHED] = FALSE;
custom_element_change_events[CE_HITTING_SOMETHING] = FALSE;
custom_element_change_events[CE_HIT_BY_SOMETHING] = FALSE;
+ 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[custom_element_change.direct_action] =
static void CopyClassicElementPropertiesToGame(int element)
{
#if 1
- if (COULD_MOVE_INTO_ACID(element))
+ if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
setMoveIntoAcidProperty(&level, element,
custom_element_properties[EP_CAN_MOVE_INTO_ACID]);
+ if (MAYBE_DONT_COLLIDE_WITH(element))
+ setDontCollideWithProperty(&level, element,
+ custom_element_properties[EP_DONT_COLLIDE_WITH]);
#else
if (COULD_MOVE_INTO_ACID(element))
if (bit_nr > -1)
{
- level.can_move_into_acid &= ~(1 << bit_nr);
+ level.can_move_into_acid_bits &= ~(1 << bit_nr);
if (custom_element_properties[EP_CAN_MOVE_INTO_ACID])
- level.can_move_into_acid |= (1 << bit_nr);
+ level.can_move_into_acid_bits |= (1 << bit_nr);
}
}
#endif
redraw_mask |= REDRAW_ALL;
- ReinitializeElementListButtons(); /* only needed after setup changes */
+ ReinitializeElementListButtons(); /* custom element may look different */
#if 0
ModifyEditorElementList(); /* may be needed for custom elements */
#endif
for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
MapCounterButtons(i);
+ /* draw selectbox gadgets */
+ for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++)
+ MapSelectboxGadget(i);
+
/* draw checkbutton gadgets */
for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++)
MapCheckbuttonGadget(i);
int id = ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT;
struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
int x1 = right_gadget_border[GADGET_ID_CHANGE_USE_CONTENT];
- int x2 = right_gadget_border[GADGET_ID_CHANGE_POWER];
+ int x2 = right_gadget_border[GADGET_ID_CHANGE_REPLACE_WHEN];
int x3 = right_gadget_border[GADGET_ID_CHANGE_ONLY_COMPLETE];
int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE;
{ EP_PASSABLE_OVER, "- player can pass over it" },
{ EP_PASSABLE_INSIDE, "- player can pass through it" },
{ EP_PASSABLE_UNDER, "- player can pass under it" },
+ { EP_PROTECTED, "- player is protected by it" },
{ EP_DIGGABLE, "- can be digged away" },
{ EP_COLLECTIBLE, "- can be collected" },
{ EP_DROPPABLE, "- can be dropped after collecting" },
+ { EP_THROWABLE, "- can be thrown after collecting" },
{ EP_PUSHABLE, "- can be pushed" },
- { EP_CAN_MOVE, "- can move" },
{ EP_CAN_FALL, "- can fall" },
+ { EP_CAN_MOVE, "- can move" },
{ EP_CAN_SMASH_PLAYER, "- can smash player" },
#if 0
#endif
{ EP_CAN_SMASH_EVERYTHING, "- can smash everything smashable" },
- { EP_SLIPPERY, "- slippery for falling objects" },
+ { EP_SLIPPERY, "- slippery for falling elements" },
{ EP_EM_SLIPPERY_WALL, "- slippery for some gems (EM style)" },
{ EP_DONT_RUN_INTO, "- deadly when running into" },
/* pre-defined properties */
{ EP_CAN_PASS_MAGIC_WALL, "- can pass magic walls" },
+ { EP_SWITCHABLE, "- can be switched" },
{ EP_HAS_CONTENT, "- can contain other elements" },
{ -1, NULL }
IS_ENVELOPE(element) ||
ELEM_IS_PLAYER(element) ||
HAS_CONTENT(element) ||
+ CAN_GROW(element) ||
COULD_MOVE_INTO_ACID(element) ||
- element == EL_SPRING)
+ MAYBE_DONT_COLLIDE_WITH(element))
return TRUE;
else
for (i = 0; elements_with_counter[i].element != -1; i++)
counterbutton_info[counter_id].y =
ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) +
- (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0));
+ (CAN_GROW(properties_element) ? 1 : 0) +
+ (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0) +
+ (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 :0));
counterbutton_info[counter_id].value = elements_with_counter[i].value;
counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
}
if (ELEM_IS_PLAYER(properties_element))
+ {
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
+ }
if (IS_GEM(properties_element))
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
if (COULD_MOVE_INTO_ACID(properties_element) &&
+ !ELEM_IS_PLAYER(properties_element) &&
(!IS_CUSTOM_ELEMENT(properties_element) ||
edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
{
+ /* set position for checkbutton for "can move into acid" */
checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
ED_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
HAS_CONTENT(properties_element) ? 1 : 0);
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
}
+ if (MAYBE_DONT_COLLIDE_WITH(properties_element))
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH);
+
if (properties_element == EL_SPRING)
MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG);
+ if (CAN_GROW(properties_element))
+ {
+ checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
+ ED_SETTINGS_YPOS(HAS_CONTENT(properties_element) ? 1 : 0);
+
+ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE);
+ }
+
if (IS_ENVELOPE(properties_element))
{
int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
}
else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)
{
- /* set position for special checkbutton for "can move into acid" */
-
/* draw checkbutton gadgets */
for (i = ED_CHECKBUTTON_ID_CUSTOM2_FIRST;
i <= ED_CHECKBUTTON_ID_CUSTOM2_LAST; i++)
}
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
{
- custom_element_change.content[sx][sy] = new_element;
+ custom_element_change.target_content[sx][sy] = new_element;
CopyCustomElementPropertiesToGame(properties_element);
}
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
PickDrawingElement(button, custom_element_change.target_element);
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- PickDrawingElement(button, custom_element_change.content[sx][sy]);
+ PickDrawingElement(button, custom_element_change.target_content[sx][sy]);
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
PickDrawingElement(button, custom_element_change.trigger_element);
else if (id == GADGET_ID_GROUP_CONTENT)
DrawPropertiesWindow();
}
+ else if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE ||
+ type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE)
+ {
+ struct ElementInfo *ei = &element_info[properties_element];
+ int current_change_page = ei->current_change_page;
+
+ if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE)
+ element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0] =
+ ei->change_page[current_change_page];
+ else if (type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE)
+ ei->change_page[current_change_page] =
+ element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0];
+
+ DrawPropertiesWindow();
+ }
}
static void HandleRadiobuttons(struct GadgetInfo *gi)
*checkbutton_info[type_id].value ^= TRUE;
- if (type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID ||
+ if (type_id == ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID ||
+ type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID ||
+ type_id == ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH ||
(((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) ||
(type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
last_drawing_function = drawing_function;
break;
+ case GADGET_ID_CUSTOM_COPY:
+ CopyCustomElement(properties_element, -1, id);
+ break;
+
+ case GADGET_ID_CUSTOM_PASTE:
+ CopyCustomElement(-1, properties_element, id);
+ break;
+
case GADGET_ID_UNDO:
if (undo_buffer_steps == 0)
{
else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
element = custom_element_change.target_element;
else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
- element = custom_element_change.content[sx][sy];
+ element = custom_element_change.target_content[sx][sy];
else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
element = custom_element_change.trigger_element;
else if (id == GADGET_ID_GROUP_CONTENT)