X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=f499cf116576b4af3d4a58de3f2960f4cf5c6135;hb=43088f3908d6b92f5f26d93a1f9067effadbcc8c;hp=7852895b4d85797be41f155461ec36116a7c21ae;hpb=ed22fcb49eb39c34da82c51f44cbe64ca5b409c4;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 7852895b..f499cf11 100644 --- a/src/editor.c +++ b/src/editor.c @@ -84,9 +84,9 @@ #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 + \ +#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 */ @@ -96,7 +96,7 @@ #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 */ @@ -106,22 +106,22 @@ #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 @@ -131,59 +131,26 @@ /* 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(11) + \ - ED_GADGET_DISTANCE) -#define ED_AREA_ELEM_CONTENT4b_XPOS (29 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT4b_YPOS (ED_SETTINGS_YPOS(11) + \ - 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 @@ -201,12 +168,14 @@ #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) @@ -222,16 +191,16 @@ #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 */ @@ -266,14 +235,14 @@ #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 @@ -281,14 +250,14 @@ #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 @@ -530,36 +499,38 @@ #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_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 34) +#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 + 35) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 37) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -729,35 +700,37 @@ #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_INSTANT_RELOCATION 8 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 9 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 10 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 11 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 12 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 13 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 14 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 15 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 16 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 17 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 18 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 19 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 20 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 21 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 22 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 23 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 24 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 25 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 26 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 27 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 28 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 29 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 30 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 31 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 32 - -#define ED_NUM_CHECKBUTTONS 33 +#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 @@ -1248,6 +1221,7 @@ static struct ValueTextInfo options_walk_to_action[] = { EP_DIGGABLE, "diggable" }, { EP_COLLECTIBLE_ONLY, "collectible" }, { EP_DROPPABLE, "collectible & droppable" }, + { EP_THROWABLE, "collectible & throwable" }, { EP_PUSHABLE, "pushable" }, { -1, NULL } @@ -1271,10 +1245,10 @@ static struct ValueTextInfo options_move_pattern[] = { 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 } }; @@ -1365,18 +1339,21 @@ static struct ValueTextInfo options_time_units[] = 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)" }, @@ -1386,20 +1363,20 @@ static struct ValueTextInfo options_change_direct_action[] = 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_SWITCHING, "switch of" }, { CE_OTHER_IS_CHANGING, "change by page of" }, { CE_OTHER_IS_EXPLODING, "explosion of" }, @@ -1473,6 +1450,8 @@ static struct ValueTextInfo options_change_replace_when[] = { { CP_WHEN_EMPTY, "empty" }, { CP_WHEN_DIGGABLE, "diggable" }, + { CP_WHEN_COLLECTIBLE, "collectible" }, + { CP_WHEN_REMOVABLE, "removable" }, { CP_WHEN_DESTRUCTIBLE, "destructible" }, { -1, NULL } @@ -1659,7 +1638,7 @@ static struct -1, options_change_trigger_side, &custom_element_change.trigger_side, - "... at", "side", "element side that causes change" + "at", "side", "element side that causes change" }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7), @@ -1990,6 +1969,13 @@ static struct NULL, "use spring pushing bug", "use odd spring pushing behaviour" }, + { + 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, @@ -2011,6 +1997,13 @@ static struct 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, @@ -2241,7 +2234,7 @@ static struct /* ---------- 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 @@ -2250,7 +2243,7 @@ static struct /* ---------- 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 @@ -2259,7 +2252,7 @@ static struct /* ---------- 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 @@ -2268,13 +2261,13 @@ static struct /* ---------- 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 @@ -2283,7 +2276,7 @@ static struct /* ---------- 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 @@ -2292,7 +2285,7 @@ static struct /* ---------- 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 @@ -2301,7 +2294,7 @@ static struct /* ---------- 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 @@ -2310,7 +2303,7 @@ static struct /* ---------- 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 @@ -2319,7 +2312,7 @@ static struct /* ---------- 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 @@ -5341,9 +5334,8 @@ static void MapCheckbuttonGadget(int id) 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_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; @@ -5820,12 +5812,14 @@ static void CopyCustomElementPropertiesToEditor(int element) (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 */ @@ -5884,6 +5878,7 @@ static void CopyCustomElementPropertiesToEditor(int element) 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); @@ -5995,6 +5990,7 @@ static void CopyCustomElementPropertiesToGame(int element) 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]; @@ -6049,6 +6045,7 @@ static void CopyCustomElementPropertiesToGame(int element) 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] = @@ -6170,7 +6167,7 @@ void DrawLevelEd() 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 @@ -6762,14 +6759,16 @@ static void DrawPropertiesInfo() { 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 @@ -6777,7 +6776,7 @@ static void DrawPropertiesInfo() #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" }, @@ -6794,6 +6793,7 @@ static void DrawPropertiesInfo() /* 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 } @@ -6967,6 +6967,7 @@ static boolean checkPropertiesConfig(int element) IS_ENVELOPE(element) || ELEM_IS_PLAYER(element) || HAS_CONTENT(element) || + CAN_GROW(element) || COULD_MOVE_INTO_ACID(element) || MAYBE_DONT_COLLIDE_WITH(element)) return TRUE; @@ -6998,8 +6999,9 @@ static void DrawPropertiesConfig() counterbutton_info[counter_id].y = ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) + - (MAYBE_DONT_COLLIDE_WITH(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; @@ -7028,6 +7030,7 @@ static void DrawPropertiesConfig() 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)) @@ -7038,7 +7041,7 @@ static void DrawPropertiesConfig() (!IS_CUSTOM_ELEMENT(properties_element) || edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)) { - /* set position for special checkbutton for "can move into acid" */ + /* 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); @@ -7052,6 +7055,14 @@ static void DrawPropertiesConfig() 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;