X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=f098b1f5f9b025757e32804e850927f4f05251ba;hb=7892cce9f39489a779f8fad4a3e756b0bb8dbee5;hp=9914b16f83b5a60a81f8ceb500e426bfec6b8b0a;hpb=8f33ee4940b9c35bf4627b7ef1126d03748da646;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 9914b16f..f098b1f5 100644 --- a/src/editor.c +++ b/src/editor.c @@ -153,6 +153,9 @@ #define ED_AREA_ELEM_CONTENT6_XPOS (29 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT6_YPOS (ED_SETTINGS_YPOS(10) + \ ED_GADGET_DISTANCE - MINI_TILEY) +/* group element content */ +#define ED_AREA_GROUP_CONTENT_XPOS ED_SETTINGS_XPOS(0) +#define ED_AREA_GROUP_CONTENT_YPOS (22 * MINI_TILEY) /* values for random placement background drawing area */ #define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY) @@ -375,9 +378,12 @@ #define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 57) #define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 58) #define GADGET_ID_CHANGE_CONT_RND_UP (GADGET_ID_COUNTER_FIRST + 59) +#define GADGET_ID_GROUP_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_GROUP_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 61) +#define GADGET_ID_GROUP_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 62) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 60) +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 63) #define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) #define GADGET_ID_ELEMENT_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) @@ -394,10 +400,11 @@ #define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 12) #define GADGET_ID_CUSTOM_CHANGE_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 13) #define GADGET_ID_CUSTOM_CHANGE_TRIGGER (GADGET_ID_DRAWING_AREA_FIRST + 14) -#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_GROUP_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 15) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 16) /* text input identifiers */ -#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 16) +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 17) #define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) #define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) @@ -523,11 +530,12 @@ #define ED_COUNTER_ID_PUSH_DELAY_RND 14 #define ED_COUNTER_ID_MOVE_DELAY_FIX 15 #define ED_COUNTER_ID_MOVE_DELAY_RND 16 -#define ED_COUNTER_ID_CHANGE_DELAY_FIX 17 -#define ED_COUNTER_ID_CHANGE_DELAY_RND 18 -#define ED_COUNTER_ID_CHANGE_CONT_RND 19 +#define ED_COUNTER_ID_GROUP_CONTENT 17 +#define ED_COUNTER_ID_CHANGE_DELAY_FIX 18 +#define ED_COUNTER_ID_CHANGE_DELAY_RND 19 +#define ED_COUNTER_ID_CHANGE_CONT_RND 20 -#define ED_NUM_COUNTERBUTTONS 20 +#define ED_NUM_COUNTERBUTTONS 21 #define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE #define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM @@ -694,9 +702,10 @@ #define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET 12 #define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT 13 #define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER 14 -#define ED_DRAWING_ID_RANDOM_BACKGROUND 15 +#define ED_DRAWING_ID_GROUP_CONTENT 15 +#define ED_DRAWING_ID_RANDOM_BACKGROUND 16 -#define ED_NUM_DRAWING_AREAS 16 +#define ED_NUM_DRAWING_AREAS 17 /* @@ -795,6 +804,7 @@ static boolean stick_element_properties_window = FALSE; static boolean custom_element_properties[NUM_ELEMENT_PROPERTIES]; static boolean custom_element_change_events[NUM_CHANGE_EVENTS]; static struct ElementChangeInfo custom_element_change; +static struct ElementGroupInfo group_element_info; static struct ElementInfo custom_element; static struct @@ -902,7 +912,7 @@ static struct NULL, " ", "height", }, - /* ---------- element settings: configure (custom elements) ------------- */ + /* ---------- element settings: configure (custom elements) -------------- */ { ED_SETTINGS_XPOS(1), ED_SETTINGS_YPOS(3), @@ -953,6 +963,17 @@ static struct NULL, "+random", NULL }, + /* ---------- element settings: configure (group elements) --------------- */ + + { + ED_SETTINGS_XPOS(0), ED_SETTINGS_YPOS(6), + MIN_ELEMENTS_IN_GROUP, MAX_ELEMENTS_IN_GROUP, + GADGET_ID_GROUP_CONTENT_DOWN, GADGET_ID_GROUP_CONTENT_UP, + GADGET_ID_GROUP_CONTENT_TEXT, GADGET_ID_NONE, + &group_element_info.num_elements, + NULL, NULL, "number of elements in group" + }, + /* ---------- element settings: advanced (custom elements) --------------- */ { @@ -1070,8 +1091,12 @@ static struct ValueTextInfo options_move_pattern[] = { MV_ALONG_RIGHT_SIDE, "along right side" }, { MV_TURNING_LEFT, "turning left" }, { MV_TURNING_RIGHT, "turning right" }, + { MV_TURNING_LEFT_RIGHT, "turning left, right" }, + { MV_TURNING_RIGHT_LEFT, "turning right, left" }, + { MV_TURNING_RANDOM, "turning random" }, { MV_WHEN_PUSHED, "when pushed" }, -#if 0 + { MV_WHEN_DROPPED, "when dropped" }, +#if 1 { MV_MAZE_RUNNER, "maze runner style" }, { MV_MAZE_HUNTER, "maze hunter style" }, #endif @@ -1129,6 +1154,7 @@ static struct ValueTextInfo options_deadliness[] = static struct ValueTextInfo options_consistency[] = { { EP_CAN_EXPLODE_3X3, "can explode 3x3" }, + { EP_CAN_EXPLODE_DYNA, "can explode 3+3" }, { EP_CAN_EXPLODE_1X1, "can explode 1x1" }, { EP_INDESTRUCTIBLE, "indestructible" }, { -1, NULL } @@ -1150,11 +1176,11 @@ static struct ValueTextInfo options_change_direct_action[] = { CE_LEFT_BY_PLAYER, "left by player ..." }, { CE_DROPPED_BY_PLAYER, "dropped by player" }, { CE_SWITCHED, "switched ..." }, -#if 0 - { CE_COLLISION_ACTIVE, "hitting something ..." }, - { CE_COLLISION_PASSIVE, "hit by something ..." }, +#if 1 + { CE_HITTING_SOMETHING, "hitting something ..." }, + { CE_HIT_BY_SOMETHING, "hit by something ..." }, #else - { CE_COLLISION_ACTIVE, "collision ..." }, + { CE_HITTING_SOMETHING, "collision ..." }, #endif { CE_IMPACT, "impact (on something)" }, { CE_SMASHED, "smashed (from above)" }, @@ -1172,9 +1198,9 @@ static struct ValueTextInfo options_change_other_action[] = { CE_OTHER_GETS_COLLECTED, "player collects" }, { CE_OTHER_GETS_DROPPED, "player drops" }, { CE_OTHER_IS_TOUCHING, "touching ..." }, -#if 0 - { CE_OTHER_IS_COLL_ACTIVE, "hitting ..." }, - { CE_OTHER_IS_COLL_PASSIVE, "hit by ..." }, +#if 1 + { CE_OTHER_IS_HITTING, "hitting ..." }, + { CE_OTHER_GETS_HIT, "hit by ..." }, #endif { CE_OTHER_IS_SWITCHING, "switch of ..." }, { CE_OTHER_IS_CHANGING, "change of" }, @@ -1841,6 +1867,15 @@ static struct NULL, NULL, NULL }, + /* ---------- group element content -------------------------------------- */ + + { + ED_AREA_GROUP_CONTENT_XPOS, ED_AREA_GROUP_CONTENT_YPOS, + MAX_ELEMENTS_IN_GROUP, 1, + GADGET_ID_GROUP_CONTENT, GADGET_ID_NONE, + "content:", NULL, NULL + }, + /* ---------- random background (for random painting) -------------------- */ { @@ -1880,6 +1915,7 @@ static int new_element3 = EL_SAND; static void ModifyEditorCounter(int, int); static void ModifyEditorCounterLimits(int, int, int); static void ModifyEditorSelectbox(int, int); +static void ModifyEditorDrawingArea(int, int, int); static void ModifyEditorElementList(); static void RedrawDrawingElements(); static void DrawDrawingWindow(); @@ -2899,6 +2935,87 @@ static int *editor_el_custom_more_ptr = editor_el_custom_more; static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more); static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more); +static int editor_hl_group[] = +{ + EL_CHAR('G'), + EL_CHAR('R'), + EL_CHAR('O'), + EL_CHAR('U'), + + EL_CHAR('P'), + EL_CHAR(' '), + EL_CHAR(' '), + EL_CHAR(' '), + + EL_CHAR('E'), + EL_CHAR('L'), + EL_CHAR('E'), + EL_CHAR('M'), + + EL_CHAR('E'), + EL_CHAR('N'), + EL_CHAR('T'), + EL_CHAR('S'), +}; + +static int editor_el_group[] = +{ + EL_GROUP_START + 0, + EL_GROUP_START + 1, + EL_GROUP_START + 2, + EL_GROUP_START + 3, + + EL_GROUP_START + 4, + EL_GROUP_START + 5, + EL_GROUP_START + 6, + EL_GROUP_START + 7, + + EL_GROUP_START + 8, + EL_GROUP_START + 9, + EL_GROUP_START + 10, + EL_GROUP_START + 11, + + EL_GROUP_START + 12, + EL_GROUP_START + 13, + EL_GROUP_START + 14, + EL_GROUP_START + 15 +}; +static int *editor_hl_group_ptr = editor_hl_group; +static int *editor_el_group_ptr = editor_el_group; +static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group); +static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group); + +static int editor_hl_group_more[] = +{ +}; + +static int editor_el_group_more[] = +{ + EL_GROUP_START + 16, + EL_GROUP_START + 17, + EL_GROUP_START + 18, + EL_GROUP_START + 19, + + EL_GROUP_START + 20, + EL_GROUP_START + 21, + EL_GROUP_START + 22, + EL_GROUP_START + 23, + + EL_GROUP_START + 24, + EL_GROUP_START + 25, + EL_GROUP_START + 26, + EL_GROUP_START + 27, + + EL_GROUP_START + 28, + EL_GROUP_START + 29, + EL_GROUP_START + 30, + EL_GROUP_START + 31 +}; +static int *editor_hl_group_more_ptr = editor_hl_group_more; +static int *editor_el_group_more_ptr = editor_el_group_more; +static int num_editor_hl_group_more = SIZEOF_ARRAY_INT(editor_hl_group_more); +static int num_editor_el_group_more = SIZEOF_ARRAY_INT(editor_el_group_more); + static int editor_hl_user_defined[] = { EL_CHAR('U'), @@ -2999,6 +3116,16 @@ editor_elements_info[] = &editor_hl_custom_more_ptr, &num_editor_hl_custom_more, &editor_el_custom_more_ptr, &num_editor_el_custom_more }, + { + &setup.editor.el_custom, + &editor_hl_group_ptr, &num_editor_hl_group, + &editor_el_group_ptr, &num_editor_el_group + }, + { + &setup.editor.el_custom_more, + &editor_hl_group_more_ptr, &num_editor_hl_group_more, + &editor_el_group_more_ptr, &num_editor_el_group_more + }, { &setup.editor.el_user_defined, &editor_hl_user_defined_ptr, &num_editor_hl_user_defined, @@ -3220,8 +3347,8 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height, (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER); Bitmap *src_bitmap; int src_x, src_y; - int num_mini_tilex = width / MINI_TILEX + 1; - int num_mini_tiley = width / MINI_TILEY + 1; + int num_mini_tilex = width / MINI_TILEX + 1; + int num_mini_tiley = height / MINI_TILEY + 1; int x, y; getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y); @@ -3266,6 +3393,10 @@ static void DrawDrawingArea(int id) else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER) DrawMiniGraphicExt(drawto, gi->x, gi->y, el2edimg(custom_element_change.trigger_element)); + else if (id == ED_DRAWING_ID_GROUP_CONTENT) + for (x = 0; x < group_element_info.num_elements; x++) + DrawMiniGraphicExt(drawto, gi->x + x * MINI_TILEX, gi->y, + el2edimg(group_element_info.element[x])); else if (id >= ED_DRAWING_ID_ELEMENT_CONTENT_0 && id <= ED_DRAWING_ID_ELEMENT_CONTENT_7) { @@ -4958,11 +5089,13 @@ static void CopyCustomElementPropertiesToEditor(int element) (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE : CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 : CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 : + CAN_EXPLODE_DYNA(element) ? EP_CAN_EXPLODE_DYNA : custom_element.consistency); custom_element_properties[EP_EXPLODE_RESULT] = (IS_INDESTRUCTIBLE(element) || CAN_EXPLODE_1X1(element) || - CAN_EXPLODE_3X3(element)); + CAN_EXPLODE_3X3(element) || + CAN_EXPLODE_DYNA(element)); /* special case: sub-settings dependent from main setting */ if (CAN_EXPLODE_BY_FIRE(element)) @@ -4983,8 +5116,8 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_LEFT_BY_PLAYER) ? CE_LEFT_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_DROPPED_BY_PLAYER) ? CE_DROPPED_BY_PLAYER : HAS_CHANGE_EVENT(element, CE_SWITCHED) ? CE_SWITCHED : - HAS_CHANGE_EVENT(element, CE_COLLISION_ACTIVE) ? CE_COLLISION_ACTIVE : - HAS_CHANGE_EVENT(element, CE_COLLISION_PASSIVE) ? CE_COLLISION_PASSIVE : + HAS_CHANGE_EVENT(element, CE_HITTING_SOMETHING) ? CE_HITTING_SOMETHING : + HAS_CHANGE_EVENT(element, CE_HIT_BY_SOMETHING) ? CE_HIT_BY_SOMETHING : HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT : HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED : custom_element_change.direct_action); @@ -5000,14 +5133,19 @@ static void CopyCustomElementPropertiesToEditor(int element) HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED : HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED : HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_COLL_ACTIVE) ? CE_OTHER_IS_COLL_ACTIVE : - HAS_CHANGE_EVENT(element, CE_OTHER_IS_COLL_PASSIVE) ? CE_OTHER_IS_COLL_PASSIVE : + HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING : + HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT : HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING : HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING : HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING : custom_element_change.other_action); } +static void CopyGroupElementPropertiesToEditor(int element) +{ + group_element_info = *element_info[element].group; +} + static void CopyCustomElementPropertiesToGame(int element) { int i; @@ -5076,6 +5214,7 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[EP_INDESTRUCTIBLE] = FALSE; custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE; custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE; + custom_element_properties[EP_CAN_EXPLODE_DYNA] = FALSE; custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE; custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE; custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE; @@ -5083,8 +5222,9 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_properties[EP_EXPLODE_RESULT]; /* special case: sub-settings dependent from main setting */ - if (custom_element_properties[EP_CAN_EXPLODE_3X3] || - custom_element_properties[EP_CAN_EXPLODE_1X1]) + if (custom_element_properties[EP_CAN_EXPLODE_1X1] || + custom_element_properties[EP_CAN_EXPLODE_3X3] || + custom_element_properties[EP_CAN_EXPLODE_DYNA]) { custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = custom_element.can_explode_by_fire; @@ -5104,8 +5244,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_LEFT_BY_PLAYER] = FALSE; custom_element_change_events[CE_DROPPED_BY_PLAYER] = FALSE; custom_element_change_events[CE_SWITCHED] = FALSE; - custom_element_change_events[CE_COLLISION_ACTIVE] = FALSE; - custom_element_change_events[CE_COLLISION_PASSIVE] = FALSE; + custom_element_change_events[CE_HITTING_SOMETHING] = FALSE; + custom_element_change_events[CE_HIT_BY_SOMETHING] = FALSE; custom_element_change_events[CE_IMPACT] = FALSE; custom_element_change_events[CE_SMASHED] = FALSE; custom_element_change_events[custom_element_change.direct_action] = @@ -5121,8 +5261,8 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE; custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE; custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE; - custom_element_change_events[CE_OTHER_IS_COLL_ACTIVE] = FALSE; - custom_element_change_events[CE_OTHER_IS_COLL_PASSIVE] = FALSE; + custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE; + custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE; custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE; custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE; custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE; @@ -5140,6 +5280,14 @@ static void CopyCustomElementPropertiesToGame(int element) custom_element_change = *element_info[element].change; } +static void CopyGroupElementPropertiesToGame(int element) +{ + /* mark that this group element has been modified */ + element_info[element].modified_settings = TRUE; + + *element_info[element].group = group_element_info; +} + void DrawLevelEd() { CloseDoor(DOOR_CLOSE_ALL); @@ -5331,6 +5479,14 @@ static void ModifyEditorSelectbox(int selectbox_id, int new_value) ModifyGadget(gi, GDI_SELECTBOX_INDEX, new_index_value, GDI_END); } +static void ModifyEditorDrawingArea(int drawingarea_id, int xsize, int ysize) +{ + int gadget_id = drawingarea_info[drawingarea_id].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + + ModifyGadget(gi, GDI_AREA_SIZE, xsize, ysize, GDI_END); +} + static void ModifyEditorElementList() { int i; @@ -5497,7 +5653,7 @@ static void DrawElementContentAreas() DrawBackground(SX + drawingarea_info[id].x - MINI_TILEX / 2, SY + drawingarea_info[id].y - MINI_TILEY / 2, 4 * MINI_TILEX, - 4 * MINI_TILEX + ED_GADGET_TEXT_DISTANCE + font_height); + 4 * MINI_TILEY + ED_GADGET_TEXT_DISTANCE + font_height); } } @@ -5506,6 +5662,28 @@ static void DrawElementContentAreas() DrawText(x, y + 2 * MINI_TILEY, "smashed", FONT_TEXT_1); } +static void DrawGroupElementArea(int element) +{ + int num_elements = group_element_info.num_elements; + int id = ED_DRAWING_ID_GROUP_CONTENT; + int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2; + int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2; + int xsize = MAX_ELEMENTS_IN_GROUP; + int ysize = 1; + + if (drawingarea_info[id].text_left != NULL) + sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left); + + UnmapDrawingArea(id); + + ModifyEditorDrawingArea(id, num_elements, 1); + + /* delete content areas in case of reducing number of them */ + DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY); + + MapDrawingArea(id); +} + static void DrawEnvelopeTextArea(int envelope_nr) { int id = ED_TEXTAREA_ID_ENVELOPE_INFO; @@ -5923,6 +6101,7 @@ static boolean checkPropertiesConfig() if (IS_GEM(properties_element) || IS_CUSTOM_ELEMENT(properties_element) || + IS_GROUP_ELEMENT(properties_element) || IS_ENVELOPE(properties_element) || HAS_CONTENT(properties_element)) return TRUE; @@ -6018,6 +6197,18 @@ static void DrawPropertiesConfig() /* draw text input gadgets */ MapTextInputGadget(ED_TEXTINPUT_ID_ELEMENT_NAME); } + + 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); + + MapCounterButtons(ED_COUNTER_ID_GROUP_CONTENT); + + DrawGroupElementArea(properties_element); + } } static void DrawPropertiesAdvancedDrawingAreas() @@ -6126,6 +6317,9 @@ static void DrawPropertiesWindow() if (IS_CUSTOM_ELEMENT(properties_element)) CopyCustomElementPropertiesToEditor(properties_element); + if (IS_GROUP_ELEMENT(properties_element)) + CopyGroupElementPropertiesToEditor(properties_element); + UnmapLevelEditorWindowGadgets(); UnmapLevelEditorToolboxDrawingGadgets(); UnmapLevelEditorToolboxCustomGadgets(); @@ -6940,6 +7134,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) CopyCustomElementPropertiesToGame(properties_element); } + else if (id == GADGET_ID_GROUP_CONTENT) + { + group_element_info.element[sx] = new_element; + + CopyGroupElementPropertiesToGame(properties_element); + } else if (id == GADGET_ID_RANDOM_BACKGROUND) random_placement_background_element = new_element; else if (id >= GADGET_ID_ELEMENT_CONTENT_0 && @@ -7111,6 +7311,11 @@ static void HandleCounterButtons(struct GadgetInfo *gi) DrawElementContentAreas(); break; + case ED_COUNTER_ID_GROUP_CONTENT: + DrawGroupElementArea(properties_element); + CopyGroupElementPropertiesToGame(properties_element); + break; + case ED_COUNTER_ID_ENVELOPE_XSIZE: case ED_COUNTER_ID_ENVELOPE_YSIZE: DrawEnvelopeTextArea(-1); @@ -7195,7 +7400,8 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi) } else if (type_id == ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE) { - boolean new_template = (!LevelFileExists(-1)); + char *template_filename = getDefaultLevelFilename(-1); + boolean new_template = !fileExists(template_filename); if (new_template || Request("Save this template and kill the old ?", REQ_ASK)) @@ -7283,7 +7489,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi) } else if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE) { - if (level.use_custom_template && !LevelFileExists(-1)) + char *template_filename = getDefaultLevelFilename(-1); + + if (level.use_custom_template && !fileExists(template_filename)) { Request("No level template found !", REQ_CONFIRM); @@ -7566,7 +7774,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM); else { - boolean new_level = (!LevelFileExists(level_nr)); + char *level_filename = getDefaultLevelFilename(level_nr); + boolean new_level = !fileExists(level_filename); if (new_level || Request("Save this level and kill the old ?", REQ_ASK))