X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=4dce1f20be6c85f50c41abd25f13f80602862f6e;hp=54bf0c0095212ea7e426e90dce53b73d09cca067;hb=51fac215ea420ec5bc559d49300e3f871203f134;hpb=d0893bbe2c52d482fd5dab425d46373ac969c479 diff --git a/src/editor.c b/src/editor.c index 54bf0c00..4dce1f20 100644 --- a/src/editor.c +++ b/src/editor.c @@ -97,27 +97,31 @@ #define ED_TABBUTTON_XSIZE (graphic_info[IMG_EDITOR_TABBUTTON].width) #define ED_TABBUTTON_YSIZE (graphic_info[IMG_EDITOR_TABBUTTON].height) -#define ED_LEVEL_SETTINGS_TABS_X (editor.settings.tabs.x) -#define ED_LEVEL_SETTINGS_TABS_Y (editor.settings.tabs.y) -#define ED_ELEMENT_SETTINGS_TABS_X (editor.settings.tabs.x) -#define ED_ELEMENT_SETTINGS_TABS_Y (editor.settings.tabs.y + \ +#define ED_SETTINGS_LEVEL_TABS_X (editor.settings.tabs.x) +#define ED_SETTINGS_LEVEL_TABS_Y (editor.settings.tabs.y) +#define ED_SETTINGS_ELEMENT_TABS_X (editor.settings.tabs.x) +#define ED_SETTINGS_ELEMENT_TABS_Y (editor.settings.tabs.y + \ editor.settings.tabs.yoffset2) #define ED_SETTINGS_TABS_XOFFSET (editor.settings.tabs.draw_xoffset) #define ED_SETTINGS_TABS_YOFFSET (editor.settings.tabs.draw_yoffset) -#define ED_LEVEL_SETTINGS_XSTART (ED_LEVEL_SETTINGS_TABS_X + \ +#define ED_LEVEL_TABS_XSTART (ED_SETTINGS_LEVEL_TABS_X) +#define ED_LEVEL_TABS_YSTART (ED_SETTINGS_LEVEL_TABS_Y) +#define ED_LEVEL_SETTINGS_XSTART (ED_SETTINGS_LEVEL_TABS_X + \ ED_SETTINGS_TABS_XOFFSET) -#define ED_LEVEL_SETTINGS_YSTART (ED_LEVEL_SETTINGS_TABS_Y + \ +#define ED_LEVEL_SETTINGS_YSTART (ED_SETTINGS_LEVEL_TABS_Y + \ ED_TABBUTTON_YSIZE + \ ED_GADGET_TINY_DISTANCE + \ ED_TAB_BAR_HEIGHT + \ ED_SETTINGS_TABS_YOFFSET + \ getFontHeight(FONT_TEXT_1) + \ ED_GADGET_TEXT_DISTANCE) -#define ED_ELEMENT_SETTINGS_XSTART (ED_ELEMENT_SETTINGS_TABS_X + \ +#define ED_ELEMENT_TABS_XSTART (ED_SETTINGS_ELEMENT_TABS_X) +#define ED_ELEMENT_TABS_YSTART (ED_SETTINGS_ELEMENT_TABS_Y) +#define ED_ELEMENT_SETTINGS_XSTART (ED_SETTINGS_ELEMENT_TABS_X + \ ED_SETTINGS_TABS_XOFFSET) -#define ED_ELEMENT_SETTINGS_YSTART (ED_ELEMENT_SETTINGS_TABS_Y + \ +#define ED_ELEMENT_SETTINGS_YSTART (ED_SETTINGS_ELEMENT_TABS_Y + \ ED_TABBUTTON_YSIZE + \ ED_GADGET_TINY_DISTANCE + \ ED_TAB_BAR_HEIGHT + \ @@ -128,62 +132,99 @@ #define ED_SETTINGS_YOFFSET (ED_CHECKBUTTON_YSIZE + \ ED_GADGET_LINE_DISTANCE) -#define ED_POS_LEVEL_SETTINGS_RANGE (10000) -#define ED_POS_LEVEL_SETTINGS_FIRST (1 * ED_POS_LEVEL_SETTINGS_RANGE) -#define ED_POS_LEVEL_SETTINGS_LAST (2 * ED_POS_LEVEL_SETTINGS_RANGE - 1) -#define ED_POS_ELEMENT_SETTINGS_FIRST (2 * ED_POS_LEVEL_SETTINGS_RANGE) -#define ED_POS_ELEMENT_SETTINGS_LAST (3 * ED_POS_LEVEL_SETTINGS_RANGE - 1) +#define ED_POS_RANGE (10000) +#define ED_POS_LEVEL_TABS_FIRST (1 * ED_POS_RANGE) +#define ED_POS_LEVEL_TABS_LAST (2 * ED_POS_RANGE - 1) +#define ED_POS_LEVEL_SETTINGS_FIRST (2 * ED_POS_RANGE) +#define ED_POS_LEVEL_SETTINGS_LAST (3 * ED_POS_RANGE - 1) +#define ED_POS_ELEMENT_TABS_FIRST (3 * ED_POS_RANGE) +#define ED_POS_ELEMENT_TABS_LAST (4 * ED_POS_RANGE - 1) +#define ED_POS_ELEMENT_SETTINGS_FIRST (4 * ED_POS_RANGE) +#define ED_POS_ELEMENT_SETTINGS_LAST (5 * ED_POS_RANGE - 1) + +#define ED_LEVEL_TABS_XPOS(n) (ED_POS_LEVEL_TABS_FIRST + (n)) +#define ED_LEVEL_TABS_YPOS(n) (ED_POS_LEVEL_TABS_FIRST + (n)) #define ED_LEVEL_SETTINGS_XPOS(n) (ED_POS_LEVEL_SETTINGS_FIRST + (n)) #define ED_LEVEL_SETTINGS_YPOS(n) (ED_POS_LEVEL_SETTINGS_FIRST + (n)) +#define ED_ELEMENT_TABS_XPOS(n) (ED_POS_ELEMENT_TABS_FIRST + (n)) +#define ED_ELEMENT_TABS_YPOS(n) (ED_POS_ELEMENT_TABS_FIRST + (n)) + #define ED_ELEMENT_SETTINGS_XPOS(n) (ED_POS_ELEMENT_SETTINGS_FIRST + (n)) #define ED_ELEMENT_SETTINGS_YPOS(n) (ED_POS_ELEMENT_SETTINGS_FIRST + (n)) +#define IS_POS_LEVEL_TABS(n) ((n) >= ED_POS_LEVEL_TABS_FIRST && \ + (n) <= ED_POS_LEVEL_TABS_LAST) #define IS_POS_LEVEL_SETTINGS(n) ((n) >= ED_POS_LEVEL_SETTINGS_FIRST && \ (n) <= ED_POS_LEVEL_SETTINGS_LAST) +#define IS_POS_ELEMENT_TABS(n) ((n) >= ED_POS_ELEMENT_TABS_FIRST && \ + (n) <= ED_POS_ELEMENT_TABS_LAST) #define IS_POS_ELEMENT_SETTINGS(n) ((n) >= ED_POS_ELEMENT_SETTINGS_FIRST && \ (n) <= ED_POS_ELEMENT_SETTINGS_LAST) +#define ED_LEVEL_TABS_LINE(n) ((n) - ED_POS_LEVEL_TABS_FIRST) #define ED_LEVEL_SETTINGS_LINE(n) ((n) - ED_POS_LEVEL_SETTINGS_FIRST) +#define ED_ELEMENT_TABS_LINE(n) ((n) - ED_POS_ELEMENT_TABS_FIRST) #define ED_ELEMENT_SETTINGS_LINE(n) ((n) - ED_POS_ELEMENT_SETTINGS_FIRST) +#define ED_LEVEL_TABS_X(n) (ED_LEVEL_TABS_XSTART + \ + (n) * ED_SETTINGS_TABS_XOFFSET) +#define ED_LEVEL_TABS_Y(n) (ED_LEVEL_TABS_YSTART + \ + (n) * ED_SETTINGS_TABS_YOFFSET) + #define ED_LEVEL_SETTINGS_X(n) (ED_LEVEL_SETTINGS_XSTART + \ (n) * ED_SETTINGS_XOFFSET) #define ED_LEVEL_SETTINGS_Y(n) (ED_LEVEL_SETTINGS_YSTART + \ (n) * ED_SETTINGS_YOFFSET) +#define ED_ELEMENT_TABS_X(n) (ED_ELEMENT_TABS_XSTART + \ + (n) * ED_SETTINGS_TABS_XOFFSET) +#define ED_ELEMENT_TABS_Y(n) (ED_ELEMENT_TABS_YSTART + \ + (n) * ED_SETTINGS_TABS_YOFFSET) + #define ED_ELEMENT_SETTINGS_X(n) (ED_ELEMENT_SETTINGS_XSTART + \ (n) * ED_SETTINGS_XOFFSET) #define ED_ELEMENT_SETTINGS_Y(n) (ED_ELEMENT_SETTINGS_YSTART + \ (n) * ED_SETTINGS_YOFFSET) +#define ED_POS_TO_LEVEL_TABS_X(n) \ + (ED_LEVEL_TABS_X(ED_LEVEL_TABS_LINE(n))) +#define ED_POS_TO_LEVEL_TABS_Y(n) \ + (ED_LEVEL_TABS_Y(ED_LEVEL_TABS_LINE(n))) + #define ED_POS_TO_LEVEL_SETTINGS_X(n) \ (ED_LEVEL_SETTINGS_X(ED_LEVEL_SETTINGS_LINE(n))) #define ED_POS_TO_LEVEL_SETTINGS_Y(n) \ (ED_LEVEL_SETTINGS_Y(ED_LEVEL_SETTINGS_LINE(n))) +#define ED_POS_TO_ELEMENT_TABS_X(n) \ + (ED_ELEMENT_TABS_X(ED_ELEMENT_TABS_LINE(n))) +#define ED_POS_TO_ELEMENT_TABS_Y(n) \ + (ED_ELEMENT_TABS_Y(ED_ELEMENT_TABS_LINE(n))) + #define ED_POS_TO_ELEMENT_SETTINGS_X(n) \ (ED_ELEMENT_SETTINGS_X(ED_ELEMENT_SETTINGS_LINE(n))) #define ED_POS_TO_ELEMENT_SETTINGS_Y(n) \ (ED_ELEMENT_SETTINGS_Y(ED_ELEMENT_SETTINGS_LINE(n))) -#define ED_SETTINGS_X(n) (IS_POS_LEVEL_SETTINGS(n) ? \ +#define ED_SETTINGS_X(n) (IS_POS_LEVEL_TABS(n) ? \ + ED_POS_TO_LEVEL_TABS_X(n) : \ + IS_POS_LEVEL_SETTINGS(n) ? \ ED_POS_TO_LEVEL_SETTINGS_X(n) : \ + IS_POS_ELEMENT_TABS(n) ? \ + ED_POS_TO_ELEMENT_TABS_X(n) : \ IS_POS_ELEMENT_SETTINGS(n) ? \ ED_POS_TO_ELEMENT_SETTINGS_X(n) : (n)) -#define ED_SETTINGS_Y(n) (IS_POS_LEVEL_SETTINGS(n) ? \ +#define ED_SETTINGS_Y(n) (IS_POS_LEVEL_TABS(n) ? \ + ED_POS_TO_LEVEL_TABS_Y(n) : \ + IS_POS_LEVEL_SETTINGS(n) ? \ ED_POS_TO_LEVEL_SETTINGS_Y(n) : \ + IS_POS_ELEMENT_TABS(n) ? \ + ED_POS_TO_ELEMENT_TABS_Y(n) : \ IS_POS_ELEMENT_SETTINGS(n) ? \ ED_POS_TO_ELEMENT_SETTINGS_Y(n) : (n)) -#define ED_TAB_SETTINGS_X(n) (IS_POS_LEVEL_SETTINGS(n) ? \ - ED_LEVEL_SETTINGS_TABS_X : \ - ED_ELEMENT_SETTINGS_TABS_X) -#define ED_TAB_SETTINGS_Y(n) (IS_POS_LEVEL_SETTINGS(n) ? \ - ED_LEVEL_SETTINGS_TABS_Y : \ - ED_ELEMENT_SETTINGS_TABS_Y) - #define ED_SETTINGS_XOFF(n) (5 * ((n) % 4) * \ ED_DRAWINGAREA_TILE_SIZE) #define ED_SETTINGS_YOFF(n) (5 * ((n) / 4) * \ @@ -553,12 +594,13 @@ #define GADGET_ID_PROPERTIES_CONFIG_1 (GADGET_ID_TEXTBUTTON_FIRST + 4) #define GADGET_ID_PROPERTIES_CONFIG_2 (GADGET_ID_TEXTBUTTON_FIRST + 5) #define GADGET_ID_PROPERTIES_CHANGE (GADGET_ID_TEXTBUTTON_FIRST + 6) -#define GADGET_ID_SAVE_AS_TEMPLATE (GADGET_ID_TEXTBUTTON_FIRST + 7) -#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 8) -#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 9) +#define GADGET_ID_SAVE_AS_TEMPLATE_1 (GADGET_ID_TEXTBUTTON_FIRST + 7) +#define GADGET_ID_SAVE_AS_TEMPLATE_2 (GADGET_ID_TEXTBUTTON_FIRST + 8) +#define GADGET_ID_ADD_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 9) +#define GADGET_ID_DEL_CHANGE_PAGE (GADGET_ID_TEXTBUTTON_FIRST + 10) /* graphicbutton identifiers */ -#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 10) +#define GADGET_ID_GRAPHICBUTTON_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 11) #define GADGET_ID_PREV_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 0) #define GADGET_ID_NEXT_CHANGE_PAGE (GADGET_ID_GRAPHICBUTTON_FIRST + 1) @@ -630,19 +672,21 @@ #define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 42) #define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 43) #define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 44) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 45) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 46) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 49) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 50) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 51) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 52) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 53) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 54) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_1 (GADGET_ID_CHECKBUTTON_FIRST + 45) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_2 (GADGET_ID_CHECKBUTTON_FIRST + 46) +#define GADGET_ID_CUSTOM_USE_TEMPLATE_3 (GADGET_ID_CHECKBUTTON_FIRST + 47) +#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 48) +#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 49) +#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 50) +#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 51) +#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 52) +#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 53) +#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 54) +#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 55) +#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 56) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 55) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 57) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -801,17 +845,18 @@ #define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1 4 #define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2 5 #define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE 6 -#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE 7 -#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 8 -#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 9 +#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2 7 +#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1 8 +#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE 9 +#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE 10 -#define ED_NUM_TEXTBUTTONS 10 +#define ED_NUM_TEXTBUTTONS 11 -#define ED_TEXTBUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL -#define ED_TEXTBUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR +#define ED_TAB_BUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL +#define ED_TAB_BUTTON_ID_LEVELINFO_LAST ED_TEXTBUTTON_ID_LEVELINFO_EDITOR -#define ED_TEXTBUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO -#define ED_TEXTBUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE +#define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO +#define ED_TAB_BUTTON_ID_PROPERTIES_LAST ED_TEXTBUTTON_ID_PROPERTIES_CHANGE #define ED_TEXTBUTTON_ID_CHANGE_FIRST ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE #define ED_TEXTBUTTON_ID_CHANGE_LAST ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE @@ -829,63 +874,65 @@ /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 0 -#define ED_CHECKBUTTON_ID_STICK_ELEMENT 1 -#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 2 -#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 3 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 4 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 5 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 6 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 7 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 8 -#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN 9 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 10 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 11 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 12 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 13 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 14 -#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 15 -#define ED_CHECKBUTTON_ID_LAZY_RELOCATION 16 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 17 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 18 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 19 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 20 -#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 21 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 22 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 23 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 24 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 25 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 26 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 27 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 28 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 29 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 30 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 31 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 32 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 33 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 34 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 35 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 36 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 37 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 38 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 39 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 40 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 41 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 42 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 43 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 44 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 45 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 46 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 47 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 48 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 49 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 50 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 51 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 52 - -#define ED_NUM_CHECKBUTTONS 53 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3 1 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 2 +#define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 +#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 +#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 5 +#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 6 +#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 7 +#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 8 +#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 9 +#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 10 +#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN 11 +#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 12 +#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 13 +#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 14 +#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 15 +#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 16 +#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 17 +#define ED_CHECKBUTTON_ID_LAZY_RELOCATION 18 +#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 19 +#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 20 +#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 21 +#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 22 +#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 23 +#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 24 +#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 25 +#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 26 +#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 27 +#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 28 +#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 29 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 30 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1 31 +#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 32 +#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 33 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 34 +#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 35 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 36 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 37 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 38 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 39 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 40 +#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 41 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 42 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 43 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 44 +#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 45 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 46 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY 47 +#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 48 +#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 49 +#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 50 +#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 51 +#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 52 +#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 53 +#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 54 + +#define ED_NUM_CHECKBUTTONS 55 #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED -#define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED +#define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE @@ -2532,68 +2579,87 @@ static struct int gadget_id_align; int size; char *text; - char *text_left, *text_right, *infotext; + char *text_above, *text_left, *text_right, *infotext; } textbutton_info[ED_NUM_TEXTBUTTONS] = { + /* ---------- level and editor settings (tabs) --------------------------- */ + { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(0), + ED_LEVEL_TABS_XPOS(0), ED_LEVEL_TABS_YPOS(0), GADGET_ID_LEVELINFO_LEVEL, GADGET_ID_NONE, 8, "Level", - NULL, NULL, "Configure level properties" + NULL, NULL, NULL, "Configure level properties" }, { -1, -1, GADGET_ID_LEVELINFO_EDITOR, GADGET_ID_LEVELINFO_LEVEL, 8, "Editor", - NULL, NULL, "Configure editor properties" + NULL, NULL, NULL, "Configure editor properties" }, + + /* ---------- element settings (tabs) ------------------------------------ */ + { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + ED_ELEMENT_TABS_XPOS(0), ED_ELEMENT_TABS_YPOS(0), GADGET_ID_PROPERTIES_INFO, GADGET_ID_NONE, 8, "Info", - NULL, NULL, "Show information about element" + NULL, NULL, NULL, "Show information about element" }, { -1, -1, GADGET_ID_PROPERTIES_CONFIG, GADGET_ID_PROPERTIES_INFO, 8, "Config", - NULL, NULL, "Configure element properties" + NULL, NULL, NULL, "Configure element properties" }, { -1, -1, GADGET_ID_PROPERTIES_CONFIG_1, GADGET_ID_PROPERTIES_INFO, 8, "Config 1", - NULL, NULL, "Configure element properties, part 1" + NULL, NULL, NULL, "Configure element properties, part 1" }, { -1, -1, GADGET_ID_PROPERTIES_CONFIG_2, GADGET_ID_PROPERTIES_CONFIG_1, 8, "Config 2", - NULL, NULL, "Configure element properties, part 2" + NULL, NULL, NULL, "Configure element properties, part 2" }, { -1, -1, GADGET_ID_PROPERTIES_CHANGE, GADGET_ID_PROPERTIES_CONFIG_2, 8, "Change", - NULL, NULL, "Configure custom element change pages" + NULL, NULL, NULL, "Configure custom element change pages" + }, + + /* ---------- level and editor settings (buttons) ------------------------ */ + + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), + GADGET_ID_SAVE_AS_TEMPLATE_2, GADGET_ID_NONE, + -1, "Save", + NULL, NULL, "this level as level template", + "Save current settings as new template" }, + + /* ---------- element settings (buttons) --------------------------------- */ + { -1, -1, - GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE, + GADGET_ID_SAVE_AS_TEMPLATE_1, GADGET_ID_CUSTOM_USE_TEMPLATE_1, -1, "Save", - " ", "As Template", "Save current settings as new template" + NULL, " ", "As Template", + "Save current settings as new template" }, { -1, -1, GADGET_ID_ADD_CHANGE_PAGE, GADGET_ID_PASTE_CHANGE_PAGE, -1, "New", - NULL, NULL, "Add new change page" + NULL, NULL, NULL, "Add new change page" }, { -1, -1, GADGET_ID_DEL_CHANGE_PAGE, GADGET_ID_ADD_CHANGE_PAGE, -1, "Delete", - NULL, NULL, "Delete current change page" + NULL, NULL, NULL, "Delete current change page" }, }; @@ -2746,7 +2812,7 @@ static struct int gadget_id; int gadget_id_align; boolean *value; - char *text_left, *text_right, *infotext; + char *text_above, *text_left, *text_right, *infotext; } checkbutton_info[ED_NUM_CHECKBUTTONS] = { /* ---------- level and editor settings ---------------------------------- */ @@ -2755,9 +2821,23 @@ static struct ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(1), GADGET_ID_RANDOM_RESTRICTED, GADGET_ID_NONE, &random_placement_background_restricted, - NULL, + NULL, NULL, "restrict random placement to:", "set random placement restriction" }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(4), + GADGET_ID_CUSTOM_USE_TEMPLATE_3, GADGET_ID_NONE, + &setup.editor.use_template_for_new_levels, + "Template for new levels and CE/GE:", NULL, + "use template for new levels", "use template for level properties" + }, + { + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(5), + GADGET_ID_CUSTOM_USE_TEMPLATE_2, GADGET_ID_NONE, + &level.use_custom_template, + NULL, NULL, + "use template for custom elements", "use template for custom properties" + }, /* ---------- element settings: configure (various elements) ------------- */ @@ -2765,189 +2845,189 @@ static struct ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_STICK_ELEMENT, GADGET_ID_NONE, &stick_element_properties_window, - NULL, + NULL, NULL, "stick this screen to edit content","stick this screen to edit content" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_EM_SLIPPERY_GEMS, GADGET_ID_NONE, &level.em_slippery_gems, - NULL, + NULL, NULL, "slip down from certain flat walls","use EM/DC style slipping behaviour" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_EM_EXPLODES_BY_FIRE, GADGET_ID_NONE, &level.em_explodes_by_fire, - NULL, + NULL, NULL, "explodes with chain reaction", "use R'n'D style explosion behaviour" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_USE_SPRING_BUG, GADGET_ID_NONE, &level.use_spring_bug, - NULL, + NULL, NULL, "use spring pushing bug", "use odd spring pushing behaviour" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_USE_TIME_ORB_BUG, GADGET_ID_NONE, &level.use_time_orb_bug, - NULL, + NULL, NULL, "use time orb bug", "use odd time orb behaviour" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_RANDOM_BALL_CONTENT, GADGET_ID_NONE, &level.ball_random, - NULL, + NULL, NULL, "create single random element", "only create one element from content" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_INITIAL_BALL_STATE, GADGET_ID_NONE, &level.ball_state_initial, - NULL, + NULL, NULL, "magic ball initially activated", "activate magic ball after level start" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_GROW_INTO_DIGGABLE, GADGET_ID_NONE, &level.grow_into_diggable, - NULL, + NULL, NULL, "can grow into anything diggable", "grow into more than just sand" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_AUTO_EXIT_SOKOBAN, GADGET_ID_NONE, &level.auto_exit_sokoban, - NULL, + NULL, NULL, "exit level if all fields solved", "automatically finish Sokoban levels" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE, &level.continuous_snapping, - NULL, + NULL, NULL, "continuous snapping", "use snapping without releasing key" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE, &level.block_snap_field, - NULL, + NULL, NULL, "block snapped field when snapping", "use snapping delay to show animation" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.block_last_field, - NULL, + NULL, NULL, "block last field when moving", "player blocks last field when moving" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_SP_BLOCK_LAST_FIELD, GADGET_ID_NONE, &level.sp_block_last_field, - NULL, + NULL, NULL, "block last field when moving", "player blocks last field when moving" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(3), GADGET_ID_INSTANT_RELOCATION, GADGET_ID_NONE, &level.instant_relocation, - NULL, + NULL, NULL, "no scrolling when relocating", "player gets relocated without delay" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_SHIFTED_RELOCATION, GADGET_ID_NONE, &level.shifted_relocation, - NULL, + NULL, NULL, "no centering when relocating", "level not centered after relocation" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_LAZY_RELOCATION, GADGET_ID_NONE, &level.lazy_relocation, - NULL, + NULL, NULL, "only redraw off-screen relocation","no redraw if relocation target visible" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_USE_START_ELEMENT, GADGET_ID_NONE, &level.use_start_element[0], - NULL, + NULL, NULL, "use level start element:", "start level at this element's position" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE, &level.use_artwork_element[0], - NULL, + NULL, NULL, "use artwork from element:", "use player artwork from other element" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE, &level.use_explosion_element[0], - NULL, + NULL, NULL, "use explosion from element:", "use explosion properties from element" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, &level.initial_player_gravity[0], - NULL, + NULL, NULL, "use initial gravity", "set initial player gravity" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_USE_INITIAL_INVENTORY, GADGET_ID_NONE, &level.use_initial_inventory[0], - NULL, + NULL, NULL, "use initial inventory:", "use collected elements on level start" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), GADGET_ID_CAN_PASS_TO_WALKABLE, GADGET_ID_NONE, &level.can_pass_to_walkable, - NULL, + NULL, NULL, "can pass to walkable element", "player can pass to empty or walkable" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CAN_FALL_INTO_ACID, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE_INTO_ACID], - NULL, + NULL, NULL, "can fall into acid (with gravity)","player can fall into acid pool" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), GADGET_ID_CAN_MOVE_INTO_ACID, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE_INTO_ACID], - NULL, + NULL, NULL, "can move into acid", "element can move into acid pool" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_DONT_COLLIDE_WITH, GADGET_ID_NONE, &custom_element_properties[EP_DONT_COLLIDE_WITH], - NULL, + NULL, NULL, "deadly when colliding with", "element is deadly when hitting player" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_ENVELOPE_AUTOWRAP, GADGET_ID_NONE, &level.envelope[0].autowrap, - NULL, + NULL, NULL, "auto-wrap", "automatically wrap envelope text" }, { -1, ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_ENVELOPE_CENTERED, GADGET_ID_ENVELOPE_AUTOWRAP, &level.envelope[0].centered, - " ", + NULL, " ", "centered", "automatically center envelope text" }, @@ -2957,49 +3037,49 @@ static struct ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_USE_GRAPHIC, GADGET_ID_NONE, &custom_element.use_gfx_element, - NULL, + NULL, NULL, "use graphic of element:", "use existing element graphic" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(14), - GADGET_ID_CUSTOM_USE_TEMPLATE, GADGET_ID_NONE, + GADGET_ID_CUSTOM_USE_TEMPLATE_1, GADGET_ID_NONE, &level.use_custom_template, - NULL, + NULL, NULL, "use template", "use template for custom properties" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CUSTOM_ACCESSIBLE, GADGET_ID_NONE, &custom_element_properties[EP_ACCESSIBLE], - NULL, + NULL, NULL, NULL, "player can walk to or pass this field" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_GRAV_REACHABLE, GADGET_ID_NONE, &custom_element_properties[EP_GRAVITY_REACHABLE], - NULL, + NULL, NULL, "reachable despite gravity", "player can walk/dig despite gravity" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_USE_LAST_VALUE, GADGET_ID_NONE, &custom_element.use_last_ce_value, - NULL, + NULL, NULL, "use last CE value after change", "use last CE value after change" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CUSTOM_WALK_TO_OBJECT, GADGET_ID_NONE, &custom_element_properties[EP_WALK_TO_OBJECT], - NULL, + NULL, NULL, NULL, "player can dig/collect/push element" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_INDESTRUCTIBLE, GADGET_ID_NONE, &custom_element_properties[EP_INDESTRUCTIBLE], - NULL, + NULL, NULL, "indestructible", "element is indestructible" }, @@ -3009,63 +3089,63 @@ static struct ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_CAN_MOVE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_MOVE], - NULL, + NULL, NULL, NULL, "element can move with some pattern" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_CUSTOM_CAN_FALL, GADGET_ID_NONE, &custom_element_properties[EP_CAN_FALL], - NULL, + NULL, NULL, "can fall", "element can fall down" }, { -1, ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_CUSTOM_CAN_SMASH, GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_SMASH], - " ", + NULL, " ", NULL, "element can smash other elements" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CUSTOM_SLIPPERY, GADGET_ID_NONE, &custom_element_properties[EP_SLIPPERY], - NULL, + NULL, NULL, NULL, "other elements can fall down from it" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CUSTOM_DEADLY, GADGET_ID_NONE, &custom_element_properties[EP_DEADLY], - NULL, + NULL, NULL, NULL, "element can kill the player" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), GADGET_ID_CUSTOM_CAN_EXPLODE, GADGET_ID_NONE, &custom_element_properties[EP_CAN_EXPLODE], - NULL, + NULL, NULL, NULL, "element can explode" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_EXPLODE_FIRE, GADGET_ID_NONE, &custom_element_properties[EP_EXPLODES_BY_FIRE], - NULL, + NULL, NULL, "by fire", "element can explode by fire/explosion" }, { -1, ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_EXPLODE_SMASH, GADGET_ID_CUSTOM_EXPLODE_FIRE, &custom_element_properties[EP_EXPLODES_SMASHED], - " ", + NULL, " ", "smashed", "element can explode when smashed" }, { -1, ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CUSTOM_EXPLODE_IMPACT, GADGET_ID_CUSTOM_EXPLODE_SMASH, &custom_element_properties[EP_EXPLODES_IMPACT], - " ", + NULL, " ", "impact", "element can explode on impact" }, @@ -3075,63 +3155,63 @@ static struct ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(1), GADGET_ID_CUSTOM_CAN_CHANGE, GADGET_ID_NONE, &custom_element_change.can_change, - NULL, + NULL, NULL, "element changes to:", "change element on specified condition" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(2), GADGET_ID_CHANGE_DELAY, GADGET_ID_NONE, &custom_element_change_events[CE_DELAY], - NULL, + NULL, NULL, NULL, "element changes after delay" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(4), GADGET_ID_CHANGE_BY_DIRECT_ACT, GADGET_ID_NONE, &custom_element_change_events[CE_BY_DIRECT_ACTION], - NULL, + NULL, NULL, NULL, "element changes by direct action" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(5), GADGET_ID_CHANGE_BY_OTHER_ACT, GADGET_ID_NONE, &custom_element_change_events[CE_BY_OTHER_ACTION], - NULL, + NULL, NULL, NULL, "element changes by other element" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_CHANGE_USE_EXPLOSION, GADGET_ID_NONE, &custom_element_change.explode, - NULL, + NULL, NULL, "explode instead of change", "element explodes instead of change" }, { ED_ELEMENT_SETTINGS_XPOS(1), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CHANGE_USE_CONTENT, GADGET_ID_NONE, &custom_element_change.use_target_content, - NULL, + NULL, NULL, "use extended change target:", "element changes to more elements" }, { ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_CHANGE_ONLY_COMPLETE, GADGET_ID_NONE, &custom_element_change.only_if_complete, - NULL, + NULL, NULL, "replace all or nothing", "only replace when all can be changed" }, { ED_ELEMENT_SETTINGS_XPOS(2), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_CHANGE_USE_RANDOM, GADGET_ID_NONE, &custom_element_change.use_random_replace, - NULL, + NULL, NULL, NULL, "use percentage for random replace" }, { ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_CHANGE_HAS_ACTION, GADGET_ID_NONE, &custom_element_change.has_action, - NULL, + NULL, NULL, NULL, "execute action on specified condition" }, }; @@ -4829,7 +4909,6 @@ static boolean use_el_empty = FALSE; static int *editor_elements = NULL; /* dynamically allocated */ static int num_editor_elements = 0; /* dynamically determined */ -static boolean setup_editor_show_always = TRUE; static boolean setup_editor_cascade_never = FALSE; static int editor_hl_unused[] = { EL_EMPTY }; @@ -4852,67 +4931,67 @@ static struct editor_elements_info[] = { { - &setup_editor_show_always, + &setup.editor.el_classic, &setup_editor_cascade_never, &editor_hl_unused_ptr, &num_editor_hl_unused, &editor_el_players_ptr, &num_editor_el_players }, { - &setup.editor.el_boulderdash, + &setup.editor.el_classic, &setup.editor_cascade.el_bd, &editor_hl_boulderdash_ptr, &num_editor_hl_boulderdash, &editor_el_boulderdash_ptr, &num_editor_el_boulderdash }, { - &setup.editor.el_emerald_mine, + &setup.editor.el_classic, &setup.editor_cascade.el_em, &editor_hl_emerald_mine_ptr, &num_editor_hl_emerald_mine, &editor_el_emerald_mine_ptr, &num_editor_el_emerald_mine }, { - &setup.editor.el_emerald_mine_club, + &setup.editor.el_classic, &setup.editor_cascade.el_emc, &editor_hl_emerald_mine_club_ptr, &num_editor_hl_emerald_mine_club, &editor_el_emerald_mine_club_ptr, &num_editor_el_emerald_mine_club }, { - &setup.editor.el_more, + &setup.editor.el_classic, &setup.editor_cascade.el_rnd, &editor_hl_rnd_ptr, &num_editor_hl_rnd, &editor_el_rnd_ptr, &num_editor_el_rnd }, { - &setup.editor.el_sokoban, + &setup.editor.el_classic, &setup.editor_cascade.el_sb, &editor_hl_sokoban_ptr, &num_editor_hl_sokoban, &editor_el_sokoban_ptr, &num_editor_el_sokoban }, { - &setup.editor.el_supaplex, + &setup.editor.el_classic, &setup.editor_cascade.el_sp, &editor_hl_supaplex_ptr, &num_editor_hl_supaplex, &editor_el_supaplex_ptr, &num_editor_el_supaplex }, { - &setup.editor.el_diamond_caves, + &setup.editor.el_classic, &setup.editor_cascade.el_dc, &editor_hl_diamond_caves_ptr, &num_editor_hl_diamond_caves, &editor_el_diamond_caves_ptr, &num_editor_el_diamond_caves }, { - &setup.editor.el_dx_boulderdash, + &setup.editor.el_classic, &setup.editor_cascade.el_dx, &editor_hl_dx_boulderdash_ptr, &num_editor_hl_dx_boulderdash, &editor_el_dx_boulderdash_ptr, &num_editor_el_dx_boulderdash }, { - &setup.editor.el_chars, + &setup.editor.el_classic, &setup.editor_cascade.el_chars, &editor_hl_chars_ptr, &num_editor_hl_chars, &editor_el_chars_ptr, &num_editor_el_chars }, { - &setup.editor.el_steel_chars, + &setup.editor.el_classic, &setup.editor_cascade.el_steel_chars, &editor_hl_steel_chars_ptr, &num_editor_hl_steel_chars, &editor_el_steel_chars_ptr, &num_editor_el_steel_chars @@ -6138,8 +6217,8 @@ static void CreateTextbuttonGadgets() struct GadgetInfo *gi; unsigned int event_mask; char infotext[MAX_OUTPUT_LINESIZE + 1]; - int x = SX + ED_TAB_SETTINGS_X(textbutton_info[i].x); - int y = SY + ED_TAB_SETTINGS_Y(textbutton_info[i].y); + int x = SX + ED_SETTINGS_X(textbutton_info[i].x); + int y = SY + ED_SETTINGS_Y(textbutton_info[i].y); if (textbutton_info[i].size == -1) /* dynamically determine size */ textbutton_info[i].size = strlen(textbutton_info[i].text); @@ -6733,9 +6812,12 @@ static void MapTextbuttonGadget(int id) struct GadgetInfo *gi = level_editor_gadget[textbutton_info[id].gadget_id]; int xoffset_left = getTextWidthForGadget(textbutton_info[id].text_left); int xoffset_right = ED_GADGET_TEXT_DISTANCE; + int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE; int yoffset = (gi->height - font_height) / 2; int x_left = gi->x - xoffset_left; int x_right = gi->x + gi->width + xoffset_right; + int y_above = gi->y - yoffset_above; + int x = gi->x; int y = gi->y + yoffset; /* only show button to delete change pages when more than minimum pages */ @@ -6743,6 +6825,9 @@ static void MapTextbuttonGadget(int id) custom_element.num_change_pages == MIN_CHANGE_PAGES) return; + if (textbutton_info[id].text_above) + DrawText(x, y_above, textbutton_info[id].text_above, font_nr); + if (textbutton_info[id].text_left) DrawText(x_left, y, textbutton_info[id].text_left, font_nr); @@ -6805,7 +6890,10 @@ static void MapCheckbuttonGadget(int id) struct GadgetInfo *gi = level_editor_gadget[checkbutton_info[id].gadget_id]; int xoffset_left = getTextWidthForGadget(checkbutton_info[id].text_left); int xoffset_right = ED_GADGET_TEXT_DISTANCE; + int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE; int yoffset = (gi->height - font_height) / 2; + int y_above = gi->y - yoffset_above; + int x = gi->x; int x_left, x_right, y; /* set after gadget position was modified */ /* set position for gadgets with dynamically determined position */ @@ -6817,6 +6905,9 @@ static void MapCheckbuttonGadget(int id) x_right = gi->x + gi->width + xoffset_right; y = gi->y + yoffset; + if (checkbutton_info[id].text_above) + DrawText(x, y_above, checkbutton_info[id].text_above, font_nr); + if (checkbutton_info[id].text_left) DrawText(x_left, y, checkbutton_info[id].text_left, font_nr); @@ -7531,11 +7622,13 @@ static void CopyElementPropertiesToEditor(int element) static boolean AskToCopyAndModifyLevelTemplate() { - if (Request("Copy and modify level template?", REQ_ASK)) + if (Request("Copy and modify settings from level template?", REQ_ASK)) { level.use_custom_template = FALSE; - ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE], + ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE_1], + GDI_CHECKED, FALSE, GDI_END); + ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE_2], GDI_CHECKED, FALSE, GDI_END); return TRUE; @@ -8145,8 +8238,8 @@ static void DrawLevelInfoTabulatorGadgets() int gd_x = gd->x + gd_gi1->border.width / 2; int gd_y = gd->y + gd_gi1->height - 1; Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y); - int id_first = ED_TEXTBUTTON_ID_LEVELINFO_LEVEL; - int id_last = ED_TEXTBUTTON_ID_LEVELINFO_EDITOR; + int id_first = ED_TAB_BUTTON_ID_LEVELINFO_FIRST; + int id_last = ED_TAB_BUTTON_ID_LEVELINFO_LAST; int i; for (i = id_first; i <= id_last; i++) @@ -8259,6 +8352,9 @@ static void DrawLevelInfoEditor() /* draw drawing area */ MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND); + + /* draw textbutton gadgets */ + MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2); } static void DrawLevelInfoWindow() @@ -9056,7 +9152,7 @@ static void DrawPropertiesConfig() MapSelectboxGadget(i); /* draw textbutton gadgets */ - MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); + MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1); /* draw text input gadgets */ MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); @@ -9096,7 +9192,7 @@ static void DrawPropertiesConfig() /* draw checkbutton gadgets */ MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC); - MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1); /* draw counter gadgets */ MapCounterButtons(ED_COUNTER_ID_GROUP_CONTENT); @@ -9105,7 +9201,7 @@ static void DrawPropertiesConfig() MapSelectboxGadget(ED_SELECTBOX_ID_GROUP_CHOICE_MODE); /* draw textbutton gadgets */ - MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); + MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1); /* draw drawing area gadgets */ DrawGroupElementArea(properties_element); @@ -11392,21 +11488,22 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) int type_id = gi->custom_type_id; int i; - if (type_id >= ED_TEXTBUTTON_ID_LEVELINFO_FIRST && - type_id <= ED_TEXTBUTTON_ID_LEVELINFO_LAST) + if (type_id >= ED_TAB_BUTTON_ID_LEVELINFO_FIRST && + type_id <= ED_TAB_BUTTON_ID_LEVELINFO_LAST) { edit_mode_levelinfo = gi->custom_type_id; DrawLevelInfoWindow(); } - else if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST && - type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST) + else if (type_id >= ED_TAB_BUTTON_ID_PROPERTIES_FIRST && + type_id <= ED_TAB_BUTTON_ID_PROPERTIES_LAST) { edit_mode_properties = gi->custom_type_id; DrawPropertiesWindow(); } - else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) + else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1 || + type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2) { boolean new_template = !fileExists(getLocalLevelTemplateFilename()); @@ -11543,7 +11640,7 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) 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)) + type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1)) { CopyElementPropertiesToGame(properties_element); } @@ -11552,7 +11649,8 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) { UpdateCustomElementGraphicGadgets(); } - else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) + else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1 || + type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2) { boolean template_related_changes_found = FALSE; int i; @@ -11586,10 +11684,48 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) return; } + if (!level.use_custom_template && + Request("Copy settings from level template?", REQ_ASK)) + { + return; + } + LoadLevelTemplate(level.use_custom_template ? -1 : level_nr); DrawEditModeWindow(); } + else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3) + { + if (setup.editor.use_template_for_new_levels && + !fileExists(getGlobalLevelTemplateFilename())) + { + Request("No level template found!", REQ_CONFIRM); + + return; + } + + if (setup.editor.use_template_for_new_levels && + level.changed && + !Request("Discard level and load template?", REQ_ASK)) + { + return; + } + + if (!setup.editor.use_template_for_new_levels && + level.changed && + !Request("Discard level and use empty level?", REQ_ASK)) + { + return; + } + + LoadLevel(level_nr); + LoadScore(level_nr); + + TapeErase(); + + ResetUndoBuffer(); + DrawEditModeWindow(); + } /* do not mark level as modified for certain non-level-changing gadgets */ if ((type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST &&