+#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_COLLECT 4
+#define ED_COUNTER_ID_LEVEL_TIMELIMIT 5
+#define ED_COUNTER_ID_LEVEL_TIMESCORE 6
+#define ED_COUNTER_ID_LEVEL_RANDOM 7
+#define ED_COUNTER_ID_SELECT_LEVEL 8
+
+#define ED_NUM_COUNTERBUTTONS 9
+
+#define ED_COUNTER_ID_LEVEL_FIRST ED_COUNTER_ID_LEVEL_XSIZE
+#define ED_COUNTER_ID_LEVEL_LAST ED_COUNTER_ID_LEVEL_RANDOM
+
+/* values for scrollbutton gadgets */
+#define ED_SCROLLBUTTON_ID_AREA_UP 0
+#define ED_SCROLLBUTTON_ID_AREA_DOWN 1
+#define ED_SCROLLBUTTON_ID_AREA_LEFT 2
+#define ED_SCROLLBUTTON_ID_AREA_RIGHT 3
+#define ED_SCROLLBUTTON_ID_LIST_UP 4
+#define ED_SCROLLBUTTON_ID_LIST_DOWN 5
+
+#define ED_NUM_SCROLLBUTTONS 6
+
+#define ED_SCROLLBUTTON_ID_AREA_FIRST ED_SCROLLBUTTON_ID_AREA_UP
+#define ED_SCROLLBUTTON_ID_AREA_LAST ED_SCROLLBUTTON_ID_AREA_RIGHT
+
+/* values for scrollbar gadgets */
+#define ED_SCROLLBAR_ID_AREA_HORIZONTAL 0
+#define ED_SCROLLBAR_ID_AREA_VERTICAL 1
+#define ED_SCROLLBAR_ID_LIST_VERTICAL 2
+
+#define ED_NUM_SCROLLBARS 3
+
+#define ED_SCROLLBAR_ID_AREA_FIRST ED_SCROLLBAR_ID_AREA_HORIZONTAL
+#define ED_SCROLLBAR_ID_AREA_LAST ED_SCROLLBAR_ID_AREA_VERTICAL
+
+/* values for text input gadgets */
+#define ED_TEXTINPUT_ID_LEVEL_NAME 0
+#define ED_TEXTINPUT_ID_LEVEL_AUTHOR 1
+
+#define ED_NUM_TEXTINPUT 2
+
+#define ED_TEXTINPUT_ID_LEVEL_FIRST ED_TEXTINPUT_ID_LEVEL_NAME
+#define ED_TEXTINPUT_ID_LEVEL_LAST ED_TEXTINPUT_ID_LEVEL_AUTHOR
+
+/* 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_NUM_CHECKBUTTONS 5
+
+#define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED
+#define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
+
+/* values for radiobutton gadgets */
+#define ED_RADIOBUTTON_ID_PERCENTAGE 0
+#define ED_RADIOBUTTON_ID_QUANTITY 1
+
+#define ED_NUM_RADIOBUTTONS 2
+
+#define ED_RADIOBUTTON_ID_LEVEL_FIRST ED_RADIOBUTTON_ID_PERCENTAGE
+#define ED_RADIOBUTTON_ID_LEVEL_LAST ED_RADIOBUTTON_ID_QUANTITY
+
+/* 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" }
+};
+
+/* 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 struct
+{
+ int x, y;
+ int min_value, max_value;
+ int gadget_id_down, gadget_id_up;
+ int gadget_id_text;
+ int *value;
+ char *infotext_above, *infotext_right;
+} 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,
+ NULL, /* will be set when used */
+ "element score", NULL
+ },
+ {
+ ED_COUNT_ELEM_CONTENT_XPOS, ED_COUNT_ELEM_CONTENT_YPOS,
+ MIN_ELEMENT_CONTENTS, MAX_ELEMENT_CONTENTS,
+ GADGET_ID_ELEM_CONTENT_DOWN, GADGET_ID_ELEM_CONTENT_UP,
+ GADGET_ID_ELEM_CONTENT_TEXT,
+ &level.num_yam_contents,
+ "element content", NULL
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(2),
+ MIN_LEV_FIELDX, MAX_LEV_FIELDX,
+ GADGET_ID_LEVEL_XSIZE_DOWN, GADGET_ID_LEVEL_XSIZE_UP,
+ GADGET_ID_LEVEL_XSIZE_TEXT,
+ &level.fieldx,
+ "playfield size", "width",
+ },
+ {
+ ED_SETTINGS_XPOS + 2 * DXSIZE, ED_COUNTER_YPOS(2),
+ MIN_LEV_FIELDY, MAX_LEV_FIELDY,
+ GADGET_ID_LEVEL_YSIZE_DOWN, GADGET_ID_LEVEL_YSIZE_UP,
+ GADGET_ID_LEVEL_YSIZE_TEXT,
+ &level.fieldy,
+ NULL, "height",
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(3),
+ 0, 999,
+ GADGET_ID_LEVEL_COLLECT_DOWN, GADGET_ID_LEVEL_COLLECT_UP,
+ GADGET_ID_LEVEL_COLLECT_TEXT,
+ &level.gems_needed,
+ "number of emeralds to collect", NULL
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(4),
+ 0, 999,
+ GADGET_ID_LEVEL_TIMELIMIT_DOWN, GADGET_ID_LEVEL_TIMELIMIT_UP,
+ GADGET_ID_LEVEL_TIMELIMIT_TEXT,
+ &level.time,
+ "time available to solve level", "(0 => no time limit)"
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(5),
+ 0, 255,
+ GADGET_ID_LEVEL_TIMESCORE_DOWN, GADGET_ID_LEVEL_TIMESCORE_UP,
+ GADGET_ID_LEVEL_TIMESCORE_TEXT,
+ &level.score[SC_ZEITBONUS],
+ "score for each 10 seconds left", NULL
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER2_YPOS(8),
+ 1, 100,
+ GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP,
+ GADGET_ID_LEVEL_RANDOM_TEXT,
+ &random_placement_value,
+ "random element placement", "in"
+ },
+ {
+ DX + 5 - SX, DY + 3 - SY,
+ 1, 100,
+ GADGET_ID_SELECT_LEVEL_DOWN, GADGET_ID_SELECT_LEVEL_UP,
+ GADGET_ID_SELECT_LEVEL_TEXT,
+ &level_nr,
+ NULL, NULL
+ }
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ int size;
+ char *value;
+ char *infotext;
+} textinput_info[ED_NUM_TEXTINPUT] =
+{
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(0),
+ GADGET_ID_LEVEL_NAME,
+ MAX_LEVEL_NAME_LEN,
+ level.name,
+ "Title"
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(1),
+ GADGET_ID_LEVEL_AUTHOR,
+ MAX_LEVEL_AUTHOR_LEN,
+ level.author,
+ "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_SCROLLBUTTON2_XPOS, ED_SCROLLBUTTON2_YPOS + 0 * ED_SCROLLBUTTON2_YSIZE,
+ ED_SCROLL2_UP_XPOS, ED_SCROLL2_UP_YPOS,
+ GADGET_ID_SCROLL_LIST_UP,
+ "scroll element list up ('Page Up')"
+ },
+ {
+ ED_SCROLLBUTTON2_XPOS, ED_SCROLLBUTTON2_YPOS + 1 * ED_SCROLLBUTTON2_YSIZE,
+ ED_SCROLL2_DOWN_XPOS, ED_SCROLL2_DOWN_YPOS,
+ GADGET_ID_SCROLL_LIST_DOWN,
+ "scroll element list down ('Page 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,
+ SX + ED_SCROLL_HORIZONTAL_XPOS, SY + 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"
+ },
+ {
+ ED_SCROLLBAR_XPOS, ED_SCROLLBAR_YPOS,
+ SX + ED_SCROLL_VERTICAL_XPOS, SY + 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_SCROLLBAR2_XPOS, ED_SCROLLBAR2_YPOS,
+ DX + ED_SCROLL2_VERTICAL_XPOS, DY + ED_SCROLL2_VERTICAL_YPOS,
+ ED_SCROLL2_VERTICAL_XSIZE, ED_SCROLL2_VERTICAL_YSIZE,
+ GD_TYPE_SCROLLBAR_VERTICAL,
+ GADGET_ID_SCROLL_LIST_VERTICAL,
+ "scroll element list vertically"
+ }
+};