X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=479fec7af807ebc7dbd3bbb34c3f5a078c6a0197;hp=091bbd7c4faa47fc49e933fd4193846773a1f554;hb=bb43be9a97c4c6b8fd4ac94c7438f1b0ca1d33eb;hpb=70fab7480fcedd8f51015d592fc94f3ce50172d0 diff --git a/src/editor.c b/src/editor.c index 091bbd7c..479fec7a 100644 --- a/src/editor.c +++ b/src/editor.c @@ -79,7 +79,7 @@ #define IMG_BORDER_2 IMG_EDITOR_ELEMENT_BORDER_INPUT #define ED_ELEMENT_BORDER (graphic_info[IMG_BORDER_1].border_size) #define ED_DRAWINGAREA_BORDER_SIZE (graphic_info[IMG_BORDER_2].border_size) -#define ED_DRAWINGAREA_TILE_SIZE (graphic_info[IMG_BORDER_2].tile_size) +#define ED_DRAWINGAREA_TILE_SIZE (editor.drawingarea.tile_size) /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_XSIZE (graphic_info[IMG_EDITOR_CHECKBOX].width) @@ -590,45 +590,46 @@ #define GADGET_ID_SP_BLOCK_LAST_FIELD (GADGET_ID_CHECKBUTTON_FIRST + 15) #define GADGET_ID_INSTANT_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 16) #define GADGET_ID_SHIFTED_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 20) -#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 21) -#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 22) -#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 23) -#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 24) -#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 25) -#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 26) -#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 27) -#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 28) -#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 29) -#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 30) -#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 31) -#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 32) -#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 33) -#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 34) -#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 35) -#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 36) -#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 37) -#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 38) -#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 39) -#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 40) -#define GADGET_ID_CUSTOM_GRAV_REACHABLE (GADGET_ID_CHECKBUTTON_FIRST + 41) -#define GADGET_ID_CUSTOM_USE_LAST_VALUE (GADGET_ID_CHECKBUTTON_FIRST + 42) -#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 43) -#define GADGET_ID_CUSTOM_USE_TEMPLATE (GADGET_ID_CHECKBUTTON_FIRST + 44) -#define GADGET_ID_CUSTOM_CAN_CHANGE (GADGET_ID_CHECKBUTTON_FIRST + 45) -#define GADGET_ID_CHANGE_USE_CONTENT (GADGET_ID_CHECKBUTTON_FIRST + 46) -#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 47) -#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 48) -#define GADGET_ID_CHANGE_USE_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 49) -#define GADGET_ID_CHANGE_HAS_ACTION (GADGET_ID_CHECKBUTTON_FIRST + 50) -#define GADGET_ID_CHANGE_DELAY (GADGET_ID_CHECKBUTTON_FIRST + 51) -#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 52) -#define GADGET_ID_CHANGE_BY_OTHER_ACT (GADGET_ID_CHECKBUTTON_FIRST + 53) +#define GADGET_ID_LAZY_RELOCATION (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_USE_START_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_USE_ARTWORK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_USE_EXPLOSION_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_INITIAL_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 22) +#define GADGET_ID_USE_INITIAL_INVENTORY (GADGET_ID_CHECKBUTTON_FIRST + 23) +#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 24) +#define GADGET_ID_CAN_FALL_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 25) +#define GADGET_ID_CAN_MOVE_INTO_ACID (GADGET_ID_CHECKBUTTON_FIRST + 26) +#define GADGET_ID_DONT_COLLIDE_WITH (GADGET_ID_CHECKBUTTON_FIRST + 27) +#define GADGET_ID_ENVELOPE_AUTOWRAP (GADGET_ID_CHECKBUTTON_FIRST + 28) +#define GADGET_ID_ENVELOPE_CENTERED (GADGET_ID_CHECKBUTTON_FIRST + 29) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 30) +#define GADGET_ID_CUSTOM_CAN_EXPLODE (GADGET_ID_CHECKBUTTON_FIRST + 31) +#define GADGET_ID_CUSTOM_EXPLODE_FIRE (GADGET_ID_CHECKBUTTON_FIRST + 32) +#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 33) +#define GADGET_ID_CUSTOM_EXPLODE_IMPACT (GADGET_ID_CHECKBUTTON_FIRST + 34) +#define GADGET_ID_CUSTOM_WALK_TO_OBJECT (GADGET_ID_CHECKBUTTON_FIRST + 35) +#define GADGET_ID_CUSTOM_DEADLY (GADGET_ID_CHECKBUTTON_FIRST + 36) +#define GADGET_ID_CUSTOM_CAN_MOVE (GADGET_ID_CHECKBUTTON_FIRST + 37) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 38) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 39) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 40) +#define GADGET_ID_CUSTOM_ACCESSIBLE (GADGET_ID_CHECKBUTTON_FIRST + 41) +#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) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 54) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 55) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -830,44 +831,45 @@ #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_USE_START_ELEMENT 16 -#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT 17 -#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT 18 -#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY 19 -#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY 20 -#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 21 -#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID 22 -#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID 23 -#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH 24 -#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP 25 -#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED 26 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 27 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE 28 -#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE 29 -#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE 30 -#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE 31 -#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT 32 -#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 33 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE 34 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 35 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 36 -#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 37 -#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY 38 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE 39 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE 40 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 41 -#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT 42 -#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE 43 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY 44 -#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 45 -#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT 46 -#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 47 -#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT 48 -#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 49 -#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM 50 -#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION 51 - -#define ED_NUM_CHECKBUTTONS 52 +#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_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_EDITOR_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -1003,82 +1005,82 @@ static struct /* ---------- toolbox control buttons ------------------------------------ */ { - IMG_EDITOR_BUTTON_GFX_DRAW_SINGLE, GADGET_ID_SINGLE_ITEMS, + IMG_GFX_EDITOR_BUTTON_DRAW_SINGLE, GADGET_ID_SINGLE_ITEMS, &editor.button.draw_single, GD_TYPE_RADIO_BUTTON, "draw single items", 's' }, { - IMG_EDITOR_BUTTON_GFX_DRAW_CONNECTED, GADGET_ID_CONNECTED_ITEMS, + IMG_GFX_EDITOR_BUTTON_DRAW_CONNECTED, GADGET_ID_CONNECTED_ITEMS, &editor.button.draw_connected, GD_TYPE_RADIO_BUTTON, "draw connected items", 'd' }, { - IMG_EDITOR_BUTTON_GFX_DRAW_LINE, GADGET_ID_LINE, + IMG_GFX_EDITOR_BUTTON_DRAW_LINE, GADGET_ID_LINE, &editor.button.draw_line, GD_TYPE_RADIO_BUTTON, "draw lines", 'l' }, { - IMG_EDITOR_BUTTON_GFX_DRAW_ARC, GADGET_ID_ARC, + IMG_GFX_EDITOR_BUTTON_DRAW_ARC, GADGET_ID_ARC, &editor.button.draw_arc, GD_TYPE_RADIO_BUTTON, "draw arcs", 'a' }, { - IMG_EDITOR_BUTTON_GFX_DRAW_RECTANGLE, GADGET_ID_RECTANGLE, + IMG_GFX_EDITOR_BUTTON_DRAW_RECTANGLE, GADGET_ID_RECTANGLE, &editor.button.draw_rectangle, GD_TYPE_RADIO_BUTTON, "draw outline rectangles", 'r' }, { - IMG_EDITOR_BUTTON_GFX_DRAW_FILLED_BOX, GADGET_ID_FILLED_BOX, + IMG_GFX_EDITOR_BUTTON_DRAW_FILLED_BOX, GADGET_ID_FILLED_BOX, &editor.button.draw_filled_box, GD_TYPE_RADIO_BUTTON, "draw filled rectangles", 'R' }, { - IMG_EDITOR_BUTTON_GFX_ROTATE_UP, GADGET_ID_WRAP_UP, + IMG_GFX_EDITOR_BUTTON_ROTATE_UP, GADGET_ID_WRAP_UP, &editor.button.rotate_up, GD_TYPE_NORMAL_BUTTON, "wrap (rotate) level up", 0 }, { - IMG_EDITOR_BUTTON_GFX_DRAW_TEXT, GADGET_ID_TEXT, + IMG_GFX_EDITOR_BUTTON_DRAW_TEXT, GADGET_ID_TEXT, &editor.button.draw_text, GD_TYPE_RADIO_BUTTON, "enter text elements", 't' }, { - IMG_EDITOR_BUTTON_GFX_FLOOD_FILL, GADGET_ID_FLOOD_FILL, + IMG_GFX_EDITOR_BUTTON_FLOOD_FILL, GADGET_ID_FLOOD_FILL, &editor.button.flood_fill, GD_TYPE_RADIO_BUTTON, "flood fill", 'f' }, { - IMG_EDITOR_BUTTON_GFX_ROTATE_LEFT, GADGET_ID_WRAP_LEFT, + IMG_GFX_EDITOR_BUTTON_ROTATE_LEFT, GADGET_ID_WRAP_LEFT, &editor.button.rotate_left, GD_TYPE_NORMAL_BUTTON, "wrap (rotate) level left", 0 }, { - IMG_EDITOR_BUTTON_GFX_ZOOM_LEVEL, GADGET_ID_ZOOM, + IMG_GFX_EDITOR_BUTTON_ZOOM_LEVEL, GADGET_ID_ZOOM, &editor.button.zoom_level, GD_TYPE_NORMAL_BUTTON, - "zoom level tile size", '-' + "zoom level tile size", '+' }, { - IMG_EDITOR_BUTTON_GFX_ROTATE_RIGHT, GADGET_ID_WRAP_RIGHT, + IMG_GFX_EDITOR_BUTTON_ROTATE_RIGHT, GADGET_ID_WRAP_RIGHT, &editor.button.rotate_right, GD_TYPE_NORMAL_BUTTON, "wrap (rotate) level right", 0 }, { - IMG_EDITOR_BUTTON_GFX_DRAW_RANDOM, GADGET_ID_RANDOM_PLACEMENT, + IMG_GFX_EDITOR_BUTTON_DRAW_RANDOM, GADGET_ID_RANDOM_PLACEMENT, &editor.button.draw_random, GD_TYPE_NORMAL_BUTTON, "random element placement", 0 }, { - IMG_EDITOR_BUTTON_GFX_GRAB_BRUSH, GADGET_ID_GRAB_BRUSH, + IMG_GFX_EDITOR_BUTTON_GRAB_BRUSH, GADGET_ID_GRAB_BRUSH, &editor.button.grab_brush, GD_TYPE_RADIO_BUTTON, "grab brush", 'b' }, { - IMG_EDITOR_BUTTON_GFX_ROTATE_DOWN, GADGET_ID_WRAP_DOWN, + IMG_GFX_EDITOR_BUTTON_ROTATE_DOWN, GADGET_ID_WRAP_DOWN, &editor.button.rotate_down, GD_TYPE_NORMAL_BUTTON, "wrap (rotate) level down", 0 }, { - IMG_EDITOR_BUTTON_GFX_PICK_ELEMENT, GADGET_ID_PICK_ELEMENT, + IMG_GFX_EDITOR_BUTTON_PICK_ELEMENT, GADGET_ID_PICK_ELEMENT, &editor.button.pick_element, GD_TYPE_RADIO_BUTTON, "pick drawing element", ',' }, @@ -1086,32 +1088,32 @@ static struct /* ---------- level control buttons -------------------------------------- */ { - IMG_EDITOR_BUTTON_GFX_UNDO, GADGET_ID_UNDO, + IMG_GFX_EDITOR_BUTTON_UNDO, GADGET_ID_UNDO, &editor.button.undo, GD_TYPE_NORMAL_BUTTON, "undo/redo last operation", 'u' }, { - IMG_EDITOR_BUTTON_GFX_CONF, GADGET_ID_INFO, + IMG_GFX_EDITOR_BUTTON_CONF, GADGET_ID_INFO, &editor.button.conf, GD_TYPE_NORMAL_BUTTON, "properties of level", 'I' }, { - IMG_EDITOR_BUTTON_GFX_SAVE, GADGET_ID_SAVE, + IMG_GFX_EDITOR_BUTTON_SAVE, GADGET_ID_SAVE, &editor.button.save, GD_TYPE_NORMAL_BUTTON, "save level", 'S' }, { - IMG_EDITOR_BUTTON_GFX_CLEAR, GADGET_ID_CLEAR, + IMG_GFX_EDITOR_BUTTON_CLEAR, GADGET_ID_CLEAR, &editor.button.clear, GD_TYPE_NORMAL_BUTTON, "clear level", 'C' }, { - IMG_EDITOR_BUTTON_GFX_TEST, GADGET_ID_TEST, + IMG_GFX_EDITOR_BUTTON_TEST, GADGET_ID_TEST, &editor.button.test, GD_TYPE_NORMAL_BUTTON, "test level", 'T' }, { - IMG_EDITOR_BUTTON_GFX_EXIT, GADGET_ID_EXIT, + IMG_GFX_EDITOR_BUTTON_EXIT, GADGET_ID_EXIT, &editor.button.exit, GD_TYPE_NORMAL_BUTTON, "exit level editor", 'E' }, @@ -1119,27 +1121,27 @@ static struct /* ---------- CE and GE control buttons ---------------------------------- */ { - IMG_EDITOR_BUTTON_GFX_CE_COPY_FROM, GADGET_ID_CUSTOM_COPY_FROM, + IMG_GFX_EDITOR_BUTTON_CE_COPY_FROM, GADGET_ID_CUSTOM_COPY_FROM, &editor.button.ce_copy_from, GD_TYPE_RADIO_BUTTON, "copy settings from other element", 0 }, { - IMG_EDITOR_BUTTON_GFX_CE_COPY_TO, GADGET_ID_CUSTOM_COPY_TO, + IMG_GFX_EDITOR_BUTTON_CE_COPY_TO, GADGET_ID_CUSTOM_COPY_TO, &editor.button.ce_copy_to, GD_TYPE_RADIO_BUTTON, "copy settings to other element", 0 }, { - IMG_EDITOR_BUTTON_GFX_CE_SWAP, GADGET_ID_CUSTOM_EXCHANGE, + IMG_GFX_EDITOR_BUTTON_CE_SWAP, GADGET_ID_CUSTOM_EXCHANGE, &editor.button.ce_swap, GD_TYPE_RADIO_BUTTON, "exchange element with other element", 0 }, { - IMG_EDITOR_BUTTON_GFX_CE_COPY, GADGET_ID_CUSTOM_COPY, + IMG_GFX_EDITOR_BUTTON_CE_COPY, GADGET_ID_CUSTOM_COPY, &editor.button.ce_copy, GD_TYPE_NORMAL_BUTTON, "copy settings from this element", 0 }, { - IMG_EDITOR_BUTTON_GFX_CE_PASTE, GADGET_ID_CUSTOM_PASTE, + IMG_GFX_EDITOR_BUTTON_CE_PASTE, GADGET_ID_CUSTOM_PASTE, &editor.button.ce_paste, GD_TYPE_NORMAL_BUTTON, "paste settings to this element", 0 }, @@ -1147,7 +1149,7 @@ static struct /* ---------- palette control buttons ------------------------------------ */ { - IMG_EDITOR_BUTTON_GFX_PROPERTIES, GADGET_ID_PROPERTIES, + IMG_GFX_EDITOR_BUTTON_PROPERTIES, GADGET_ID_PROPERTIES, &editor.button.properties, GD_TYPE_NORMAL_BUTTON, "properties of drawing element", 'p' } @@ -2262,7 +2264,7 @@ static struct /* ---------- element settings: configure (several elements) ------------- */ { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(6), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), GADGET_ID_PLAYER_SPEED, GADGET_ID_NONE, -1, options_player_speed, @@ -2580,13 +2582,13 @@ static struct NULL, "change page", "select next change page" }, { - IMG_EDITOR_BUTTON_GFX_CP_COPY, + IMG_GFX_EDITOR_BUTTON_CP_COPY, -1, ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_COPY_CHANGE_PAGE, GADGET_ID_NEXT_CHANGE_PAGE, " ", NULL, "copy settings from this change page" }, { - IMG_EDITOR_BUTTON_GFX_CP_PASTE, + IMG_GFX_EDITOR_BUTTON_CP_PASTE, -1, ED_ELEMENT_SETTINGS_YPOS(14), GADGET_ID_PASTE_CHANGE_PAGE, GADGET_ID_COPY_CHANGE_PAGE, NULL, NULL, "paste settings to this change page" @@ -2786,14 +2788,14 @@ static struct "exit level if all fields solved", "automatically finish Sokoban levels" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), GADGET_ID_CONTINUOUS_SNAPPING, GADGET_ID_NONE, &level.continuous_snapping, NULL, "continuous snapping", "use snapping without releasing key" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(7), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(8), GADGET_ID_BLOCK_SNAP_FIELD, GADGET_ID_NONE, &level.block_snap_field, NULL, @@ -2828,28 +2830,35 @@ static struct "no centering when relocating", "level not centered after relocation" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(9), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), + GADGET_ID_LAZY_RELOCATION, GADGET_ID_NONE, + &level.lazy_relocation, + 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, "use level start element:", "start level at this element's position" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(10), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), GADGET_ID_USE_ARTWORK_ELEMENT, GADGET_ID_NONE, &level.use_artwork_element[0], NULL, "use artwork from element:", "use player artwork from other element" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(11), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12), GADGET_ID_USE_EXPLOSION_ELEMENT, GADGET_ID_NONE, &level.use_explosion_element[0], NULL, "use explosion from element:", "use explosion properties from element" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(12), + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(13), GADGET_ID_INITIAL_GRAVITY, GADGET_ID_NONE, &level.initial_player_gravity[0], NULL, @@ -2863,7 +2872,7 @@ static struct "use initial inventory:", "use collected elements on level start" }, { - ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(5), + 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, @@ -3253,7 +3262,7 @@ static struct /* ---------- level start element ---------------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(9), + -1, ED_AREA_1X1_SETTINGS_YPOS(10), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_START_ELEMENT, GADGET_ID_USE_START_ELEMENT, &level.start_element[0], 1, 1, @@ -3263,7 +3272,7 @@ static struct /* ---------- player artwork element ------------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(10), + -1, ED_AREA_1X1_SETTINGS_YPOS(11), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_ARTWORK_ELEMENT, GADGET_ID_USE_ARTWORK_ELEMENT, &level.artwork_element[0], 1, 1, @@ -3273,7 +3282,7 @@ static struct /* ---------- player explosion element ----------------------------------- */ { - -1, ED_AREA_1X1_SETTINGS_YPOS(11), + -1, ED_AREA_1X1_SETTINGS_YPOS(12), 0, ED_AREA_1X1_SETTINGS_YOFF, GADGET_ID_EXPLOSION_ELEMENT, GADGET_ID_USE_EXPLOSION_ELEMENT, &level.explosion_element[0], 1, 1, @@ -3424,10 +3433,6 @@ static int new_element3 = EL_SAND; #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \ (button) == 2 ? new_element2 : \ (button) == 3 ? new_element3 : EL_EMPTY) -#define BUTTON_STEPSIZE(button) ((button) == 1 ? 1 : \ - (button) == 2 ? 5 : \ - (button) == 3 ? 10 : \ - (button)) /* forward declaration for internal use */ static void ModifyEditorCounterValue(int, int); @@ -5221,9 +5226,9 @@ void PrintEditorElementList() int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element); char *headline = element_info[cascade_element_show].editor_description; - printf_line_with_prefix("# ", "-", 77); - printf("# %s\n", headline); - printf_line_with_prefix("# ", "-", 77); + PrintLineWithPrefix("# ", "-", 77); + Print("# %s\n", headline); + PrintLineWithPrefix("# ", "-", 77); } for (j = 0; j < *editor_elements_info[i].headline_list_size; j++) @@ -5233,21 +5238,21 @@ void PrintEditorElementList() if (IS_EDITOR_CASCADE(element)) element = EL_CHAR_MINUS; - printf("# %s\n", element_info[element].token_name); + Print("# %s\n", element_info[element].token_name); } if (j > 0) - printf("#\n"); + Print("#\n"); for (j = 0; j < *editor_elements_info[i].element_list_size; j++) { int element = (*editor_elements_info[i].element_list)[j]; - printf("# %s\n", element_info[element].token_name); + Print("# %s\n", element_info[element].token_name); } if (j > 0) - printf("#\n"); + Print("#\n"); } } @@ -5645,8 +5650,8 @@ static void CreateCounterButtons() if (i == ED_COUNTER_ID_SELECT_LEVEL) { graphic = (j == 0 ? - IMG_EDITOR_BUTTON_GFX_PREV_LEVEL : - IMG_EDITOR_BUTTON_GFX_NEXT_LEVEL); + IMG_GFX_EDITOR_BUTTON_PREV_LEVEL : + IMG_GFX_EDITOR_BUTTON_NEXT_LEVEL); event_mask |= GD_EVENT_RELEASED; @@ -5714,7 +5719,7 @@ static void CreateCounterButtons() if (i == ED_COUNTER_ID_SELECT_LEVEL) { - graphic = IMG_EDITOR_INPUT_GFX_LEVEL_NUMBER; + graphic = IMG_GFX_EDITOR_INPUT_LEVEL_NUMBER; font_type = FONT_LEVEL_NUMBER; font_type_active = FONT_LEVEL_NUMBER_ACTIVE; @@ -6398,10 +6403,8 @@ static void CreateRadiobuttonGadgets() void CreateLevelEditorGadgets() { - int old_game_status = game_status; - - /* setting 'game_status' is needed to get the right fonts for the editor */ - game_status = GAME_MODE_EDITOR; + /* force EDITOR font inside level editor */ + SetFontStatus(GAME_MODE_EDITOR); /* these values are not constant, but can change at runtime */ ed_fieldx = MAX_ED_FIELDX - 1; @@ -6435,7 +6438,7 @@ void CreateLevelEditorGadgets() CreateTextbuttonGadgets(); CreateDrawingAreas(); - game_status = old_game_status; + ResetFontStatus(); } void FreeLevelEditorGadgets() @@ -7616,25 +7619,23 @@ void InitZoomLevelSettings() MAX_ED_FIELDY = getMaxEdFieldY(FALSE); } -static boolean playfield_area_changed = FALSE; - void DrawLevelEd() { - StopAnimation(); + int fade_mask = REDRAW_FIELD; - CloseDoor(DOOR_CLOSE_ALL); + FadeSoundsAndMusic(); - FadeOut(REDRAW_FIELD); + if (CheckIfGlobalBorderHasChanged()) + fade_mask = REDRAW_ALL; - /* needed after playing if editor playfield area has different size */ - ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); + FadeOut(fade_mask); /* needed if different viewport properties defined for editor */ ChangeViewportPropertiesIfNeeded(); - InitZoomLevelSettings(); + ClearField(); - playfield_area_changed = DrawingAreaChanged(); + InitZoomLevelSettings(); OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY); @@ -7694,7 +7695,9 @@ void DrawLevelEd() DrawEditModeWindow(); - FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD); + DrawMaskedBorder(fade_mask); + + FadeIn(fade_mask); /* copy actual editor door content to door double buffer for OpenDoor() */ BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); @@ -8781,6 +8784,7 @@ static void DrawPropertiesConfig() MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_RELOCATION); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_LAZY_RELOCATION); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT); MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT); @@ -10925,7 +10929,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) DrawFixedGraphicExt(drawto, gi->x + sx * TILEX, gi->y + sy * TILEY, - el2img(new_element), 0); + el2edimg(new_element), 0); if (id == GADGET_ID_CUSTOM_GRAPHIC) new_element = GFX_ELEMENT(new_element); @@ -11881,6 +11885,7 @@ void HandleLevelEditorKeyInput(Key key) { int id = GADGET_ID_NONE; int new_element_shift = element_shift; + int step = ED_ELEMENTLIST_BUTTONS_VERT - 1; int i; switch (key) @@ -11897,13 +11902,23 @@ void HandleLevelEditorKeyInput(Key key) case KSYM_Down: id = GADGET_ID_SCROLL_DOWN; break; + case KSYM_Page_Up: - id = GADGET_ID_SCROLL_LIST_UP; - button = ED_ELEMENTLIST_BUTTONS_VERT - 1; - break; case KSYM_Page_Down: - id = GADGET_ID_SCROLL_LIST_DOWN; - button = ED_ELEMENTLIST_BUTTONS_VERT - 1; + step *= (key == KSYM_Page_Up ? -1 : +1); + element_shift += step * ED_ELEMENTLIST_BUTTONS_HORIZ; + + if (element_shift < 0) + element_shift = 0; + if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS) + element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS; + + ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL], + GDI_SCROLLBAR_ITEM_POSITION, + element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END); + + ModifyEditorElementList(); + break; case KSYM_Home: @@ -11987,12 +12002,13 @@ void HandleLevelEditorKeyInput(Key key) ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button); else if (letter == 'U') ClickOnGadget(level_editor_gadget[GADGET_ID_UNDO], 3); - else if (key == KSYM_KP_Subtract) - ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1); - else if (key == KSYM_KP_0 || letter == '0') - ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 2); - else if (key == KSYM_KP_Add || letter == '+') + else if (letter == '-' || key == KSYM_KP_Subtract) ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 3); + else if (letter == '0' || key == KSYM_KP_0) + ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 2); + else if (letter == '+' || key == KSYM_KP_Add || + letter == '=') // ("Shift-=" is "+" on US keyboards) + ClickOnGadget(level_editor_gadget[GADGET_ID_ZOOM], 1); else if (key == KSYM_Return || key == KSYM_space || key == setup.shortcut.toggle_pause) @@ -12046,7 +12062,7 @@ void PrintEditorGadgetInfoText(struct GadgetInfo *gi) char shortcut[MAX_OUTPUT_LINESIZE + 1]; int max_infotext_len = getMaxInfoTextLength(); - if (gi == NULL || gi->info_text == NULL) + if (gi == NULL || strlen(gi->info_text) == 0) return; strncpy(infotext, gi->info_text, max_infotext_len); @@ -12261,14 +12277,33 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed, Request("Level has changed! Exit without saving?", REQ_ASK | REQ_STAY_OPEN)) { - SetDoorState(DOOR_CLOSE_2); + struct RectWithBorder *vp_door_1 = &viewport.door_1[GAME_MODE_MAIN]; + struct RectWithBorder *vp_door_2 = &viewport.door_2[GAME_MODE_MAIN]; + + /* draw normal door */ + UndrawSpecialEditorDoor(); + + // close editor doors if viewport definition is the same as in main menu + if (vp_door_1->x == DX && + vp_door_1->y == DY && + vp_door_1->width == DXSIZE && + vp_door_1->height == DYSIZE && + vp_door_2->x == VX && + vp_door_2->y == VY && + vp_door_2->width == VXSIZE && + vp_door_2->height == VYSIZE) + CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); + else + SetDoorState(DOOR_CLOSE_2); + + BackToFront(); if (quick_quit) FadeSkipNextFadeIn(); - game_status = GAME_MODE_MAIN; + SetGameStatus(GAME_MODE_MAIN); - DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD); + DrawMainMenu(); } else {