X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=af251d33341060df607549939c1b98f0e5dd9813;hb=5216f629803d5255919cadc2419fb1e798812ae2;hp=40181b77eeaa83a82c46dcf1b9e9b0df32d4029d;hpb=b876f418a4aaf55280b4b5da38c175997be01360;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 40181b77..af251d33 100644 --- a/src/editor.c +++ b/src/editor.c @@ -159,7 +159,7 @@ ED_GADGET_DISTANCE) /* extended custom change target */ #define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX) -#define ED_AREA_ELEM_CONTENT6_YPOS (ED_SETTINGS_YPOS(9) + \ +#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) @@ -439,29 +439,32 @@ /* selectbox identifiers */ #define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_AREA_FIRST + 1) -#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 0) -#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 1) -#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 2) -#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 3) -#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 4) -#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5) -#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 6) -#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 7) -#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 8) -#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 9) -#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 10) -#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 11) -#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 12) -#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 13) -#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 14) -#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 15) -#define GADGET_ID_CHANGE_SIDES (GADGET_ID_SELECTBOX_FIRST + 16) -#define GADGET_ID_CHANGE_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) +#define GADGET_ID_TIME_OR_STEPS (GADGET_ID_SELECTBOX_FIRST + 0) +#define GADGET_ID_CUSTOM_WALK_TO_ACTION (GADGET_ID_SELECTBOX_FIRST + 1) +#define GADGET_ID_CUSTOM_CONSISTENCY (GADGET_ID_SELECTBOX_FIRST + 2) +#define GADGET_ID_CUSTOM_DEADLINESS (GADGET_ID_SELECTBOX_FIRST + 3) +#define GADGET_ID_CUSTOM_MOVE_PATTERN (GADGET_ID_SELECTBOX_FIRST + 4) +#define GADGET_ID_CUSTOM_MOVE_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 5) +#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 6) +#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 7) +#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 8) +#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 9) +#define GADGET_ID_CUSTOM_ACCESS_TYPE (GADGET_ID_SELECTBOX_FIRST + 10) +#define GADGET_ID_CUSTOM_ACCESS_LAYER (GADGET_ID_SELECTBOX_FIRST + 11) +#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 12) +#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 13) +#define GADGET_ID_CHANGE_TIME_UNITS (GADGET_ID_SELECTBOX_FIRST + 14) +#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 15) +#define GADGET_ID_CHANGE_OTHER_ACTION (GADGET_ID_SELECTBOX_FIRST + 16) +#define GADGET_ID_CHANGE_SIDE (GADGET_ID_SELECTBOX_FIRST + 17) +#define GADGET_ID_CHANGE_PLAYER (GADGET_ID_SELECTBOX_FIRST + 18) +#define GADGET_ID_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 19) +#define GADGET_ID_CHANGE_POWER (GADGET_ID_SELECTBOX_FIRST + 20) +#define GADGET_ID_SELECT_CHANGE_PAGE (GADGET_ID_SELECTBOX_FIRST + 21) +#define GADGET_ID_GROUP_CHOICE_MODE (GADGET_ID_SELECTBOX_FIRST + 22) /* textbutton identifiers */ -#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 20) +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 23) #define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) #define GADGET_ID_PROPERTIES_CONFIG (GADGET_ID_TEXTBUTTON_FIRST + 1) @@ -508,31 +511,33 @@ #define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) #define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 8) #define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_CUSTOM_EXPLODE_RESULT (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 33) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 34) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -625,28 +630,34 @@ #define ED_TEXTAREA_ID_LEVEL_LAST ED_TEXTAREA_ID_ENVELOPE /* values for selectbox gadgets */ -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 0 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 1 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 2 -#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 3 -#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 4 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 5 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 6 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 7 -#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 8 -#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 9 -#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 10 -#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 11 -#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 12 -#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 13 -#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 14 -#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 15 -#define ED_SELECTBOX_ID_CHANGE_SIDES 16 -#define ED_SELECTBOX_ID_CHANGE_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_TIME_OR_STEPS 0 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE 1 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER 2 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED 3 +#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION 4 +#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION 5 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN 6 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION 7 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE 8 +#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 9 +#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS 10 +#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE 11 +#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS 12 +#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY 13 +#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS 14 +#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION 15 +#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION 16 +#define ED_SELECTBOX_ID_CHANGE_SIDE 17 +#define ED_SELECTBOX_ID_CHANGE_PLAYER 18 +#define ED_SELECTBOX_ID_CHANGE_PAGE 19 +#define ED_SELECTBOX_ID_CHANGE_POWER 20 +#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE 21 +#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE 22 + +#define ED_NUM_SELECTBOX 23 + +#define ED_SELECTBOX_ID_LEVEL_FIRST ED_SELECTBOX_ID_TIME_OR_STEPS +#define ED_SELECTBOX_ID_LEVEL_LAST ED_SELECTBOX_ID_TIME_OR_STEPS #define ED_SELECTBOX_ID_CUSTOM1_FIRST ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE #define ED_SELECTBOX_ID_CUSTOM1_LAST ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE @@ -694,30 +705,32 @@ #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_CAN_FALL_INTO_ACID 8 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 9 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 10 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 11 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 12 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 13 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 14 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 15 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 16 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 17 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 18 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 19 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT 20 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 21 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 22 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 23 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 24 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 25 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 26 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 27 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 28 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 29 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 30 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 31 + +#define ED_NUM_CHECKBUTTONS 32 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -909,7 +922,7 @@ static struct GADGET_ID_LEVEL_GEMSLIMIT_DOWN, GADGET_ID_LEVEL_GEMSLIMIT_UP, GADGET_ID_LEVEL_GEMSLIMIT_TEXT, GADGET_ID_NONE, &level.gems_needed, - "number of emeralds to collect:", NULL, NULL + "number of gems to collect:", NULL, NULL }, { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(4), @@ -917,7 +930,7 @@ static struct GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP, GADGET_ID_LEVEL_TIMELIMIT_TEXT, GADGET_ID_NONE, &level.time, - "time available to solve level:", NULL, "(0 => no time limit)" + "time or step limit to solve level:", NULL, NULL }, { ED_SETTINGS_XPOS(0), ED_COUNTER_YPOS(5), @@ -925,7 +938,7 @@ static struct GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, GADGET_ID_NONE, &level.score[SC_TIME_BONUS], - "score for each 10 seconds left:", NULL, NULL + "score for each 10 sec/steps left:", NULL, NULL }, { ED_SETTINGS_XPOS(0), ED_COUNTER2_YPOS(8), @@ -1071,7 +1084,7 @@ static struct NULL, "+random", NULL }, { - ED_SETTINGS_XPOS(3), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(3), ED_SETTINGS_YPOS(12), 0, 100, GADGET_ID_CHANGE_CONT_RND_DOWN, GADGET_ID_CHANGE_CONT_RND_UP, GADGET_ID_CHANGE_CONT_RND_TEXT, GADGET_ID_NONE, @@ -1130,10 +1143,19 @@ static struct } }; +static struct ValueTextInfo options_time_or_steps[] = +{ + { 0, "seconds" }, + { 1, "steps" }, + + { -1, NULL } +}; + static struct ValueTextInfo options_access_type[] = { { EP_WALKABLE, "walkable" }, { EP_PASSABLE, "passable" }, + { -1, NULL } }; @@ -1142,6 +1164,7 @@ static struct ValueTextInfo options_access_layer[] = { EP_ACCESSIBLE_OVER, "over" }, { EP_ACCESSIBLE_INSIDE, "inside" }, { EP_ACCESSIBLE_UNDER, "under" }, + { -1, NULL } }; @@ -1149,6 +1172,7 @@ static struct ValueTextInfo options_access_protected[] = { { 0, "unprotected" }, { 1, "protected" }, + { -1, NULL } }; @@ -1169,6 +1193,7 @@ static struct ValueTextInfo options_access_direction[] = { MV_VERTICAL | MV_LEFT, "vertical + left" }, { MV_VERTICAL | MV_RIGHT, "vertical + right" }, { MV_ALL_DIRECTIONS, "all directions" }, + { -1, NULL } }; @@ -1178,6 +1203,7 @@ static struct ValueTextInfo options_walk_to_action[] = { EP_COLLECTIBLE_ONLY, "collectible" }, { EP_DROPPABLE, "collectible & droppable" }, { EP_PUSHABLE, "pushable" }, + { -1, NULL } }; @@ -1203,6 +1229,7 @@ static struct ValueTextInfo options_move_pattern[] = { MV_WHEN_DROPPED, "when dropped" }, { MV_MAZE_RUNNER, "maze runner style" }, { MV_MAZE_HUNTER, "maze hunter style" }, + { -1, NULL } }; @@ -1215,6 +1242,7 @@ static struct ValueTextInfo options_move_direction[] = { MV_START_DOWN, "down" }, { MV_START_RANDOM, "random" }, { MV_START_PREVIOUS, "previous" }, + { -1, NULL } }; @@ -1225,6 +1253,7 @@ static struct ValueTextInfo options_move_stepsize[] = { 4, "normal" }, { 8, "fast" }, { 16, "very fast" }, + { -1, NULL } }; @@ -1232,6 +1261,7 @@ static struct ValueTextInfo options_move_leave_type[] = { { LEAVE_TYPE_UNLIMITED, "leave behind" }, { LEAVE_TYPE_LIMITED, "change it to" }, + { -1, NULL } }; @@ -1242,6 +1272,7 @@ static struct ValueTextInfo options_smash_targets[] = { EP_CAN_SMASH_ENEMIES, "enemies" }, #endif { EP_CAN_SMASH_EVERYTHING, "everything" }, + { -1, NULL } }; @@ -1252,6 +1283,7 @@ static struct ValueTextInfo options_slippery_type[] = { SLIPPERY_ANY_RIGHT_LEFT, "right, left" }, { SLIPPERY_ONLY_LEFT, "only left" }, { SLIPPERY_ONLY_RIGHT, "only right" }, + { -1, NULL } }; @@ -1260,6 +1292,7 @@ static struct ValueTextInfo options_deadliness[] = { EP_DONT_RUN_INTO, "running into" }, { EP_DONT_COLLIDE_WITH, "colliding with" }, { EP_DONT_TOUCH, "touching" }, + { -1, NULL } }; @@ -1269,6 +1302,7 @@ static struct ValueTextInfo options_consistency[] = { EP_CAN_EXPLODE_DYNA, "can explode 3+3" }, { EP_CAN_EXPLODE_1X1, "can explode 1x1" }, { EP_INDESTRUCTIBLE, "indestructible" }, + { -1, NULL } }; @@ -1276,6 +1310,7 @@ static struct ValueTextInfo options_time_units[] = { { 1, "frames" }, { FRAMES_PER_SECOND, "seconds" }, + { -1, NULL } }; @@ -1296,6 +1331,7 @@ static struct ValueTextInfo options_change_direct_action[] = #endif { CE_IMPACT, "impact (on something)" }, { CE_SMASHED, "smashed (from above)" }, + { -1, NULL } }; @@ -1315,20 +1351,72 @@ static struct ValueTextInfo options_change_other_action[] = { CE_OTHER_GETS_HIT, "hit by ..." }, #endif { CE_OTHER_IS_SWITCHING, "switch of ..." }, - { CE_OTHER_IS_CHANGING, "change of" }, + { CE_OTHER_IS_CHANGING, "change by page of" }, { CE_OTHER_IS_EXPLODING, "explosion of" }, + { -1, NULL } }; -static struct ValueTextInfo options_change_sides[] = +static struct ValueTextInfo options_change_trigger_side[] = { - { CH_SIDE_LEFT, "left side" }, - { CH_SIDE_RIGHT, "right side" }, - { CH_SIDE_TOP, "top side" }, - { CH_SIDE_BOTTOM, "bottom side" }, - { CH_SIDE_LEFT_RIGHT, "left/right side" }, - { CH_SIDE_TOP_BOTTOM, "top/bottom side" }, - { CH_SIDE_ANY, "any side" }, + { CH_SIDE_LEFT, "left" }, + { CH_SIDE_RIGHT, "right" }, + { CH_SIDE_TOP, "top" }, + { CH_SIDE_BOTTOM, "bottom" }, + { CH_SIDE_LEFT_RIGHT, "left/right" }, + { CH_SIDE_TOP_BOTTOM, "top/bottom" }, + { CH_SIDE_ANY, "any" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_change_trigger_player[] = +{ + { CH_PLAYER_1, "1" }, + { CH_PLAYER_2, "2" }, + { CH_PLAYER_3, "3" }, + { CH_PLAYER_4, "4" }, + { CH_PLAYER_ANY, "any" }, + + { -1, NULL } +}; + +static struct ValueTextInfo options_change_trigger_page[] = +{ + { (1 << 0), "1" }, + { (1 << 1), "2" }, + { (1 << 2), "3" }, + { (1 << 3), "4" }, + { (1 << 4), "5" }, + { (1 << 5), "6" }, + { (1 << 6), "7" }, + { (1 << 7), "8" }, + { (1 << 8), "9" }, + { (1 << 9), "10" }, + { (1 << 10), "11" }, + { (1 << 11), "12" }, + { (1 << 12), "13" }, + { (1 << 13), "14" }, + { (1 << 14), "15" }, + { (1 << 15), "16" }, + { (1 << 16), "17" }, + { (1 << 17), "18" }, + { (1 << 18), "19" }, + { (1 << 19), "20" }, + { (1 << 20), "21" }, + { (1 << 21), "22" }, + { (1 << 22), "23" }, + { (1 << 23), "24" }, + { (1 << 24), "25" }, + { (1 << 25), "26" }, + { (1 << 26), "27" }, + { (1 << 27), "28" }, + { (1 << 28), "29" }, + { (1 << 29), "30" }, + { (1 << 30), "31" }, + { (1 << 31), "32" }, + { CH_PAGE_ANY, "any" }, + { -1, NULL } }; @@ -1337,6 +1425,7 @@ static struct ValueTextInfo options_change_power[] = { CP_NON_DESTRUCTIVE, "empty" }, { CP_HALF_DESTRUCTIVE, "diggable" }, { CP_FULL_DESTRUCTIVE, "destructible" }, + { -1, NULL } }; @@ -1353,6 +1442,7 @@ static struct ValueTextInfo options_group_choice_mode[] = { ANIM_LINEAR, "linear" }, { ANIM_PINGPONG, "pingpong" }, { ANIM_PINGPONG2, "pingpong 2" }, + { -1, NULL } }; @@ -1367,6 +1457,17 @@ static struct char *text_left, *text_right, *infotext; } selectbox_info[ED_NUM_SELECTBOX] = { + /* ---------- level and editor settings ---------------------------------- */ + + { + -1, ED_COUNTER_YPOS(4), + GADGET_ID_TIME_OR_STEPS, GADGET_ID_LEVEL_TIMELIMIT_UP, + -1, + options_time_or_steps, + &level.use_step_counter, + NULL, "(0 => no limit)", "time or step limit" + }, + /* ---------- element settings: configure 1 (custom elements) ----------- */ { @@ -1505,14 +1606,30 @@ static struct }, { ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(6), - GADGET_ID_CHANGE_SIDES, GADGET_ID_NONE, + GADGET_ID_CHANGE_SIDE, GADGET_ID_NONE, -1, - options_change_sides, - &custom_element_change.sides, - "... at", NULL, "element side that causes change" + options_change_trigger_side, + &custom_element_change.trigger_side, + "... at", "side", "element side that causes change" }, { - ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(9), + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7), + GADGET_ID_CHANGE_PLAYER, GADGET_ID_NONE, + -1, + options_change_trigger_player, + &custom_element_change.trigger_player, + "player:", " ", "player that causes change" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(7), + GADGET_ID_CHANGE_PAGE, GADGET_ID_CHANGE_PLAYER, + -1, + options_change_trigger_page, + &custom_element_change.trigger_page, + "page:", NULL, "change page that causes change" + }, + { + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), GADGET_ID_CHANGE_POWER, GADGET_ID_NONE, -1, options_change_power, @@ -1520,7 +1637,7 @@ static struct "replace when", NULL, "which elements can be replaced" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(13), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(14), GADGET_ID_SELECT_CHANGE_PAGE, GADGET_ID_NONE, 3, options_change_page, @@ -1608,13 +1725,13 @@ static struct " ", "As Template", "Save current settings as new template" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE, -1, "New", " ", NULL, "Add new change page" }, { - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE, -1, "Delete", NULL, NULL, "Delete current change page" @@ -1633,14 +1750,14 @@ static struct { { ED_BUTTON_MINUS_XPOS, ED_BUTTON_COUNT_YPOS, - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(13), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(14), ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE, GADGET_ID_PREV_CHANGE_PAGE, GADGET_ID_NONE, NULL, NULL, "select previous change page" }, { ED_BUTTON_PLUS_XPOS, ED_BUTTON_COUNT_YPOS, - -1, ED_SETTINGS_YPOS(13), + -1, ED_SETTINGS_YPOS(14), ED_BUTTON_COUNT_XSIZE, ED_BUTTON_COUNT_YSIZE, GADGET_ID_NEXT_CHANGE_PAGE, GADGET_ID_SELECT_CHANGE_PAGE, NULL, "change page", "select next change page" @@ -1811,19 +1928,26 @@ static struct "use spring pushing bug", "use odd spring pushing behaviour" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.block_last_field, NULL, "block last field when moving", "player blocks last field when moving" }, { - ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), GADGET_ID_SP_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.sp_block_last_field, NULL, "block last field when moving", "player blocks last field when moving" }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), + GADGET_ID_CAN_FALL_INTO_ACID, GADGET_ID_NONE, + &custom_element_properties[EP_CAN_MOVE_INTO_ACID], + NULL, + "can fall into acid (with gravity)","player can fall into acid pool" + }, { ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(0), GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE, @@ -1831,6 +1955,13 @@ static struct NULL, "can move into acid", "element can move into acid pool" }, + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(1), + GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_NONE, + &custom_element_properties[EP_DONT_COLLIDE_WITH], + NULL, + "deadly when colliding with", "element is deadly when hitting player" + }, /* ---------- element settings: configure 1 (custom elements) ----------- */ @@ -1943,25 +2074,25 @@ static struct NULL, NULL, "element changes by other element" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(7), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE, &custom_element_change.explode, NULL, "explode instead of change", "element explodes instead of change" }, { - ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(8), + ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(9), GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE, &custom_element_change.use_content, NULL, "use extended change target:","element changes to more elements" }, { - ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(10), + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE, &custom_element_change.only_complete, NULL, "replace all or nothing", "only replace when all can be changed" }, { - ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(11), + ED_SETTINGS_XPOS(2), ED_SETTINGS_YPOS(12), GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE, &custom_element_change.use_random_change, NULL, NULL, "use percentage for random replace" @@ -5095,8 +5226,7 @@ static void MapCheckbuttonGadget(int id) 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) + if (id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID) ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END); y = gi->y + yoffset; @@ -5411,7 +5541,7 @@ static void copy_custom_element_settings(int element_from, int element_to) change_to->can_change = change_from->can_change; - change_to->sides = change_from->sides; + change_to->trigger_side = change_from->trigger_side; } #endif @@ -5668,10 +5798,13 @@ static void CopyGroupElementPropertiesToEditor(int element) static void CopyClassicElementPropertiesToEditor(int element) { #if 1 - if (COULD_MOVE_INTO_ACID(element)) + if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element)) custom_element_properties[EP_CAN_MOVE_INTO_ACID] = getMoveIntoAcidProperty(&level, element); + if (MAYBE_DONT_COLLIDE_WITH(element)) + custom_element_properties[EP_DONT_COLLIDE_WITH] = + getDontCollideWithProperty(&level, element); #else if (COULD_MOVE_INTO_ACID(element)) @@ -5680,7 +5813,7 @@ static void CopyClassicElementPropertiesToEditor(int element) if (bit_nr > -1) custom_element_properties[EP_CAN_MOVE_INTO_ACID] = - ((level.can_move_into_acid & (1 << bit_nr)) != 0); + ((level.can_move_into_acid_bits & (1 << bit_nr)) != 0); } #endif } @@ -5844,10 +5977,13 @@ static void CopyGroupElementPropertiesToGame(int element) static void CopyClassicElementPropertiesToGame(int element) { #if 1 - if (COULD_MOVE_INTO_ACID(element)) + if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element)) setMoveIntoAcidProperty(&level, element, custom_element_properties[EP_CAN_MOVE_INTO_ACID]); + if (MAYBE_DONT_COLLIDE_WITH(element)) + setDontCollideWithProperty(&level, element, + custom_element_properties[EP_DONT_COLLIDE_WITH]); #else if (COULD_MOVE_INTO_ACID(element)) @@ -5856,10 +5992,10 @@ static void CopyClassicElementPropertiesToGame(int element) if (bit_nr > -1) { - level.can_move_into_acid &= ~(1 << bit_nr); + level.can_move_into_acid_bits &= ~(1 << bit_nr); if (custom_element_properties[EP_CAN_MOVE_INTO_ACID]) - level.can_move_into_acid |= (1 << bit_nr); + level.can_move_into_acid_bits |= (1 << bit_nr); } } #endif @@ -6169,6 +6305,10 @@ static void DrawLevelInfoWindow() for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++) MapCounterButtons(i); + /* draw selectbox gadgets */ + for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++) + MapSelectboxGadget(i); + /* draw checkbutton gadgets */ for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++) MapCheckbuttonGadget(i); @@ -6710,7 +6850,7 @@ static boolean checkPropertiesConfig(int element) ELEM_IS_PLAYER(element) || HAS_CONTENT(element) || COULD_MOVE_INTO_ACID(element) || - element == EL_SPRING) + MAYBE_DONT_COLLIDE_WITH(element)) return TRUE; else for (i = 0; elements_with_counter[i].element != -1; i++) @@ -6740,6 +6880,7 @@ static void DrawPropertiesConfig() counterbutton_info[counter_id].y = ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) + + (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0)+ (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0)); counterbutton_info[counter_id].value = elements_with_counter[i].value; @@ -6763,9 +6904,12 @@ static void DrawPropertiesConfig() } if (ELEM_IS_PLAYER(properties_element)) + { + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID); MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ? ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD : ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD); + } if (IS_GEM(properties_element)) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS); @@ -6774,6 +6918,7 @@ static void DrawPropertiesConfig() (!IS_CUSTOM_ELEMENT(properties_element) || edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)) { + /* set position for special checkbutton for "can move into acid" */ 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); @@ -6781,6 +6926,9 @@ static void DrawPropertiesConfig() MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID); } + if (MAYBE_DONT_COLLIDE_WITH(properties_element)) + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH); + if (properties_element == EL_SPRING) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG); @@ -6835,8 +6983,6 @@ 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++) @@ -8244,7 +8390,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) *checkbutton_info[type_id].value ^= TRUE; - if (type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID || + if (type_id == ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID || + type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID || + type_id == ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH || (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) || (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&