X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=4a9491d0fbc2c0481cdae62704cba03a865b09cf;hp=51ac61b211851e76e42e70c09e7c91661510d0b2;hb=7438ace9ddf2b1f08cf76cfa8bc63396aac405d3;hpb=8c3660a79a3ca587049365e4a1f1fad4ce063dc6 diff --git a/src/editor.c b/src/editor.c index 51ac61b2..4a9491d0 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) * \ @@ -943,6 +984,9 @@ #define ED_NUM_DRAWING_AREAS 33 +#define ED_DRAWING_ID_EDITOR_FIRST ED_DRAWING_ID_RANDOM_BACKGROUND +#define ED_DRAWING_ID_EDITOR_LAST ED_DRAWING_ID_RANDOM_BACKGROUND + /* ----------------------------------------------------------------------------- @@ -2532,8 +2576,10 @@ static struct char *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" @@ -2544,8 +2590,11 @@ static struct 8, "Editor", 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" @@ -2574,6 +2623,9 @@ static struct 8, "Change", NULL, NULL, "Configure custom element change pages" }, + + /* ---------- element settings (buttons) --------------------------------- */ + { -1, -1, GADGET_ID_SAVE_AS_TEMPLATE, GADGET_ID_CUSTOM_USE_TEMPLATE, @@ -4826,7 +4878,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 }; @@ -4849,67 +4900,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 @@ -6135,8 +6186,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); @@ -7528,7 +7579,7 @@ 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; @@ -10964,6 +11015,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { static boolean started_inside_drawing_area = FALSE; int id = gi->custom_id; + int type_id = gi->custom_type_id; boolean button_press_event; boolean button_release_event; boolean inside_drawing_area = !gi->event.off_borders; @@ -11075,7 +11127,6 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (!button_release_event) { - int type_id = gi->custom_type_id; int pos = sx * drawingarea_info[type_id].area_ysize + sy; if (item_xsize == MINI_TILEX && item_ysize == MINI_TILEY) @@ -11202,17 +11253,22 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) PickDrawingElement(button, Feld[lx][ly]); else { - int type_id = gi->custom_type_id; int pos = sx * drawingarea_info[type_id].area_ysize + sy; PickDrawingElement(button, drawingarea_info[type_id].value[pos]); } - break; - default: break; } + + /* do not mark level as modified for certain non-level-changing gadgets */ + if ((type_id >= ED_DRAWING_ID_EDITOR_FIRST && + type_id <= ED_DRAWING_ID_EDITOR_LAST) || + actual_drawing_function == GADGET_ID_PICK_ELEMENT) + return; + + level.changed = TRUE; } static void HandleCounterButtons(struct GadgetInfo *gi) @@ -11309,6 +11365,11 @@ static void HandleCounterButtons(struct GadgetInfo *gi) counter_id <= ED_COUNTER_ID_CHANGE_LAST)) CopyElementPropertiesToGame(properties_element); + /* do not mark level as modified for certain non-level-changing gadgets */ + if (counter_id >= ED_COUNTER_ID_EDITOR_FIRST && + counter_id <= ED_COUNTER_ID_EDITOR_LAST) + return; + level.changed = TRUE; } @@ -11504,8 +11565,15 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi) static void HandleRadiobuttons(struct GadgetInfo *gi) { - *radiobutton_info[gi->custom_type_id].value = - radiobutton_info[gi->custom_type_id].checked_value; + int type_id = gi->custom_type_id; + + *radiobutton_info[type_id].value = + radiobutton_info[type_id].checked_value; + + /* do not mark level as modified for certain non-level-changing gadgets */ + if (type_id >= ED_RADIOBUTTON_ID_EDITOR_FIRST && + type_id <= ED_RADIOBUTTON_ID_EDITOR_LAST) + return; level.changed = TRUE; } @@ -11566,11 +11634,23 @@ 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(); } + /* do not mark level as modified for certain non-level-changing gadgets */ + if ((type_id >= ED_CHECKBUTTON_ID_EDITOR_FIRST && + type_id <= ED_CHECKBUTTON_ID_EDITOR_LAST) || + type_id == ED_CHECKBUTTON_ID_STICK_ELEMENT) + return; + level.changed = TRUE; }