X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=df3db706e31ba03f7fce6d18943144d25ba9631d;hp=e8201e302b6f3ddcfaa6993a0a5867c1092cdf56;hb=5ae04ac2ef54f6f164a797c16c9782042cc2ce67;hpb=fa26d82a378cebf6b519c566c3f33739ebba7823 diff --git a/src/editor.c b/src/editor.c index e8201e30..df3db706 100644 --- a/src/editor.c +++ b/src/editor.c @@ -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_INFO (GADGET_ID_TEXTBUTTON_FIRST + 0) +#define GADGET_ID_PROPERTIES_CONFIG (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_INFO 0 +#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG 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_INFO ED_TEXTBUTTON_ID_PROPERTIES_INFO +#define ED_MODE_PROPERTIES_CONFIG ED_TEXTBUTTON_ID_PROPERTIES_CONFIG +#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,39 +501,36 @@ 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_SAND; static boolean random_placement_background_restricted = FALSE; static boolean stick_element_properties_window = FALSE; +static boolean custom_element_properties[NUM_ELEMENT_PROPERTIES]; static struct { @@ -487,7 +595,7 @@ static struct 0, 255, GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP, GADGET_ID_LEVEL_TIMESCORE_TEXT, - &level.score[SC_ZEITBONUS], + &level.score[SC_TIME_BONUS], "score for each 10 seconds left", NULL }, { @@ -533,6 +641,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_INFO, + 11, "Information", + "Show information about element" + }, + { + ED_SETTINGS_XPOS + 166, ED_COUNTER_YPOS(1), + GADGET_ID_PROPERTIES_CONFIG, + 11, "Configure", + "Configure element properties" + }, + { + ED_SETTINGS_XPOS + 332, ED_COUNTER_YPOS(1), + GADGET_ID_PROPERTIES_ADVANCED, + 11, "Advanced", + "Advanced element configuration" + }, +}; + static struct { int xpos, ypos; @@ -678,12 +845,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[EP_INDESTRUCTIBLE], + "indestructible", "element cannot be destroyed" + }, + { + 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(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(13), + GADGET_ID_CUSTOM_PUSHABLE, + &custom_element_properties[EP_PUSHABLE], + "pushable", "element can be pushed" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS2(14), + GADGET_ID_CUSTOM_SLIPPERY, + &custom_element_properties[EP_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; @@ -713,6 +913,8 @@ static void CopyLevelToUndoBuffer(int); static void HandleDrawingAreas(struct GadgetInfo *); static void HandleCounterButtons(struct GadgetInfo *); static void HandleTextInputGadgets(struct GadgetInfo *); +static void HandleSelectboxGadgets(struct GadgetInfo *); +static void HandleTextbuttonGadgets(struct GadgetInfo *); static void HandleRadiobuttons(struct GadgetInfo *); static void HandleCheckbuttons(struct GadgetInfo *); static void HandleControlButtons(struct GadgetInfo *); @@ -732,12 +934,11 @@ static int undo_buffer_position = 0; static int undo_buffer_steps = 0; static int edit_mode; +static int edit_mode_properties; -static int counter_xsize = DXSIZE + FONT2_XSIZE - 2 * ED_GADGET_DISTANCE; +static int element_shift = 0; -int element_shift = 0; - -int editor_el_boulderdash[] = +static int editor_el_boulderdash[] = { EL_CHAR('B'), EL_CHAR('O'), @@ -754,7 +955,7 @@ int editor_el_boulderdash[] = EL_CHAR('S'), EL_CHAR('H'), - EL_PLAYER1, + EL_PLAYER_1, EL_EMPTY, EL_SAND, EL_STEELWALL, @@ -779,9 +980,9 @@ int editor_el_boulderdash[] = EL_BD_FIREFLY_DOWN, EL_EMPTY, }; -int num_editor_el_boulderdash = SIZEOF_ARRAY_INT(editor_el_boulderdash); +static int num_editor_el_boulderdash = SIZEOF_ARRAY_INT(editor_el_boulderdash); -int editor_el_emerald_mine[] = +static int editor_el_emerald_mine[] = { EL_CHAR('E'), EL_CHAR('M'), @@ -798,12 +999,12 @@ int editor_el_emerald_mine[] = EL_CHAR('N'), EL_CHAR('E'), - EL_PLAYER1, - EL_PLAYER2, - EL_PLAYER3, - EL_PLAYER4, + EL_PLAYER_1, + EL_PLAYER_2, + EL_PLAYER_3, + EL_PLAYER_4, - EL_PLAYER1, + EL_PLAYER_1, EL_EMPTY, EL_SAND, EL_ROCK, @@ -843,14 +1044,14 @@ int editor_el_emerald_mine[] = EL_SPACESHIP_DOWN, EL_INVISIBLE_WALL, - EL_ACIDPOOL_TOPLEFT, + EL_ACID_POOL_TOPLEFT, EL_ACID, - EL_ACIDPOOL_TOPRIGHT, + EL_ACID_POOL_TOPRIGHT, EL_EMPTY, - EL_ACIDPOOL_BOTTOMLEFT, - EL_ACIDPOOL_BOTTOM, - EL_ACIDPOOL_BOTTOMRIGHT, + EL_ACID_POOL_BOTTOMLEFT, + EL_ACID_POOL_BOTTOM, + EL_ACID_POOL_BOTTOMRIGHT, EL_EMPTY, EL_AMOEBA_DROP, @@ -858,49 +1059,49 @@ int editor_el_emerald_mine[] = EL_AMOEBA_WET, EL_AMOEBA_DRY, - EL_EM_KEY1_FILE, - EL_EM_KEY2_FILE, - EL_EM_KEY3_FILE, - EL_EM_KEY4_FILE, + EL_EM_KEY_1_FILE, + EL_EM_KEY_2_FILE, + EL_EM_KEY_3_FILE, + EL_EM_KEY_4_FILE, - EL_EM_GATE1, - EL_EM_GATE2, - EL_EM_GATE3, - EL_EM_GATE4, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, - EL_EM_GATE1_GRAY, - EL_EM_GATE2_GRAY, - EL_EM_GATE3_GRAY, - EL_EM_GATE4_GRAY, + EL_EM_GATE_1_GRAY, + EL_EM_GATE_2_GRAY, + EL_EM_GATE_3_GRAY, + EL_EM_GATE_4_GRAY, }; -int num_editor_el_emerald_mine = SIZEOF_ARRAY_INT(editor_el_emerald_mine); +static int num_editor_el_emerald_mine = SIZEOF_ARRAY_INT(editor_el_emerald_mine); -int editor_el_more[] = +static int editor_el_more[] = { EL_CHAR('M'), EL_CHAR('O'), EL_CHAR('R'), EL_CHAR('E'), - EL_KEY1, - EL_KEY2, - EL_KEY3, - EL_KEY4, + EL_KEY_1, + EL_KEY_2, + EL_KEY_3, + EL_KEY_4, - EL_GATE1, - EL_GATE2, - EL_GATE3, - EL_GATE4, + EL_GATE_1, + EL_GATE_2, + EL_GATE_3, + EL_GATE_4, - EL_GATE1_GRAY, - EL_GATE2_GRAY, - EL_GATE3_GRAY, - EL_GATE4_GRAY, + EL_GATE_1_GRAY, + EL_GATE_2_GRAY, + EL_GATE_3_GRAY, + EL_GATE_4_GRAY, - EL_ARROW_BLUE_LEFT, - EL_ARROW_BLUE_RIGHT, - EL_ARROW_BLUE_UP, - EL_ARROW_BLUE_DOWN, + EL_ARROW_LEFT, + EL_ARROW_RIGHT, + EL_ARROW_UP, + EL_ARROW_DOWN, EL_AMOEBA_FULL, EL_EMERALD_YELLOW, @@ -912,7 +1113,7 @@ int editor_el_more[] = EL_WALL_EMERALD_RED, EL_WALL_EMERALD_PURPLE, - EL_GAMEOFLIFE, + EL_GAME_OF_LIFE, EL_PACMAN_UP, EL_TIME_ORB_FULL, EL_TIME_ORB_EMPTY, @@ -920,16 +1121,16 @@ int editor_el_more[] = EL_PACMAN_LEFT, EL_DARK_YAMYAM, EL_PACMAN_RIGHT, - EL_WALL_GROWING, + EL_EXPANDABLE_WALL, EL_BIOMAZE, EL_PACMAN_DOWN, EL_LAMP, EL_LAMP_ACTIVE, - EL_DYNABOMB_NR, - EL_DYNABOMB_SZ, - EL_DYNABOMB_XL, + EL_DYNABOMB_INCREASE_NUMBER, + EL_DYNABOMB_INCREASE_SIZE, + EL_DYNABOMB_INCREASE_POWER, EL_STONEBLOCK, EL_MOLE, @@ -950,36 +1151,36 @@ int editor_el_more[] = EL_EMPTY, EL_MOLE_DOWN, EL_BALLOON, - EL_BALLOON_SEND_ANY_DIRECTION, + EL_BALLOON_SWITCH_ANY, - EL_BALLOON_SEND_LEFT, - EL_BALLOON_SEND_RIGHT, - EL_BALLOON_SEND_UP, - EL_BALLOON_SEND_DOWN, + EL_BALLOON_SWITCH_LEFT, + EL_BALLOON_SWITCH_RIGHT, + EL_BALLOON_SWITCH_UP, + EL_BALLOON_SWITCH_DOWN, EL_SATELLITE, - EL_WALL_GROWING_X, - EL_WALL_GROWING_Y, - EL_WALL_GROWING_XY, + EL_EXPANDABLE_WALL_HORIZONTAL, + EL_EXPANDABLE_WALL_VERTICAL, + EL_EXPANDABLE_WALL_ANY, EL_INVISIBLE_STEELWALL, EL_INVISIBLE_WALL, EL_SPEED_PILL, EL_BLACK_ORB, - EL_EMC_STEELWALL1, - EL_EMC_WALL_PILLAR_UPPER, - EL_EMC_WALL_PILLAR_MIDDLE, - EL_EMC_WALL_PILLAR_LOWER, + EL_EMC_STEELWALL_1, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, - EL_EMC_WALL4, - EL_EMC_WALL5, - EL_EMC_WALL6, - EL_EMC_WALL7, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, }; -int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more); +static int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more); -int editor_el_sokoban[] = +static int editor_el_sokoban[] = { EL_CHAR('S'), EL_CHAR('O'), @@ -996,9 +1197,9 @@ int editor_el_sokoban[] = EL_SOKOBAN_FIELD_FULL, EL_STEELWALL, }; -int num_editor_el_sokoban = SIZEOF_ARRAY_INT(editor_el_sokoban); +static int num_editor_el_sokoban = SIZEOF_ARRAY_INT(editor_el_sokoban); -int editor_el_supaplex[] = +static int editor_el_supaplex[] = { EL_CHAR('S'), EL_CHAR('U'), @@ -1017,52 +1218,52 @@ int editor_el_supaplex[] = EL_SP_INFOTRON, EL_SP_CHIP_SINGLE, - EL_SP_HARD_GRAY, + EL_SP_HARDWARE_GRAY, EL_SP_EXIT_CLOSED, EL_SP_DISK_ORANGE, - EL_SP_PORT1_RIGHT, - EL_SP_PORT1_DOWN, - EL_SP_PORT1_LEFT, + EL_SP_PORT_RIGHT, + EL_SP_PORT_DOWN, + EL_SP_PORT_LEFT, - EL_SP_PORT1_UP, - EL_SP_PORT2_RIGHT, - EL_SP_PORT2_DOWN, - EL_SP_PORT2_LEFT, + EL_SP_PORT_UP, + EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_PORT_LEFT, - EL_SP_PORT2_UP, + EL_SP_GRAVITY_PORT_UP, EL_SP_SNIKSNAK, EL_SP_DISK_YELLOW, EL_SP_TERMINAL, EL_SP_DISK_RED, - EL_SP_PORT_Y, - EL_SP_PORT_X, - EL_SP_PORT_XY, + EL_SP_PORT_VERTICAL, + EL_SP_PORT_HORIZONTAL, + EL_SP_PORT_ANY, EL_SP_ELECTRON, EL_SP_BUGGY_BASE, EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT, - EL_SP_HARD_BASE1, - EL_SP_HARD_GREEN, - EL_SP_HARD_BLUE, - EL_SP_HARD_RED, + EL_SP_HARDWARE_BASE_1, + EL_SP_HARDWARE_GREEN, + EL_SP_HARDWARE_BLUE, + EL_SP_HARDWARE_RED, - EL_SP_HARD_YELLOW, - EL_SP_HARD_BASE2, - EL_SP_HARD_BASE3, - EL_SP_HARD_BASE4, + EL_SP_HARDWARE_YELLOW, + EL_SP_HARDWARE_BASE_2, + EL_SP_HARDWARE_BASE_3, + EL_SP_HARDWARE_BASE_4, - EL_SP_HARD_BASE5, - EL_SP_HARD_BASE6, - EL_SP_CHIP_UPPER, - EL_SP_CHIP_LOWER, + EL_SP_HARDWARE_BASE_5, + EL_SP_HARDWARE_BASE_6, + EL_SP_CHIP_TOP, + EL_SP_CHIP_BOTTOM, }; -int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex); +static int num_editor_el_supaplex = SIZEOF_ARRAY_INT(editor_el_supaplex); -int editor_el_diamond_caves[] = +static int editor_el_diamond_caves[] = { EL_CHAR('D'), EL_CHAR('I'), @@ -1089,35 +1290,35 @@ int editor_el_diamond_caves[] = EL_WALL_PEARL, EL_WALL_CRYSTAL, - EL_CONVEYOR_BELT1_LEFT, - EL_CONVEYOR_BELT1_MIDDLE, - EL_CONVEYOR_BELT1_RIGHT, - EL_CONVEYOR_BELT1_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_1_LEFT, + EL_CONVEYOR_BELT_1_MIDDLE, + EL_CONVEYOR_BELT_1_RIGHT, + EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, - EL_CONVEYOR_BELT2_LEFT, - EL_CONVEYOR_BELT2_MIDDLE, - EL_CONVEYOR_BELT2_RIGHT, - EL_CONVEYOR_BELT2_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_2_LEFT, + EL_CONVEYOR_BELT_2_MIDDLE, + EL_CONVEYOR_BELT_2_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_MIDDLE, - EL_CONVEYOR_BELT3_LEFT, - EL_CONVEYOR_BELT3_MIDDLE, - EL_CONVEYOR_BELT3_RIGHT, - EL_CONVEYOR_BELT3_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_3_LEFT, + EL_CONVEYOR_BELT_3_MIDDLE, + EL_CONVEYOR_BELT_3_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_MIDDLE, - EL_CONVEYOR_BELT4_LEFT, - EL_CONVEYOR_BELT4_MIDDLE, - EL_CONVEYOR_BELT4_RIGHT, - EL_CONVEYOR_BELT4_SWITCH_MIDDLE, + EL_CONVEYOR_BELT_4_LEFT, + EL_CONVEYOR_BELT_4_MIDDLE, + EL_CONVEYOR_BELT_4_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_MIDDLE, - EL_CONVEYOR_BELT1_SWITCH_LEFT, - EL_CONVEYOR_BELT2_SWITCH_LEFT, - EL_CONVEYOR_BELT3_SWITCH_LEFT, - EL_CONVEYOR_BELT4_SWITCH_LEFT, + EL_CONVEYOR_BELT_1_SWITCH_LEFT, + EL_CONVEYOR_BELT_2_SWITCH_LEFT, + EL_CONVEYOR_BELT_3_SWITCH_LEFT, + EL_CONVEYOR_BELT_4_SWITCH_LEFT, - EL_CONVEYOR_BELT1_SWITCH_RIGHT, - EL_CONVEYOR_BELT2_SWITCH_RIGHT, - EL_CONVEYOR_BELT3_SWITCH_RIGHT, - EL_CONVEYOR_BELT4_SWITCH_RIGHT, + EL_CONVEYOR_BELT_1_SWITCH_RIGHT, + EL_CONVEYOR_BELT_2_SWITCH_RIGHT, + EL_CONVEYOR_BELT_3_SWITCH_RIGHT, + EL_CONVEYOR_BELT_4_SWITCH_RIGHT, EL_SWITCHGATE_OPEN, EL_SWITCHGATE_CLOSED, @@ -1144,9 +1345,9 @@ int editor_el_diamond_caves[] = EL_EXTRA_TIME, EL_EMPTY, }; -int num_editor_el_diamond_caves = SIZEOF_ARRAY_INT(editor_el_diamond_caves); +static int num_editor_el_diamond_caves = SIZEOF_ARRAY_INT(editor_el_diamond_caves); -int editor_el_dx_boulderdash[] = +static int editor_el_dx_boulderdash[] = { EL_CHAR('D'), EL_CHAR('X'), @@ -1175,7 +1376,7 @@ int editor_el_dx_boulderdash[] = EL_TUBE_HORIZONTAL, EL_TUBE_VERTICAL_RIGHT, - EL_TUBE_ALL, + EL_TUBE_ANY, EL_TUBE_VERTICAL_LEFT, EL_TUBE_VERTICAL, @@ -1188,9 +1389,9 @@ int editor_el_dx_boulderdash[] = EL_EMPTY, EL_EMPTY }; -int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderdash); +static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderdash); -int editor_el_chars[] = +static int editor_el_chars[] = { EL_CHAR('T'), EL_CHAR('E'), @@ -1270,21 +1471,26 @@ int editor_el_chars[] = EL_CHAR('X'), EL_CHAR('Y'), EL_CHAR('Z'), - EL_CHAR('Ä'), + EL_CHAR('['), - EL_CHAR('Ö'), - EL_CHAR('Ü'), + EL_CHAR('\\'), + EL_CHAR(']'), EL_CHAR('^'), EL_CHAR('_'), - EL_CHAR(' '), + EL_CHAR('©'), + EL_CHAR('Ä'), + EL_CHAR('Ö'), + EL_CHAR('Ü'), + EL_CHAR('°'), - EL_CHAR('´'), - EL_CHAR('|') + EL_CHAR('®'), + EL_CHAR(FONT_ASCII_CURSOR), + EL_CHAR(' ') }; -int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars); +static int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars); -int editor_el_custom[] = +static int editor_el_custom[] = { EL_CHAR('C'), EL_CHAR('U'), @@ -1466,12 +1672,12 @@ int editor_el_custom[] = EL_CUSTOM_START + 126, EL_CUSTOM_START + 127 }; -int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom); +static int num_editor_el_custom = SIZEOF_ARRAY_INT(editor_el_custom); -int *editor_elements = NULL; /* dynamically allocated */ -int num_editor_elements = 0; /* dynamically determined */ +static int *editor_elements = NULL; /* dynamically allocated */ +static int num_editor_elements = 0; /* dynamically determined */ -struct +static struct { boolean *setup_value; int *element_list; @@ -1503,6 +1709,13 @@ editor_elements_info[] = NULL } }; + +/* + ----------------------------------------------------------------------------- + functions + ----------------------------------------------------------------------------- +*/ + static void ReinitializeElementList() { int pos = 0; @@ -1561,15 +1774,34 @@ static void ReinitializeElementListButtons() initialization_needed = FALSE; } +static int getCounterGadgetWidth() +{ + return (DXSIZE + getFontWidth(FONT_INPUT_1) - 2 * ED_GADGET_DISTANCE); +} + +static int getMaxInfoTextLength() +{ + return (SXSIZE / getFontWidth(FONT_TEXT_2)); +} + static char *getElementInfoText(int element) { - char *info_text = "unknown"; + char *info_text = NULL; + + if (element < NUM_FILE_ELEMENTS) + { + if (element_info[element].custom_description != NULL) + info_text = element_info[element].custom_description; + else if (element_info[element].editor_description != NULL) + info_text = element_info[element].editor_description; + } + + if (info_text == NULL) + { + info_text = "unknown"; - if (element < NUM_FILE_ELEMENTS && - element_info[element].editor_description != NULL) - info_text = element_info[element].editor_description; - else Error(ERR_WARN, "no element description for element %d", element); + } return info_text; } @@ -1606,7 +1838,7 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll) static void CreateControlButtons() { - Bitmap *gd_bitmap = new_graphic_info[IMG_MENU_DOOR].bitmap; + Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap; struct GadgetInfo *gi; unsigned long event_mask; int i; @@ -1784,7 +2016,7 @@ static void CreateControlButtons() gd_x2 = DOOR_GFX_PAGEX6 + ED_ELEMENTLIST_XPOS; gd_y = DOOR_GFX_PAGEY1 + ED_ELEMENTLIST_YPOS; - getMiniGraphicSource(el2img(element), &deco_bitmap, &deco_x, &deco_y); + getMiniGraphicSource(el2edimg(element), &deco_bitmap, &deco_x, &deco_y); deco_xpos = (ED_ELEMENTLIST_XSIZE - MINI_TILEX) / 2; deco_ypos = (ED_ELEMENTLIST_YSIZE - MINI_TILEY) / 2; @@ -1817,6 +2049,7 @@ static void CreateControlButtons() static void CreateCounterButtons() { + int max_infotext_len = getMaxInfoTextLength(); int i; for (i=0; i= max_lines_per_screen) + return FALSE; + + DrawText(sx, sy + screen_line * font_height, text, font_nr); + + return TRUE; +} + +static int PrintElementDescriptionFromFile(char *filename, int screen_line) +{ + int font_nr = FONT_TEXT_2; + int font_width = getFontWidth(font_nr); + int pad_x = ED_SETTINGS_XPOS; + int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; + char line[MAX_LINE_LEN]; + char buffer[max_chars_per_line + 1]; + int buffer_len; + int lines_printed = 0; + FILE *file; + + if (filename == NULL) + return 0; + + if (!(file = fopen(filename, MODE_READ))) + return 0; + + buffer[0] = '\0'; + buffer_len = 0; + + while(!feof(file)) + { + char *line_ptr, *word_ptr; + boolean last_line_was_empty = TRUE; + + /* read next line of input file */ + if (!fgets(line, MAX_LINE_LEN, file)) + break; + + /* skip comments (lines directly beginning with '#') */ + if (line[0] == '#') + continue; + + /* cut trailing newline from input line */ + for (line_ptr = line; *line_ptr; line_ptr++) + { + if (*line_ptr == '\n' || *line_ptr == '\r') + { + *line_ptr = '\0'; + break; + } + } + + if (strlen(line) == 0) /* special case: force empty line */ + strcpy(line, "\n"); + + word_ptr = line; + + while (*word_ptr) + { + boolean print_buffer = FALSE; + int word_len; + + /* skip leading whitespaces */ + while (*word_ptr == ' ' || *word_ptr == '\t') + word_ptr++; + + line_ptr = word_ptr; + word_len = 0; + + /* look for end of next word */ + while (*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\0') + { + line_ptr++; + word_len++; + } + + if (word_len == 0) + { + continue; + } + else if (*word_ptr == '\n') /* special case: force empty line */ + { + if (buffer_len == 0) + word_ptr++; + + /* prevent printing of multiple empty lines */ + if (buffer_len > 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) + { + if (!PrintInfoText(buffer, font_nr, screen_line + lines_printed)) + return lines_printed; + + last_line_was_empty = (buffer_len == 0); + lines_printed++; + + buffer[0] = '\0'; + buffer_len = 0; + print_buffer = FALSE; + } + } + } + + fclose(file); + + if (buffer_len > 0) + if (PrintInfoText(buffer, font_nr, screen_line + lines_printed)) + lines_printed++; + + return lines_printed; +} + +static void DrawPropertiesTabulatorGadgets() +{ + struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO]; + struct GadgetDesign *gd = &gd_gi->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_INFO; + int id_last = ED_TEXTBUTTON_ID_PROPERTIES_INFO; + int i; + + /* draw additional "configure" tabulator for configurable elements */ + if (checkPropertiesConfig()) + id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG; + + /* 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); +} + +static void DrawPropertiesInfo() +{ + static struct + { + int value; + char *text; + } + properties[] = + { + { EP_AMOEBALIVE, "- living amoeba" }, + { EP_AMOEBOID, "- amoeboid" }, + { EP_PFORTE, "- pforte" }, + { EP_SOLID, "- solid" }, + { EP_INDESTRUCTIBLE, "- undestructible" }, + { EP_SLIPPERY, "- slippery" }, + { EP_ENEMY, "- enemy" }, + { EP_MAUER, "- mauer" }, + { EP_CAN_FALL, "- can fall" }, + { EP_CAN_SMASH, "- can smash" }, + { EP_CAN_CHANGE, "- can change" }, + { EP_CAN_MOVE, "- can move" }, + { EP_COULD_MOVE, "- could move" }, + { EP_DONT_TOUCH, "- don't touch" }, + { EP_DONT_GO_TO, "- don't go to" }, + { EP_FOOD_DARK_YAMYAM, "- food for dark yamyam" }, + { EP_BD_ELEMENT, "- BD style" }, + { EP_SB_ELEMENT, "- SB style" }, + { EP_GEM, "- gem" }, + { EP_INACTIVE, "- inactive" }, + { EP_EXPLOSIVE, "- explosive" }, + { EP_FOOD_PENGUIN, "- food for penguin" }, + { EP_PUSHABLE, "- pushable" }, + { EP_PLAYER, "- player" }, + { EP_HAS_CONTENT, "- has content" }, + { EP_DIGGABLE, "- diggable" }, + { EP_SP_ELEMENT, "- SB style" }, + { EP_WALKABLE_THROUGH, "- walkable through" }, + { EP_OVER_PLAYER, "- over player" }, + { EP_ACTIVE_BOMB, "- active bomb" }, + { EP_BELT, "- belt" }, + { EP_BELT_ACTIVE, "- active belt" }, + { EP_BELT_SWITCH, "- belt switch" }, + { EP_WALKABLE_UNDER, "- walkable under" }, + { EP_EM_SLIPPERY_WALL, "- EM style slippery wall" }, + { EP_CAN_BE_CRUMBLED, "- can be crumbled" }, + { -1, NULL } + }; + char *filename = getElementDescriptionFilename(properties_element); + char *percentage_text = "In this level:"; + char *properties_text = "Standard properties:"; + float percentage; + int num_elements_in_level; + int num_standard_properties = 0; + int font1_nr = FONT_TEXT_1; + int font2_nr = FONT_TEXT_2; + int font1_width = getFontWidth(font1_nr); + int font2_height = getFontHeight(font2_nr); + int pad_x = ED_SETTINGS_XPOS; + int pad_y = 5 * TILEY; + int screen_line = 2; + int i, x, y; + + num_elements_in_level = 0; + for (y=0; y 0) + { + DrawTextF(pad_x, pad_y + screen_line * font2_height, font1_nr, + properties_text); + screen_line++; + + for (i=0; properties[i].value != -1; i++) + { + if (!HAS_PROPERTY(properties_element, properties[i].value)) + continue; + + DrawTextF(pad_x, pad_y + screen_line * font2_height, font2_nr, + properties[i].text); + screen_line++; + } + + screen_line++; + } + + PrintInfoText("Description:", FONT_TEXT_1, screen_line); + if (PrintElementDescriptionFromFile(filename, screen_line + 1) == 0) + PrintInfoText("No description available.", FONT_TEXT_1, screen_line); +} + +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_CONFIG; + + if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG && + !checkPropertiesConfig()) + edit_mode_properties = ED_MODE_PROPERTIES_INFO; + + 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, + el2img(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_INFO) + DrawPropertiesInfo(); + else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG) + DrawPropertiesConfig(); + else /* edit_mode_properties == ED_MODE_PROPERTIES_ADVANCED */ + DrawPropertiesAdvanced(); } static void DrawLineElement(int sx, int sy, int element, boolean change_level) @@ -3182,8 +3892,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); @@ -3305,7 +4015,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); } @@ -3493,11 +4203,11 @@ 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_COPYRIGHT; else @@ -3803,14 +4513,14 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) } else if (new_element != Feld[lx][ly]) { - if (new_element == EL_PLAYER1) + if (new_element == EL_PLAYER_1) { /* remove player at old position */ for(y=0; y= 0 && x - level_xpos < ed_fieldx && @@ -3831,14 +4541,21 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) DrawMiniGraphicExt(drawto, gi->x + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, - el2img(new_element)); + el2edimg(new_element)); DrawMiniGraphicExt(window, gi->x + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, - el2img(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 && @@ -3885,7 +4602,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) @@ -4012,6 +4729,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_INFO && + 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 = @@ -4020,7 +4761,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(properties_element); } static void HandleControlButtons(struct GadgetInfo *gi) @@ -4157,7 +4904,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) int element = editor_elements[element_shift + i]; UnmapGadget(gi); - getMiniGraphicSource(el2img(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); } @@ -4264,9 +5011,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) { if (Request("Save this level and kill the old ?", REQ_ASK)) { - 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) { @@ -4489,12 +5230,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) @@ -4588,18 +5329,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); } @@ -4613,13 +5354,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); }