X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=9184cc7cd62f4b9a2721ec3d290a07cc79210158;hb=4d6ea47cc83d553df014ff38a69f45a9f5ac41fa;hp=e311541abdcf975346589cb53addf1787c0c24e6;hpb=608452efc3cb8d145639e0f401d85996dfc4e698;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index e311541a..9184cc7c 100644 --- a/src/editor.c +++ b/src/editor.c @@ -640,72 +640,74 @@ #define GADGET_ID_CHECKBUTTON_FIRST (GADGET_ID_SCROLLING_LIST_FIRST + 3) #define GADGET_ID_AUTO_COUNT_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 0) -#define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 1) -#define GADGET_ID_RANDOM_QUANTITY (GADGET_ID_CHECKBUTTON_FIRST + 2) -#define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 3) -#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 4) -#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 5) -#define GADGET_ID_EM_EXPLODES_BY_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 6) -#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 7) -#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 8) -#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 9) -#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 10) -#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 11) -#define GADGET_ID_AUTO_EXIT_SOKOBAN (GADGET_ID_CHECKBUTTON_FIRST + 12) -#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 13) -#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 14) -#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 15) -#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 16) -#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_LAZY_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_MM_LASER_RED (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_MM_LASER_GREEN (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_MM_LASER_BLUE (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_DF_LASER_RED (GADGET_ID_CHECKBUTTON_FIRST + 34) -#define GADGET_ID_DF_LASER_GREEN (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_DF_LASER_BLUE (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 38) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 39) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 40) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 41) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 42) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 43) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 44) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 45) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 46) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 49) -#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 50) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 51) -#define GADGET_ID_CUSTOM_USE_TEMPLATE_1 (GADGET_ID_CHECKBUTTON_FIRST + 52) -#define GADGET_ID_CUSTOM_USE_TEMPLATE_2 (GADGET_ID_CHECKBUTTON_FIRST + 53) -#define GADGET_ID_CUSTOM_USE_TEMPLATE_3 (GADGET_ID_CHECKBUTTON_FIRST + 54) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 55) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 56) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 57) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 58) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 59) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 60) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 61) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 62) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 63) +#define GADGET_ID_USE_LEVELSET_ARTWORK (GADGET_ID_CHECKBUTTON_FIRST + 1) +#define GADGET_ID_COPY_LEVEL_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 2) +#define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 3) +#define GADGET_ID_RANDOM_QUANTITY (GADGET_ID_CHECKBUTTON_FIRST + 4) +#define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 5) +#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 6) +#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_EM_EXPLODES_BY_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_USE_SPRING_BUG (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_USE_TIME_ORB_BUG (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_RANDOM_BALL_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 11) +#define GADGET_ID_INITIAL_BALL_STATE (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_GROW_INTO_DIGGABLE (GADGET_ID_CHECKBUTTON_FIRST + 13) +#define GADGET_ID_AUTO_EXIT_SOKOBAN (GADGET_ID_CHECKBUTTON_FIRST + 14) +#define GADGET_ID_CONTINUOUS_SNAPPING (GADGET_ID_CHECKBUTTON_FIRST + 15) +#define GADGET_ID_BLOCK_SNAP_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 16) +#define GADGET_ID_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 17) +#define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_LAZY_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_MM_LASER_RED (GADGET_ID_CHECKBUTTON_FIRST + 33) +#define GADGET_ID_MM_LASER_GREEN (GADGET_ID_CHECKBUTTON_FIRST + 34) +#define GADGET_ID_MM_LASER_BLUE (GADGET_ID_CHECKBUTTON_FIRST + 35) +#define GADGET_ID_DF_LASER_RED (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_DF_LASER_GREEN (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_DF_LASER_BLUE (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 41) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 42) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 43) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 44) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 45) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 46) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 47) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 48) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 49) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 51) +#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 52) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 53) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_1 (GADGET_ID_CHECKBUTTON_FIRST + 54) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_2 (GADGET_ID_CHECKBUTTON_FIRST + 55) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_3 (GADGET_ID_CHECKBUTTON_FIRST + 56) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 57) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 58) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 59) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 60) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 61) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 62) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 63) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 64) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 65) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 64) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 66) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -907,73 +909,78 @@ /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS 0 -#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 1 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3 2 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 3 -#define ED_CHECKBUTTON_ID_STICK_ELEMENT 4 -#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 5 -#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 6 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 7 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 8 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 9 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 10 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 11 -#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN 12 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 13 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 14 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 15 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 16 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 17 -#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 18 -#define ED_CHECKBUTTON_ID_LAZY_RELOCATION 19 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 20 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 21 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 22 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 23 -#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 24 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 25 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 26 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 27 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 28 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 29 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 30 -#define ED_CHECKBUTTON_ID_MM_LASER_RED 31 -#define ED_CHECKBUTTON_ID_MM_LASER_GREEN 32 -#define ED_CHECKBUTTON_ID_MM_LASER_BLUE 33 -#define ED_CHECKBUTTON_ID_DF_LASER_RED 34 -#define ED_CHECKBUTTON_ID_DF_LASER_GREEN 35 -#define ED_CHECKBUTTON_ID_DF_LASER_BLUE 36 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 37 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1 38 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 39 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 40 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 41 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 42 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 43 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 44 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 45 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 46 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 47 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 48 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 49 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 50 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 51 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 52 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 53 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 54 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 55 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 56 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 57 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 58 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 59 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 60 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 61 - -#define ED_NUM_CHECKBUTTONS 62 +#define ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK 1 +#define ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE 2 +#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 3 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3 4 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 5 +#define ED_CHECKBUTTON_ID_STICK_ELEMENT 6 +#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 7 +#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 8 +#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 9 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 10 +#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 11 +#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 12 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 13 +#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN 14 +#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 15 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 16 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 17 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 18 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 19 +#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 20 +#define ED_CHECKBUTTON_ID_LAZY_RELOCATION 21 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 22 +#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 23 +#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 24 +#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 25 +#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 26 +#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 27 +#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 28 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 29 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 30 +#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 31 +#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 32 +#define ED_CHECKBUTTON_ID_MM_LASER_RED 33 +#define ED_CHECKBUTTON_ID_MM_LASER_GREEN 34 +#define ED_CHECKBUTTON_ID_MM_LASER_BLUE 35 +#define ED_CHECKBUTTON_ID_DF_LASER_RED 36 +#define ED_CHECKBUTTON_ID_DF_LASER_GREEN 37 +#define ED_CHECKBUTTON_ID_DF_LASER_BLUE 38 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 39 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1 40 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 41 +#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 42 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 43 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 44 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 45 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 46 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 47 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 48 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 49 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 50 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 51 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 52 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 53 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 54 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 55 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 56 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 57 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 58 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 59 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 60 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 61 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 62 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 63 + +#define ED_NUM_CHECKBUTTONS 64 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS +#define ED_CHECKBUTTON_ID_LEVELSET_FIRST ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK +#define ED_CHECKBUTTON_ID_LEVELSET_LAST ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE + #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 @@ -1093,6 +1100,7 @@ /* default value for element tile size in drawing area */ #define DEFAULT_EDITOR_TILESIZE MINI_TILESIZE +#define DEFAULT_EDITOR_TILESIZE_MM TILESIZE /* @@ -1301,6 +1309,8 @@ static struct ElementInfo custom_element; static char levelset_name[MAX_LEVEL_NAME_LEN + 1]; static char levelset_author[MAX_LEVEL_AUTHOR_LEN + 1]; static int levelset_num_levels = 100; +static boolean levelset_use_levelset_artwork = FALSE; +static boolean levelset_copy_level_template = FALSE; static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE; static struct @@ -2421,7 +2431,7 @@ static struct NULL, "game engine:", NULL, "game engine" }, { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), GADGET_ID_LEVELSET_SAVE_MODE, GADGET_ID_NONE, -1, options_levelset_save_mode, @@ -2731,7 +2741,7 @@ static struct /* ---------- level and editor settings (buttons) ------------------------ */ { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(9), + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(10), GADGET_ID_SAVE_LEVELSET, GADGET_ID_LEVELSET_SAVE_MODE, -1, "Save", NULL, NULL, NULL, "Update or create level set" @@ -2928,6 +2938,20 @@ static struct NULL, NULL, "automatically count gems needed", "set counter to number of gems" }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(7), + GADGET_ID_USE_LEVELSET_ARTWORK, GADGET_ID_NONE, + &levelset_use_levelset_artwork, + NULL, NULL, + "use current custom artwork", "use custom artwork of this level set" + }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(8), + GADGET_ID_COPY_LEVEL_TEMPLATE, GADGET_ID_NONE, + &levelset_copy_level_template, + NULL, NULL, + "copy current level template", "copy level template of this level set" + }, { ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, @@ -3691,6 +3715,7 @@ static int level_xpos = -1, level_ypos = -1; /* actual tile size used to display playfield drawing area */ static int ed_tilesize = DEFAULT_EDITOR_TILESIZE; +static int ed_tilesize_default = DEFAULT_EDITOR_TILESIZE; #define IN_ED_FIELD(x,y) IN_FIELD(x, y, ed_fieldx, ed_fieldy) @@ -8278,17 +8303,57 @@ static int getMaxEdFieldY(boolean has_scrollbar) void InitZoomLevelSettings(int zoom_tilesize) { if (zoom_tilesize == -1) - zoom_tilesize = setup.auto_setup.editor_zoom_tilesize; + { + ed_tilesize = setup.auto_setup.editor_zoom_tilesize; + ed_tilesize_default = DEFAULT_EDITOR_TILESIZE; + + if (level.game_engine_type == GAME_ENGINE_TYPE_MM) + { + ed_tilesize = DEFAULT_EDITOR_TILESIZE_MM; + ed_tilesize_default = DEFAULT_EDITOR_TILESIZE_MM; + } + } // limit zoom tilesize by upper and lower bound - zoom_tilesize = MIN(MAX(MICRO_TILESIZE, zoom_tilesize), TILESIZE); + ed_tilesize = MIN(MAX(MICRO_TILESIZE, ed_tilesize), TILESIZE); - ed_tilesize = setup.auto_setup.editor_zoom_tilesize = zoom_tilesize; + // store zoom tilesize in auto setup file only if it was manually changed + if (zoom_tilesize != -1) + setup.auto_setup.editor_zoom_tilesize = ed_tilesize; MAX_ED_FIELDX = getMaxEdFieldX(FALSE); MAX_ED_FIELDY = getMaxEdFieldY(FALSE); } +static void InitDrawingElements() +{ + static int game_engine_type_last = GAME_ENGINE_TYPE_UNKNOWN; + + if (level.game_engine_type == game_engine_type_last) + return; + + if (level.game_engine_type == GAME_ENGINE_TYPE_SP) + { + new_element1 = EL_SP_CHIP_SINGLE; + new_element2 = EL_EMPTY; + new_element3 = EL_SP_BASE; + } + else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) + { + new_element1 = EL_MM_MIRROR_START; + new_element2 = EL_EMPTY; + new_element3 = EL_MM_WOODEN_WALL; + } + else + { + new_element1 = EL_WALL; + new_element2 = EL_EMPTY; + new_element3 = EL_SAND; + } + + game_engine_type_last = level.game_engine_type; +} + static void InitLevelSetInfo() { snprintf(levelset_name, MAX_LEVEL_NAME_LEN + 1, @@ -8298,6 +8363,9 @@ static void InitLevelSetInfo() levelset_num_levels = leveldir_current->levels; + levelset_use_levelset_artwork = FALSE; + levelset_copy_level_template = FALSE; + levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE; } @@ -8390,6 +8458,7 @@ void DrawLevelEd() ClearField(); InitZoomLevelSettings(-1); + InitDrawingElements(); InitLevelSetInfo(); #if DEBUG @@ -8949,12 +9018,25 @@ static void DrawLevelInfoLevelSet_DirectoryInfo() static void DrawLevelInfoLevelSet() { + boolean artwork_exists = checkIfCustomArtworkExistsForCurrentLevelSet(); + boolean template_exists = fileExists(getLocalLevelTemplateFilename()); int i; /* draw counter gadgets */ for (i = ED_COUNTER_ID_LEVELSET_FIRST; i <= ED_COUNTER_ID_LEVELSET_LAST; i++) MapCounterButtons(i); + /* draw checkbutton gadgets */ + for (i = ED_CHECKBUTTON_ID_LEVELSET_FIRST; i <= ED_CHECKBUTTON_ID_LEVELSET_LAST; i++) + { + if (levelset_save_mode == LEVELSET_SAVE_MODE_UPDATE || + (i == ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK && !artwork_exists) || + (i == ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE && !template_exists)) + continue; + + MapCheckbuttonGadget(i); + } + /* draw selectbox gadgets */ for (i = ED_SELECTBOX_ID_LEVELSET_FIRST; i <= ED_SELECTBOX_ID_LEVELSET_LAST; i++) MapSelectboxGadget(i); @@ -12183,6 +12265,18 @@ void WrapLevel(int dx, int dy) CopyLevelToUndoBuffer(UNDO_ACCUMULATE); } +static void CopyLevelTemplateToUserLevelSet(char *levelset_subdir) +{ + char *template_filename_old = getLocalLevelTemplateFilename(); + char *template_filename_new = + getPath2(getUserLevelDir(levelset_subdir), LEVELTEMPLATE_FILENAME); + + if (copyFile(template_filename_old, template_filename_new) != 0) + Request("Cannot copy level template!", REQ_CONFIRM); + + free(template_filename_new); +} + static void HandleDrawingAreas(struct GadgetInfo *gi) { static boolean started_inside_drawing_area = FALSE; @@ -12787,13 +12881,21 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) Request("Updating level set failed!", REQ_CONFIRM); } } - else + else if (levelset_save_mode == LEVELSET_SAVE_MODE_CREATE) { + if (level.changed && !Request("Level has changed! Discard changes?", + REQ_ASK)) + return; + if (CreateUserLevelSet(levelset_subdir, levelset_name, levelset_author, - levelset_num_levels)) + levelset_num_levels, + levelset_use_levelset_artwork)) { + if (levelset_copy_level_template) + CopyLevelTemplateToUserLevelSet(levelset_subdir); + Request("New level set created!", REQ_CONFIRM); AddUserLevelSetToLevelInfo(levelset_subdir); @@ -13014,7 +13116,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } /* do not mark level as modified for certain non-level-changing gadgets */ - if ((type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST && + if ((type_id >= ED_CHECKBUTTON_ID_LEVELSET_FIRST && + type_id <= ED_CHECKBUTTON_ID_LEVELSET_LAST) || + (type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST && type_id <= ED_CHECKBUTTON_ID_EDITOR_LAST) || type_id == ED_CHECKBUTTON_ID_STICK_ELEMENT) return; @@ -13263,7 +13367,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) case GADGET_ID_ZOOM: // zoom level editor tile size in or out (or reset to default size) ed_tilesize = (button == 1 ? ed_tilesize * 2 : - button == 2 ? DEFAULT_EDITOR_TILESIZE : + button == 2 ? ed_tilesize_default : button == 3 ? ed_tilesize / 2 : ed_tilesize); // limit zoom level by upper and lower bound