+#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
+
+/* 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
+
+/* drawing area identifiers */
+#define GADGET_ID_DRAWING_LEVEL 46
+#define GADGET_ID_ELEM_CONTENT_0 47
+#define GADGET_ID_ELEM_CONTENT_1 48
+#define GADGET_ID_ELEM_CONTENT_2 49
+#define GADGET_ID_ELEM_CONTENT_3 50
+#define GADGET_ID_ELEM_CONTENT_4 51
+#define GADGET_ID_ELEM_CONTENT_5 52
+#define GADGET_ID_ELEM_CONTENT_6 53
+#define GADGET_ID_ELEM_CONTENT_7 54
+#define GADGET_ID_AMOEBA_CONTENT 55
+
+/* text input identifiers */
+#define GADGET_ID_LEVEL_NAME 56
+#define GADGET_ID_LEVEL_AUTHOR 57
+
+/* gadgets for scrolling of drawing area */
+#define GADGET_ID_SCROLL_UP 58
+#define GADGET_ID_SCROLL_DOWN 59
+#define GADGET_ID_SCROLL_LEFT 60
+#define GADGET_ID_SCROLL_RIGHT 61
+#define GADGET_ID_SCROLL_VERTICAL 62
+#define GADGET_ID_SCROLL_HORIZONTAL 63
+
+/* gadgets for scrolling element list */
+#define GADGET_ID_ELEMENTLIST_UP 64
+#define GADGET_ID_ELEMENTLIST_DOWN 65
+
+/* gadgets for buttons in element list */
+#define GADGET_ID_ELEMENTLIST_FIRST 66
+#define GADGET_ID_ELEMENTLIST_LAST 105
+
+#define NUM_EDITOR_GADGETS 106
+
+/* values for counter gadgets */
+#define ED_COUNTER_ID_ELEM_SCORE 0
+#define ED_COUNTER_ID_ELEM_CONTENT 1
+#define ED_COUNTER_ID_LEVEL_XSIZE 2
+#define ED_COUNTER_ID_LEVEL_YSIZE 3
+#define ED_COUNTER_ID_LEVEL_RANDOM 4
+#define ED_COUNTER_ID_LEVEL_COLLECT 5
+#define ED_COUNTER_ID_LEVEL_TIMELIMIT 6
+#define ED_COUNTER_ID_LEVEL_TIMESCORE 7
+
+/* values for text input gadgets */
+#define ED_TEXTINPUT_ID_LEVEL_NAME 0
+#define ED_TEXTINPUT_ID_LEVEL_AUTHOR 1
+
+#define ED_NUM_COUNTERBUTTONS 8
+#define ED_NUM_SCROLLBUTTONS 6
+#define ED_NUM_SCROLLBARS 2
+#define ED_NUM_TEXTINPUT 2
+
+/* 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)
+
+static struct
+{
+ char shortcut;
+ 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" }
+};
+
+/* pointers to counter values */
+static int *gadget_elem_score_value = NULL;
+static int *gadget_elem_content_value = NULL;
+static int *gadget_level_xsize_value = NULL;
+static int *gadget_level_ysize_value = NULL;
+static int *gadget_level_random_value = NULL;
+static int *gadget_level_collect_value = NULL;
+static int *gadget_level_timelimit_value = NULL;
+static int *gadget_level_timescore_value = NULL;
+
+static struct
+{
+ int x, y;
+ int min_value, max_value;
+ int gadget_id_down, gadget_id_up;
+ int gadget_id_text;
+ int **counter_value;
+ char *infotext;
+} counterbutton_info[ED_NUM_COUNTERBUTTONS] =
+{
+ {
+ ED_COUNT_ELEM_SCORE_XPOS, ED_COUNT_ELEM_SCORE_YPOS,
+ MIN_SCORE, MAX_SCORE,
+ GADGET_ID_ELEM_SCORE_DOWN, GADGET_ID_ELEM_SCORE_UP,
+ GADGET_ID_ELEM_SCORE_TEXT,
+ &gadget_elem_score_value,
+ "element score"
+ },
+ {
+ ED_COUNT_ELEM_CONTENT_XPOS, ED_COUNT_ELEM_CONTENT_YPOS,
+ MIN_ELEM_CONTENT, MAX_ELEM_CONTENT,
+ GADGET_ID_ELEM_CONTENT_DOWN, GADGET_ID_ELEM_CONTENT_UP,
+ GADGET_ID_ELEM_CONTENT_TEXT,
+ &gadget_elem_content_value,
+ "element content"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(0),
+ MIN_LEV_FIELDX, MAX_LEV_FIELDX,
+ GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP,
+ GADGET_ID_LEVEL_XSIZE_TEXT,
+ &gadget_level_xsize_value,
+ "playfield width"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(1),
+ MIN_LEV_FIELDY, MAX_LEV_FIELDY,
+ GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP,
+ GADGET_ID_LEVEL_YSIZE_TEXT,
+ &gadget_level_ysize_value,
+ "playfield height"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(2),
+ 0, 100,
+ GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP,
+ GADGET_ID_LEVEL_RANDOM_TEXT,
+ &gadget_level_random_value,
+ "number of random elements"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(3),
+ 0, 999,
+ GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP,
+ GADGET_ID_LEVEL_COLLECT_TEXT,
+ &gadget_level_collect_value,
+ "number of emeralds to collect"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(4),
+ 0, 999,
+ GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP,
+ GADGET_ID_LEVEL_TIMELIMIT_TEXT,
+ &gadget_level_timelimit_value,
+ "time available to solve level"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(5),
+ 0, 255,
+ GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
+ GADGET_ID_LEVEL_TIMESCORE_TEXT,
+ &gadget_level_timescore_value,
+ "score for each 10 seconds left"
+ },
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ char *value;
+ char *infotext;
+} textinput_info[ED_NUM_TEXTINPUT] =
+{
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(6),
+ GADGET_ID_LEVEL_NAME,
+ level.name,
+ "Level Title"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(7),
+ GADGET_ID_LEVEL_AUTHOR,
+ level.author,
+ "Level Author"
+ }
+};
+
+static struct
+{
+ int xpos, ypos;
+ int x, y;
+ int gadget_id;
+ char *infotext;
+} scrollbutton_info[ED_NUM_SCROLLBUTTONS] =
+{
+ {
+ ED_SCROLLBUTTON_XPOS, ED_SCROLLBUTTON_YPOS + 0 * ED_SCROLLBUTTON_YSIZE,
+ ED_SCROLL_UP_XPOS, ED_SCROLL_UP_YPOS,
+ GADGET_ID_SCROLL_UP,
+ "scroll level editing area up"
+ },
+ {
+ ED_SCROLLBUTTON_XPOS, ED_SCROLLBUTTON_YPOS + 1 * ED_SCROLLBUTTON_YSIZE,
+ ED_SCROLL_DOWN_XPOS, ED_SCROLL_DOWN_YPOS,
+ GADGET_ID_SCROLL_DOWN,
+ "scroll level editing area down"
+ },
+ {
+ ED_SCROLLBUTTON_XPOS, ED_SCROLLBUTTON_YPOS + 2 * ED_SCROLLBUTTON_YSIZE,
+ ED_SCROLL_LEFT_XPOS, ED_SCROLL_LEFT_YPOS,
+ GADGET_ID_SCROLL_LEFT,
+ "scroll level editing area left"
+ },
+ {
+ ED_SCROLLBUTTON_XPOS, ED_SCROLLBUTTON_YPOS + 3 * ED_SCROLLBUTTON_YSIZE,
+ ED_SCROLL_RIGHT_XPOS, ED_SCROLL_RIGHT_YPOS,
+ GADGET_ID_SCROLL_RIGHT,
+ "scroll level editing area right"
+ },
+ {
+ ED_ELEMENTLIST_UP_XPOS, ED_ELEMENTLIST_UP_ALT_YPOS,
+ ED_ELEMENTLIST_UP_XPOS, ED_ELEMENTLIST_UP_YPOS,
+ GADGET_ID_ELEMENTLIST_UP,
+ "scroll element list up"
+ },
+ {
+ ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_ALT_YPOS,
+ ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_YPOS,
+ GADGET_ID_ELEMENTLIST_DOWN,
+ "scroll element list down"
+ }
+};
+
+static struct
+{
+ int xpos, ypos;
+ int x, y;
+ int width, height;
+ int type;
+ int gadget_id;
+ char *infotext;
+} scrollbar_info[ED_NUM_SCROLLBARS] =
+{
+ {
+ ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS,
+ ED_SCROLL_VERTICAL_XPOS, ED_SCROLL_VERTICAL_YPOS,
+ ED_SCROLL_VERTICAL_XSIZE, ED_SCROLL_VERTICAL_YSIZE,
+ GD_TYPE_SCROLLBAR_VERTICAL,
+ GADGET_ID_SCROLL_VERTICAL,
+ "scroll level editing area vertically"
+ },
+ {
+ ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS,
+ ED_SCROLL_HORIZONTAL_XPOS, ED_SCROLL_HORIZONTAL_YPOS,
+ ED_SCROLL_HORIZONTAL_XSIZE, ED_SCROLL_HORIZONTAL_YSIZE,
+ GD_TYPE_SCROLLBAR_HORIZONTAL,
+ GADGET_ID_SCROLL_HORIZONTAL,
+ "scroll level editing area horizontally"
+ },
+};