X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=0ed7c8ca792851de30b7927ff2c064efe247420c;hb=c64be0354d88b9776537a907f524993e29e074aa;hp=c9f86cc35d1a65df60761f3f4e50d211ba29127d;hpb=f6e7c3f82181ecb9e1a8e2de37672c838998e942;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index c9f86cc3..0ed7c8ca 100644 --- a/src/editor.c +++ b/src/editor.c @@ -144,8 +144,15 @@ ED_GADGET_DISTANCE) /* custom element content */ #define ED_AREA_ELEM_CONTENT4_XPOS (29 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(12) + \ +#define ED_AREA_ELEM_CONTENT4_YPOS (ED_SETTINGS_YPOS(13) + \ 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(7) + \ + ED_GADGET_DISTANCE) +#define ED_AREA_ELEM_CONTENT4b_XPOS (29 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT4b_YPOS (ED_SETTINGS_YPOS(7) + \ + ED_GADGET_DISTANCE) /* custom change trigger element */ #define ED_AREA_ELEM_CONTENT5_YPOS (ED_SETTINGS_YPOS(6) + \ ED_GADGET_DISTANCE) @@ -153,6 +160,9 @@ #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) +#define ED_AREA_GROUP_CONTENT_YPOS (22 * MINI_TILEY) /* values for random placement background drawing area */ #define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY) @@ -375,9 +385,12 @@ #define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57) #define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58) #define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 59) +#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 61) +#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 62) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 63) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -391,13 +404,16 @@ #define GADGET_ID_AMOEBA_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 9) #define GADGET_ID_CUSTOM_GRAPHIC (GADGET_ID_DRAWING_AREA_FIRST + 10) #define GADGET_ID_CUSTOM_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 11) -#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12) -#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 13) -#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 14) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_CUSTOM_MOVE_ENTER (GADGET_ID_DRAWING_AREA_FIRST + 12) +#define GADGET_ID_CUSTOM_MOVE_LEAVE (GADGET_ID_DRAWING_AREA_FIRST + 13) +#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 14) +#define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 16) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 17) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 18) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 16) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 19) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -417,19 +433,21 @@ #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_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) -#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) -#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 9) -#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 13) -#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 14) -#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 15) +#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_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 14) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 15) +#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 16) +#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 17) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 16) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 18) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -461,7 +479,7 @@ #define GADGET_ID_SCROLL_LIST_DOWN (GADGET_ID_SCROLLING_LIST_FIRST + 1) #define GADGET_ID_SCROLL_LIST_VERTICAL (GADGET_ID_SCROLLING_LIST_FIRST + 2) -/* checkbuttons for level/element properties */ +/* checkbuttons/radiobuttons for level/element properties */ #define GADGET_ID_CHECKBUTTON_FIRST (GADGET_ID_SCROLLING_LIST_FIRST + 3) #define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 0) @@ -471,30 +489,32 @@ #define GADGET_ID_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 4) #define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 5) #define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 6) -#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 29) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 30) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -523,11 +543,12 @@ #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_CHANGE_DELAY_FIX 17 -#define ED_COUNTER_ID_CHANGE_DELAY_RND 18 -#define ED_COUNTER_ID_CHANGE_CONT_RND 19 +#define ED_COUNTER_ID_GROUP_CONTENT 17 +#define ED_COUNTER_ID_CHANGE_DELAY_FIX 18 +#define ED_COUNTER_ID_CHANGE_DELAY_RND 19 +#define ED_COUNTER_ID_CHANGE_CONT_RND 20 -#define ED_NUM_COUNTERBUTTONS 20 +#define ED_NUM_COUNTERBUTTONS 21 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM @@ -586,18 +607,20 @@ #define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 3 #define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 4 #define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 5 -#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 6 -#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 7 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 8 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 9 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 10 -#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 11 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 12 -#define ED_SELECTBOX_ID_CHANGE_SIDES 13 -#define ED_SELECTBOX_ID_CHANGE_POWER 14 -#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 15 - -#define ED_NUM_SELECTBOX 16 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 6 +#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 7 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 8 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 9 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 10 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 11 +#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 12 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 13 +#define ED_SELECTBOX_ID_CHANGE_SIDES 14 +#define ED_SELECTBOX_ID_CHANGE_POWER 15 +#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 16 +#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 17 + +#define ED_NUM_SELECTBOX 18 #define ED_SELECTBOX_ID_CUSTOM_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE #define ED_SELECTBOX_ID_CUSTOM_LAST ED_SELECTBOX_ID_CUSTOM_CONSISTENCY @@ -636,29 +659,31 @@ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 5 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 6 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 7 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 8 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 9 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 10 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 11 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 12 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 13 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 14 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 15 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 17 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 18 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 19 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 20 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 21 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 22 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 23 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 24 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 25 - -#define ED_NUM_CHECKBUTTONS 26 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 5 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 6 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 7 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 8 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 9 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 10 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 11 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 12 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 13 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 14 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 15 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 16 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 17 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 18 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 19 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 20 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 21 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 22 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 23 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 24 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 25 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 26 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 27 + +#define ED_NUM_CHECKBUTTONS 28 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -691,12 +716,15 @@ #define ED_DRAWING_ID_AMOEBA_CONTENT 9 #define ED_DRAWING_ID_CUSTOM_GRAPHIC 10 #define ED_DRAWING_ID_CUSTOM_CONTENT 11 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 12 -#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 13 -#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 14 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 15 +#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER 12 +#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE 13 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 14 +#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 15 +#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 16 +#define ED_DRAWING_ID_GROUP_CONTENT 17 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 18 -#define ED_NUM_DRAWING_AREAS 16 +#define ED_NUM_DRAWING_AREAS 19 /* @@ -795,6 +823,7 @@ static boolean stick_element_properties_window = FALSE; static boolean custom_element_properties[NUM_ELEMENT_PROPERTIES]; static boolean custom_element_change_events[NUM_CHANGE_EVENTS]; static struct ElementChangeInfo custom_element_change; +static struct ElementGroupInfo group_element_info; static struct ElementInfo custom_element; static struct @@ -902,7 +931,7 @@ static struct NULL, " ", "height", }, - /* ---------- element settings: configure (custom elements) ------------- */ + /* ---------- element settings: configure (custom elements) -------------- */ { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), @@ -937,7 +966,7 @@ static struct NULL, "+random", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), 0, 999, GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP, GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE, @@ -945,7 +974,7 @@ static struct NULL, "move delay", NULL }, { - -1, ED_SETTINGS_YPOS(7), + -1, ED_SETTINGS_YPOS(9), 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, @@ -953,6 +982,17 @@ static struct NULL, "+random", NULL }, + /* ---------- element settings: configure (group elements) --------------- */ + + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), + MIN_ELEMENTS_IN_GROUP, MAX_ELEMENTS_IN_GROUP, + GADGET_ID_GROUP_CONTENT_DOWN, GADGET_ID_GROUP_CONTENT_UP, + GADGET_ID_GROUP_CONTENT_TEXT, GADGET_ID_NONE, + &group_element_info.num_elements, + NULL, NULL, "number of elements in group" + }, + /* ---------- element settings: advanced (custom elements) --------------- */ { @@ -1074,22 +1114,23 @@ static struct ValueTextInfo options_move_pattern[] = { MV_TURNING_RIGHT_LEFT, "turning right, left" }, { MV_TURNING_RANDOM, "turning random" }, { MV_WHEN_PUSHED, "when pushed" }, + { MV_WHEN_DROPPED, "when dropped" }, #if 1 { MV_MAZE_RUNNER, "maze runner style" }, { MV_MAZE_HUNTER, "maze hunter style" }, #endif - { MV_PROJECTILE, "projectile style" }, - { MV_PROJECTILE, "projectile style" }, { -1, NULL } }; static struct ValueTextInfo options_move_direction[] = { - { MV_NO_MOVING, "automatic" }, + { MV_AUTOMATIC, "automatic" }, { MV_LEFT, "left" }, { MV_RIGHT, "right" }, { MV_UP, "up" }, { MV_DOWN, "down" }, + { MV_RANDOM, "random" }, + { MV_PREVIOUS, "previous" }, { -1, NULL } }; @@ -1103,6 +1144,13 @@ static struct ValueTextInfo options_move_stepsize[] = { -1, NULL } }; +static struct ValueTextInfo options_move_leave_type[] = +{ + { LEAVE_TYPE_UNLIMITED, "leave behind" }, + { LEAVE_TYPE_LIMITED, "change it to" }, + { -1, NULL } +}; + static struct ValueTextInfo options_smash_targets[] = { { EP_CAN_SMASH_PLAYER, "player" }, @@ -1214,6 +1262,16 @@ static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] = { -1, NULL } }; +static struct ValueTextInfo options_group_choice_mode[] = +{ + { ANIM_RANDOM, "random" }, + { ANIM_LOOP, "loop" }, + { ANIM_LINEAR, "linear" }, + { ANIM_PINGPONG, "pingpong" }, + { ANIM_PINGPONG2, "pingpong 2" }, + { -1, NULL } +}; + static struct { int x, y; @@ -1276,7 +1334,15 @@ static struct "move/fall speed", NULL, "speed of element movement" }, { - -1, ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE, + -1, + options_move_leave_type, + &custom_element.move_leave_type, + "can dig: can", ":", "leave behind or change element" + }, + { + -1, ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, options_smash_targets, @@ -1284,7 +1350,7 @@ static struct "can smash", NULL, "elements that can be smashed" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, -1, options_slippery_type, @@ -1292,7 +1358,7 @@ static struct "slippery", NULL, "where other elements fall down" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_DEADLINESS, GADGET_ID_NONE, -1, options_deadliness, @@ -1300,7 +1366,7 @@ static struct "deadly when", NULL, "deadliness of element" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_CONSISTENCY, GADGET_ID_NONE, -1, options_consistency, @@ -1358,6 +1424,17 @@ static struct &custom_element.current_change_page, NULL, NULL, "element config page" }, + + /* ---------- element settings: configure (group elements) --------------- */ + + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), + GADGET_ID_GROUP_CHOICE_MODE, GADGET_ID_NONE, + -1, + options_group_choice_mode, + &group_element_info.choice_mode, + "choice type:", NULL, "type of group element choice" + }, }; static struct @@ -1590,6 +1667,20 @@ static struct NULL, "slip down from certain flat walls","use EM style slipping behaviour" }, + { + ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), + 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_COUNTER_YPOS(4), + 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" + }, /* ---------- element settings: configure (custom elements) ------------- */ @@ -1612,49 +1703,49 @@ static struct NULL, NULL, "element can move in some direction" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE, &custom_element_properties[EP_CAN_FALL], NULL, "can fall", "element can fall down" }, { - -1, ED_SETTINGS_YPOS(9), + -1, ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_SMASH], " ", NULL, "element can smash other elements" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], NULL, NULL, "other elements can fall down from it" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE, &custom_element_properties[EP_DEADLY], NULL, NULL, "element can kill the player" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_EXPLODE_RESULT, GADGET_ID_NONE, &custom_element_properties[EP_EXPLODE_RESULT], NULL, NULL, "set consistency/destructibility" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, &custom_element.can_explode_by_fire, NULL, "by fire", "element can explode by fire/explosion" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, &custom_element.can_explode_smashed, " ", "smashed", "element can explode when smashed" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, &custom_element.can_explode_impact, " ", "impact", "element can explode on impact" @@ -1820,6 +1911,21 @@ static struct "content:", NULL, NULL }, + /* ---------- custom enter and leave element (when moving) --------------- */ + + { + ED_SETTINGS_XPOS(1), ED_AREA_ELEM_CONTENT4a_YPOS, + 1, 1, + GADGET_ID_CUSTOM_MOVE_ENTER, GADGET_ID_NONE, + "can dig:", " ", NULL + }, + { + -1, ED_AREA_ELEM_CONTENT4b_YPOS, + 1, 1, + GADGET_ID_CUSTOM_MOVE_LEAVE, GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, + NULL, NULL, NULL + }, + /* ---------- custom change target --------------------------------------- */ { @@ -1847,6 +1953,15 @@ static struct NULL, NULL, NULL }, + /* ---------- group element content -------------------------------------- */ + + { + ED_AREA_GROUP_CONTENT_XPOS, ED_AREA_GROUP_CONTENT_YPOS, + MAX_ELEMENTS_IN_GROUP, 1, + GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE, + "content:", NULL, NULL + }, + /* ---------- random background (for random painting) -------------------- */ { @@ -1886,6 +2001,7 @@ static int new_element3 = EL_SAND; static void ModifyEditorCounter(int, int); static void ModifyEditorCounterLimits(int, int, int); static void ModifyEditorSelectbox(int, int); +static void ModifyEditorDrawingArea(int, int, int); static void ModifyEditorElementList(); static void RedrawDrawingElements(); static void DrawDrawingWindow(); @@ -2152,11 +2268,7 @@ static int editor_el_more[] = EL_BD_FIREFLY, EL_MOLE_LEFT, -#if 0 - EL_MAZE_RUNNER, -#else EL_EMPTY, -#endif EL_MOLE_RIGHT, EL_PACMAN, @@ -2213,7 +2325,7 @@ static int editor_el_sokoban[] = EL_SOKOBAN_OBJECT, EL_SOKOBAN_FIELD_EMPTY, EL_SOKOBAN_FIELD_FULL, - EL_STEELWALL, + EL_SOKOBAN_FIELD_PLAYER, }; static int *editor_hl_sokoban_ptr = editor_hl_sokoban; static int *editor_el_sokoban_ptr = editor_el_sokoban; @@ -2905,6 +3017,87 @@ static int *editor_el_custom_more_ptr = editor_el_custom_more; 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_group[] = +{ + EL_CHAR('G'), + EL_CHAR('R'), + EL_CHAR('O'), + EL_CHAR('U'), + + EL_CHAR('P'), + EL_CHAR(' '), + EL_CHAR(' '), + EL_CHAR(' '), + + EL_CHAR('E'), + EL_CHAR('L'), + EL_CHAR('E'), + EL_CHAR('M'), + + EL_CHAR('E'), + EL_CHAR('N'), + EL_CHAR('T'), + EL_CHAR('S'), +}; + +static int editor_el_group[] = +{ + EL_GROUP_START + 0, + EL_GROUP_START + 1, + EL_GROUP_START + 2, + EL_GROUP_START + 3, + + EL_GROUP_START + 4, + EL_GROUP_START + 5, + EL_GROUP_START + 6, + EL_GROUP_START + 7, + + EL_GROUP_START + 8, + EL_GROUP_START + 9, + EL_GROUP_START + 10, + EL_GROUP_START + 11, + + EL_GROUP_START + 12, + EL_GROUP_START + 13, + EL_GROUP_START + 14, + EL_GROUP_START + 15 +}; +static int *editor_hl_group_ptr = editor_hl_group; +static int *editor_el_group_ptr = editor_el_group; +static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group); +static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group); + +static int editor_hl_group_more[] = +{ +}; + +static int editor_el_group_more[] = +{ + EL_GROUP_START + 16, + EL_GROUP_START + 17, + EL_GROUP_START + 18, + EL_GROUP_START + 19, + + EL_GROUP_START + 20, + EL_GROUP_START + 21, + EL_GROUP_START + 22, + EL_GROUP_START + 23, + + EL_GROUP_START + 24, + EL_GROUP_START + 25, + EL_GROUP_START + 26, + EL_GROUP_START + 27, + + EL_GROUP_START + 28, + EL_GROUP_START + 29, + EL_GROUP_START + 30, + EL_GROUP_START + 31 +}; +static int *editor_hl_group_more_ptr = editor_hl_group_more; +static int *editor_el_group_more_ptr = editor_el_group_more; +static int num_editor_hl_group_more = SIZEOF_ARRAY_INT(editor_hl_group_more); +static int num_editor_el_group_more = SIZEOF_ARRAY_INT(editor_el_group_more); + static int editor_hl_user_defined[] = { EL_CHAR('U'), @@ -3005,6 +3198,16 @@ editor_elements_info[] = &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_group_ptr, &num_editor_hl_group, + &editor_el_group_ptr, &num_editor_el_group + }, + { + &setup.editor.el_custom_more, + &editor_hl_group_more_ptr, &num_editor_hl_group_more, + &editor_el_group_more_ptr, &num_editor_el_group_more + }, { &setup.editor.el_user_defined, &editor_hl_user_defined_ptr, &num_editor_hl_user_defined, @@ -3022,6 +3225,205 @@ editor_elements_info[] = } }; +static struct +{ + short element; + short element_mapped; +} +forum_sketch_element_mapping[] = +{ + { EL_WALL_SLIPPERY, EL_WALL }, + { EL_EXPANDABLE_WALL, EL_WALL }, + { EL_EXPANDABLE_WALL_HORIZONTAL, EL_WALL }, + { EL_EXPANDABLE_WALL_VERTICAL, EL_WALL }, + { EL_EXPANDABLE_WALL_ANY, EL_WALL }, + { EL_WALL_EMERALD, EL_WALL }, + { EL_WALL_DIAMOND, EL_WALL }, + { EL_WALL_BD_DIAMOND, EL_WALL }, + { EL_WALL_EMERALD_YELLOW, EL_WALL }, + { EL_WALL_EMERALD_RED, EL_WALL }, + { EL_WALL_EMERALD_PURPLE, EL_WALL }, + { EL_ACID_POOL_TOPLEFT, EL_WALL }, + { EL_ACID_POOL_TOPRIGHT, EL_WALL }, + { EL_ACID_POOL_BOTTOMLEFT, EL_WALL }, + { EL_ACID_POOL_BOTTOM, EL_WALL }, + { EL_ACID_POOL_BOTTOMRIGHT, EL_WALL }, + { EL_BD_WALL, EL_WALL }, + + { EL_BD_ROCK, EL_ROCK }, + + { EL_SP_ZONK, EL_ROCK }, + { EL_SP_BASE, EL_SAND }, + { EL_SP_MURPHY, EL_PLAYER_1 }, + { EL_SP_INFOTRON, EL_EMERALD }, + { EL_SP_HARDWARE_GRAY, EL_STEELWALL }, + { EL_SP_EXIT_CLOSED, EL_EXIT_OPEN }, + { EL_SP_DISK_ORANGE, EL_BOMB }, + { EL_SP_DISK_RED, EL_BOMB }, + { EL_SP_DISK_YELLOW, EL_BOMB }, + { EL_SP_PORT_RIGHT, EL_GATE_1_GRAY }, + { EL_SP_PORT_DOWN, EL_GATE_1_GRAY }, + { EL_SP_PORT_LEFT, EL_GATE_1_GRAY }, + { EL_SP_PORT_UP, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_RIGHT, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_DOWN, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_LEFT, EL_GATE_1_GRAY }, + { EL_SP_GRAVITY_PORT_UP, EL_GATE_1_GRAY }, + { EL_SP_PORT_VERTICAL, EL_GATE_1_GRAY }, + { EL_SP_PORT_HORIZONTAL, EL_GATE_1_GRAY }, + { EL_SP_PORT_ANY, EL_GATE_1_GRAY }, + { EL_SP_SNIKSNAK, EL_BUG }, + { EL_SP_ELECTRON, EL_SPACESHIP }, + { EL_SP_CHIP_SINGLE, EL_WALL }, + { EL_SP_CHIP_LEFT, EL_WALL }, + { EL_SP_CHIP_RIGHT, EL_WALL }, + { EL_SP_CHIP_TOP, EL_WALL }, + { EL_SP_CHIP_BOTTOM, EL_WALL }, + { EL_SP_HARDWARE_BASE_1, EL_STEELWALL }, + { EL_SP_HARDWARE_GREEN, EL_STEELWALL }, + { EL_SP_HARDWARE_BLUE, EL_STEELWALL }, + { EL_SP_HARDWARE_RED, EL_STEELWALL }, + { EL_SP_HARDWARE_YELLOW, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_2, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_3, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_3, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_4, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_5, EL_STEELWALL }, + { EL_SP_HARDWARE_BASE_6, EL_STEELWALL }, + + { EL_STEELWALL_SLIPPERY, EL_STEELWALL }, + + { EL_EXIT_CLOSED, EL_EXIT_OPEN }, + + { EL_DIAMOND, EL_EMERALD }, + { EL_BD_DIAMOND, EL_EMERALD }, + { EL_EMERALD_YELLOW, EL_EMERALD }, + { EL_EMERALD_RED, EL_EMERALD }, + { EL_EMERALD_PURPLE, EL_EMERALD }, + + { EL_AMOEBA_DEAD, EL_AMOEBA }, + { EL_AMOEBA_DROP, EL_AMOEBA }, + { EL_AMOEBA_WET, EL_AMOEBA }, + { EL_AMOEBA_DRY, EL_AMOEBA }, + { EL_AMOEBA_FULL, EL_AMOEBA }, + { EL_BD_AMOEBA, EL_AMOEBA }, + { EL_AMOEBA_TO_DIAMOND, EL_AMOEBA }, + + { EL_DYNAMITE_ACTIVE, EL_DYNAMITE }, + + { EL_GATE_2_GRAY, EL_GATE_1_GRAY }, + { EL_GATE_3_GRAY, EL_GATE_1_GRAY }, + { EL_GATE_4_GRAY, EL_GATE_1_GRAY }, + + { EL_EM_KEY_1, EL_KEY_1 }, + { EL_EM_KEY_2, EL_KEY_2 }, + { EL_EM_KEY_3, EL_KEY_3 }, + { EL_EM_KEY_4, EL_KEY_4 }, + + { EL_EM_GATE_1, EL_GATE_1 }, + { EL_EM_GATE_2, EL_GATE_2 }, + { EL_EM_GATE_3, EL_GATE_3 }, + { EL_EM_GATE_4, EL_GATE_4 }, + + { EL_EM_GATE_1_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_2_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_3_GRAY, EL_GATE_1_GRAY }, + { EL_EM_GATE_4_GRAY, EL_GATE_1_GRAY }, + + { EL_INVISIBLE_SAND, EL_EMPTY }, + { EL_INVISIBLE_WALL, EL_EMPTY }, + { EL_INVISIBLE_STEELWALL, EL_EMPTY }, + + { EL_PACMAN, EL_YAMYAM }, + { EL_DARK_YAMYAM, EL_YAMYAM }, + + { EL_BD_MAGIC_WALL, EL_MAGIC_WALL }, + + { EL_DYNABOMB_INCREASE_NUMBER, EL_BOMB }, + { EL_DYNABOMB_INCREASE_SIZE, EL_BOMB }, + { EL_DYNABOMB_INCREASE_POWER, EL_BOMB }, + { EL_BLACK_ORB, EL_BOMB }, + { EL_DX_SUPABOMB, EL_BOMB }, + + { EL_SOKOBAN_OBJECT, EL_KEY_1 }, + { EL_SOKOBAN_FIELD_EMPTY, EL_GATE_1_GRAY }, + { EL_SOKOBAN_FIELD_FULL, EL_GATE_1 }, + { EL_SOKOBAN_FIELD_PLAYER, EL_PLAYER_1 }, + + { EL_BD_BUTTERFLY_RIGHT, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_UP, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_LEFT, EL_BD_BUTTERFLY }, + { EL_BD_BUTTERFLY_DOWN, EL_BD_BUTTERFLY }, + + { EL_BD_FIREFLY_RIGHT, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_UP, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_LEFT, EL_BD_FIREFLY }, + { EL_BD_FIREFLY_DOWN, EL_BD_FIREFLY }, + + { EL_PLAYER_2, EL_PLAYER_1 }, + { EL_PLAYER_3, EL_PLAYER_1 }, + { EL_PLAYER_4, EL_PLAYER_1 }, + + { EL_BUG_RIGHT, EL_BUG }, + { EL_BUG_UP, EL_BUG }, + { EL_BUG_LEFT, EL_BUG }, + { EL_BUG_DOWN, EL_BUG }, + + { EL_SPACESHIP_RIGHT, EL_SPACESHIP }, + { EL_SPACESHIP_UP, EL_SPACESHIP }, + { EL_SPACESHIP_LEFT, EL_SPACESHIP }, + { EL_SPACESHIP_DOWN, EL_SPACESHIP }, + + { EL_PACMAN_RIGHT, EL_YAMYAM }, + { EL_PACMAN_UP, EL_YAMYAM }, + { EL_PACMAN_LEFT, EL_YAMYAM }, + { EL_PACMAN_DOWN, EL_YAMYAM }, + + { -1, -1 } +}; + +static struct +{ + short element; + char *element_string; +} +forum_sketch_element_strings[] = +{ + { EL_PLAYER_1, "p" }, + { EL_EMPTY, "_" }, + { EL_SAND, "s" }, + { EL_ROCK, "b" }, + { EL_EMERALD, "e" }, + { EL_BUG, "u" }, + { EL_SPACESHIP, "h" }, + { EL_BD_FIREFLY, "f" }, + { EL_BD_BUTTERFLY, "b" }, + { EL_AMOEBA, "a" }, + { EL_YAMYAM, "y" }, + { EL_WALL, "w" }, + { EL_STEELWALL, "t" }, + { EL_MAGIC_WALL, "m" }, + { EL_EXIT_OPEN, "x" }, + { EL_DYNAMITE, "d" }, + { EL_KEY_1, "1" }, + { EL_KEY_2, "2" }, + { EL_KEY_3, "3" }, + { EL_KEY_4, "4" }, + { EL_GATE_1, "5" }, + { EL_GATE_2, "6" }, + { EL_GATE_3, "7" }, + { EL_GATE_4, "8" }, + { EL_GATE_1_GRAY, "9" }, + { EL_BOMB, "@" }, + { EL_ROBOT, "r" }, + { EL_ROBOT_WHEEL, "0" }, + { EL_NUT, "n" }, + { EL_CUSTOM_1, "c" }, + { EL_CHAR_QUESTION, "?" }, + + { -1, NULL } +}; + /* ----------------------------------------------------------------------------- @@ -3226,8 +3628,8 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height, (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER); Bitmap *src_bitmap; int src_x, src_y; - int num_mini_tilex = width / MINI_TILEX + 1; - int num_mini_tiley = width / MINI_TILEY + 1; + int num_mini_tilex = width / MINI_TILEX + 1; + int num_mini_tiley = height / MINI_TILEY + 1; int x, y; getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y); @@ -3260,6 +3662,12 @@ static void DrawDrawingArea(int id) DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY, el2edimg(custom_element.content[x][y])); + else if (id == ED_DRAWING_ID_CUSTOM_MOVE_ENTER) + DrawMiniGraphicExt(drawto, gi->x, gi->y, + el2edimg(custom_element.move_enter_element)); + else if (id == ED_DRAWING_ID_CUSTOM_MOVE_LEAVE) + DrawMiniGraphicExt(drawto, gi->x, gi->y, + el2edimg(custom_element.move_leave_element)); else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TARGET) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element_change.target_element)); @@ -3272,6 +3680,10 @@ static void DrawDrawingArea(int id) else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element_change.trigger_element)); + else if (id == ED_DRAWING_ID_GROUP_CONTENT) + for (x = 0; x < group_element_info.num_elements; x++) + DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y, + el2edimg(group_element_info.element[x])); else if (id >= ED_DRAWING_ID_ELEMENT_CONTENT_0 && id <= ED_DRAWING_ID_ELEMENT_CONTENT_7) { @@ -4628,7 +5040,7 @@ static void UnmapLevelEditorToolboxDrawingGadgets() static void UnmapDrawingArea(int id) { - UnmapGadget(level_editor_gadget[id]); + UnmapGadget(level_editor_gadget[drawingarea_info[id].gadget_id]); } static void UnmapLevelEditorWindowGadgets() @@ -4722,6 +5134,40 @@ static int setSelectboxValue(int selectbox_id, int new_value) static void copy_custom_element_settings(int element_from, int element_to) { +#if 1 + struct ElementInfo ei_to_old = element_info[element_to]; + struct ElementInfo *ei_from = &element_info[element_from]; + struct ElementInfo *ei_to = &element_info[element_to]; + int i; + + /* ---------- copy whole element structure ---------- */ + *ei_to = *ei_from; + + /* ---------- restore structure pointers which cannot be copied ---------- */ + ei_to->token_name = ei_to_old.token_name; + ei_to->class_name = ei_to_old.class_name; + ei_to->editor_description = ei_to_old.editor_description; + ei_to->custom_description = ei_to_old.custom_description; + ei_to->change_page = ei_to_old.change_page; + ei_to->change = ei_to_old.change; + ei_to->group = ei_to_old.group; + + /* ---------- copy element base properties ---------- */ + Properties[element_to][EP_BITFIELD_BASE] = + Properties[element_from][EP_BITFIELD_BASE]; + + /* ---------- reinitialize and copy change pages ---------- */ + setElementChangePages(ei_to, ei_to->num_change_pages); + + for (i=0; i < ei_to->num_change_pages; i++) + ei_to->change_page[i] = ei_from->change_page[i]; + + /* ---------- copy group element info ---------- */ + if (ei_from->group != NULL && ei_to->group != NULL) /* group or internal */ + *ei_to->group = *ei_from->group; + +#else + struct ElementInfo *ei_from = &element_info[element_from]; struct ElementInfo *ei_to = &element_info[element_to]; int i, x, y; @@ -4794,6 +5240,7 @@ static void copy_custom_element_settings(int element_from, int element_to) change_to->sides = change_from->sides; } +#endif /* mark this custom element as modified */ ei_to->modified_settings = TRUE; @@ -4813,7 +5260,7 @@ static void replace_custom_element_in_settings(int element_from, if (ei->content[x][y] == element_from) ei->content[x][y] = element_to; - for (j=0; j < ei->num_change_pages; j++) + for (j = 0; j < ei->num_change_pages; j++) { struct ElementChangeInfo *change = &ei->change_page[j]; @@ -4828,6 +5275,11 @@ static void replace_custom_element_in_settings(int element_from, if (change->content[x][y] == element_from) change->content[x][y] = element_to; } + + if (ei->group != NULL) /* group or internal */ + for (j = 0; j < MAX_ELEMENTS_IN_GROUP; j++) + if (ei->group->element[j] == element_from) + ei->group->element[j] = element_to; } } @@ -4842,8 +5294,22 @@ static void replace_custom_element_in_playfield(int element_from, Feld[x][y] = element_to; } -static void CopyCustomElement(int element_old, int element_new, int copy_mode) +static boolean CopyCustomElement(int element_old, int element_new, + int copy_mode) { + if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new)) + { + Request("Please choose custom element !", REQ_CONFIRM); + + return FALSE; + } + else if (IS_GROUP_ELEMENT(element_old) && !IS_GROUP_ELEMENT(element_new)) + { + Request("Please choose group element !", REQ_CONFIRM); + + return FALSE; + } + if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM) { copy_custom_element_settings(element_new, element_old); @@ -4854,21 +5320,23 @@ static void CopyCustomElement(int element_old, int element_new, int copy_mode) } else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE) { - copy_custom_element_settings(element_old, EL_DUMMY); + copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR); copy_custom_element_settings(element_new, element_old); - copy_custom_element_settings(EL_DUMMY, element_new); + copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new); - replace_custom_element_in_settings(element_old, EL_DUMMY); + replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR); replace_custom_element_in_settings(element_new, element_old); - replace_custom_element_in_settings(EL_DUMMY, element_new); + replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new); - replace_custom_element_in_playfield(element_old, EL_DUMMY); + replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR); replace_custom_element_in_playfield(element_new, element_old); - replace_custom_element_in_playfield(EL_DUMMY, element_new); + replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new); } UpdateCustomElementGraphicGadgets(); DrawPropertiesWindow(); + + return TRUE; } static void CopyCustomElementPropertiesToEditor(int element) @@ -5016,6 +5484,20 @@ static void CopyCustomElementPropertiesToEditor(int element) custom_element_change.other_action); } +static void CopyGroupElementPropertiesToEditor(int element) +{ + group_element_info = *element_info[element].group; + custom_element = element_info[element]; /* needed for description */ +} + +static void CopyElementPropertiesToEditor(int element) +{ + if (IS_CUSTOM_ELEMENT(element)) + CopyCustomElementPropertiesToEditor(element); + else if (IS_GROUP_ELEMENT(element)) + CopyGroupElementPropertiesToEditor(element); +} + static void CopyCustomElementPropertiesToGame(int element) { int i; @@ -5150,6 +5632,23 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change = *element_info[element].change; } +static void CopyGroupElementPropertiesToGame(int element) +{ + element_info[element] = custom_element; + *element_info[element].group = group_element_info; + + /* mark that this group element has been modified */ + element_info[element].modified_settings = TRUE; +} + +static void CopyElementPropertiesToGame(int element) +{ + if (IS_CUSTOM_ELEMENT(element)) + CopyCustomElementPropertiesToGame(element); + else if (IS_GROUP_ELEMENT(element)) + CopyGroupElementPropertiesToGame(element); +} + void DrawLevelEd() { CloseDoor(DOOR_CLOSE_ALL); @@ -5341,6 +5840,14 @@ static void ModifyEditorSelectbox(int selectbox_id, int new_value) ModifyGadget(gi, GDI_SELECTBOX_INDEX, new_index_value, GDI_END); } +static void ModifyEditorDrawingArea(int drawingarea_id, int xsize, int ysize) +{ + int gadget_id = drawingarea_info[drawingarea_id].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + + ModifyGadget(gi, GDI_AREA_SIZE, xsize, ysize, GDI_END); +} + static void ModifyEditorElementList() { int i; @@ -5507,7 +6014,7 @@ static void DrawElementContentAreas() DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2, SY + drawingarea_info[id].y - MINI_TILEY / 2, 4 * MINI_TILEX, - 4 * MINI_TILEX + ED_GADGET_TEXT_DISTANCE + font_height); + 4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height); } } @@ -5516,6 +6023,28 @@ static void DrawElementContentAreas() DrawText(x, y + 2 * MINI_TILEY, "smashed", FONT_TEXT_1); } +static void DrawGroupElementArea(int element) +{ + int num_elements = group_element_info.num_elements; + int id = ED_DRAWING_ID_GROUP_CONTENT; + int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2; + int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2; + int xsize = MAX_ELEMENTS_IN_GROUP; + int ysize = 1; + + if (drawingarea_info[id].text_left != NULL) + sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left); + + UnmapDrawingArea(id); + + ModifyEditorDrawingArea(id, num_elements, 1); + + /* delete content areas in case of reducing number of them */ + DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY); + + MapDrawingArea(id); +} + static void DrawEnvelopeTextArea(int envelope_nr) { int id = ED_TEXTAREA_ID_ENVELOPE_INFO; @@ -5699,7 +6228,8 @@ static void DrawPropertiesTabulatorGadgets() int i; /* draw additional "advanced" tabulator for custom elements */ - if (IS_CUSTOM_ELEMENT(properties_element)) + if (IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element)) id_last = ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED; for (i = id_first; i <= id_last; i++) @@ -5801,6 +6331,12 @@ static void DrawPropertiesInfo() "[Custom Element %d]", properties_element - EL_CUSTOM_START + 1); screen_line++; } + else if (IS_GROUP_ELEMENT(properties_element)) + { + DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3, + "[Group Element %d]", properties_element - EL_GROUP_START + 1); + screen_line++; + } #endif /* ----- print number of elements / percentage of this element in level */ @@ -5933,7 +6469,9 @@ static boolean checkPropertiesConfig() if (IS_GEM(properties_element) || IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element) || IS_ENVELOPE(properties_element) || + ELEM_IS_PLAYER(properties_element) || HAS_CONTENT(properties_element)) return TRUE; else @@ -5986,6 +6524,11 @@ static void DrawPropertiesConfig() if (IS_GEM(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + if (ELEM_IS_PLAYER(properties_element)) + MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? + ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : + ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); + if (IS_ENVELOPE(properties_element)) { int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE; @@ -6024,6 +6567,27 @@ static void DrawPropertiesConfig() /* draw drawing area gadgets */ DrawCustomContentArea(); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_ENTER); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_MOVE_LEAVE); + + /* draw text input gadgets */ + MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); + } + else if (IS_GROUP_ELEMENT(properties_element)) + { + /* draw stickybutton gadget */ + i = ED_CHECKBUTTON_ID_STICK_ELEMENT; + checkbutton_info[i].y = ED_SETTINGS_YPOS(0); + MapCheckbuttonGadget(i); + + /* draw counter gadgets */ + MapCounterButtons(ED_COUNTER_ID_GROUP_CONTENT); + + /* draw selectbox gadgets */ + MapSelectboxGadget(ED_SELECTBOX_ID_GROUP_CHOICE_MODE); + + /* draw drawing area gadgets */ + DrawGroupElementArea(properties_element); /* draw text input gadgets */ MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); @@ -6033,10 +6597,14 @@ static void DrawPropertiesConfig() static void DrawPropertiesAdvancedDrawingAreas() { MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC); - MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); - MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); - DrawCustomChangeContentArea(); + if (IS_CUSTOM_ELEMENT(properties_element)) + { + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); + + DrawCustomChangeContentArea(); + } redraw_mask |= REDRAW_FIELD; } @@ -6050,27 +6618,42 @@ static void DrawPropertiesAdvanced() checkbutton_info[i].y = ED_SETTINGS_YPOS(0); MapCheckbuttonGadget(i); - /* draw checkbutton gadgets */ - for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; - i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) + if (IS_CUSTOM_ELEMENT(properties_element)) + { + /* draw checkbutton gadgets */ + for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; + i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) MapCheckbuttonGadget(i); - /* draw counter gadgets */ - for (i = ED_COUNTER_ID_CHANGE_FIRST; i <= ED_COUNTER_ID_CHANGE_LAST; i++) - MapCounterButtons(i); + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_CHANGE_FIRST; + i <= ED_COUNTER_ID_CHANGE_LAST; i++) + MapCounterButtons(i); - /* draw selectbox gadgets */ - for (i = ED_SELECTBOX_ID_CHANGE_FIRST; i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) - MapSelectboxGadget(i); + /* draw selectbox gadgets */ + for (i = ED_SELECTBOX_ID_CHANGE_FIRST; + i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) + MapSelectboxGadget(i); - /* draw textbutton gadgets */ - for (i=ED_TEXTBUTTON_ID_CHANGE_FIRST; i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) - MapTextbuttonGadget(i); + /* draw textbutton gadgets */ + for (i = ED_TEXTBUTTON_ID_CHANGE_FIRST; + i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) + MapTextbuttonGadget(i); - /* draw graphicbutton gadgets */ - for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; - i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) - MapGraphicbuttonGadget(i); + /* draw graphicbutton gadgets */ + for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; + i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) + MapGraphicbuttonGadget(i); + } + else if (IS_GROUP_ELEMENT(properties_element)) + { + /* draw checkbutton gadgets */ + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE); + + /* draw textbutton gadgets */ + MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); + } /* draw drawing area gadgets */ DrawPropertiesAdvancedDrawingAreas(); @@ -6130,17 +6713,18 @@ static void DrawPropertiesWindow() /* make sure that previous properties edit mode exists for this element */ if (edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED && - !IS_CUSTOM_ELEMENT(properties_element)) + !IS_CUSTOM_ELEMENT(properties_element) && + !IS_GROUP_ELEMENT(properties_element)) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; - if (IS_CUSTOM_ELEMENT(properties_element)) - CopyCustomElementPropertiesToEditor(properties_element); + CopyElementPropertiesToEditor(properties_element); UnmapLevelEditorWindowGadgets(); UnmapLevelEditorToolboxDrawingGadgets(); UnmapLevelEditorToolboxCustomGadgets(); - if (IS_CUSTOM_ELEMENT(properties_element)) + if (IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element)) MapLevelEditorToolboxCustomGadgets(); SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); @@ -6386,6 +6970,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, #define CB_BRUSH_TO_CURSOR 1 #define CB_BRUSH_TO_LEVEL 2 #define CB_DELETE_OLD_CURSOR 3 +#define CB_DUMP_BRUSH 4 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int button, int mode) @@ -6397,6 +6982,54 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y, int new_element = BUTTON_ELEMENT(button); int x, y; + if (mode == CB_DUMP_BRUSH) + { + if (!draw_with_brush) + { + Error(ERR_WARN, "no brush selected"); + + return; + } + + for (y = 0; y < brush_height; y++) + { + for (x = 0; x < brush_width; x++) + { + int element = brush_buffer[x][y]; + int element_mapped = element; + char *element_string = "?"; + int k; + + for (k = 0; forum_sketch_element_mapping[k].element != -1; k++) + { + if (forum_sketch_element_mapping[k].element == element) + { + element_mapped = forum_sketch_element_mapping[k].element_mapped; + break; + } + } + + if (IS_CUSTOM_ELEMENT(element)) + element_mapped = EL_CUSTOM_1; + + for (k = 0; forum_sketch_element_strings[k].element != -1; k++) + { + if (forum_sketch_element_strings[k].element == element_mapped) + { + element_string = forum_sketch_element_strings[k].element_string; + break; + } + } + + printf("`%s", element_string); + } + + printf("\n"); + } + + return; + } + if (mode == CB_DELETE_OLD_CURSOR && !delete_old_brush) return; @@ -6511,6 +7144,11 @@ static void DeleteBrushFromCursor() CopyBrushExt(0, 0, 0, 0, 0, CB_DELETE_OLD_CURSOR); } +void DumpBrush() +{ + CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH); +} + static void FloodFill(int from_x, int from_y, int fill_element) { int i,x,y; @@ -6920,7 +7558,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) new_element = GFX_ELEMENT(new_element); custom_element.gfx_element = new_element; - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); UpdateCustomElementGraphicGadgets(); @@ -6932,6 +7570,18 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) CopyCustomElementPropertiesToGame(properties_element); } + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + { + custom_element.move_enter_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + { + custom_element.move_leave_element = new_element; + + CopyCustomElementPropertiesToGame(properties_element); + } else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) { custom_element_change.target_element = new_element; @@ -6950,6 +7600,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) CopyCustomElementPropertiesToGame(properties_element); } + else if (id == GADGET_ID_GROUP_CONTENT) + { + group_element_info.element[sx] = new_element; + + CopyGroupElementPropertiesToGame(properties_element); + } else if (id == GADGET_ID_RANDOM_BACKGROUND) random_placement_background_element = new_element; else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -7060,12 +7716,18 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) PickDrawingElement(button, custom_element.gfx_element); else if (id == GADGET_ID_CUSTOM_CONTENT) PickDrawingElement(button, custom_element.content[sx][sy]); + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + PickDrawingElement(button, custom_element.move_enter_element); + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + PickDrawingElement(button, custom_element.move_leave_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]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) PickDrawingElement(button, custom_element_change.trigger_element); + else if (id == GADGET_ID_GROUP_CONTENT) + PickDrawingElement(button, group_element_info.element[sx]); else if (id == GADGET_ID_RANDOM_BACKGROUND) PickDrawingElement(button, random_placement_background_element); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -7121,6 +7783,11 @@ static void HandleCounterButtons(struct GadgetInfo *gi) DrawElementContentAreas(); break; + case ED_COUNTER_ID_GROUP_CONTENT: + DrawGroupElementArea(properties_element); + CopyGroupElementPropertiesToGame(properties_element); + break; + case ED_COUNTER_ID_ENVELOPE_XSIZE: case ED_COUNTER_ID_ENVELOPE_YSIZE: DrawEnvelopeTextArea(-1); @@ -7147,7 +7814,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi) counter_id <= ED_COUNTER_ID_CUSTOM_LAST) || (counter_id >= ED_COUNTER_ID_CHANGE_FIRST && counter_id <= ED_COUNTER_ID_CHANGE_LAST)) - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); } static void HandleTextInputGadgets(struct GadgetInfo *gi) @@ -7158,7 +7825,7 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) if (type_id == ED_TEXTINPUT_ID_ELEMENT_NAME) { - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); ModifyEditorElementList(); /* update changed button info text */ } @@ -7187,8 +7854,9 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) else if ((type_id >= ED_SELECTBOX_ID_CUSTOM_FIRST && type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) || (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST && - type_id <= ED_SELECTBOX_ID_CHANGE_LAST)) - CopyCustomElementPropertiesToGame(properties_element); + type_id <= ED_SELECTBOX_ID_CHANGE_LAST) || + (type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE)) + CopyElementPropertiesToGame(properties_element); } static void HandleTextbuttonGadgets(struct GadgetInfo *gi) @@ -7205,7 +7873,8 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) { - boolean new_template = (!LevelFileExists(-1)); + char *template_filename = getDefaultLevelFilename(-1); + boolean new_template = !fileExists(template_filename); if (new_template || Request("Save this template and kill the old ?", REQ_ASK)) @@ -7284,7 +7953,7 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST && type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) { - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); } if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) @@ -7293,7 +7962,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { - if (level.use_custom_template && !LevelFileExists(-1)) + char *template_filename = getDefaultLevelFilename(-1); + + if (level.use_custom_template && !fileExists(template_filename)) { Request("No level template found !", REQ_CONFIRM); @@ -7335,6 +8006,10 @@ static void HandleControlButtons(struct GadgetInfo *gi) edit_mode = ED_MODE_DRAWING; } + /* element copy mode active, but no element button pressed => deactivate */ + if (last_custom_copy_mode != -1 && id < ED_NUM_CTRL_BUTTONS) + last_custom_copy_mode = -1; + switch (id) { case GADGET_ID_SCROLL_LEFT: @@ -7576,7 +8251,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - boolean new_level = (!LevelFileExists(level_nr)); + char *level_filename = getDefaultLevelFilename(level_nr); + boolean new_level = !fileExists(level_filename); if (new_level || Request("Save this level and kill the old ?", REQ_ASK)) @@ -7632,13 +8308,14 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (last_custom_copy_mode != -1) { - CopyCustomElement(properties_element, new_element, - last_custom_copy_mode); - - ClickOnGadget(level_editor_gadget[last_drawing_function], - MB_LEFTBUTTON); + if (CopyCustomElement(properties_element, new_element, + last_custom_copy_mode)) + { + ClickOnGadget(level_editor_gadget[last_drawing_function], + MB_LEFTBUTTON); - last_custom_copy_mode = -1; + last_custom_copy_mode = -1; + } break; } @@ -7826,7 +8503,6 @@ void HandleEditorGadgetInfoText(void *ptr) static void HandleDrawingAreaInfo(struct GadgetInfo *gi) { static int start_lx, start_ly; - char *infotext; int id = gi->custom_id; int sx = gi->event.x; int sy = gi->event.y; @@ -7836,6 +8512,11 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) int max_sx = gi->drawing.area_xsize - 1; int max_sy = gi->drawing.area_ysize - 1; int actual_drawing_function = drawing_function; + int max_infotext_len = getMaxInfoTextLength(); + char infotext[MAX_OUTPUT_LINESIZE + 1]; + char *text; + + infotext[0] = '\0'; /* start with empty info text */ /* pressed Control key: simulate picking element */ if (GetKeyModState() & KMOD_Control) @@ -7883,41 +8564,48 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: - infotext = "Drawing single items"; + text = "Drawing single items"; break; case GADGET_ID_CONNECTED_ITEMS: - infotext = "Drawing connected items"; + text = "Drawing connected items"; break; case GADGET_ID_LINE: - infotext = "Drawing line"; + text = "Drawing line"; break; case GADGET_ID_ARC: - infotext = "Drawing arc"; + text = "Drawing arc"; break; case GADGET_ID_TEXT: - infotext = "Setting text cursor"; + text = "Setting text cursor"; break; case GADGET_ID_RECTANGLE: - infotext = "Drawing rectangle"; + text = "Drawing rectangle"; break; case GADGET_ID_FILLED_BOX: - infotext = "Drawing filled box"; + text = "Drawing filled box"; break; case GADGET_ID_FLOOD_FILL: - infotext = "Flood fill"; + text = "Flood fill"; break; case GADGET_ID_GRAB_BRUSH: - infotext = "Grabbing brush"; + text = "Grabbing brush"; break; case GADGET_ID_PICK_ELEMENT: - infotext = "Picking element"; + text = "Picking element"; break; default: - infotext = "Drawing position"; + text = "Drawing position"; break; } +#if 1 + if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + sprintf(infotext, "%s: %d, %d", text, lx, ly); + else + sprintf(infotext, "%s: %d, %d", text, + ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, lx, ly); @@ -7925,13 +8613,21 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#endif } +#if 1 + else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len); + else + sprintf(infotext, "Level position: %d, %d", lx, ly); +#else else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", getElementInfoText(Feld[lx][ly])); else DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Level position: %d, %d", lx, ly); +#endif } /* misuse this function to draw brush cursor, if needed */ @@ -7945,65 +8641,66 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { + int element = EL_EMPTY; + if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.amoeba_content)); + element = level.amoeba_content; else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.gfx_element)); + element = custom_element.gfx_element; else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.content[sx][sy])); + element = custom_element.content[sx][sy]; + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + element = custom_element.move_enter_element; + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + element = custom_element.move_leave_element; else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.target_element)); + element = custom_element_change.target_element; else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.content[sx][sy])); + element = custom_element_change.content[sx][sy]; else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.trigger_element)); + element = custom_element_change.trigger_element; + else if (id == GADGET_ID_GROUP_CONTENT) + element = group_element_info.element[sx]; else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(random_placement_background_element)); + element = random_placement_background_element; else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) - { - int i = id - GADGET_ID_ELEMENT_CONTENT_0; + element = level.yamyam_content[id - GADGET_ID_ELEMENT_CONTENT_0][sx][sy]; - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.yamyam_content[i][sx][sy])); - } + strncpy(infotext, getElementInfoText(element), max_infotext_len); } else { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Amoeba content"); + strcpy(infotext, "Amoeba content"); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom graphic element"); + strcpy(infotext, "Custom graphic element"); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom element content position: %d, %d", sx, sy); + sprintf(infotext, "Custom element content position: %d, %d", sx, sy); + else if (id == GADGET_ID_CUSTOM_MOVE_ENTER) + strcpy(infotext, "Element that can be digged/collected"); + else if (id == GADGET_ID_CUSTOM_MOVE_LEAVE) + strcpy(infotext, "Element that will be left behind"); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New element after change"); + strcpy(infotext, "New element after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New extended elements after change"); + strcpy(infotext, "New extended elements after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Other element triggering change"); + strcpy(infotext, "Other element triggering change"); + else if (id == GADGET_ID_GROUP_CONTENT) + sprintf(infotext, "Group element position: %d", sx + 1); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Random placement background"); + strcpy(infotext, "Random placement background"); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Content area %d position: %d, %d", - id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); + sprintf(infotext, "Content area %d position: %d, %d", + id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); } + + infotext[max_infotext_len] = '\0'; + + if (strlen(infotext) > 0) + DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext); } void RequestExitLevelEditor(boolean ask_if_level_has_changed)