X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=c15014899d9ff269ee308e2a57caaac54939014e;hb=48a25efecc912acbfd07d709e5c45cea3e432f94;hp=f098b1f5f9b025757e32804e850927f4f05251ba;hpb=7892cce9f39489a779f8fad4a3e756b0bb8dbee5;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index f098b1f5..c1501489 100644 --- a/src/editor.c +++ b/src/editor.c @@ -4753,7 +4753,7 @@ static void UnmapLevelEditorToolboxDrawingGadgets() static void UnmapDrawingArea(int id) { - UnmapGadget(level_editor_gadget[id]); + UnmapGadget(level_editor_gadget[drawingarea_info[id].gadget_id]); } static void UnmapLevelEditorWindowGadgets() @@ -5144,6 +5144,15 @@ static void CopyCustomElementPropertiesToEditor(int element) static void CopyGroupElementPropertiesToEditor(int element) { group_element_info = *element_info[element].group; + custom_element = element_info[element]; /* needed for description */ +} + +static void CopyElementPropertiesToEditor(int element) +{ + if (IS_CUSTOM_ELEMENT(element)) + CopyCustomElementPropertiesToEditor(element); + else if (IS_GROUP_ELEMENT(element)) + CopyGroupElementPropertiesToEditor(element); } static void CopyCustomElementPropertiesToGame(int element) @@ -5282,10 +5291,19 @@ 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; +} - *element_info[element].group = group_element_info; +static void CopyElementPropertiesToGame(int element) +{ + if (IS_CUSTOM_ELEMENT(element)) + CopyCustomElementPropertiesToGame(element); + else if (IS_GROUP_ELEMENT(element)) + CopyGroupElementPropertiesToGame(element); } void DrawLevelEd() @@ -5867,7 +5885,8 @@ static void DrawPropertiesTabulatorGadgets() int i; /* draw additional "advanced" tabulator for custom elements */ - if (IS_CUSTOM_ELEMENT(properties_element)) + if (IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element)) id_last = ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED; for (i = id_first; i <= id_last; i++) @@ -5969,6 +5988,12 @@ static void DrawPropertiesInfo() "[Custom Element %d]", properties_element - EL_CUSTOM_START + 1); screen_line++; } + else if (IS_GROUP_ELEMENT(properties_element)) + { + DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3, + "[Group Element %d]", properties_element - EL_GROUP_START + 1); + screen_line++; + } #endif /* ----- print number of elements / percentage of this element in level */ @@ -6197,27 +6222,35 @@ static void DrawPropertiesConfig() /* draw text input gadgets */ MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); } - - if (IS_GROUP_ELEMENT(properties_element)) + else if (IS_GROUP_ELEMENT(properties_element)) { /* draw stickybutton gadget */ i = ED_CHECKBUTTON_ID_STICK_ELEMENT; checkbutton_info[i].y = ED_SETTINGS_YPOS(0); MapCheckbuttonGadget(i); + /* draw counter gadgets */ MapCounterButtons(ED_COUNTER_ID_GROUP_CONTENT); + /* draw drawing area gadgets */ DrawGroupElementArea(properties_element); + + /* draw text input gadgets */ + MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); } } static void DrawPropertiesAdvancedDrawingAreas() { MapDrawingArea(ED_DRAWING_ID_CUSTOM_GRAPHIC); - MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); - MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); - DrawCustomChangeContentArea(); + if (IS_CUSTOM_ELEMENT(properties_element)) + { + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET); + MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER); + + DrawCustomChangeContentArea(); + } redraw_mask |= REDRAW_FIELD; } @@ -6231,27 +6264,42 @@ static void DrawPropertiesAdvanced() checkbutton_info[i].y = ED_SETTINGS_YPOS(0); MapCheckbuttonGadget(i); - /* draw checkbutton gadgets */ - for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; - i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) + if (IS_CUSTOM_ELEMENT(properties_element)) + { + /* draw checkbutton gadgets */ + for (i = ED_CHECKBUTTON_ID_CHANGE_FIRST; + i <= ED_CHECKBUTTON_ID_CHANGE_LAST; i++) MapCheckbuttonGadget(i); - /* draw counter gadgets */ - for (i = ED_COUNTER_ID_CHANGE_FIRST; i <= ED_COUNTER_ID_CHANGE_LAST; i++) - MapCounterButtons(i); + /* draw counter gadgets */ + for (i = ED_COUNTER_ID_CHANGE_FIRST; + i <= ED_COUNTER_ID_CHANGE_LAST; i++) + MapCounterButtons(i); - /* draw selectbox gadgets */ - for (i = ED_SELECTBOX_ID_CHANGE_FIRST; i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) - MapSelectboxGadget(i); + /* draw selectbox gadgets */ + for (i = ED_SELECTBOX_ID_CHANGE_FIRST; + i <= ED_SELECTBOX_ID_CHANGE_LAST; i++) + MapSelectboxGadget(i); - /* draw textbutton gadgets */ - for (i=ED_TEXTBUTTON_ID_CHANGE_FIRST; i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) - MapTextbuttonGadget(i); + /* draw textbutton gadgets */ + for (i = ED_TEXTBUTTON_ID_CHANGE_FIRST; + i <= ED_TEXTBUTTON_ID_CHANGE_LAST; i++) + MapTextbuttonGadget(i); + + /* draw graphicbutton gadgets */ + for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; + i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) + MapGraphicbuttonGadget(i); + } + else if (IS_GROUP_ELEMENT(properties_element)) + { + /* draw checkbutton gadgets */ + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC); + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE); - /* draw graphicbutton gadgets */ - for (i = ED_GRAPHICBUTTON_ID_CHANGE_FIRST; - i <= ED_GRAPHICBUTTON_ID_CHANGE_LAST; i++) - MapGraphicbuttonGadget(i); + /* draw textbutton gadgets */ + MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE); + } /* draw drawing area gadgets */ DrawPropertiesAdvancedDrawingAreas(); @@ -6311,14 +6359,11 @@ static void DrawPropertiesWindow() /* make sure that previous properties edit mode exists for this element */ if (edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED && - !IS_CUSTOM_ELEMENT(properties_element)) + !IS_CUSTOM_ELEMENT(properties_element) && + !IS_GROUP_ELEMENT(properties_element)) edit_mode_properties = ED_MODE_PROPERTIES_CONFIG; - if (IS_CUSTOM_ELEMENT(properties_element)) - CopyCustomElementPropertiesToEditor(properties_element); - - if (IS_GROUP_ELEMENT(properties_element)) - CopyGroupElementPropertiesToEditor(properties_element); + CopyElementPropertiesToEditor(properties_element); UnmapLevelEditorWindowGadgets(); UnmapLevelEditorToolboxDrawingGadgets(); @@ -7104,7 +7149,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) new_element = GFX_ELEMENT(new_element); custom_element.gfx_element = new_element; - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); UpdateCustomElementGraphicGadgets(); @@ -7256,6 +7301,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) PickDrawingElement(button, custom_element_change.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) PickDrawingElement(button, custom_element_change.trigger_element); + else if (id == GADGET_ID_GROUP_CONTENT) + PickDrawingElement(button, group_element_info.element[sx]); else if (id == GADGET_ID_RANDOM_BACKGROUND) PickDrawingElement(button, random_placement_background_element); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -7342,7 +7389,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi) counter_id <= ED_COUNTER_ID_CUSTOM_LAST) || (counter_id >= ED_COUNTER_ID_CHANGE_FIRST && counter_id <= ED_COUNTER_ID_CHANGE_LAST)) - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); } static void HandleTextInputGadgets(struct GadgetInfo *gi) @@ -7353,7 +7400,7 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) if (type_id == ED_TEXTINPUT_ID_ELEMENT_NAME) { - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); ModifyEditorElementList(); /* update changed button info text */ } @@ -7383,7 +7430,7 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi) type_id <= ED_SELECTBOX_ID_CUSTOM_LAST) || (type_id >= ED_SELECTBOX_ID_CHANGE_FIRST && type_id <= ED_SELECTBOX_ID_CHANGE_LAST)) - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); } static void HandleTextbuttonGadgets(struct GadgetInfo *gi) @@ -7480,7 +7527,7 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST && type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)) { - CopyCustomElementPropertiesToGame(properties_element); + CopyElementPropertiesToGame(properties_element); } if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) @@ -8025,7 +8072,6 @@ void HandleEditorGadgetInfoText(void *ptr) static void HandleDrawingAreaInfo(struct GadgetInfo *gi) { static int start_lx, start_ly; - char *infotext; int id = gi->custom_id; int sx = gi->event.x; int sy = gi->event.y; @@ -8035,6 +8081,11 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) int max_sx = gi->drawing.area_xsize - 1; int max_sy = gi->drawing.area_ysize - 1; int actual_drawing_function = drawing_function; + int max_infotext_len = getMaxInfoTextLength(); + char infotext[MAX_OUTPUT_LINESIZE + 1]; + char *text; + + infotext[0] = '\0'; /* start with empty info text */ /* pressed Control key: simulate picking element */ if (GetKeyModState() & KMOD_Control) @@ -8082,41 +8133,48 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) switch (actual_drawing_function) { case GADGET_ID_SINGLE_ITEMS: - infotext = "Drawing single items"; + text = "Drawing single items"; break; case GADGET_ID_CONNECTED_ITEMS: - infotext = "Drawing connected items"; + text = "Drawing connected items"; break; case GADGET_ID_LINE: - infotext = "Drawing line"; + text = "Drawing line"; break; case GADGET_ID_ARC: - infotext = "Drawing arc"; + text = "Drawing arc"; break; case GADGET_ID_TEXT: - infotext = "Setting text cursor"; + text = "Setting text cursor"; break; case GADGET_ID_RECTANGLE: - infotext = "Drawing rectangle"; + text = "Drawing rectangle"; break; case GADGET_ID_FILLED_BOX: - infotext = "Drawing filled box"; + text = "Drawing filled box"; break; case GADGET_ID_FLOOD_FILL: - infotext = "Flood fill"; + text = "Flood fill"; break; case GADGET_ID_GRAB_BRUSH: - infotext = "Grabbing brush"; + text = "Grabbing brush"; break; case GADGET_ID_PICK_ELEMENT: - infotext = "Picking element"; + text = "Picking element"; break; default: - infotext = "Drawing position"; + text = "Drawing position"; break; } +#if 1 + if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + sprintf(infotext, "%s: %d, %d", text, lx, ly); + else + sprintf(infotext, "%s: %d, %d", text, + ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, lx, ly); @@ -8124,13 +8182,23 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); +#endif } +#if 1 + else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) + strncpy(infotext, getElementInfoText(Feld[lx][ly]), max_infotext_len); + else + sprintf(infotext, "Level position: %d, %d", lx, ly); + + infotext[max_infotext_len] = '\0'; +#else else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", getElementInfoText(Feld[lx][ly])); else DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Level position: %d, %d", lx, ly); +#endif } /* misuse this function to draw brush cursor, if needed */ @@ -8145,64 +8213,58 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) else if (actual_drawing_function == GADGET_ID_PICK_ELEMENT) { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.amoeba_content)); + text = getElementInfoText(level.amoeba_content); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.gfx_element)); + text = getElementInfoText(custom_element.gfx_element); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element.content[sx][sy])); + text = getElementInfoText(custom_element.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.target_element)); + text = getElementInfoText(custom_element_change.target_element); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.content[sx][sy])); + text = getElementInfoText(custom_element_change.content[sx][sy]); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(custom_element_change.trigger_element)); + text = getElementInfoText(custom_element_change.trigger_element); + else if (id == GADGET_ID_GROUP_CONTENT) + text = getElementInfoText(group_element_info.element[sx]); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(random_placement_background_element)); + text = getElementInfoText(random_placement_background_element); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) { int i = id - GADGET_ID_ELEMENT_CONTENT_0; - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", - getElementInfoText(level.yamyam_content[i][sx][sy])); + text = getElementInfoText(level.yamyam_content[i][sx][sy]); } + + strncpy(infotext, text, max_infotext_len); + infotext[max_infotext_len] = '\0'; } else { if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Amoeba content"); + strcpy(infotext, "Amoeba content"); else if (id == GADGET_ID_CUSTOM_GRAPHIC) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom graphic element"); + strcpy(infotext, "Custom graphic element"); else if (id == GADGET_ID_CUSTOM_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Custom element content position: %d, %d", sx, sy); + sprintf(infotext, "Custom element content position: %d, %d", sx, sy); else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New element after change"); + strcpy(infotext, "New element after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "New extended elements after change"); + strcpy(infotext, "New extended elements after change"); else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Other element triggering change"); + strcpy(infotext, "Other element triggering change"); + else if (id == GADGET_ID_GROUP_CONTENT) + sprintf(infotext, "Group element position: %d", sx + 1); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Random placement background"); + strcpy(infotext, "Random placement background"); else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && id <= GADGET_ID_ELEMENT_CONTENT_7) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, - "Content area %d position: %d, %d", - id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); + sprintf(infotext, "Content area %d position: %d, %d", + id - GADGET_ID_ELEMENT_CONTENT_0 + 1, sx, sy); } + + if (strlen(infotext) > 0) + DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext); } void RequestExitLevelEditor(boolean ask_if_level_has_changed)