X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=ca104b8d9b16dd6e74e4c88537cb10ae24a27e55;hp=2798beecd3a495faffa45ef3e306d7fb5eafeb79;hb=b35eb67187273bda7318af1b35a79a92ed59f96b;hpb=ffd72ec82d108006fce6246f2d0023057c39af35 diff --git a/src/editor.c b/src/editor.c index 2798beec..ca104b8d 100644 --- a/src/editor.c +++ b/src/editor.c @@ -674,18 +674,19 @@ #define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 44) #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_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 49) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 50) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 51) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 52) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 53) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 54) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 55) +#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 + 56) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 57) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -844,18 +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_1 7 -#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2 8 +#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 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 @@ -873,61 +874,62 @@ /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 0 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2 1 -#define ED_CHECKBUTTON_ID_STICK_ELEMENT 2 -#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 3 -#define ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE 4 -#define ED_CHECKBUTTON_ID_USE_SPRING_BUG 5 -#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG 6 -#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT 7 -#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE 8 -#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE 9 -#define ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN 10 -#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING 11 -#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD 12 -#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD 13 -#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD 14 -#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION 15 -#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION 16 -#define ED_CHECKBUTTON_ID_LAZY_RELOCATION 17 -#define ED_CHECKBUTTON_ID_USE_START_ELEMENT 18 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 19 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 20 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 21 -#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 22 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 23 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 24 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 25 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 26 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 27 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 28 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 29 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1 30 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 31 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 32 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 33 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 34 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 35 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 36 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 37 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 38 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 39 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 40 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 41 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 42 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 43 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 44 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 45 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 46 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 47 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 48 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 49 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 50 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 51 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 52 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 53 - -#define ED_NUM_CHECKBUTTONS 54 +#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_CUSTOM_USE_TEMPLATE_2 @@ -2628,19 +2630,23 @@ static struct NULL, NULL, NULL, "Configure custom element change pages" }, - /* ---------- element settings (buttons) --------------------------------- */ + /* ---------- level and editor settings (buttons) ------------------------ */ { - -1, -1, - GADGET_ID_SAVE_AS_TEMPLATE_1, GADGET_ID_CUSTOM_USE_TEMPLATE_1, + ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(6), + GADGET_ID_SAVE_AS_TEMPLATE_2, GADGET_ID_NONE, -1, "Save", - NULL, " ", "As Template", "Save current settings as new template" + NULL, NULL, "this level as level template", + "Save current settings as new template" }, + + /* ---------- element settings (buttons) --------------------------------- */ + { - ED_LEVEL_SETTINGS_XPOS(0), ED_LEVEL_SETTINGS_YPOS(3), - GADGET_ID_SAVE_AS_TEMPLATE_2, GADGET_ID_NONE, + -1, -1, + GADGET_ID_SAVE_AS_TEMPLATE_1, GADGET_ID_CUSTOM_USE_TEMPLATE_1, -1, "Save", - "Template to use for new levels:", NULL, "this level as level template", + NULL, " ", "As Template", "Save current settings as new template" }, { @@ -2806,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 ---------------------------------- */ @@ -2815,14 +2821,21 @@ 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, NULL, "use template for custom elements", "use template for custom properties" }, @@ -2832,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" }, @@ -3024,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_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" }, @@ -3076,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" }, @@ -3142,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" }, }; @@ -6877,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 */ @@ -6889,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); @@ -8219,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++) @@ -8579,41 +8598,22 @@ static void DrawEnvelopeTextArea(int envelope_nr) MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO); } -static boolean PrintInfoText(char *text, int font_nr, int start_line) +static void PrintInfoText(char *text, int font_nr, int xpos, int ypos) { - int font_height = getFontHeight(font_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - int sx = SX + pad_x; - int sy = SY + pad_y; - int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; - - if (start_line >= max_lines_per_screen) - return FALSE; - - DrawText(sx, sy + start_line * font_height, text, font_nr); - - return TRUE; + DrawText(SX + xpos, SY + ypos, text, font_nr); } -static int PrintElementDescriptionFromFile(char *filename, int start_line) +static int PrintElementDescriptionFromFile(char *filename, int font_nr, + int xpos, int ypos) { - int font_nr = FONT_TEXT_2; int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - int sx = SX + pad_x; - int sy = SY + pad_y + start_line * font_height; - int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; - int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; - int max_lines_drawable = max_lines_per_screen - start_line; - - if (start_line >= max_lines_per_screen) - return FALSE; + int max_chars_per_line = (SXSIZE - 2 * xpos) / font_width; + int max_lines_drawable = (SYSIZE - ypos) / font_height - 1; - return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, - max_lines_drawable, 0, -1, TRUE, FALSE, FALSE); + return DrawTextFile(SX + xpos, SY + ypos, filename, font_nr, + max_chars_per_line, -1, max_lines_drawable, 0, -1, + TRUE, FALSE, FALSE); } static void DrawPropertiesInfo() @@ -8679,23 +8679,34 @@ static void DrawPropertiesInfo() char *filename = getElementDescriptionFilename(properties_element); char *percentage_text = "In this level: "; char *properties_text = "Standard properties: "; + char *description_text = "Description:"; + char *no_description_text = "No description available."; + char *none_text = "None"; float percentage; int num_elements_in_level; int num_standard_properties = 0; int font1_nr = FONT_TEXT_1; int font2_nr = FONT_TEXT_2; int font1_width = getFontWidth(font1_nr); + int font1_height = getFontHeight(font1_nr); int font2_height = getFontHeight(font2_nr); - int pad_x = ED_ELEMENT_SETTINGS_X(0); - int pad_y = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; - int screen_line = 0; + int line1_height = font1_height + ED_GADGET_LINE_DISTANCE; + int font2_yoffset = (font1_height - font2_height) / 2; + int percentage_text_len = strlen(percentage_text) * font1_width; + int properties_text_len = strlen(properties_text) * font1_width; + int xpos = ED_ELEMENT_SETTINGS_X(0); + int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; int i, x, y; if (setup.editor.show_element_token) { - DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3, + int font3_nr = FONT_TEXT_3; + int font3_height = getFontHeight(font3_nr); + + DrawTextF(xpos, ypos, font3_nr, "[%s]", element_info[properties_element].token_name); - screen_line++; + + ypos += 2 * font3_height; } /* ----- print number of elements / percentage of this element in level */ @@ -8707,40 +8718,53 @@ static void DrawPropertiesInfo() num_elements_in_level++; percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy); - DrawTextS(pad_x, pad_y + screen_line * font2_height, font1_nr, - percentage_text); - DrawTextF(pad_x + strlen(percentage_text) * font1_width, - pad_y + screen_line++ * font2_height, font2_nr, - "%d (%.2f%%)", num_elements_in_level, percentage); + DrawTextS(xpos, ypos, font1_nr, percentage_text); + + if (num_elements_in_level > 0) + DrawTextF(xpos + percentage_text_len, ypos + font2_yoffset, font2_nr, + "%d (%.2f %%)", num_elements_in_level, percentage); + else + DrawTextF(xpos + percentage_text_len, ypos + font2_yoffset, font2_nr, + none_text); - screen_line++; + ypos += 2 * MAX(font1_height, font2_height); /* ----- print standard properties of this element */ - DrawTextS(pad_x, pad_y + screen_line++ * font2_height, font1_nr, - properties_text); + DrawTextS(xpos, ypos, font1_nr, properties_text); + + ypos += line1_height; for (i = 0; properties[i].value != -1; i++) { if (!HAS_PROPERTY(properties_element, properties[i].value)) continue; - DrawTextS(pad_x, pad_y + screen_line++ * font2_height, font2_nr, - properties[i].text); + DrawTextS(xpos, ypos, font2_nr, properties[i].text); + + ypos += font2_height; + num_standard_properties++; } if (num_standard_properties == 0) - DrawTextS(pad_x + strlen(properties_text) * font1_width, - pad_y + (screen_line - 1) * font2_height, font2_nr, "none"); + { + DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset, + font2_nr, none_text); + + ypos -= (line1_height - font1_height); + } - screen_line++; + ypos += MAX(font1_height, font2_height); /* ----- print special description of this element */ - PrintInfoText("Description:", FONT_TEXT_1, screen_line); - if (PrintElementDescriptionFromFile(filename, screen_line + 1) == 0) - PrintInfoText("No description available.", FONT_TEXT_1, screen_line); + PrintInfoText(description_text, font1_nr, xpos, ypos); + + ypos += line1_height; + + if (PrintElementDescriptionFromFile(filename, font2_nr, xpos, ypos) == 0) + PrintInfoText(no_description_text, font1_nr, xpos, ypos - line1_height); } #define TEXT_COLLECTING "Score for collecting" @@ -8903,7 +8927,11 @@ static void DrawPropertiesConfig() if (!checkPropertiesConfig(properties_element)) { - PrintInfoText("No configuration options available.", FONT_TEXT_1, 0); + int xpos = ED_ELEMENT_SETTINGS_X(0); + int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE; + + PrintInfoText("No configuration options available.", + FONT_TEXT_1, xpos, ypos); return; } @@ -11469,15 +11497,15 @@ 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; @@ -11675,6 +11703,38 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) 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 &&