X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=199da58e31b098767a660ab174bf4f8556c26283;hb=564a563aee2c9fdb37116d41342b36eda63c1f6a;hp=6ca13b17aef7bc78edf0ed2b6b2e82401a947fdc;hpb=9afd3ebaca7211c2c7e10926ddaaf422c73486dc;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 6ca13b17..199da58e 100644 --- a/src/editor.c +++ b/src/editor.c @@ -109,9 +109,9 @@ #define ED_SETTINGS_YOFFSET (3 * MINI_TILEY / 2) #define ED_SETTINGS_XPOS(n) (ED_SETTINGS_XSTART + \ - n * ED_SETTINGS_XOFFSET) + (n) * ED_SETTINGS_XOFFSET) #define ED_SETTINGS_YPOS(n) (ED_SETTINGS_YSTART + \ - n * ED_SETTINGS_YOFFSET) + (n) * ED_SETTINGS_YOFFSET) #define ED_SETTINGS1_YPOS MINI_TILEY #define ED_SETTINGS2_XPOS MINI_TILEX @@ -121,20 +121,21 @@ #define ED_COUNTER_YSTART (ED_SETTINGS1_YPOS + 2 * TILEY) #define ED_COUNTER_YDISTANCE (3 * MINI_TILEY) #define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \ - n * ED_COUNTER_YDISTANCE) + (n) * ED_COUNTER_YDISTANCE) #define ED_COUNTER2_YPOS(n) (ED_COUNTER_YSTART + \ - n * ED_COUNTER_YDISTANCE - 2) + (n) * ED_COUNTER_YDISTANCE - 2) /* values for element content drawing areas */ /* amoeba content */ -#define ED_AREA_ELEM_CONTENT_XPOS ( 2 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT_YPOS (22 * MINI_TILEY) +#define ED_AREA_AMOEBA_CONTENT_XPOS ED_SETTINGS_XPOS(0) +#define ED_AREA_AMOEBA_CONTENT_YPOS (ED_SETTINGS_YPOS(2) + \ + ED_GADGET_DISTANCE) /* yamyam content */ -#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (ED_AREA_ELEM_CONTENT_XPOS + \ - 5 * (n % 4) * MINI_TILEX) -#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (ED_AREA_ELEM_CONTENT_YPOS + \ - 6 * (n / 4) * MINI_TILEY) +#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 + \ + 6 * ((n) / 4) * MINI_TILEY) /* custom change target */ #define ED_AREA_ELEM_CONTENT2_YPOS (ED_SETTINGS_YPOS(1) + \ @@ -148,10 +149,10 @@ 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(9) + \ +#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(9) + \ +#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) + \ @@ -381,21 +382,27 @@ #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_CHANGE_DELAY_FIX_DOWN (GADGET_ID_COUNTER_FIRST + 51) -#define GADGET_ID_CHANGE_DELAY_FIX_TEXT (GADGET_ID_COUNTER_FIRST + 52) -#define GADGET_ID_CHANGE_DELAY_FIX_UP (GADGET_ID_COUNTER_FIRST + 53) -#define GADGET_ID_CHANGE_DELAY_RND_DOWN (GADGET_ID_COUNTER_FIRST + 54) -#define GADGET_ID_CHANGE_DELAY_RND_TEXT (GADGET_ID_COUNTER_FIRST + 55) -#define GADGET_ID_CHANGE_DELAY_RND_UP (GADGET_ID_COUNTER_FIRST + 56) -#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) +#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) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 63) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 69) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -444,16 +451,17 @@ #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_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 13) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 14) -#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 15) -#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 16) -#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 17) -#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 18) +#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_POWER (GADGET_ID_SELECTBOX_FIRST + 17) +#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 18) +#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 19) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 19) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 20) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -497,32 +505,34 @@ #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_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) +#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) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 32) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -551,18 +561,24 @@ #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_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_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 21 +#define ED_NUM_COUNTERBUTTONS 23 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM -#define ED_COUNTER_ID_CUSTOM_FIRST ED_COUNTER_ID_CUSTOM_SCORE -#define ED_COUNTER_ID_CUSTOM_LAST ED_COUNTER_ID_MOVE_DELAY_RND +#define ED_COUNTER_ID_CUSTOM1_FIRST ED_COUNTER_ID_CUSTOM_SCORE +#define ED_COUNTER_ID_CUSTOM1_LAST ED_COUNTER_ID_MOVE_DELAY_RND +#define ED_COUNTER_ID_CUSTOM2_FIRST ED_COUNTER_ID_EXPLOSION_DELAY +#define ED_COUNTER_ID_CUSTOM2_LAST ED_COUNTER_ID_IGNITION_DELAY +#define ED_COUNTER_ID_CUSTOM_FIRST ED_COUNTER_ID_CUSTOM1_FIRST +#define ED_COUNTER_ID_CUSTOM_LAST ED_COUNTER_ID_CUSTOM2_LAST #define ED_COUNTER_ID_CHANGE_FIRST ED_COUNTER_ID_CHANGE_DELAY_FIX #define ED_COUNTER_ID_CHANGE_LAST ED_COUNTER_ID_CHANGE_CONT_RND @@ -612,29 +628,32 @@ #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_WALK_TO_ACTION 3 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 4 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 5 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 6 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 7 -#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 8 -#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 9 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 10 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 11 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 12 -#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 13 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 14 -#define ED_SELECTBOX_ID_CHANGE_SIDES 15 -#define ED_SELECTBOX_ID_CHANGE_POWER 16 -#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 17 -#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 18 - -#define ED_NUM_SELECTBOX 19 +#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_POWER 17 +#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 18 +#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 19 + +#define ED_NUM_SELECTBOX 20 #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_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 #define ED_SELECTBOX_ID_CHANGE_FIRST ED_SELECTBOX_ID_CHANGE_TIME_UNITS #define ED_SELECTBOX_ID_CHANGE_LAST ED_SELECTBOX_ID_SELECT_CHANGE_PAGE @@ -672,31 +691,33 @@ #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_BLOCK_LAST_FIELD 5 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 6 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 7 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 8 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 9 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 10 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 11 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 12 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 13 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 14 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 15 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 16 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 17 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 18 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 19 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 20 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 21 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 22 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 23 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 24 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 25 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 26 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 27 - -#define ED_NUM_CHECKBUTTONS 28 +#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_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -705,6 +726,8 @@ #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_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 #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE #define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM @@ -924,7 +947,7 @@ static struct NULL, NULL, NULL }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(3), MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS, GADGET_ID_ELEMENT_CONTENT_DOWN, GADGET_ID_ELEMENT_CONTENT_UP, GADGET_ID_ELEMENT_CONTENT_TEXT, GADGET_ID_NONE, @@ -948,10 +971,10 @@ static struct NULL, " ", "height", }, - /* ---------- element settings: configure (custom elements) -------------- */ + /* ---------- element settings: configure 1 (custom elements) ------------ */ { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), MIN_SCORE, MAX_SCORE, GADGET_ID_CUSTOM_SCORE_DOWN, GADGET_ID_CUSTOM_SCORE_UP, GADGET_ID_CUSTOM_SCORE_TEXT, GADGET_ID_NONE, @@ -959,7 +982,7 @@ static struct NULL, "score", " " }, { - -1, ED_SETTINGS_YPOS(5), + -1, ED_SETTINGS_YPOS(6), MIN_COLLECT_COUNT, MAX_COLLECT_COUNT, GADGET_ID_CUSTOM_GEMCOUNT_DOWN, GADGET_ID_CUSTOM_GEMCOUNT_UP, GADGET_ID_CUSTOM_GEMCOUNT_TEXT, GADGET_ID_CUSTOM_SCORE_UP, @@ -967,7 +990,7 @@ static struct NULL, "count", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(6), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), 0, 999, GADGET_ID_PUSH_DELAY_FIX_DOWN, GADGET_ID_PUSH_DELAY_FIX_UP, GADGET_ID_PUSH_DELAY_FIX_TEXT, GADGET_ID_NONE, @@ -975,7 +998,7 @@ static struct NULL, "push delay", NULL }, { - -1, ED_SETTINGS_YPOS(6), + -1, ED_SETTINGS_YPOS(7), 0, 999, GADGET_ID_PUSH_DELAY_RND_DOWN, GADGET_ID_PUSH_DELAY_RND_UP, GADGET_ID_PUSH_DELAY_RND_TEXT, GADGET_ID_PUSH_DELAY_FIX_UP, @@ -983,7 +1006,7 @@ static struct NULL, "+random", NULL }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(12), 0, 999, GADGET_ID_MOVE_DELAY_FIX_DOWN, GADGET_ID_MOVE_DELAY_FIX_UP, GADGET_ID_MOVE_DELAY_FIX_TEXT, GADGET_ID_NONE, @@ -991,7 +1014,7 @@ static struct NULL, "move delay", NULL }, { - -1, ED_SETTINGS_YPOS(11), + -1, ED_SETTINGS_YPOS(12), 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, @@ -999,6 +1022,25 @@ static struct NULL, "+random", NULL }, + /* ---------- element settings: configure 2 (custom elements) ------------ */ + + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4), + 0, 255, + GADGET_ID_EXPLOSION_DELAY_DOWN, GADGET_ID_EXPLOSION_DELAY_UP, + GADGET_ID_EXPLOSION_DELAY_TEXT, GADGET_ID_NONE, + &custom_element.explosion_delay, + NULL, "explosion delay", NULL + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), + 0, 255, + GADGET_ID_IGNITION_DELAY_DOWN, GADGET_ID_IGNITION_DELAY_UP, + GADGET_ID_IGNITION_DELAY_TEXT, GADGET_ID_NONE, + &custom_element.ignition_delay, + NULL, "ignition delay", "(by fire)" + }, + /* ---------- element settings: configure (group elements) --------------- */ { @@ -1110,6 +1152,26 @@ static struct ValueTextInfo options_access_protected[] = { -1, NULL } }; +static struct ValueTextInfo options_access_direction[] = +{ + { MV_LEFT, "left" }, + { MV_RIGHT, "right" }, + { MV_UP, "up" }, + { MV_DOWN, "down" }, + { MV_LEFT | MV_UP, "left + up" }, + { MV_LEFT | MV_DOWN, "left + down" }, + { MV_RIGHT | MV_UP, "right + up" }, + { MV_RIGHT | MV_DOWN, "right + down" }, + { MV_HORIZONTAL, "horizontal" }, + { MV_VERTICAL, "vertical" }, + { MV_HORIZONTAL | MV_UP, "horizontal + up" }, + { MV_HORIZONTAL | MV_DOWN, "horizontal + down" }, + { MV_VERTICAL | MV_LEFT, "vertical + left" }, + { MV_VERTICAL | MV_RIGHT, "vertical + right" }, + { MV_ALL_DIRECTIONS, "all directions" }, + { -1, NULL } +}; + static struct ValueTextInfo options_walk_to_action[] = { { EP_DIGGABLE, "diggable" }, @@ -1333,6 +1395,14 @@ static struct }, { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(4), + GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE, + -1, + options_access_direction, + &custom_element.access_direction, + "from", NULL, "access direction for this field" + }, + { + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_WALK_TO_ACTION, GADGET_ID_NONE, -1, options_walk_to_action, @@ -1340,7 +1410,7 @@ static struct NULL, NULL, "diggable/collectible/pushable" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_MOVE_PATTERN, GADGET_ID_NONE, -1, options_move_pattern, @@ -1348,7 +1418,7 @@ static struct "can move", NULL, "element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_MOVE_DIRECTION, GADGET_ID_NONE, -1, options_move_direction, @@ -1356,7 +1426,7 @@ static struct "starts moving", NULL, "initial element move direction" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_MOVE_STEPSIZE, GADGET_ID_NONE, -1, options_move_stepsize, @@ -1364,7 +1434,7 @@ static struct "move/fall speed", NULL, "speed of element movement" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE, GADGET_ID_NONE, -1, options_move_leave_type, @@ -1372,7 +1442,7 @@ static struct "can dig: can", ":", "leave behind or change element" }, { - -1, ED_SETTINGS_YPOS(12), + -1, ED_SETTINGS_YPOS(13), GADGET_ID_CUSTOM_SMASH_TARGETS, GADGET_ID_CUSTOM_CAN_SMASH, -1, options_smash_targets, @@ -1380,7 +1450,7 @@ static struct "can smash", NULL, "elements that can be smashed" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_SLIPPERY_TYPE, GADGET_ID_NONE, -1, options_slippery_type, @@ -1720,33 +1790,47 @@ static struct /* ---------- element settings: configure (various elements) ------------- */ { - ED_SETTINGS_XPOS(0), 0, /* set at runtime */ + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE, &stick_element_properties_window, NULL, "stick this screen to edit content","stick this screen to edit content" }, { - ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE, &level.em_slippery_gems, NULL, "slip down from certain flat walls","use EM style slipping behaviour" }, { - ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), + GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE, + &level.use_spring_bug, + NULL, + "use spring pushing bug", "use odd spring pushing behaviour" + }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), 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), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), 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(0), + GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE, + &custom_element_properties[EP_CAN_MOVE_INTO_ACID], + NULL, + "can move into acid", "element can move into acid pool" + }, /* ---------- element settings: configure 1 (custom elements) ----------- */ @@ -1769,31 +1853,31 @@ static struct NULL, NULL, "player can walk to or pass this field" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(4), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(5), GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE, &custom_element_properties[EP_WALK_TO_OBJECT], NULL, NULL, "player can dig/collect/push element" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(8), 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(0), ED_SETTINGS_YPOS(12), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), 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(12), + -1, ED_SETTINGS_YPOS(13), 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(13), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(14), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], NULL, NULL, "other elements can fall down from it" @@ -1956,10 +2040,10 @@ static struct /* ---------- amoeba content --------------------------------------------- */ { - ED_AREA_ELEM_CONTENT_XPOS, ED_AREA_ELEM_CONTENT_YPOS, + ED_AREA_AMOEBA_CONTENT_XPOS, ED_AREA_AMOEBA_CONTENT_YPOS, 1, 1, GADGET_ID_AMOEBA_CONTENT, GADGET_ID_NONE, - NULL, "content of amoeba", NULL + "content:", NULL, NULL }, /* ---------- custom graphic --------------------------------------------- */ @@ -2077,7 +2161,7 @@ static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); static void UpdateCustomElementGraphicGadgets(); -static boolean checkPropertiesConfig(); +static boolean checkPropertiesConfig(int); static void CopyLevelToUndoBuffer(int); static void HandleDrawingAreas(struct GadgetInfo *); static void HandleCounterButtons(struct GadgetInfo *); @@ -4770,8 +4854,10 @@ void FreeLevelEditorGadgets() static void MapCounterButtons(int id) { int gadget_id_down = counterbutton_info[id].gadget_id_down; + int gadget_id_text = counterbutton_info[id].gadget_id_text; int gadget_id_up = counterbutton_info[id].gadget_id_up; struct GadgetInfo *gi_down = level_editor_gadget[gadget_id_down]; + struct GadgetInfo *gi_text = level_editor_gadget[gadget_id_text]; struct GadgetInfo *gi_up = level_editor_gadget[gadget_id_up]; #if 0 char infotext[MAX_OUTPUT_LINESIZE + 1]; @@ -4789,9 +4875,19 @@ static void MapCounterButtons(int id) int x_right = gi_up->x + gi_up->width + xoffset_right; int y_above = gi_down->y - yoffset_above; int x = gi_down->x; - int y = gi_up->y + yoffset; + int y; /* set after gadget position was modified */ #endif + /* set position for "score" counter gadget */ + if (id == ED_COUNTER_ID_ELEMENT_SCORE) + { + ModifyGadget(gi_down, GDI_Y, SY + counterbutton_info[id].y, GDI_END); + ModifyGadget(gi_text, GDI_Y, SY + counterbutton_info[id].y, GDI_END); + ModifyGadget(gi_up, GDI_Y, SY + counterbutton_info[id].y, GDI_END); + } + + y = gi_up->y + yoffset; + if (counterbutton_info[id].text_above) DrawText(x, y_above, counterbutton_info[id].text_above, FONT_TEXT_1); @@ -4803,9 +4899,9 @@ static void MapCounterButtons(int id) ModifyEditorCounter(id, *counterbutton_info[id].value); - MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]); - MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]); - MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]); + MapGadget(gi_down); + MapGadget(gi_text); + MapGadget(gi_up); } static void MapControlButtons() @@ -4992,11 +5088,13 @@ static void MapCheckbuttonGadget(int id) int yoffset = ED_BORDER_SIZE; int x_left = gi->x - xoffset_left; int x_right = gi->x + gi->width + xoffset_right; - int y = gi->y + yoffset; + 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); - /* special case needed for "sticky" gadget */ - ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value, - GDI_Y, SY + checkbutton_info[id].y, GDI_END); y = gi->y + yoffset; if (checkbutton_info[id].text_left) @@ -5005,6 +5103,8 @@ static void MapCheckbuttonGadget(int id) if (checkbutton_info[id].text_right) DrawText(x_right, y, checkbutton_info[id].text_right, FONT_TEXT_1); + ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value, GDI_END); + MapGadget(gi); } @@ -5561,12 +5661,34 @@ static void CopyGroupElementPropertiesToEditor(int element) custom_element = element_info[element]; /* needed for description */ } +static void CopyClassicElementPropertiesToEditor(int element) +{ +#if 1 + if (COULD_MOVE_INTO_ACID(element)) + custom_element_properties[EP_CAN_MOVE_INTO_ACID] = + getMoveIntoAcidProperty(&level, element); + +#else + + if (COULD_MOVE_INTO_ACID(element)) + { + int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID); + + if (bit_nr > -1) + custom_element_properties[EP_CAN_MOVE_INTO_ACID] = + ((level.can_move_into_acid & (1 << bit_nr)) != 0); + } +#endif +} + static void CopyElementPropertiesToEditor(int element) { if (IS_CUSTOM_ELEMENT(element)) CopyCustomElementPropertiesToEditor(element); else if (IS_GROUP_ELEMENT(element)) CopyGroupElementPropertiesToEditor(element); + else + CopyClassicElementPropertiesToEditor(element); } static void CopyCustomElementPropertiesToGame(int element) @@ -5715,12 +5837,38 @@ static void CopyGroupElementPropertiesToGame(int element) element_info[element].modified_settings = TRUE; } +static void CopyClassicElementPropertiesToGame(int element) +{ +#if 1 + if (COULD_MOVE_INTO_ACID(element)) + setMoveIntoAcidProperty(&level, element, + custom_element_properties[EP_CAN_MOVE_INTO_ACID]); + +#else + + if (COULD_MOVE_INTO_ACID(element)) + { + int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID); + + if (bit_nr > -1) + { + level.can_move_into_acid &= ~(1 << bit_nr); + + if (custom_element_properties[EP_CAN_MOVE_INTO_ACID]) + level.can_move_into_acid |= (1 << bit_nr); + } + } +#endif +} + static void CopyElementPropertiesToGame(int element) { if (IS_CUSTOM_ELEMENT(element)) CopyCustomElementPropertiesToGame(element); else if (IS_GROUP_ELEMENT(element)) CopyGroupElementPropertiesToGame(element); + else + CopyClassicElementPropertiesToGame(element); } void DrawLevelEd() @@ -6485,19 +6633,23 @@ static struct { EL_DIAMOND, &level.score[SC_DIAMOND], TEXT_COLLECTING }, { EL_CRYSTAL, &level.score[SC_CRYSTAL], TEXT_COLLECTING }, { EL_PEARL, &level.score[SC_PEARL], TEXT_COLLECTING }, + { EL_BUG, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BUG_RIGHT, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BUG_UP, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BUG_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BUG_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_BD_BUTTERFLY, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_BUG], TEXT_SMASHING }, { EL_BD_BUTTERFLY_UP, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG], TEXT_SMASHING }, { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG], TEXT_SMASHING }, { EL_SP_ELECTRON, &level.score[SC_BUG], TEXT_SMASHING }, + { EL_SPACESHIP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_SPACESHIP_RIGHT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_SPACESHIP_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP], TEXT_SMASHING }, + { EL_BD_FIREFLY, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_BD_FIREFLY_RIGHT,&level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_BD_FIREFLY_UP, &level.score[SC_SPACESHIP], TEXT_SMASHING }, { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP], TEXT_SMASHING }, @@ -6506,6 +6658,7 @@ static struct { EL_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, { EL_DARK_YAMYAM, &level.score[SC_YAMYAM], TEXT_SMASHING }, { EL_ROBOT, &level.score[SC_ROBOT], TEXT_SMASHING }, + { EL_PACMAN, &level.score[SC_PACMAN], TEXT_SMASHING }, { EL_PACMAN_RIGHT, &level.score[SC_PACMAN], TEXT_SMASHING }, { EL_PACMAN_UP, &level.score[SC_PACMAN], TEXT_SMASHING }, { EL_PACMAN_LEFT, &level.score[SC_PACMAN], TEXT_SMASHING }, @@ -6542,20 +6695,22 @@ static struct { -1, NULL, NULL } }; -static boolean checkPropertiesConfig() +static boolean checkPropertiesConfig(int element) { int i; - 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)) + if (IS_GEM(element) || + IS_CUSTOM_ELEMENT(element) || + IS_GROUP_ELEMENT(element) || + IS_ENVELOPE(element) || + ELEM_IS_PLAYER(element) || + HAS_CONTENT(element) || + COULD_MOVE_INTO_ACID(element) || + element == EL_SPRING) return TRUE; else for (i = 0; elements_with_counter[i].element != -1; i++) - if (elements_with_counter[i].element == properties_element) + if (elements_with_counter[i].element == element) return TRUE; return FALSE; @@ -6565,7 +6720,7 @@ static void DrawPropertiesConfig() { int i; - if (!checkPropertiesConfig()) + if (!checkPropertiesConfig(properties_element)) { PrintInfoText("No configuration options available.", FONT_TEXT_1, 0); @@ -6579,8 +6734,13 @@ static void DrawPropertiesConfig() { int counter_id = ED_COUNTER_ID_ELEMENT_SCORE; + counterbutton_info[counter_id].y = + ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) + + (COULD_MOVE_INTO_ACID(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; + MapCounterButtons(counter_id); break; @@ -6590,9 +6750,7 @@ static void DrawPropertiesConfig() if (HAS_CONTENT(properties_element)) { /* draw stickybutton gadget */ - i = ED_CHECKBUTTON_ID_STICK_ELEMENT; - checkbutton_info[i].y = ED_COUNTER_YPOS(4); - MapCheckbuttonGadget(i); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); if (IS_AMOEBOID(properties_element)) MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT); @@ -6600,14 +6758,28 @@ static void DrawPropertiesConfig() DrawElementContentAreas(); } - 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_GEM(properties_element)) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); + + if (COULD_MOVE_INTO_ACID(properties_element) && + (!IS_CUSTOM_ELEMENT(properties_element) || + edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)) + { + 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 (properties_element == EL_SPRING) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG); + if (IS_ENVELOPE(properties_element)) { int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE; @@ -6627,9 +6799,7 @@ static void DrawPropertiesConfig() if (IS_CUSTOM_ELEMENT(properties_element)) { /* draw stickybutton gadget */ - i = ED_CHECKBUTTON_ID_STICK_ELEMENT; - checkbutton_info[i].y = ED_SETTINGS_YPOS(0); - MapCheckbuttonGadget(i); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_1) { @@ -6639,7 +6809,8 @@ static void DrawPropertiesConfig() MapCheckbuttonGadget(i); /* draw counter gadgets */ - for (i = ED_COUNTER_ID_CUSTOM_FIRST; i <= ED_COUNTER_ID_CUSTOM_LAST; i++) + for (i = ED_COUNTER_ID_CUSTOM1_FIRST; + i <= ED_COUNTER_ID_CUSTOM1_LAST; i++) MapCounterButtons(i); /* draw selectbox gadgets */ @@ -6660,11 +6831,18 @@ static void DrawPropertiesConfig() } 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++) MapCheckbuttonGadget(i); + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_CUSTOM2_FIRST; + i <= ED_COUNTER_ID_CUSTOM2_LAST; i++) + MapCounterButtons(i); + /* draw selectbox gadgets */ for (i = ED_SELECTBOX_ID_CUSTOM2_FIRST; i <= ED_SELECTBOX_ID_CUSTOM2_LAST; i++) @@ -6677,9 +6855,7 @@ static void DrawPropertiesConfig() 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); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); /* draw checkbutton gadgets */ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC); @@ -6723,9 +6899,7 @@ static void DrawPropertiesChange() int i; /* draw stickybutton gadget */ - i = ED_CHECKBUTTON_ID_STICK_ELEMENT; - checkbutton_info[i].y = ED_SETTINGS_YPOS(0); - MapCheckbuttonGadget(i); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT); /* draw checkbutton gadgets */ for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; @@ -7958,10 +8132,8 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) DrawPropertiesWindow(); } - else if ((type_id >= ED_SELECTBOX_ID_CUSTOM1_FIRST && - type_id <= ED_SELECTBOX_ID_CUSTOM1_LAST) || - (type_id >= ED_SELECTBOX_ID_CUSTOM2_FIRST && - type_id <= ED_SELECTBOX_ID_CUSTOM2_LAST) || + 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) || (type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE)) @@ -8056,13 +8228,12 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) *checkbutton_info[type_id].value ^= TRUE; - if (((type_id >= ED_CHECKBUTTON_ID_CUSTOM1_FIRST && - type_id <= ED_CHECKBUTTON_ID_CUSTOM1_LAST) || - (type_id >= ED_CHECKBUTTON_ID_CUSTOM2_FIRST && - type_id <= ED_CHECKBUTTON_ID_CUSTOM2_LAST) || - (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST && - type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) && - type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) + if (type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID || + (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && + type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) || + (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST && + type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) && + type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) { CopyElementPropertiesToGame(properties_element); }