X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=8d9f58219b87a0bf96910ab3955e0cc482b298a3;hp=351818540394017ad7b7cdb725ed3cce722d19d6;hb=5c5685a92a0ca8060018c4d035e6b37fea7e0f5a;hpb=0281b0b196bdb10b3ee17d93c6db75f90de31458 diff --git a/src/editor.c b/src/editor.c index 35181854..8d9f5821 100644 --- a/src/editor.c +++ b/src/editor.c @@ -943,6 +943,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 + /* ----------------------------------------------------------------------------- @@ -3505,6 +3508,7 @@ static void HandleCheckbuttons(struct GadgetInfo *); static void HandleControlButtons(struct GadgetInfo *); static void HandleDrawingAreaInfo(struct GadgetInfo *); static void PrintEditorGadgetInfoText(struct GadgetInfo *); +static boolean AskToCopyAndModifyLevelTemplate(); static int num_editor_gadgets = 0; /* dynamically determined */ @@ -4825,7 +4829,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 }; @@ -4848,67 +4851,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 @@ -7280,6 +7283,8 @@ static void replace_custom_element_in_playfield(int element_from, static boolean CopyCustomElement(int element_old, int element_new, int copy_mode) { + int copy_mode_orig = copy_mode; + if (copy_mode == GADGET_ID_CUSTOM_COPY) { element_new = (IS_CUSTOM_ELEMENT(element_old) ? @@ -7311,6 +7316,13 @@ static boolean CopyCustomElement(int element_old, int element_new, level.changed = TRUE; } + /* when modifying custom/group element, ask for copying level template */ + if (copy_mode_orig != GADGET_ID_CUSTOM_COPY && level.use_custom_template) + { + if (!AskToCopyAndModifyLevelTemplate()) + return FALSE; + } + if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM) { copy_custom_element_settings(element_new, element_old); @@ -7516,6 +7528,27 @@ static void CopyElementPropertiesToEditor(int element) CopyClassicElementPropertiesToEditor(element); } +static boolean AskToCopyAndModifyLevelTemplate() +{ + 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], + GDI_CHECKED, FALSE, GDI_END); + + return TRUE; + } + else + { + LoadLevelTemplate(-1); /* this resets all element modifications ... */ + + DrawEditModeWindow(); /* ... and copies them to 'custom_element' */ + + return FALSE; + } +} + static void CopyCustomElementPropertiesToGame(int element) { int i; @@ -7526,20 +7559,7 @@ static void CopyCustomElementPropertiesToGame(int element) level.changed = TRUE; if (level.use_custom_template) - { - if (Request("Copy and modify level template?", REQ_ASK)) - { - level.use_custom_template = FALSE; - ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE], - GDI_CHECKED, FALSE, GDI_END); - } - else - { - LoadLevelTemplate(-1); /* this resets all element modifications ... */ - - DrawEditModeWindow(); /* ... and copies them to 'custom_element' */ - } - } + AskToCopyAndModifyLevelTemplate(); element_info[element] = custom_element; *element_info[element].change = custom_element_change; @@ -7650,12 +7670,15 @@ static void CopyCustomElementPropertiesToGame(int element) static void CopyGroupElementPropertiesToGame(int element) { - element_info[element] = custom_element; - *element_info[element].group = group_element_info; - /* mark that this group element has been modified */ - element_info[element].modified_settings = TRUE; + custom_element.modified_settings = TRUE; level.changed = TRUE; + + if (level.use_custom_template) + AskToCopyAndModifyLevelTemplate(); + + element_info[element] = custom_element; + *element_info[element].group = group_element_info; } static void CopyClassicElementPropertiesToGame(int element) @@ -9309,11 +9332,9 @@ static void DrawPaletteWindow() static void UpdateCustomElementGraphicGadgets() { - struct ElementInfo *ei = &element_info[properties_element]; int i; - ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial : - properties_element); + InitElementPropertiesGfxElement(); ModifyEditorElementList(); RedrawDrawingElements(); @@ -10945,6 +10966,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; @@ -11054,9 +11076,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) SetElementButton(lx, ly, new_element, button); } } - else + 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) @@ -11183,17 +11204,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) @@ -11290,6 +11316,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; } @@ -11376,8 +11407,7 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) { - char *template_filename = getDefaultLevelFilename(-1); - boolean new_template = !fileExists(template_filename); + boolean new_template = !fileExists(getLocalLevelTemplateFilename()); /* backup original "level.field" (needed to track playfield changes) */ CopyPlayfield(level.field, FieldBackup); @@ -11400,6 +11430,10 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { struct ElementInfo *ei = &element_info[properties_element]; + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + setElementChangePages(ei, ei->num_change_pages + 1); /* set new change page to be new current change page */ @@ -11417,6 +11451,10 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) { struct ElementInfo *ei = &element_info[properties_element]; + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + /* copy all change pages after change page to be deleted */ for (i = ei->current_change_page; i < ei->num_change_pages - 1; i++) ei->change_page[i] = ei->change_page[i + 1]; @@ -11456,10 +11494,16 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi) int current_change_page = ei->current_change_page; if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE) + { element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0] = ei->change_page[current_change_page]; + } else if (type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE) { + /* when modifying custom element, ask for copying level template */ + if (level.use_custom_template && !AskToCopyAndModifyLevelTemplate()) + return; + ei->change_page[current_change_page] = element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0]; @@ -11472,8 +11516,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; } @@ -11502,23 +11553,55 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { - char *template_filename = getDefaultLevelFilename(-1); + boolean template_related_changes_found = FALSE; + int i; - if (level.use_custom_template && !fileExists(template_filename)) + /* check if any custom or group elements have been changed */ + for (i = 0; i < NUM_FILE_ELEMENTS; i++) + if ((IS_CUSTOM_ELEMENT(i) || IS_GROUP_ELEMENT(i)) && + element_info[i].modified_settings) + template_related_changes_found = TRUE; + + if (level.use_custom_template && + !fileExists(getGlobalLevelTemplateFilename())) { Request("No level template found!", REQ_CONFIRM); level.use_custom_template = FALSE; + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); return; } + if (level.use_custom_template && + template_related_changes_found && + !Request("Discard changes and use level template?", REQ_ASK)) + { + level.use_custom_template = FALSE; + + ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END); + + 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; }