X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Feditor.c;h=de334bb5241a7d9966b7deb138afdd1f8a24c4a5;hb=5a2237add0a19d1559c0fe20c3f27651a71adf6c;hp=5dc75613970142144db6e289a234b90550988c35;hpb=940ec320c7cdae17cda81436408c2f75b8c9a524;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 5dc75613..de334bb5 100644 --- a/src/editor.c +++ b/src/editor.c @@ -5509,6 +5509,8 @@ static void ResetUndoBuffer() undo_buffer_position = -1; undo_buffer_steps = -1; CopyLevelToUndoBuffer(UNDO_IMMEDIATE); + + level.changed = FALSE; } static void DrawEditModeWindow() @@ -5526,15 +5528,18 @@ static void DrawEditModeWindow() static boolean LevelChanged() { - boolean level_changed = FALSE; + boolean field_changed = FALSE; int x, y; + if (leveldir_current->readonly) + return FALSE; + for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++) if (Feld[x][y] != level.field[x][y]) - level_changed = TRUE; + field_changed = TRUE; - return level_changed; + return (level.changed || field_changed); } static boolean LevelContainsPlayer() @@ -5542,6 +5547,8 @@ static boolean LevelContainsPlayer() boolean player_found = FALSE; int x, y; + return TRUE; /* !!! CURRENTLY DEACTIVATED !!! */ + for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++) if (Feld[x][y] == EL_PLAYER_1 || @@ -5741,6 +5748,8 @@ static boolean CopyCustomElement(int element_old, int element_new, element_old = (IS_CUSTOM_ELEMENT(element_new) ? EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP); copy_mode = GADGET_ID_CUSTOM_COPY_TO; + + level.changed = TRUE; } else if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new)) { @@ -5754,6 +5763,10 @@ static boolean CopyCustomElement(int element_old, int element_new, return FALSE; } + else + { + level.changed = TRUE; + } if (copy_mode == GADGET_ID_CUSTOM_COPY_FROM) { @@ -5999,6 +6012,7 @@ static void CopyCustomElementPropertiesToGame(int element) /* mark that this custom element has been modified */ custom_element.modified_settings = TRUE; + level.changed = TRUE; if (level.use_custom_template) { @@ -6156,6 +6170,7 @@ static void CopyGroupElementPropertiesToGame(int element) /* mark that this group element has been modified */ element_info[element].modified_settings = TRUE; + level.changed = TRUE; } static void CopyClassicElementPropertiesToGame(int element) @@ -7903,6 +7918,8 @@ static int DrawLevelText(int sx, int sy, char letter, int mode) DrawLevelText(start_sx, sy + 1, 0, TEXT_SETCURSOR); else DrawLevelText(0, 0, 0, TEXT_END); + + level.changed = TRUE; } break; @@ -7991,6 +8008,8 @@ static void CopyLevelToUndoBuffer(int mode) SetBorderElement(); if (BorderElement != last_border_element) DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); + + level.changed = TRUE; } static void RandomPlacement(int new_element) @@ -8024,24 +8043,21 @@ static void RandomPlacement(int new_element) for (y = 0; y < lev_fieldy; y++) if (free_position[x][y]) Feld[x][y] = new_element; - - DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); - CopyLevelToUndoBuffer(UNDO_IMMEDIATE); - - return; } - - while (num_elements > 0) + else { - x = RND(lev_fieldx); - y = RND(lev_fieldy); - - /* don't place element at the same position twice */ - if (free_position[x][y]) + while (num_elements > 0) { - free_position[x][y] = FALSE; - Feld[x][y] = new_element; - num_elements--; + x = RND(lev_fieldx); + y = RND(lev_fieldy); + + /* don't place element at the same position twice */ + if (free_position[x][y]) + { + free_position[x][y] = FALSE; + Feld[x][y] = new_element; + num_elements--; + } } } @@ -8414,6 +8430,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi) { if (gadget_id == counterbutton_info[counter_id].gadget_id_text) ModifyEditorCounter(counter_id, *counter_value); + return; } } @@ -8423,6 +8440,16 @@ static void HandleCounterButtons(struct GadgetInfo *gi) else ModifyEditorCounter(counter_id, *counter_value + step); + if (counter_id == ED_COUNTER_ID_SELECT_LEVEL) + { + LoadLevel(level_nr); + TapeErase(); + ResetUndoBuffer(); + DrawEditModeWindow(); + + return; + } + switch (counter_id) { case ED_COUNTER_ID_ELEMENT_CONTENT: @@ -8445,13 +8472,6 @@ static void HandleCounterButtons(struct GadgetInfo *gi) lev_fieldy = level.fieldy; break; - case ED_COUNTER_ID_SELECT_LEVEL: - LoadLevel(level_nr); - TapeErase(); - ResetUndoBuffer(); - DrawEditModeWindow(); - break; - default: break; } @@ -8461,6 +8481,8 @@ static void HandleCounterButtons(struct GadgetInfo *gi) (counter_id >= ED_COUNTER_ID_CHANGE_FIRST && counter_id <= ED_COUNTER_ID_CHANGE_LAST)) CopyElementPropertiesToGame(properties_element); + + level.changed = TRUE; } static void HandleTextInputGadgets(struct GadgetInfo *gi) @@ -8475,6 +8497,8 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) ModifyEditorElementList(); /* update changed button info text */ } + + level.changed = TRUE; } static void HandleTextAreaGadgets(struct GadgetInfo *gi) @@ -8482,6 +8506,8 @@ static void HandleTextAreaGadgets(struct GadgetInfo *gi) int type_id = gi->custom_type_id; strcpy(textarea_info[type_id].value, gi->textarea.value); + + level.changed = TRUE; } static void HandleSelectboxGadgets(struct GadgetInfo *gi) @@ -8502,7 +8528,11 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST && type_id <= ED_SELECTBOX_ID_CHANGE_LAST) || (type_id == ED_SELECTBOX_ID_GROUP_CHOICE_MODE)) + { CopyElementPropertiesToGame(properties_element); + + level.changed = TRUE; + } } static void HandleTextbuttonGadgets(struct GadgetInfo *gi) @@ -8543,6 +8573,8 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) setElementChangeInfoToDefaults(ei->change); DrawPropertiesWindow(); + + level.changed = TRUE; } else if (type_id == ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE && custom_element.num_change_pages > MIN_CHANGE_PAGES) @@ -8556,6 +8588,8 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) setElementChangePages(ei, ei->num_change_pages - 1); DrawPropertiesWindow(); + + level.changed = TRUE; } } @@ -8589,9 +8623,13 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi) 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) + { ei->change_page[current_change_page] = element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0]; + level.changed = TRUE; + } + DrawPropertiesWindow(); } } @@ -8600,6 +8638,8 @@ static void HandleRadiobuttons(struct GadgetInfo *gi) { *radiobutton_info[gi->custom_type_id].value = radiobutton_info[gi->custom_type_id].checked_value; + + level.changed = TRUE; } static void HandleCheckbuttons(struct GadgetInfo *gi) @@ -8642,6 +8682,8 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) DrawEditModeWindow(); } + + level.changed = TRUE; } static void HandleControlButtons(struct GadgetInfo *gi) @@ -8907,6 +8949,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) for (x = 0; x < MAX_LEV_FIELDX; x++) for (y = 0; y < MAX_LEV_FIELDY; y++) Feld[x][y] = (button == 1 ? EL_EMPTY : new_element); + CopyLevelToUndoBuffer(GADGET_ID_CLEAR); DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos); @@ -8919,7 +8962,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; } - if (!LevelContainsPlayer) + if (!LevelContainsPlayer()) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { @@ -8936,11 +8979,13 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (new_level) Request("Level saved !", REQ_CONFIRM); + + level.changed = FALSE; } break; case GADGET_ID_TEST: - if (!LevelContainsPlayer) + if (!LevelContainsPlayer()) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else {