+/* counter button identifiers */
+#define ED_CTRL_ID_ELEM_SCORE_DOWN 22
+#define ED_CTRL_ID_ELEM_SCORE_TEXT 23
+#define ED_CTRL_ID_ELEM_SCORE_UP 24
+#define ED_CTRL_ID_ELEM_CONTENT_DOWN 25
+#define ED_CTRL_ID_ELEM_CONTENT_TEXT 26
+#define ED_CTRL_ID_ELEM_CONTENT_UP 27
+#define ED_CTRL_ID_LEVEL_XSIZE_DOWN 28
+#define ED_CTRL_ID_LEVEL_XSIZE_TEXT 29
+#define ED_CTRL_ID_LEVEL_XSIZE_UP 30
+#define ED_CTRL_ID_LEVEL_YSIZE_DOWN 31
+#define ED_CTRL_ID_LEVEL_YSIZE_TEXT 32
+#define ED_CTRL_ID_LEVEL_YSIZE_UP 33
+#define ED_CTRL_ID_LEVEL_RANDOM_DOWN 34
+#define ED_CTRL_ID_LEVEL_RANDOM_TEXT 35
+#define ED_CTRL_ID_LEVEL_RANDOM_UP 36
+#define ED_CTRL_ID_LEVEL_COLLECT_DOWN 37
+#define ED_CTRL_ID_LEVEL_COLLECT_TEXT 38
+#define ED_CTRL_ID_LEVEL_COLLECT_UP 39
+#define ED_CTRL_ID_LEVEL_TIMELIMIT_DOWN 40
+#define ED_CTRL_ID_LEVEL_TIMELIMIT_TEXT 41
+#define ED_CTRL_ID_LEVEL_TIMELIMIT_UP 42
+#define ED_CTRL_ID_LEVEL_TIMESCORE_DOWN 43
+#define ED_CTRL_ID_LEVEL_TIMESCORE_TEXT 44
+#define ED_CTRL_ID_LEVEL_TIMESCORE_UP 45
+
+/* drawing area identifiers */
+#define ED_CTRL_ID_DRAWING_LEVEL 46
+#define ED_CTRL_ID_ELEM_CONTENT_0 47
+#define ED_CTRL_ID_ELEM_CONTENT_1 48
+#define ED_CTRL_ID_ELEM_CONTENT_2 49
+#define ED_CTRL_ID_ELEM_CONTENT_3 50
+#define ED_CTRL_ID_ELEM_CONTENT_4 51
+#define ED_CTRL_ID_ELEM_CONTENT_5 52
+#define ED_CTRL_ID_ELEM_CONTENT_6 53
+#define ED_CTRL_ID_ELEM_CONTENT_7 54
+#define ED_CTRL_ID_AMOEBA_CONTENT 55
+
+/* text input identifiers */
+#define ED_CTRL_ID_LEVEL_NAME 56
+#define ED_CTRL_ID_LEVEL_AUTHOR 57
+
+/* gadgets for scrolling of drawing area */
+#define ED_CTRL_ID_SCROLL_UP 58
+#define ED_CTRL_ID_SCROLL_DOWN 59
+#define ED_CTRL_ID_SCROLL_LEFT 60
+#define ED_CTRL_ID_SCROLL_RIGHT 61
+#define ED_CTRL_ID_SCROLL_VERTICAL 62
+#define ED_CTRL_ID_SCROLL_HORIZONTAL 63
+
+/* gadgets for scrolling element list */
+#define ED_CTRL_ID_ELEMENTLIST_UP 64
+#define ED_CTRL_ID_ELEMENTLIST_DOWN 65
+
+/* gadgets for buttons in element list */
+#define ED_CTRL_ID_ELEMENTLIST_FIRST 66
+#define ED_CTRL_ID_ELEMENTLIST_LAST 105
+
+#define ED_NUM_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,
+ ED_CTRL_ID_ELEM_SCORE_DOWN, ED_CTRL_ID_ELEM_SCORE_UP,
+ ED_CTRL_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,
+ ED_CTRL_ID_ELEM_CONTENT_DOWN, ED_CTRL_ID_ELEM_CONTENT_UP,
+ ED_CTRL_ID_ELEM_CONTENT_TEXT,
+ &gadget_elem_content_value,
+ "element content"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(0),
+ MIN_LEV_FIELDX, MAX_LEV_FIELDX,
+ ED_CTRL_ID_LEVEL_XSIZE_DOWN, ED_CTRL_ID_LEVEL_XSIZE_UP,
+ ED_CTRL_ID_LEVEL_XSIZE_TEXT,
+ &gadget_level_xsize_value,
+ "playfield width"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(1),
+ MIN_LEV_FIELDY, MAX_LEV_FIELDY,
+ ED_CTRL_ID_LEVEL_YSIZE_DOWN, ED_CTRL_ID_LEVEL_YSIZE_UP,
+ ED_CTRL_ID_LEVEL_YSIZE_TEXT,
+ &gadget_level_ysize_value,
+ "playfield height"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(2),
+ 0, 100,
+ ED_CTRL_ID_LEVEL_RANDOM_DOWN, ED_CTRL_ID_LEVEL_RANDOM_UP,
+ ED_CTRL_ID_LEVEL_RANDOM_TEXT,
+ &gadget_level_random_value,
+ "number of random elements"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(3),
+ 0, 999,
+ ED_CTRL_ID_LEVEL_COLLECT_DOWN, ED_CTRL_ID_LEVEL_COLLECT_UP,
+ ED_CTRL_ID_LEVEL_COLLECT_TEXT,
+ &gadget_level_collect_value,
+ "number of emeralds to collect"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(4),
+ 0, 999,
+ ED_CTRL_ID_LEVEL_TIMELIMIT_DOWN, ED_CTRL_ID_LEVEL_TIMELIMIT_UP,
+ ED_CTRL_ID_LEVEL_TIMELIMIT_TEXT,
+ &gadget_level_timelimit_value,
+ "time available to solve level"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(5),
+ 0, 255,
+ ED_CTRL_ID_LEVEL_TIMESCORE_DOWN, ED_CTRL_ID_LEVEL_TIMESCORE_UP,
+ ED_CTRL_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),
+ ED_CTRL_ID_LEVEL_NAME,
+ level.name,
+ "Level Title"
+ },
+ {
+ ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(7),
+ ED_CTRL_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,
+ ED_CTRL_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,
+ ED_CTRL_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,
+ ED_CTRL_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,
+ ED_CTRL_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,
+ ED_CTRL_ID_ELEMENTLIST_UP,
+ "scroll element list up"
+ },
+ {
+ ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_ALT_YPOS,
+ ED_ELEMENTLIST_DOWN_XPOS, ED_ELEMENTLIST_DOWN_YPOS,
+ ED_CTRL_ID_ELEMENTLIST_DOWN,
+ "scroll element list down"
+ }
+};