X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=d5c66bb92d99569881528e3dcf87b8baffbc4088;hb=e1fdeb57afb3db322b3757d8105c66ba33cadca4;hp=3ab7a71ccf9a770eb86e07f57379d212eaa1d512;hpb=350a8b1817f6696d4ba926e6d55ddd157e45b836;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 3ab7a71c..d5c66bb9 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1,7 +1,7 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-2001 Artsoft Entertainment * +* (c) 1995-2002 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -22,6 +22,13 @@ #include "game.h" #include "tape.h" + +/* + ----------------------------------------------------------------------------- + screen and artwork graphic pixel position definitions + ----------------------------------------------------------------------------- +*/ + /* positions in the level editor */ #define ED_WIN_MB_LEFT_XPOS 6 #define ED_WIN_MB_LEFT_YPOS 258 @@ -30,25 +37,6 @@ #define ED_WIN_MB_RIGHT_XPOS 78 #define ED_WIN_MB_RIGHT_YPOS ED_WIN_MB_LEFT_YPOS -/* other constants for the editor */ -#define ED_SCROLL_NO 0 -#define ED_SCROLL_LEFT 1 -#define ED_SCROLL_RIGHT 2 -#define ED_SCROLL_UP 4 -#define ED_SCROLL_DOWN 8 - -/* screens in the level editor */ -#define ED_MODE_DRAWING 0 -#define ED_MODE_INFO 1 -#define ED_MODE_PROPERTIES 2 - -/* how many steps can be cancelled */ -#define NUM_UNDO_STEPS (10 + 1) - -/* values for elements with score */ -#define MIN_SCORE 0 -#define MAX_SCORE 255 - /* values for the control window */ #define ED_CTRL_BUTTONS_GFX_YPOS 236 #define ED_CTRL_BUTTONS_ALT_GFX_YPOS 142 @@ -95,16 +83,23 @@ #define ED_COUNTER_YDISTANCE (3 * MINI_TILEY) #define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \ n * ED_COUNTER_YDISTANCE) +#define ED_COUNTER_YPOS2(n) (ED_COUNTER_YSTART + \ + n * ED_COUNTER_YDISTANCE / 2) #define ED_COUNTER2_YPOS(n) (ED_COUNTER_YSTART + \ n * ED_COUNTER_YDISTANCE - 2) + /* standard distances */ #define ED_BORDER_SIZE 3 +#define ED_BORDER2_SIZE 5 #define ED_GADGET_DISTANCE 2 /* values for element content drawing areas */ #define ED_AREA_ELEM_CONTENT_XPOS ( 2 * MINI_TILEX) #define ED_AREA_ELEM_CONTENT_YPOS (22 * MINI_TILEY) +#define ED_AREA_ELEM_CONTENT2_XPOS ( 2 * MINI_TILEX) +#define ED_AREA_ELEM_CONTENT2_YPOS (28 * MINI_TILEY) + /* 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) @@ -169,133 +164,190 @@ #define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 66) /* some positions in the editor control window */ -#define ED_BUTTON_ELEM_XPOS 6 -#define ED_BUTTON_ELEM_YPOS 30 -#define ED_BUTTON_ELEM_XSIZE 22 -#define ED_BUTTON_ELEM_YSIZE 22 - -/* some values for text input and counter gadgets */ -#define ED_BUTTON_COUNT_YPOS 60 -#define ED_BUTTON_COUNT_XSIZE 20 -#define ED_BUTTON_COUNT_YSIZE 20 -#define ED_WIN_COUNT_XPOS (2 + ED_BUTTON_COUNT_XSIZE + 2) -#define ED_WIN_COUNT_YPOS ED_BUTTON_COUNT_YPOS -#define ED_WIN_COUNT_XSIZE 52 -#define ED_WIN_COUNT_YSIZE ED_BUTTON_COUNT_YSIZE -#define ED_WIN_COUNT2_XPOS 27 -#define ED_WIN_COUNT2_YPOS 3 -#define ED_WIN_COUNT2_XSIZE 46 -#define ED_WIN_COUNT2_YSIZE ED_BUTTON_COUNT_YSIZE - -#define ED_BUTTON_MINUS_XPOS 2 -#define ED_BUTTON_MINUS_YPOS ED_BUTTON_COUNT_YPOS -#define ED_BUTTON_MINUS_XSIZE ED_BUTTON_COUNT_XSIZE -#define ED_BUTTON_MINUS_YSIZE ED_BUTTON_COUNT_YSIZE -#define ED_BUTTON_PLUS_XPOS (ED_WIN_COUNT_XPOS + ED_WIN_COUNT_XSIZE + 2) -#define ED_BUTTON_PLUS_YPOS ED_BUTTON_COUNT_YPOS -#define ED_BUTTON_PLUS_XSIZE ED_BUTTON_COUNT_XSIZE -#define ED_BUTTON_PLUS_YSIZE ED_BUTTON_COUNT_YSIZE - -/* editor gadget identifiers */ +#define ED_BUTTON_ELEM_XPOS 6 +#define ED_BUTTON_ELEM_YPOS 30 +#define ED_BUTTON_ELEM_XSIZE 22 +#define ED_BUTTON_ELEM_YSIZE 22 + +/* some values for text input, selectbox and counter gadgets */ +#define ED_BUTTON_COUNT_YPOS 60 +#define ED_BUTTON_COUNT_XSIZE 20 +#define ED_BUTTON_COUNT_YSIZE 20 +#define ED_WIN_COUNT_XPOS (2 + ED_BUTTON_COUNT_XSIZE + 2) +#define ED_WIN_COUNT_YPOS ED_BUTTON_COUNT_YPOS +#define ED_WIN_COUNT_XSIZE 52 +#define ED_WIN_COUNT_YSIZE ED_BUTTON_COUNT_YSIZE +#define ED_WIN_COUNT2_XPOS 27 +#define ED_WIN_COUNT2_YPOS 3 +#define ED_WIN_COUNT2_XSIZE 46 +#define ED_WIN_COUNT2_YSIZE ED_BUTTON_COUNT_YSIZE + +#define ED_BUTTON_MINUS_XPOS 2 +#define ED_BUTTON_MINUS_YPOS ED_BUTTON_COUNT_YPOS +#define ED_BUTTON_MINUS_XSIZE ED_BUTTON_COUNT_XSIZE +#define ED_BUTTON_MINUS_YSIZE ED_BUTTON_COUNT_YSIZE +#define ED_BUTTON_PLUS_XPOS (ED_WIN_COUNT_XPOS + \ + ED_WIN_COUNT_XSIZE + 2) +#define ED_BUTTON_PLUS_YPOS ED_BUTTON_COUNT_YPOS +#define ED_BUTTON_PLUS_XSIZE ED_BUTTON_COUNT_XSIZE +#define ED_BUTTON_PLUS_YSIZE ED_BUTTON_COUNT_YSIZE + +#define ED_SELECTBOX_XPOS ED_WIN_COUNT_XPOS +#define ED_SELECTBOX_YPOS (ED_WIN_COUNT_YPOS + \ + 2 + ED_WIN_COUNT_YSIZE) +#define ED_SELECTBOX_XSIZE ED_WIN_COUNT_XSIZE +#define ED_SELECTBOX_YSIZE ED_WIN_COUNT_YSIZE + +#define ED_TEXTBUTTON_XPOS ED_WIN_COUNT_XPOS +#define ED_TEXTBUTTON_YPOS (ED_WIN_COUNT_YPOS + \ + 2 * (2 + ED_WIN_COUNT_YSIZE)) +#define ED_TEXTBUTTON_INACTIVE_YPOS (ED_WIN_COUNT_YPOS + \ + 3 * (2 + ED_WIN_COUNT_YSIZE)) +#define ED_TEXTBUTTON_XSIZE ED_WIN_COUNT_XSIZE +#define ED_TEXTBUTTON_YSIZE ED_WIN_COUNT_YSIZE + +/* values for ClearEditorGadgetInfoText() and HandleGadgetInfoText() */ +#define INFOTEXT_XPOS SX +#define INFOTEXT_YPOS (SY + SYSIZE - MINI_TILEX + 2) +#define INFOTEXT_XSIZE SXSIZE +#define INFOTEXT_YSIZE MINI_TILEX + + +/* + ----------------------------------------------------------------------------- + editor gadget definitions + ----------------------------------------------------------------------------- +*/ /* drawing toolbox buttons */ #define GADGET_ID_NONE -1 -#define GADGET_ID_SINGLE_ITEMS 0 -#define GADGET_ID_CONNECTED_ITEMS 1 -#define GADGET_ID_LINE 2 -#define GADGET_ID_ARC 3 -#define GADGET_ID_RECTANGLE 4 -#define GADGET_ID_FILLED_BOX 5 -#define GADGET_ID_WRAP_UP 6 -#define GADGET_ID_TEXT 7 -#define GADGET_ID_FLOOD_FILL 8 -#define GADGET_ID_WRAP_LEFT 9 -#define GADGET_ID_PROPERTIES 10 -#define GADGET_ID_WRAP_RIGHT 11 -#define GADGET_ID_RANDOM_PLACEMENT 12 -#define GADGET_ID_GRAB_BRUSH 13 -#define GADGET_ID_WRAP_DOWN 14 -#define GADGET_ID_PICK_ELEMENT 15 -#define GADGET_ID_UNDO 16 -#define GADGET_ID_INFO 17 -#define GADGET_ID_SAVE 18 -#define GADGET_ID_CLEAR 19 -#define GADGET_ID_TEST 20 -#define GADGET_ID_EXIT 21 +#define GADGET_ID_TOOLBOX_FIRST 0 + +#define GADGET_ID_SINGLE_ITEMS (GADGET_ID_TOOLBOX_FIRST + 0) +#define GADGET_ID_CONNECTED_ITEMS (GADGET_ID_TOOLBOX_FIRST + 1) +#define GADGET_ID_LINE (GADGET_ID_TOOLBOX_FIRST + 2) +#define GADGET_ID_ARC (GADGET_ID_TOOLBOX_FIRST + 3) +#define GADGET_ID_RECTANGLE (GADGET_ID_TOOLBOX_FIRST + 4) +#define GADGET_ID_FILLED_BOX (GADGET_ID_TOOLBOX_FIRST + 5) +#define GADGET_ID_WRAP_UP (GADGET_ID_TOOLBOX_FIRST + 6) +#define GADGET_ID_TEXT (GADGET_ID_TOOLBOX_FIRST + 7) +#define GADGET_ID_FLOOD_FILL (GADGET_ID_TOOLBOX_FIRST + 8) +#define GADGET_ID_WRAP_LEFT (GADGET_ID_TOOLBOX_FIRST + 9) +#define GADGET_ID_PROPERTIES (GADGET_ID_TOOLBOX_FIRST + 10) +#define GADGET_ID_WRAP_RIGHT (GADGET_ID_TOOLBOX_FIRST + 11) +#define GADGET_ID_RANDOM_PLACEMENT (GADGET_ID_TOOLBOX_FIRST + 12) +#define GADGET_ID_GRAB_BRUSH (GADGET_ID_TOOLBOX_FIRST + 13) +#define GADGET_ID_WRAP_DOWN (GADGET_ID_TOOLBOX_FIRST + 14) +#define GADGET_ID_PICK_ELEMENT (GADGET_ID_TOOLBOX_FIRST + 15) +#define GADGET_ID_UNDO (GADGET_ID_TOOLBOX_FIRST + 16) +#define GADGET_ID_INFO (GADGET_ID_TOOLBOX_FIRST + 17) +#define GADGET_ID_SAVE (GADGET_ID_TOOLBOX_FIRST + 18) +#define GADGET_ID_CLEAR (GADGET_ID_TOOLBOX_FIRST + 19) +#define GADGET_ID_TEST (GADGET_ID_TOOLBOX_FIRST + 20) +#define GADGET_ID_EXIT (GADGET_ID_TOOLBOX_FIRST + 21) /* counter button identifiers */ -#define GADGET_ID_ELEM_SCORE_DOWN 22 -#define GADGET_ID_ELEM_SCORE_TEXT 23 -#define GADGET_ID_ELEM_SCORE_UP 24 -#define GADGET_ID_ELEM_CONTENT_DOWN 25 -#define GADGET_ID_ELEM_CONTENT_TEXT 26 -#define GADGET_ID_ELEM_CONTENT_UP 27 -#define GADGET_ID_LEVEL_XSIZE_DOWN 28 -#define GADGET_ID_LEVEL_XSIZE_TEXT 29 -#define GADGET_ID_LEVEL_XSIZE_UP 30 -#define GADGET_ID_LEVEL_YSIZE_DOWN 31 -#define GADGET_ID_LEVEL_YSIZE_TEXT 32 -#define GADGET_ID_LEVEL_YSIZE_UP 33 -#define GADGET_ID_LEVEL_RANDOM_DOWN 34 -#define GADGET_ID_LEVEL_RANDOM_TEXT 35 -#define GADGET_ID_LEVEL_RANDOM_UP 36 -#define GADGET_ID_LEVEL_COLLECT_DOWN 37 -#define GADGET_ID_LEVEL_COLLECT_TEXT 38 -#define GADGET_ID_LEVEL_COLLECT_UP 39 -#define GADGET_ID_LEVEL_TIMELIMIT_DOWN 40 -#define GADGET_ID_LEVEL_TIMELIMIT_TEXT 41 -#define GADGET_ID_LEVEL_TIMELIMIT_UP 42 -#define GADGET_ID_LEVEL_TIMESCORE_DOWN 43 -#define GADGET_ID_LEVEL_TIMESCORE_TEXT 44 -#define GADGET_ID_LEVEL_TIMESCORE_UP 45 -#define GADGET_ID_SELECT_LEVEL_DOWN 46 -#define GADGET_ID_SELECT_LEVEL_TEXT 47 -#define GADGET_ID_SELECT_LEVEL_UP 48 +#define GADGET_ID_COUNTER_FIRST (GADGET_ID_TOOLBOX_FIRST + 22) + +#define GADGET_ID_ELEM_SCORE_DOWN (GADGET_ID_COUNTER_FIRST + 0) +#define GADGET_ID_ELEM_SCORE_TEXT (GADGET_ID_COUNTER_FIRST + 1) +#define GADGET_ID_ELEM_SCORE_UP (GADGET_ID_COUNTER_FIRST + 2) +#define GADGET_ID_ELEM_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 3) +#define GADGET_ID_ELEM_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 4) +#define GADGET_ID_ELEM_CONTENT_UP (GADGET_ID_COUNTER_FIRST + 5) +#define GADGET_ID_LEVEL_XSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 6) +#define GADGET_ID_LEVEL_XSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 7) +#define GADGET_ID_LEVEL_XSIZE_UP (GADGET_ID_COUNTER_FIRST + 8) +#define GADGET_ID_LEVEL_YSIZE_DOWN (GADGET_ID_COUNTER_FIRST + 9) +#define GADGET_ID_LEVEL_YSIZE_TEXT (GADGET_ID_COUNTER_FIRST + 10) +#define GADGET_ID_LEVEL_YSIZE_UP (GADGET_ID_COUNTER_FIRST + 11) +#define GADGET_ID_LEVEL_RANDOM_DOWN (GADGET_ID_COUNTER_FIRST + 12) +#define GADGET_ID_LEVEL_RANDOM_TEXT (GADGET_ID_COUNTER_FIRST + 13) +#define GADGET_ID_LEVEL_RANDOM_UP (GADGET_ID_COUNTER_FIRST + 14) +#define GADGET_ID_LEVEL_COLLECT_DOWN (GADGET_ID_COUNTER_FIRST + 15) +#define GADGET_ID_LEVEL_COLLECT_TEXT (GADGET_ID_COUNTER_FIRST + 16) +#define GADGET_ID_LEVEL_COLLECT_UP (GADGET_ID_COUNTER_FIRST + 17) +#define GADGET_ID_LEVEL_TIMELIMIT_DOWN (GADGET_ID_COUNTER_FIRST + 18) +#define GADGET_ID_LEVEL_TIMELIMIT_TEXT (GADGET_ID_COUNTER_FIRST + 19) +#define GADGET_ID_LEVEL_TIMELIMIT_UP (GADGET_ID_COUNTER_FIRST + 20) +#define GADGET_ID_LEVEL_TIMESCORE_DOWN (GADGET_ID_COUNTER_FIRST + 21) +#define GADGET_ID_LEVEL_TIMESCORE_TEXT (GADGET_ID_COUNTER_FIRST + 22) +#define GADGET_ID_LEVEL_TIMESCORE_UP (GADGET_ID_COUNTER_FIRST + 23) +#define GADGET_ID_SELECT_LEVEL_DOWN (GADGET_ID_COUNTER_FIRST + 24) +#define GADGET_ID_SELECT_LEVEL_TEXT (GADGET_ID_COUNTER_FIRST + 25) +#define GADGET_ID_SELECT_LEVEL_UP (GADGET_ID_COUNTER_FIRST + 26) /* drawing area identifiers */ -#define GADGET_ID_DRAWING_LEVEL 49 -#define GADGET_ID_ELEM_CONTENT_0 50 -#define GADGET_ID_ELEM_CONTENT_1 51 -#define GADGET_ID_ELEM_CONTENT_2 52 -#define GADGET_ID_ELEM_CONTENT_3 53 -#define GADGET_ID_ELEM_CONTENT_4 54 -#define GADGET_ID_ELEM_CONTENT_5 55 -#define GADGET_ID_ELEM_CONTENT_6 56 -#define GADGET_ID_ELEM_CONTENT_7 57 -#define GADGET_ID_AMOEBA_CONTENT 58 +#define GADGET_ID_DRAWING_AREA_FIRST (GADGET_ID_COUNTER_FIRST + 27) + +#define GADGET_ID_DRAWING_LEVEL (GADGET_ID_DRAWING_AREA_FIRST + 0) +#define GADGET_ID_ELEM_CONTENT_0 (GADGET_ID_DRAWING_AREA_FIRST + 1) +#define GADGET_ID_ELEM_CONTENT_1 (GADGET_ID_DRAWING_AREA_FIRST + 2) +#define GADGET_ID_ELEM_CONTENT_2 (GADGET_ID_DRAWING_AREA_FIRST + 3) +#define GADGET_ID_ELEM_CONTENT_3 (GADGET_ID_DRAWING_AREA_FIRST + 4) +#define GADGET_ID_ELEM_CONTENT_4 (GADGET_ID_DRAWING_AREA_FIRST + 5) +#define GADGET_ID_ELEM_CONTENT_5 (GADGET_ID_DRAWING_AREA_FIRST + 6) +#define GADGET_ID_ELEM_CONTENT_6 (GADGET_ID_DRAWING_AREA_FIRST + 7) +#define GADGET_ID_ELEM_CONTENT_7 (GADGET_ID_DRAWING_AREA_FIRST + 8) +#define GADGET_ID_AMOEBA_CONTENT (GADGET_ID_DRAWING_AREA_FIRST + 9) +#define GADGET_ID_CUSTOM_CHANGED (GADGET_ID_DRAWING_AREA_FIRST + 10) +#define GADGET_ID_RANDOM_BACKGROUND (GADGET_ID_DRAWING_AREA_FIRST + 11) /* text input identifiers */ -#define GADGET_ID_LEVEL_NAME 59 -#define GADGET_ID_LEVEL_AUTHOR 60 +#define GADGET_ID_TEXT_INPUT_FIRST (GADGET_ID_DRAWING_AREA_FIRST + 12) + +#define GADGET_ID_LEVEL_NAME (GADGET_ID_TEXT_INPUT_FIRST + 0) +#define GADGET_ID_LEVEL_AUTHOR (GADGET_ID_TEXT_INPUT_FIRST + 1) + +/* selectbox identifiers */ +#define GADGET_ID_SELECTBOX_FIRST (GADGET_ID_TEXT_INPUT_FIRST + 2) + +#define GADGET_ID_CUSTOM_CHANGE_CAUSE (GADGET_ID_SELECTBOX_FIRST + 0) + +/* textbutton identifiers */ +#define GADGET_ID_TEXTBUTTON_FIRST (GADGET_ID_SELECTBOX_FIRST + 1) + +#define GADGET_ID_PROPERTIES_MAIN (GADGET_ID_TEXTBUTTON_FIRST + 0) +#define GADGET_ID_PROPERTIES_INFO (GADGET_ID_TEXTBUTTON_FIRST + 1) +#define GADGET_ID_PROPERTIES_ADVANCED (GADGET_ID_TEXTBUTTON_FIRST + 2) /* gadgets for scrolling of drawing area */ -#define GADGET_ID_SCROLL_UP 61 -#define GADGET_ID_SCROLL_DOWN 62 -#define GADGET_ID_SCROLL_LEFT 63 -#define GADGET_ID_SCROLL_RIGHT 64 -#define GADGET_ID_SCROLL_HORIZONTAL 65 -#define GADGET_ID_SCROLL_VERTICAL 66 +#define GADGET_ID_SCROLLING_FIRST (GADGET_ID_TEXTBUTTON_FIRST + 3) + +#define GADGET_ID_SCROLL_UP (GADGET_ID_SCROLLING_FIRST + 0) +#define GADGET_ID_SCROLL_DOWN (GADGET_ID_SCROLLING_FIRST + 1) +#define GADGET_ID_SCROLL_LEFT (GADGET_ID_SCROLLING_FIRST + 2) +#define GADGET_ID_SCROLL_RIGHT (GADGET_ID_SCROLLING_FIRST + 3) +#define GADGET_ID_SCROLL_HORIZONTAL (GADGET_ID_SCROLLING_FIRST + 4) +#define GADGET_ID_SCROLL_VERTICAL (GADGET_ID_SCROLLING_FIRST + 5) /* gadgets for scrolling element list */ -#define GADGET_ID_SCROLL_LIST_UP 67 -#define GADGET_ID_SCROLL_LIST_DOWN 68 -#define GADGET_ID_SCROLL_LIST_VERTICAL 69 - -/* buttons for level settings */ -#define GADGET_ID_RANDOM_PERCENTAGE 70 -#define GADGET_ID_RANDOM_QUANTITY 71 -#define GADGET_ID_RANDOM_RESTRICTED 72 -#define GADGET_ID_DOUBLE_SPEED 73 -#define GADGET_ID_GRAVITY 74 -#define GADGET_ID_STICK_ELEMENT 75 -#define GADGET_ID_EM_SLIPPERY_GEMS 76 - -/* another drawing area for random placement */ -#define GADGET_ID_RANDOM_BACKGROUND 77 +#define GADGET_ID_SCROLLING_LIST_FIRST (GADGET_ID_SCROLLING_FIRST + 6) + +#define GADGET_ID_SCROLL_LIST_UP (GADGET_ID_SCROLLING_LIST_FIRST + 0) +#define GADGET_ID_SCROLL_LIST_DOWN (GADGET_ID_SCROLLING_LIST_FIRST + 1) +#define GADGET_ID_SCROLL_LIST_VERTICAL (GADGET_ID_SCROLLING_LIST_FIRST + 2) + +/* buttons for level/element properties */ +#define GADGET_ID_CHECKBUTTON_FIRST (GADGET_ID_SCROLLING_LIST_FIRST + 3) + +#define GADGET_ID_RANDOM_PERCENTAGE (GADGET_ID_CHECKBUTTON_FIRST + 0) +#define GADGET_ID_RANDOM_QUANTITY (GADGET_ID_CHECKBUTTON_FIRST + 1) +#define GADGET_ID_RANDOM_RESTRICTED (GADGET_ID_CHECKBUTTON_FIRST + 2) +#define GADGET_ID_DOUBLE_SPEED (GADGET_ID_CHECKBUTTON_FIRST + 3) +#define GADGET_ID_GRAVITY (GADGET_ID_CHECKBUTTON_FIRST + 4) +#define GADGET_ID_STICK_ELEMENT (GADGET_ID_CHECKBUTTON_FIRST + 5) +#define GADGET_ID_EM_SLIPPERY_GEMS (GADGET_ID_CHECKBUTTON_FIRST + 6) +#define GADGET_ID_CUSTOM_INDESTRUCTIBLE (GADGET_ID_CHECKBUTTON_FIRST + 7) +#define GADGET_ID_CUSTOM_CAN_FALL (GADGET_ID_CHECKBUTTON_FIRST + 8) +#define GADGET_ID_CUSTOM_CAN_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 9) +#define GADGET_ID_CUSTOM_PUSHABLE (GADGET_ID_CHECKBUTTON_FIRST + 10) +#define GADGET_ID_CUSTOM_SLIPPERY (GADGET_ID_CHECKBUTTON_FIRST + 11) /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST 78 -#define GADGET_ID_ELEMENTLIST_LAST (78 + ED_NUM_ELEMENTLIST_BUTTONS - 1) +#define GADGET_ID_ELEMENTLIST_FIRST (GADGET_ID_CHECKBUTTON_FIRST + 12) +#define GADGET_ID_ELEMENTLIST_LAST (GADGET_ID_ELEMENTLIST_FIRST + \ + ED_NUM_ELEMENTLIST_BUTTONS - 1) #define NUM_EDITOR_GADGETS (GADGET_ID_ELEMENTLIST_LAST + 1) @@ -352,18 +404,38 @@ #define ED_TEXTINPUT_ID_LEVEL_FIRST ED_TEXTINPUT_ID_LEVEL_NAME #define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR +/* values for selectbox gadgets */ +#define ED_SELECTBOX_ID_CUSTOM_CHANGE_CAUSE 0 + +#define ED_NUM_SELECTBOX 1 + +/* values for textbutton gadgets */ +#define ED_TEXTBUTTON_ID_PROPERTIES_MAIN 0 +#define ED_TEXTBUTTON_ID_PROPERTIES_INFO 1 +#define ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED 2 + +#define ED_NUM_TEXTBUTTON 3 + /* values for checkbutton gadgets */ #define ED_CHECKBUTTON_ID_DOUBLE_SPEED 0 #define ED_CHECKBUTTON_ID_GRAVITY 1 #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 +#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE 5 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL 6 +#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH 7 +#define ED_CHECKBUTTON_ID_CUSTOM_PUSHABLE 8 +#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY 9 -#define ED_NUM_CHECKBUTTONS 5 +#define ED_NUM_CHECKBUTTONS 10 #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_SLIPPERY + /* values for radiobutton gadgets */ #define ED_RADIOBUTTON_ID_PERCENTAGE 0 #define ED_RADIOBUTTON_ID_QUANTITY 1 @@ -373,16 +445,55 @@ #define ED_RADIOBUTTON_ID_LEVEL_FIRST ED_RADIOBUTTON_ID_PERCENTAGE #define ED_RADIOBUTTON_ID_LEVEL_LAST ED_RADIOBUTTON_ID_QUANTITY + +/* + ----------------------------------------------------------------------------- + some internally used definitions + ----------------------------------------------------------------------------- +*/ + /* values for CopyLevelToUndoBuffer() */ #define UNDO_IMMEDIATE 0 #define UNDO_ACCUMULATE 1 -/* values for ClearEditorGadgetInfoText() and HandleGadgetInfoText() */ -#define INFOTEXT_XPOS SX -#define INFOTEXT_YPOS (SY + SYSIZE - MINI_TILEX + 2) -#define INFOTEXT_XSIZE SXSIZE -#define INFOTEXT_YSIZE MINI_TILEX -#define MAX_INFOTEXT_LEN (SXSIZE / FONT2_XSIZE) +/* values for scrollbars */ +#define ED_SCROLL_NO 0 +#define ED_SCROLL_LEFT 1 +#define ED_SCROLL_RIGHT 2 +#define ED_SCROLL_UP 4 +#define ED_SCROLL_DOWN 8 + +/* screens in the level editor */ +#define ED_MODE_DRAWING 0 +#define ED_MODE_INFO 1 +#define ED_MODE_PROPERTIES 2 + +/* sub-screens in the element properties section */ +#define ED_MODE_PROPERTIES_MAIN ED_TEXTBUTTON_ID_PROPERTIES_MAIN +#define ED_MODE_PROPERTIES_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO +#define ED_MODE_PROPERTIES_ADVANCED ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED + +/* how many steps can be cancelled */ +#define NUM_UNDO_STEPS (10 + 1) + +/* values for elements with score */ +#define MIN_SCORE 0 +#define MAX_SCORE 255 + +/* values for random placement */ +#define RANDOM_USE_PERCENTAGE 0 +#define RANDOM_USE_QUANTITY 1 + +/* maximal size of level editor drawing area */ +#define MAX_ED_FIELDX (2 * SCR_FIELDX) +#define MAX_ED_FIELDY (2 * SCR_FIELDY - 1) + + +/* + ----------------------------------------------------------------------------- + some internally used data structure definitions + ----------------------------------------------------------------------------- +*/ static struct { @@ -390,40 +501,45 @@ static struct char *text; } control_info[ED_NUM_CTRL_BUTTONS] = { - { 's', "draw single items" }, - { 'd', "draw connected items" }, - { 'l', "draw lines" }, - { 'a', "draw arcs" }, - { 'r', "draw outline rectangles" }, - { 'R', "draw filled rectangles" }, - { '\0', "wrap (rotate) level up" }, - { 't', "enter text elements" }, - { 'f', "flood fill" }, - { '\0', "wrap (rotate) level left" }, - { '?', "properties of drawing element" }, - { '\0', "wrap (rotate) level right" }, - { '\0', "random element placement" }, - { 'b', "grab brush" }, - { '\0', "wrap (rotate) level down" }, - { ',', "pick drawing element" }, - { 'U', "undo last operation" }, - { 'I', "level properties" }, - { 'S', "save level" }, - { 'C', "clear level" }, - { 'T', "test level" }, - { 'E', "exit level editor" } + { 's', "draw single items" }, + { 'd', "draw connected items" }, + { 'l', "draw lines" }, + { 'a', "draw arcs" }, + { 'r', "draw outline rectangles" }, + { 'R', "draw filled rectangles" }, + { '\0', "wrap (rotate) level up" }, + { 't', "enter text elements" }, + { 'f', "flood fill" }, + { '\0', "wrap (rotate) level left" }, + { '?', "properties of drawing element" }, + { '\0', "wrap (rotate) level right" }, + { '\0', "random element placement" }, + { 'b', "grab brush" }, + { '\0', "wrap (rotate) level down" }, + { ',', "pick drawing element" }, + { 'U', "undo last operation" }, + { 'I', "level properties" }, + { 'S', "save level" }, + { 'C', "clear level" }, + { 'T', "test level" }, + { 'E', "exit level editor" } }; -/* values for random placement */ -#define RANDOM_USE_PERCENTAGE 0 -#define RANDOM_USE_QUANTITY 1 - static int random_placement_value = 10; static int random_placement_method = RANDOM_USE_QUANTITY; -static int random_placement_background_element = EL_ERDREICH; +static int random_placement_background_element = EL_SAND; static boolean random_placement_background_restricted = FALSE; static boolean stick_element_properties_window = FALSE; +static struct +{ + boolean indestructible; + boolean can_fall; + boolean can_smash; + boolean pushable; + boolean slippery; +} custom_element_properties[NUM_CUSTOM_ELEMENTS]; + static struct { int x, y; @@ -533,6 +649,65 @@ static struct } }; +static struct ValueTextInfo options_change_cause[] = +{ + { 1, "specified delay" }, + { 2, "impact (active)" }, + { 3, "impact (passive)" }, + { 4, "touched by player" }, + { 5, "pressed by player" }, + { -1, NULL } +}; +static int index_change_cause = 0; + +static struct +{ + int x, y; + int gadget_id; + int size; + struct ValueTextInfo *options; + int *index; + char *text, *infotext; +} selectbox_info[ED_NUM_SELECTBOX] = +{ + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS(3), + GADGET_ID_CUSTOM_CHANGE_CAUSE, + 17, + options_change_cause, &index_change_cause, + "test:", "test-selectbox entry" + }, +}; + +static struct +{ + int x, y; + int gadget_id; + int size; + char *value; + char *infotext; +} textbutton_info[ED_NUM_TEXTBUTTON] = +{ + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS(1), + GADGET_ID_PROPERTIES_MAIN, + 11, "Properties", + "Edit element properties" + }, + { + ED_SETTINGS_XPOS + 166, ED_COUNTER_YPOS(1), + GADGET_ID_PROPERTIES_INFO, + 11, "Description", + "Show element description" + }, + { + ED_SETTINGS_XPOS + 332, ED_COUNTER_YPOS(1), + GADGET_ID_PROPERTIES_ADVANCED, + 11, "Advanced", + "Advanced element features" + }, +}; + static struct { int xpos, ypos; @@ -678,12 +853,45 @@ static struct GADGET_ID_EM_SLIPPERY_GEMS, &level.em_slippery_gems, "slip down from certain flat walls","use EM style slipping behaviour" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(10), + GADGET_ID_CUSTOM_INDESTRUCTIBLE, + &custom_element_properties[0].indestructible, + "indestructible", "element cannot be destroyed" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(11), + GADGET_ID_CUSTOM_CAN_FALL, + &custom_element_properties[0].can_fall, + "can fall", "element can fall down" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(12), + GADGET_ID_CUSTOM_CAN_SMASH, + &custom_element_properties[0].can_smash, + "can smash", "element can smash other elements" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(13), + GADGET_ID_CUSTOM_PUSHABLE, + &custom_element_properties[0].pushable, + "pushable", "element can be pushed" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(14), + GADGET_ID_CUSTOM_SLIPPERY, + &custom_element_properties[0].slippery, + "slippery", "other elements can fall down from it" } }; -/* maximal size of level editor drawing area */ -#define MAX_ED_FIELDX (2 * SCR_FIELDX) -#define MAX_ED_FIELDY (2 * SCR_FIELDY - 1) + +/* + ----------------------------------------------------------------------------- + some internally used variables + ----------------------------------------------------------------------------- +*/ /* actual size of level editor drawing area */ static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1; @@ -694,13 +902,13 @@ static int level_xpos = -1, level_ypos = -1; #define IN_ED_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)alt_design[GD_BUTTON_UNPRESSED]; + int gd_x = gd->x + gd_gi->border.width / 2; + int gd_y = gd->y + gd_gi->height - 1; + Pixel line_color = GetPixel(gd->bitmap, gd_x, gd_y); + int id_first = ED_TEXTBUTTON_ID_PROPERTIES_MAIN; + int id_last = ED_TEXTBUTTON_ID_PROPERTIES_INFO; + int i; + + /* draw additional "advanced" tabulator for custom elements */ + if (IS_CUSTOM_ELEMENT(properties_element)) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED; + + for (i=id_first; i <= id_last; i++) + { + int gadget_id = textbutton_info[i].gadget_id; + struct GadgetInfo *gi = level_editor_gadget[gadget_id]; + boolean active = (i != edit_mode_properties); + Pixel color = (active ? BLACK_PIXEL : line_color); + + /* draw solid or black line below tabulator button */ + FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, color); + + ModifyGadget(gi, GDI_ACTIVE, active, GDI_END); + MapTextbuttonGadget(i); + } + + /* draw little border line below tabulator buttons */ + FillRectangle(drawto, gd_gi->x, gd_gi->y + gd_gi->height + 1, + 3 * gd_gi->width + 2 * ED_GADGET_DISTANCE, ED_GADGET_DISTANCE, + line_color); + +#if 0 + SX + ED_SETTINGS_XPOS, + SY + ED_COUNTER_YPOS(1) + ED_TEXTBUTTON_YSIZE + 1, + SXSIZE - 2 * ED_SETTINGS_XPOS, 2, line_color); +#endif +} + static void DrawAmoebaContentArea() { int area_x = ED_AREA_ELEM_CONTENT_XPOS / MINI_TILEX; int area_y = ED_AREA_ELEM_CONTENT_YPOS / MINI_TILEY; int area_sx = SX + ED_AREA_ELEM_CONTENT_XPOS; int area_sy = SY + ED_AREA_ELEM_CONTENT_YPOS; - int font_color = FC_GREEN; - int x, y; ElementContent[0][0][0] = level.amoeba_content; - /* draw decorative border for the object */ - for (y=0; y<2; y++) - for (x=0; x<2; x++) - DrawMiniElement(area_x + x, area_y + y, EL_ERDREICH); + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY); + DrawMiniElement(area_x, area_y, ElementContent[0][0][0]); - ClearRectangle(drawto, - area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1, - MINI_TILEX + 2, MINI_TILEY + 2); + DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba", FONT_TEXT_1); - /* copy border to the right location */ - BlitBitmap(drawto, drawto, - area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY, - area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2); + MapDrawingArea(GADGET_ID_AMOEBA_CONTENT); +} + +static void DrawCustomChangedArea() +{ + int area_x = ED_AREA_ELEM_CONTENT2_XPOS / MINI_TILEX; + int area_y = ED_AREA_ELEM_CONTENT2_YPOS / MINI_TILEY; + int area_sx = SX + ED_AREA_ELEM_CONTENT2_XPOS; + int area_sy = SY + ED_AREA_ELEM_CONTENT2_YPOS; + int i = properties_element - EL_CUSTOM_START; + + if (!IS_CUSTOM_ELEMENT(properties_element)) + { + /* this should never happen */ + Error(ERR_WARN, "element %d is no custom element", properties_element); + + return; + } - DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba", - FS_SMALL, font_color); + ElementContent[0][0][0] = level.custom_element_successor[i]; + DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY); DrawMiniElement(area_x, area_y, ElementContent[0][0][0]); - MapDrawingArea(GADGET_ID_AMOEBA_CONTENT); + DrawText(area_sx + TILEX, area_sy + 1, "Element after change", FONT_TEXT_1); + + MapDrawingArea(GADGET_ID_CUSTOM_CHANGED); } static void DrawElementContentAreas() @@ -2516,9 +3328,8 @@ static void DrawElementContentAreas() int area_y = ED_AREA_ELEM_CONTENT_YPOS / MINI_TILEY; int area_sx = SX + ED_AREA_ELEM_CONTENT_XPOS; int area_sy = SY + ED_AREA_ELEM_CONTENT_YPOS; - int xoffset_right = counter_xsize; + int xoffset_right = getCounterGadgetWidth(); int yoffset_right = ED_BORDER_SIZE; - int font_color = FC_GREEN; int i, x, y; for (i=0; i 0 || !last_line_was_empty) + print_buffer = TRUE; + } + else if (word_len < max_chars_per_line - buffer_len) + { + /* word fits into text buffer -- add word */ + + if (buffer_len > 0) + buffer[buffer_len++] = ' '; + + strncpy(&buffer[buffer_len], word_ptr, word_len); + buffer_len += word_len; + buffer[buffer_len] = '\0'; + word_ptr += word_len; + } + else if (buffer_len > 0) + { + /* not enough space left for word in text buffer -- print buffer */ + + print_buffer = TRUE; + } + else + { + /* word does not fit at all into empty text buffer -- cut word */ + + strncpy(buffer, word_ptr, max_chars_per_line); + buffer[max_chars_per_line] = '\0'; + word_ptr += max_chars_per_line; + print_buffer = TRUE; + } + + if (print_buffer) + { + DrawText(sx, sy + screen_line_nr * font_height, buffer, FONT_TEXT_2); + + last_line_was_empty = (buffer_len == 0); + + buffer[0] = '\0'; + buffer_len = 0; + print_buffer = FALSE; + + if (++screen_line_nr >= max_lines_per_screen) + return screen_line_nr; /* currently too much text gets cut */ + } + } + } + + if (buffer_len > 0) + { + DrawText(sx, sy + screen_line_nr * font_height, buffer, FONT_TEXT_2); + screen_line_nr++; } + + fclose(file); + + return screen_line_nr; +} + +static void DrawPropertiesInfo() +{ + char *filename = getElementDescriptionFilename(properties_element); + + if (PrintElementDescriptionFromFile(filename) == 0) + DrawText(SX + ED_SETTINGS_XPOS, SY + 5 * TILEY, + "No description available.", FONT_TEXT_1); +} + +static void DrawPropertiesAdvanced() +{ + DrawText(SX + ED_SETTINGS_XPOS, SY + 5 * TILEY, "Coming soon!", FONT_TEXT_1); +} + +static void DrawPropertiesWindow() +{ + int xstart = 2; + int ystart = 4; + + /* make sure that previous properties edit mode exists for this element */ + if (edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED && + !IS_CUSTOM_ELEMENT(properties_element)) + edit_mode_properties = ED_MODE_PROPERTIES_MAIN; + + UnmapLevelEditorWindowGadgets(); + + SetMainBackgroundImage(IMG_BACKGROUND_EDITOR); + ClearWindow(); + + DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS_YPOS, + "Element Settings", FONT_TITLE_1); + + DrawElementBorder(SX + xstart * MINI_TILEX, + SY + ystart * MINI_TILEY + MINI_TILEY / 2, + TILEX, TILEY); + DrawGraphicAnimationExt(drawto, + SX + xstart * MINI_TILEX, + SY + ystart * MINI_TILEY + MINI_TILEY / 2, + el2edimg(properties_element), -1, NO_MASKING); + + FrameCounter = 0; /* restart animation frame counter */ + + DrawTextF((xstart + 3) * MINI_TILEX, (ystart + 1) * MINI_TILEY, + FONT_TEXT_1, getElementInfoText(properties_element)); + + DrawPropertiesTabulatorGadgets(); + + if (edit_mode_properties == ED_MODE_PROPERTIES_MAIN) + DrawPropertiesMain(); + else if (edit_mode_properties == ED_MODE_PROPERTIES_INFO) + DrawPropertiesInfo(); + else /* edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED */ + DrawPropertiesAdvanced(); } static void DrawLineElement(int sx, int sy, int element, boolean change_level) @@ -2826,8 +3890,8 @@ static void DrawLine(int from_x, int from_y, int to_x, int to_y, } } -static void DrawRectangle(int from_x, int from_y, int to_x, int to_y, - int element, boolean change_level) +static void DrawBox(int from_x, int from_y, int to_x, int to_y, + int element, boolean change_level) { DrawLine(from_x, from_y, from_x, to_y, element, change_level); DrawLine(from_x, to_y, to_x, to_y, element, change_level); @@ -2949,7 +4013,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y, int element, boolean change_level) { if (element == -1 || change_level) - DrawRectangle(from_x, from_y, to_x, to_y, -1, FALSE); + DrawBox(from_x, from_y, to_x, to_y, -1, FALSE); else DrawAreaBorder(from_x, from_y, to_x, to_y); } @@ -3137,13 +4201,13 @@ static int DrawLevelText(int sx, int sy, char letter, int mode) if (letter >= 'a' && letter <= 'z') letter_element = EL_CHAR_ASCII0 + letter + (int)('A' - 'a'); else if (letter == 'ä' || letter == 'Ä') - letter_element = EL_CHAR_AE; + letter_element = EL_CHAR_AUMLAUT; else if (letter == 'ö' || letter == 'Ö') - letter_element = EL_CHAR_OE; + letter_element = EL_CHAR_OUMLAUT; else if (letter == 'ü' || letter == 'Ü') - letter_element = EL_CHAR_UE; + letter_element = EL_CHAR_UUMLAUT; else if (letter == '^') - letter_element = EL_CHAR_COPY; + letter_element = EL_CHAR_COPYRIGHT; else letter_element = EL_CHAR_ASCII0 + letter; @@ -3447,20 +4511,20 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (new_element != Feld[lx][ly]) { - if (new_element == EL_SPIELFIGUR) + if (new_element == EL_PLAYER_1) { /* remove player at old position */ for(y=0; y= 0 && x - level_xpos < ed_fieldx && y - level_ypos >= 0 && y - level_ypos < ed_fieldy) DrawMiniElement(x - level_xpos, y - level_ypos, - EL_LEERRAUM); + EL_EMPTY); } } } @@ -3475,14 +4539,21 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) DrawMiniGraphicExt(drawto, gi->x + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, - el2gfx(new_element)); + el2edimg(new_element)); DrawMiniGraphicExt(window, gi->x + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, - el2gfx(new_element)); + el2edimg(new_element)); if (id == GADGET_ID_AMOEBA_CONTENT) level.amoeba_content = new_element; + else if (id == GADGET_ID_CUSTOM_CHANGED && + IS_CUSTOM_ELEMENT(properties_element)) + { + int i = properties_element - EL_CUSTOM_START; + + level.custom_element_successor[i] = new_element; + } else if (id == GADGET_ID_RANDOM_BACKGROUND) random_placement_background_element = new_element; else if (id >= GADGET_ID_ELEM_CONTENT_0 && @@ -3529,7 +4600,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) else if (drawing_function == GADGET_ID_ARC) draw_func = DrawArc; else if (drawing_function == GADGET_ID_RECTANGLE) - draw_func = DrawRectangle; + draw_func = DrawBox; else if (drawing_function == GADGET_ID_FILLED_BOX) draw_func = DrawFilledBox; else if (drawing_function == GADGET_ID_GRAB_BRUSH) @@ -3656,6 +4727,30 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi) strcpy(textinput_info[gi->custom_type_id].value, gi->text.value); } +static void HandleSelectboxGadgets(struct GadgetInfo *gi) +{ + int type_id = gi->custom_type_id; + + *selectbox_info[type_id].index = gi->selectbox.index; + +#if 0 + printf("Selected text value: '%s' [%d]\n", + selectbox_info[type_id].options[gi->selectbox.index].text, + selectbox_info[type_id].options[gi->selectbox.index].value); +#endif +} + +static void HandleTextbuttonGadgets(struct GadgetInfo *gi) +{ + if (gi->custom_type_id >= ED_TEXTBUTTON_ID_PROPERTIES_MAIN && + gi->custom_type_id <= ED_TEXTBUTTON_ID_PROPERTIES_ADVANCED) + { + edit_mode_properties = gi->custom_type_id; + + DrawPropertiesWindow(); + } +} + static void HandleRadiobuttons(struct GadgetInfo *gi) { *radiobutton_info[gi->custom_type_id].value = @@ -3664,7 +4759,13 @@ static void HandleRadiobuttons(struct GadgetInfo *gi) static void HandleCheckbuttons(struct GadgetInfo *gi) { - *checkbutton_info[gi->custom_type_id].value ^= TRUE; + int type_id = gi->custom_type_id; + + *checkbutton_info[type_id].value ^= TRUE; + + if (type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST && + type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) + CopyCustomElementPropertiesToGame(); } static void HandleControlButtons(struct GadgetInfo *gi) @@ -3785,8 +4886,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) if (element_shift < 0) element_shift = 0; - if (element_shift > elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS) - element_shift = elements_in_list - ED_NUM_ELEMENTLIST_BUTTONS; + if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS) + element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS; ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL], GDI_SCROLLBAR_ITEM_POSITION, @@ -3798,10 +4899,10 @@ static void HandleControlButtons(struct GadgetInfo *gi) int gadget_id = GADGET_ID_ELEMENTLIST_FIRST + i; struct GadgetInfo *gi = level_editor_gadget[gadget_id]; struct GadgetDesign *gd = &gi->deco.design; - int element = editor_element[element_shift + i]; + int element = editor_elements[element_shift + i]; UnmapGadget(gi); - getMiniGraphicSource(el2gfx(element), &gd->bitmap, &gd->x, &gd->y); + getMiniGraphicSource(el2edimg(element), &gd->bitmap, &gd->x, &gd->y); ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END); MapGadget(gi); } @@ -3889,7 +4990,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) case GADGET_ID_CLEAR: for(x=0; xinfo_text == NULL) return; - strncpy(infotext, gi->info_text, MAX_INFOTEXT_LEN); - infotext[MAX_INFOTEXT_LEN] = '\0'; + strncpy(infotext, gi->info_text, max_infotext_len); + infotext[max_infotext_len] = '\0'; if (gi->custom_id < ED_NUM_CTRL_BUTTONS) { @@ -4107,12 +5228,12 @@ void HandleEditorGadgetInfoText(void *ptr) sprintf(shortcut, " ('%s%c')", (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key); - if (strlen(infotext) + strlen(shortcut) <= MAX_INFOTEXT_LEN) + if (strlen(infotext) + strlen(shortcut) <= max_infotext_len) strcat(infotext, shortcut); } } - DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FS_SMALL, FC_YELLOW); + DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2); } static void HandleDrawingAreaInfo(struct GadgetInfo *gi) @@ -4206,18 +5327,18 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } if (drawing_function == GADGET_ID_PICK_ELEMENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, lx, ly); else - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s: %d, %d", infotext, ABS(lx - start_lx) + 1, ABS(ly - start_ly) + 1); } else if (drawing_function == GADGET_ID_PICK_ELEMENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s", getElementInfoText(Feld[lx][ly])); else - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Level position: %d, %d", lx, ly); } @@ -4231,13 +5352,16 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } } else if (id == GADGET_ID_AMOEBA_CONTENT) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Amoeba content"); + else if (id == GADGET_ID_CUSTOM_CHANGED) + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, + "Next element after change"); else if (id == GADGET_ID_RANDOM_BACKGROUND) - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Random placement background"); else - DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, + DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "Content area %d position: %d, %d", id - GADGET_ID_ELEM_CONTENT_0 + 1, sx, sy); } @@ -4259,7 +5383,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed) else { CloseDoor(DOOR_CLOSE_1); - BlitBitmap(pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], + BlitBitmap(bitmap_db_door, bitmap_db_door, DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE,DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); OpenDoor(DOOR_OPEN_1);