X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=7324819387f808b5c364ec825789e4c5e16eaccc;hb=291af230c1fb2e475725abe0451ed9271abe5617;hp=8e326ea29e5fe32324bbf40c97b7f8aabaacc448;hpb=5371d88561e5304599c11e33ed98dc3e5868f69f;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 8e326ea2..73248193 100644 --- a/src/editor.c +++ b/src/editor.c @@ -106,6 +106,10 @@ #define ED_AREA_ELEM_CONTENT2_YPOS (ED_COUNTER_YPOS2(5) + \ ED_GADGET_DISTANCE) +#define ED_AREA_ELEM_CONTENT3_XPOS (24 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT3_YPOS (ED_COUNTER_YPOS2(6) + \ + ED_GADGET_DISTANCE) + /* values for random placement background drawing area */ #define ED_AREA_RANDOM_BACKGROUND_XPOS (29 * MINI_TILEX) #define ED_AREA_RANDOM_BACKGROUND_YPOS (31 * MINI_TILEY) @@ -367,12 +371,13 @@ #define GADGET_ID_CUSTOM_WALKABLE_OVER (GADGET_ID_CHECKBUTTON_FIRST + 15) #define GADGET_ID_CUSTOM_WALKABLE_INSIDE (GADGET_ID_CHECKBUTTON_FIRST+ 16) #define GADGET_ID_CUSTOM_WALKABLE_UNDER (GADGET_ID_CHECKBUTTON_FIRST + 17) -#define GADGET_ID_CUSTOM_CHANGEABLE (GADGET_ID_CHECKBUTTON_FIRST + 18) -#define GADGET_ID_CHANGE_DELAY_FIXED (GADGET_ID_CHECKBUTTON_FIRST + 19) -#define GADGET_ID_CHANGE_DELAY_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_CUSTOM_USE_GRAPHIC (GADGET_ID_CHECKBUTTON_FIRST + 18) +#define GADGET_ID_CUSTOM_CHANGEABLE (GADGET_ID_CHECKBUTTON_FIRST + 19) +#define GADGET_ID_CHANGE_DELAY_FIXED (GADGET_ID_CHECKBUTTON_FIRST + 20) +#define GADGET_ID_CHANGE_DELAY_RANDOM (GADGET_ID_CHECKBUTTON_FIRST + 21) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 21) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 22) #define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ ED_NUM_ELEMENTLIST_BUTTONS - 1) @@ -469,17 +474,18 @@ #define ED_CHECKBUTTON_ID_CUSTOM_WALKABLE_OVER 13 #define ED_CHECKBUTTON_ID_CUSTOM_WALKABLE_INSIDE 14 #define ED_CHECKBUTTON_ID_CUSTOM_WALKABLE_UNDER 15 -#define ED_CHECKBUTTON_ID_CUSTOM_CHANGEABLE 16 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY_FIXED 17 -#define ED_CHECKBUTTON_ID_CHANGE_DELAY_RANDOM 18 +#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC 16 +#define ED_CHECKBUTTON_ID_CUSTOM_CHANGEABLE 17 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY_FIXED 18 +#define ED_CHECKBUTTON_ID_CHANGE_DELAY_RANDOM 19 -#define ED_NUM_CHECKBUTTONS 19 +#define ED_NUM_CHECKBUTTONS 20 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED #define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE -#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_WALKABLE_UNDER +#define ED_CHECKBUTTON_ID_CUSTOM_LAST ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CHANGEABLE #define ED_CHECKBUTTON_ID_CHANGE_LAST ED_CHECKBUTTON_ID_CHANGE_DELAY_RANDOM @@ -580,7 +586,7 @@ static boolean random_placement_background_restricted = FALSE; 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 CustomElementChangeInfo custom_element_change; +static struct CustomElementInfo custom_element; static struct { @@ -669,7 +675,7 @@ static struct 0, 999, GADGET_ID_CHANGE_DELAY_FIX_DOWN, GADGET_ID_CHANGE_DELAY_FIX_UP, GADGET_ID_CHANGE_DELAY_FIX_TEXT, - &custom_element_change.delay_fixed, + &custom_element.change.delay_fixed, NULL, "units (fixed)" }, { @@ -677,7 +683,7 @@ static struct 0, 999, GADGET_ID_CHANGE_DELAY_RND_DOWN, GADGET_ID_CHANGE_DELAY_RND_UP, GADGET_ID_CHANGE_DELAY_RND_TEXT, - &custom_element_change.delay_random, + &custom_element.change.delay_random, NULL, "units (random)" } }; @@ -741,7 +747,7 @@ static struct GADGET_ID_CHANGE_TIME_UNITS, 0, options_change_time_units, &index_change_time_units, - &custom_element_change.delay_frames, + &custom_element.change.delay_frames, "delay units given in", "time units for change" }, { @@ -930,71 +936,77 @@ static struct "slip down from certain flat walls","use EM style slipping behaviour" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(6), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(7), GADGET_ID_CUSTOM_INDESTRUCTIBLE, &custom_element_properties[EP_INDESTRUCTIBLE], "indestructible", "element cannot be destroyed" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(7), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(8), GADGET_ID_CUSTOM_DIGGABLE, &custom_element_properties[EP_DIGGABLE], "diggable", "element can be digged away" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(8), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(9), GADGET_ID_CUSTOM_COLLECTIBLE, &custom_element_properties[EP_COLLECTIBLE], "collectible", "element can be collected" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(9), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(10), GADGET_ID_CUSTOM_PUSHABLE, &custom_element_properties[EP_PUSHABLE], "pushable", "element can be pushed" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(10), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(11), GADGET_ID_CUSTOM_CAN_FALL, &custom_element_properties[EP_CAN_FALL], "can fall", "element can fall down" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(11), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(12), GADGET_ID_CUSTOM_CAN_SMASH, &custom_element_properties[EP_CAN_SMASH], "can smash", "element can smash other elements" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(12), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(13), GADGET_ID_CUSTOM_CAN_MOVE, &custom_element_properties[EP_CAN_MOVE], "can move", "element can move in some direction" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(13), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(14), GADGET_ID_CUSTOM_SLIPPERY, &custom_element_properties[EP_SLIPPERY], "slippery", "other elements can fall down from it" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(14), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(15), GADGET_ID_CUSTOM_WALKABLE_OVER, &custom_element_properties[EP_WALKABLE_OVER], "player can walk over", "player can walk over this element" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(15), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(16), GADGET_ID_CUSTOM_WALKABLE_INSIDE, &custom_element_properties[EP_WALKABLE_INSIDE], "player can walk inside", "player can walk inside this element" }, { - ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(16), + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(17), GADGET_ID_CUSTOM_WALKABLE_UNDER, &custom_element_properties[EP_WALKABLE_UNDER], "player can walk under", "player can walk under this element" }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(6), + GADGET_ID_CUSTOM_USE_GRAPHIC, + &custom_element.use_gfx_element, + "use graphic of element:", "use optional custom graphic element" + }, { ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(5), GADGET_ID_CUSTOM_CHANGEABLE, @@ -1048,6 +1060,7 @@ static void ModifyEditorElementList(); static void DrawDrawingWindow(); static void DrawLevelInfoWindow(); static void DrawPropertiesWindow(); +static boolean checkPropertiesConfig(); static void CopyLevelToUndoBuffer(int); static void HandleDrawingAreas(struct GadgetInfo *); static void HandleCounterButtons(struct GadgetInfo *); @@ -2400,12 +2413,12 @@ static void CreateDrawingAreas() /* ... one for each custom element optional graphic element ... */ id = GADGET_ID_CUSTOM_GRAPHIC; gi = CreateGadget(GDI_CUSTOM_ID, id, - GDI_X, SX + 2 * MINI_TILEX, - GDI_Y, SY + 4 * MINI_TILEY + MINI_TILEY / 2, - GDI_WIDTH, TILEX, - GDI_HEIGHT, TILEY, + GDI_X, SX + ED_AREA_ELEM_CONTENT3_XPOS, + GDI_Y, SY + ED_AREA_ELEM_CONTENT3_YPOS, + GDI_WIDTH, MINI_TILEX, + GDI_HEIGHT, MINI_TILEY, GDI_TYPE, GD_TYPE_DRAWING_AREA, - GDI_ITEM_SIZE, TILEX, TILEY, + GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_INFO, HandleDrawingAreaInfo, GDI_CALLBACK_ACTION, HandleDrawingAreas, @@ -2976,7 +2989,7 @@ static void CopyCustomElementPropertiesToEditor(int element) int i; i = properties_element - EL_CUSTOM_START; - custom_element_change = level.custom_element[i].change; + custom_element = level.custom_element[i]; for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) custom_element_properties[i] = HAS_PROPERTY(element, i); @@ -2990,7 +3003,7 @@ static void CopyCustomElementPropertiesToGame(int element) int i; i = properties_element - EL_CUSTOM_START; - level.custom_element[i].change = custom_element_change; + level.custom_element[i] = custom_element; for (i=0; i < NUM_ELEMENT_PROPERTIES; i++) SET_PROPERTY(element, i, custom_element_properties[i]); @@ -3000,7 +3013,7 @@ static void CopyCustomElementPropertiesToGame(int element) /* copy change events also to special level editor variable */ i = properties_element - EL_CUSTOM_START; - custom_element_change = level.custom_element[i].change; + custom_element = level.custom_element[i]; } void DrawLevelEd() @@ -3276,9 +3289,11 @@ static void DrawDrawingWindow() MapMainDrawingArea(); } -static void DrawElementBorder(int dest_x, int dest_y, int width, int height) +static void DrawElementBorder(int dest_x, int dest_y, int width, int height, + boolean input) { - int border_graphic = IMG_EDITOR_ELEMENT_BORDER; + int border_graphic = + (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; @@ -3305,7 +3320,7 @@ static void DrawRandomPlacementBackgroundArea() ElementContent[0][0][0] = random_placement_background_element; - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY); + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniElement(area_x, area_y, ElementContent[0][0][0]); MapDrawingArea(GADGET_ID_RANDOM_BACKGROUND); @@ -3413,7 +3428,7 @@ static void DrawAmoebaContentArea() ElementContent[0][0][0] = level.amoeba_content; - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY); + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); DrawMiniElement(area_x, area_y, ElementContent[0][0][0]); DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba", FONT_TEXT_1); @@ -3421,6 +3436,53 @@ static void DrawAmoebaContentArea() MapDrawingArea(GADGET_ID_AMOEBA_CONTENT); } +static void DrawCustomGraphicElementArea() +{ + struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_GRAPHIC]; +#if 0 + int xoffset_right2 = ED_CHECKBUTTON_XSIZE + 2 * ED_GADGET_DISTANCE; + int yoffset_right2 = ED_BORDER_SIZE; + int i = ED_CHECKBUTTON_ID_CUSTOM_GRAPHIC; + int text_len = strlen(checkbutton_info[i].text); + int text_width = text_len * getFontWidth(FONT_TEXT_1); + int xpos = checkbutton_info[i].x + 2 * xoffset_right2 + text_width; + int ypos = checkbutton_info[i].y + yoffset_right2; +#else + int xpos = ED_AREA_ELEM_CONTENT3_XPOS; + int ypos = ED_AREA_ELEM_CONTENT3_YPOS; +#endif + int area_x = xpos / MINI_TILEX; + int area_y = ypos / MINI_TILEY; + int area_sx = SX + xpos; + int area_sy = SY + ypos; + + if (!IS_CUSTOM_ELEMENT(properties_element)) + { + /* this should never happen */ + Error(ERR_WARN, "element %d is no custom element", properties_element); + + return; + } + + ElementContent[0][0][0] = custom_element.gfx_element; + + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); +#if 1 + DrawMiniGraphicExt(drawto, + gi->x, + gi->y, + el2edimg(ElementContent[0][0][0])); +#else + DrawMiniElement(area_x, area_y, ElementContent[0][0][0]); +#endif + +#if 0 + DrawText(area_sx + TILEX, area_sy + 1, "Element after change", FONT_TEXT_1); +#endif + + MapDrawingArea(GADGET_ID_CUSTOM_GRAPHIC); +} + static void DrawCustomChangedArea() { struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_CUSTOM_CHANGED]; @@ -3449,9 +3511,9 @@ static void DrawCustomChangedArea() return; } - ElementContent[0][0][0] = custom_element_change.successor; + ElementContent[0][0][0] = custom_element.change.successor; - DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY); + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE); #if 1 DrawMiniGraphicExt(drawto, gi->x, @@ -3501,7 +3563,7 @@ static void DrawElementContentAreas() for (i=0; i= ED_CHECKBUTTON_ID_CHANGE_FIRST && type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) CopyCustomElementPropertiesToGame(properties_element); + + if (type_id == ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC) + ModifyEditorElementList(); } static void HandleControlButtons(struct GadgetInfo *gi)