#define ED_NUM_ELEMENTLIST_BUTTONS (ED_ELEMENTLIST_BUTTONS_HORIZ * \
ED_ELEMENTLIST_BUTTONS_VERT)
-/* values for element properties window */
-#define ED_PROPERTIES_XPOS (TILEX - MINI_TILEX/2)
-
-/* values for level information window */
-#define ED_LEVELINFO_XPOS (TILEX - MINI_TILEX/2)
-#define ED_LEVELINFO_YPOS (TILEY - MINI_TILEY/2)
+/* values for the setting windows */
+#define ED_SETTINGS_XPOS (MINI_TILEX + 8)
+#define ED_SETTINGS2_XPOS MINI_TILEX
+#define ED_SETTINGS_YPOS MINI_TILEY
+#define ED_SETTINGS2_YPOS (ED_SETTINGS_YPOS + 12 * TILEY - 2)
/* values for counter gadgets */
-#define ED_COUNT_VALUE_XOFFSET 5
-#define ED_COUNT_VALUE_YOFFSET 3
-#define ED_COUNT_ELEM_SCORE_XPOS ED_PROPERTIES_XPOS
+#define ED_COUNT_ELEM_SCORE_XPOS ED_SETTINGS_XPOS
#define ED_COUNT_ELEM_SCORE_YPOS (14 * MINI_TILEY)
-#define ED_COUNT_ELEM_CONTENT_XPOS ED_PROPERTIES_XPOS
-#define ED_COUNT_ELEM_CONTENT_YPOS (17 * MINI_TILEY)
-#define ED_COUNTER_YSTART (ED_LEVELINFO_YPOS + 3 * TILEY)
+#define ED_COUNT_ELEM_CONTENT_XPOS ED_SETTINGS_XPOS
+#define ED_COUNT_ELEM_CONTENT_YPOS (19 * MINI_TILEY)
+
+#define ED_COUNTER_YSTART (ED_SETTINGS_YPOS + 2 * TILEY)
#define ED_COUNTER_YDISTANCE (3 * MINI_TILEY)
#define ED_COUNTER_YPOS(n) (ED_COUNTER_YSTART + \
n * ED_COUNTER_YDISTANCE)
+#define ED_COUNTER2_YPOS(n) (ED_COUNTER_YSTART + \
+ n * ED_COUNTER_YDISTANCE - 2)
/* standard distances */
#define ED_BORDER_SIZE 3
#define ED_GADGET_DISTANCE 2
/* values for element content drawing areas */
-#define ED_AREA_ELEM_CONTENT_XPOS (TILEX)
-#define ED_AREA_ELEM_CONTENT_YPOS (10 * TILEY)
+#define ED_AREA_ELEM_CONTENT_XPOS ( 2 * MINI_TILEX)
+#define ED_AREA_ELEM_CONTENT_YPOS (22 * 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)
/* values for scrolling gadgets */
#define ED_SCROLLBUTTON_XPOS 24
#define ED_CHECKBUTTON_XSIZE ED_BUTTON_COUNT_XSIZE
#define ED_CHECKBUTTON_YSIZE ED_BUTTON_COUNT_YSIZE
#define ED_CHECKBUTTON_UNCHECKED_XPOS ED_BUTTON_MINUS_XPOS
-#define ED_CHECKBUTTON_UNCHECKED_YPOS ED_BUTTON_MINUS_YPOS
#define ED_CHECKBUTTON_CHECKED_XPOS ED_BUTTON_PLUS_XPOS
-#define ED_CHECKBUTTON_CHECKED_YPOS ED_BUTTON_PLUS_YPOS
+#define ED_CHECKBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 22)
+#define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 88)
-/* control button identifiers */
#define GADGET_ID_NONE -1
+/* drawing toolbox buttons */
#define GADGET_ID_SINGLE_ITEMS 0
#define GADGET_ID_CONNECTED_ITEMS 1
#define GADGET_ID_LINE 2
#define GADGET_ID_ELEMENTLIST_FIRST 66
#define GADGET_ID_ELEMENTLIST_LAST 105
-/* checkbuttons for level settings */
+/* buttons for level settings */
#define GADGET_ID_RANDOM_PERCENTAGE 106
#define GADGET_ID_RANDOM_QUANTITY 107
+#define GADGET_ID_RANDOM_RESTRICTED 108
+#define GADGET_ID_DOUBLE_SPEED 109
+#define GADGET_ID_STICK_ELEMENT 110
-#define NUM_EDITOR_GADGETS 108
+/* another drawing area for random placement */
+#define GADGET_ID_RANDOM_BACKGROUND 111
+
+#define NUM_EDITOR_GADGETS 112
/* radio button numbers */
#define RADIO_NR_NONE 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
+#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_NUM_COUNTERBUTTONS 8
+#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_AREA_UP 0
-#define ED_SCROLLBUTTON_AREA_DOWN 1
-#define ED_SCROLLBUTTON_AREA_LEFT 2
-#define ED_SCROLLBUTTON_AREA_RIGHT 3
-#define ED_SCROLLBUTTON_LIST_UP 4
-#define ED_SCROLLBUTTON_LIST_DOWN 5
+#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
/* values for scrollbar gadgets */
-#define ED_SCROLLBAR_HORIZONTAL 0
-#define ED_SCROLLBAR_VERTICAL 1
+#define ED_SCROLLBAR_ID_HORIZONTAL 0
+#define ED_SCROLLBAR_ID_VERTICAL 1
#define ED_NUM_SCROLLBARS 2
#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_PERCENTAGE 0
-#define ED_CHECKBUTTON_QUANTITY 1
+#define ED_CHECKBUTTON_ID_DOUBLE_SPEED 0
+#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 1
+#define ED_CHECKBUTTON_ID_STICK_ELEMENT 2
+
+#define ED_NUM_CHECKBUTTONS 3
+
+#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_NUM_CHECKBUTTONS 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
int gadget_id_down, gadget_id_up;
int gadget_id_text;
int **counter_value;
- char *infotext;
+ char *infotext_above, *infotext_right;
} counterbutton_info[ED_NUM_COUNTERBUTTONS] =
{
{
GADGET_ID_ELEM_SCORE_DOWN, GADGET_ID_ELEM_SCORE_UP,
GADGET_ID_ELEM_SCORE_TEXT,
&gadget_elem_score_value,
- "element score"
+ "element score", NULL
},
{
ED_COUNT_ELEM_CONTENT_XPOS, ED_COUNT_ELEM_CONTENT_YPOS,
GADGET_ID_ELEM_CONTENT_DOWN, GADGET_ID_ELEM_CONTENT_UP,
GADGET_ID_ELEM_CONTENT_TEXT,
&gadget_elem_content_value,
- "element content"
+ "element content", NULL
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(0),
+ 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,
&gadget_level_xsize_value,
- "playfield width"
+ "playfield size", "width",
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(1),
+ 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,
&gadget_level_ysize_value,
- "playfield height"
+ NULL, "height",
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(2),
- 1, 100,
- GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP,
- GADGET_ID_LEVEL_RANDOM_TEXT,
- &gadget_level_random_value,
- "random elements"
- },
- {
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(3),
+ ED_SETTINGS_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"
+ "number of emeralds to collect", NULL
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(4),
+ ED_SETTINGS_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"
+ "time available to solve level", "(0 => no time limit)"
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(5),
+ ED_SETTINGS_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"
+ "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,
+ &gadget_level_random_value,
+ "random element placement", "in"
}
};
{
int x, y;
int gadget_id;
+ int size;
char *value;
char *infotext;
} textinput_info[ED_NUM_TEXTINPUT] =
{
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(6),
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(0),
GADGET_ID_LEVEL_NAME,
+ MAX_LEVEL_NAME_LEN,
level.name,
- "Level Title"
+ "Title"
},
{
- ED_LEVELINFO_XPOS, ED_COUNTER_YPOS(7),
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(1),
GADGET_ID_LEVEL_AUTHOR,
+ MAX_LEVEL_AUTHOR_LEN,
level.author,
- "Level Author"
+ "Author"
}
};
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"
+ "scroll element list up ('Page 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"
+ "scroll element list down ('Page Down')"
}
};
static int random_placement_value = 10;
static int random_placement_method = RANDOM_USE_QUANTITY;
+static int random_placement_background_element = EL_ERDREICH;
+static boolean random_placement_background_restricted = FALSE;
+static boolean stick_element_properties_window = FALSE;
static struct
{
int *value;
int checked_value;
char *text, *infotext;
-} checkbutton_info[ED_NUM_CHECKBUTTONS] =
+} radiobutton_info[ED_NUM_RADIOBUTTONS] =
{
{
- ED_LEVELINFO_XPOS + 160, ED_COUNTER_YPOS(2),
+ ED_SETTINGS_XPOS + 160, ED_COUNTER2_YPOS(8),
GADGET_ID_RANDOM_PERCENTAGE,
RADIO_NR_RANDOM_ELEMENTS,
&random_placement_method, RANDOM_USE_PERCENTAGE,
- "percentage", "use percentage for random elements"
+ "percentage", "use percentage for random elements"
},
{
- ED_LEVELINFO_XPOS + 340, ED_COUNTER_YPOS(2),
+ ED_SETTINGS_XPOS + 340, ED_COUNTER2_YPOS(8),
GADGET_ID_RANDOM_QUANTITY,
RADIO_NR_RANDOM_ELEMENTS,
&random_placement_method, RANDOM_USE_QUANTITY,
- "quantity", "use quantity for random elements"
+ "quantity", "use quantity for random elements"
+ }
+};
+
+static struct
+{
+ int x, y;
+ int gadget_id;
+ boolean *value;
+ char *text, *infotext;
+} checkbutton_info[ED_NUM_CHECKBUTTONS] =
+{
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(6) - MINI_TILEY,
+ GADGET_ID_DOUBLE_SPEED,
+ &level.double_speed,
+ "double speed movement", "set movement speed of player"
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER2_YPOS(9) - MINI_TILEY,
+ GADGET_ID_RANDOM_RESTRICTED,
+ &random_placement_background_restricted,
+ "restrict random placement to", "set random placement restriction"
+ },
+ {
+ ED_SETTINGS_XPOS, ED_COUNTER_YPOS(4),
+ GADGET_ID_STICK_ELEMENT,
+ &stick_element_properties_window,
+ "stick window to edit content", "stick window to edit content"
}
};
static int edit_mode;
-static int counter_xsize = DXSIZE + 20;
+static int counter_xsize = DXSIZE + FONT2_XSIZE - 2 * ED_GADGET_DISTANCE;
int element_shift = 0;
EL_INVISIBLE_STEEL,
EL_UNSICHTBAR,
EL_SPEED_PILL,
- EL_LEERRAUM,
+ EL_BLACK_ORB,
EL_CHAR_A + ('S' - 'A'),
EL_CHAR_A + ('O' - 'A'),
EL_LEERRAUM,
EL_LEERRAUM,
- EL_CHAR_AUSRUF,
- EL_CHAR_ZOLL,
- EL_CHAR_DOLLAR,
- EL_CHAR_PROZ,
+ 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('0'),
+ EL_CHAR('1'),
+ EL_CHAR('2'),
+ EL_CHAR('3'),
+
+ EL_CHAR('4'),
+ EL_CHAR('5'),
+ EL_CHAR('6'),
+ EL_CHAR('7'),
+
+ EL_CHAR('8'),
+ EL_CHAR('9'),
+ EL_CHAR(':'),
+ EL_CHAR(';'),
+
+ EL_CHAR('<'),
+ EL_CHAR('='),
+ EL_CHAR('>'),
+ EL_CHAR('?'),
+
+ EL_CHAR('@'),
+ EL_CHAR('A'),
+ EL_CHAR('B'),
+ EL_CHAR('C'),
- EL_CHAR_APOSTR,
- EL_CHAR_KLAMM1,
- EL_CHAR_KLAMM2,
- EL_CHAR_PLUS,
+ EL_CHAR('D'),
+ EL_CHAR('E'),
+ EL_CHAR('F'),
+ EL_CHAR('G'),
- EL_CHAR_KOMMA,
- EL_CHAR_MINUS,
- EL_CHAR_PUNKT,
- EL_CHAR_SLASH,
-
- EL_CHAR_0 + 0,
- EL_CHAR_0 + 1,
- EL_CHAR_0 + 2,
- EL_CHAR_0 + 3,
-
- EL_CHAR_0 + 4,
- EL_CHAR_0 + 5,
- EL_CHAR_0 + 6,
- EL_CHAR_0 + 7,
-
- EL_CHAR_0 + 8,
- EL_CHAR_0 + 9,
- EL_CHAR_DOPPEL,
- EL_CHAR_SEMIKL,
-
- EL_CHAR_LT,
- EL_CHAR_GLEICH,
- EL_CHAR_GT,
- EL_CHAR_FRAGE,
-
- EL_CHAR_AT,
- EL_CHAR_A + 0,
- EL_CHAR_A + 1,
- EL_CHAR_A + 2,
-
- EL_CHAR_A + 3,
- EL_CHAR_A + 4,
- EL_CHAR_A + 5,
- EL_CHAR_A + 6,
-
- EL_CHAR_A + 7,
- EL_CHAR_A + 8,
- EL_CHAR_A + 9,
- EL_CHAR_A + 10,
-
- EL_CHAR_A + 11,
- EL_CHAR_A + 12,
- EL_CHAR_A + 13,
- EL_CHAR_A + 14,
-
- EL_CHAR_A + 15,
- EL_CHAR_A + 16,
- EL_CHAR_A + 17,
- EL_CHAR_A + 18,
-
- EL_CHAR_A + 19,
- EL_CHAR_A + 20,
- EL_CHAR_A + 21,
- EL_CHAR_A + 22,
-
- EL_CHAR_A + 23,
- EL_CHAR_A + 24,
- EL_CHAR_A + 25,
- EL_CHAR_AE,
-
- EL_CHAR_OE,
- EL_CHAR_UE,
- EL_CHAR_COPY,
- EL_LEERRAUM
+ EL_CHAR('H'),
+ EL_CHAR('I'),
+ EL_CHAR('J'),
+ EL_CHAR('K'),
+
+ EL_CHAR('L'),
+ EL_CHAR('M'),
+ EL_CHAR('N'),
+ EL_CHAR('O'),
+
+ EL_CHAR('P'),
+ EL_CHAR('Q'),
+ EL_CHAR('R'),
+ EL_CHAR('S'),
+
+ EL_CHAR('T'),
+ EL_CHAR('U'),
+ EL_CHAR('V'),
+ EL_CHAR('W'),
+
+ EL_CHAR('X'),
+ EL_CHAR('Y'),
+ EL_CHAR('Z'),
+ EL_CHAR('Ä'),
+
+ EL_CHAR('Ö'),
+ EL_CHAR('Ü'),
+ EL_CHAR('^'),
+ EL_CHAR(' ')
};
int elements_in_list = sizeof(editor_element)/sizeof(int);
deco_ypos = (ED_ELEMENTLIST_YSIZE - MINI_TILEY) / 2;
gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_INFO_TEXT, "choose element",
+ GDI_INFO_TEXT, element_info[editor_element[i]],
GDI_X, DX + gd_xoffset,
GDI_Y, DY + gd_yoffset,
GDI_WIDTH, ED_ELEMENTLIST_XSIZE,
level_editor_gadget[id] = gi;
}
- /* ... and one for the amoeba content */
+ /* ... one for the amoeba content */
id = GADGET_ID_AMOEBA_CONTENT;
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_X, SX + ED_AREA_ELEM_CONTENT_XPOS,
Error(ERR_EXIT, "cannot create gadget");
level_editor_gadget[id] = gi;
+
+ /* ... and one for random placement background restrictions */
+
+ id = GADGET_ID_RANDOM_BACKGROUND;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, SX + ED_AREA_RANDOM_BACKGROUND_XPOS,
+ GDI_Y, SY + ED_AREA_RANDOM_BACKGROUND_YPOS,
+ GDI_WIDTH, MINI_TILEX,
+ GDI_HEIGHT, MINI_TILEY,
+ GDI_TYPE, GD_TYPE_DRAWING_AREA,
+ GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_INFO, HandleDrawingAreaInfo,
+ GDI_CALLBACK_ACTION, HandleDrawingAreas,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
}
static void CreateTextInputGadgets()
GDI_Y, SY + textinput_info[i].y,
GDI_TYPE, GD_TYPE_TEXTINPUT_ALPHANUMERIC,
GDI_TEXT_VALUE, textinput_info[i].value,
- GDI_TEXT_SIZE, 30,
+ GDI_TEXT_SIZE, textinput_info[i].size,
GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x, gd_y,
GDI_DESIGN_PRESSED, gd_pixmap, gd_x, gd_y,
GDI_DESIGN_BORDER, ED_BORDER_SIZE,
static void CreateCheckbuttonGadgets()
{
+ Pixmap gd_pixmap = pix[PIX_DOOR];
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+ int gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
+ boolean checked;
int i;
- /* create toolbox buttons */
- for (i=0; i<ED_NUM_CHECKBUTTONS; i++)
- {
- Pixmap gd_pixmap = pix[PIX_DOOR];
- struct GadgetInfo *gi;
- unsigned long event_mask;
- int gd_x1, gd_x2, gd_x3, gd_x4, gd_y1, gd_y2;
- int button_type;
- boolean checked;
- int id = checkbutton_info[i].gadget_id;
+ event_mask = GD_EVENT_PRESSED;
- event_mask = GD_EVENT_PRESSED;
+ gd_x1 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_UNCHECKED_XPOS;
+ gd_x2 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_UNCHECKED_XPOS;
+ gd_x3 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_CHECKED_XPOS;
+ gd_x4 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_CHECKED_XPOS;
+ gd_y = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_YPOS;
+
+ for (i=0; i<ED_NUM_RADIOBUTTONS; i++)
+ {
+ int id = radiobutton_info[i].gadget_id;
- button_type = (checkbutton_info[i].radio_button_nr == RADIO_NR_NONE ?
- GD_TYPE_CHECK_BUTTON : GD_TYPE_RADIO_BUTTON);
checked =
- (*checkbutton_info[i].value == checkbutton_info[i].checked_value);
+ (*radiobutton_info[i].value == radiobutton_info[i].checked_value);
- gd_x1 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_UNCHECKED_XPOS;
- gd_x2 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_UNCHECKED_XPOS;
- gd_x3 = DOOR_GFX_PAGEX4 + ED_CHECKBUTTON_CHECKED_XPOS;
- gd_x4 = DOOR_GFX_PAGEX3 + ED_CHECKBUTTON_CHECKED_XPOS;
- gd_y1 = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_UNCHECKED_YPOS;
- gd_y2 = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_CHECKED_YPOS;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_INFO_TEXT, radiobutton_info[i].infotext,
+ GDI_X, SX + radiobutton_info[i].x,
+ GDI_Y, SY + radiobutton_info[i].y,
+ GDI_WIDTH, ED_CHECKBUTTON_XSIZE,
+ GDI_HEIGHT, ED_CHECKBUTTON_YSIZE,
+ GDI_TYPE, GD_TYPE_RADIO_BUTTON,
+ GDI_RADIO_NR, radiobutton_info[i].radio_button_nr,
+ GDI_CHECKED, checked,
+ GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
+ GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y,
+ GDI_ALT_DESIGN_UNPRESSED, gd_pixmap, gd_x3, gd_y,
+ GDI_ALT_DESIGN_PRESSED, gd_pixmap, gd_x4, gd_y,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_ACTION, HandleControlButtons,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ }
+
+ for (i=0; i<ED_NUM_CHECKBUTTONS; i++)
+ {
+ int id = checkbutton_info[i].gadget_id;
+
+ if (id == GADGET_ID_STICK_ELEMENT)
+ gd_y = DOOR_GFX_PAGEY1 + ED_STICKYBUTTON_YPOS;
+ else
+ gd_y = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_YPOS;
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_INFO_TEXT, checkbutton_info[i].infotext,
GDI_Y, SY + checkbutton_info[i].y,
GDI_WIDTH, ED_CHECKBUTTON_XSIZE,
GDI_HEIGHT, ED_CHECKBUTTON_YSIZE,
- GDI_TYPE, button_type,
- GDI_RADIO_NR, checkbutton_info[i].radio_button_nr,
- GDI_CHECKED, checked,
- GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y1,
- GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y1,
- GDI_ALT_DESIGN_UNPRESSED, gd_pixmap, gd_x3, gd_y2,
- GDI_ALT_DESIGN_PRESSED, gd_pixmap, gd_x4, gd_y2,
+ GDI_TYPE, GD_TYPE_CHECK_BUTTON,
+ GDI_CHECKED, *checkbutton_info[i].value,
+ GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y,
+ GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y,
+ GDI_ALT_DESIGN_UNPRESSED, gd_pixmap, gd_x3, gd_y,
+ GDI_ALT_DESIGN_PRESSED, gd_pixmap, gd_x4, gd_y,
GDI_EVENT_MASK, event_mask,
GDI_CALLBACK_ACTION, HandleControlButtons,
GDI_END);
MapGadget(level_editor_gadget[textinput_info[id].gadget_id]);
}
+static void MapRadiobuttonGadget(int id)
+{
+ MapGadget(level_editor_gadget[radiobutton_info[id].gadget_id]);
+}
+
static void MapCheckbuttonGadget(int id)
{
MapGadget(level_editor_gadget[checkbutton_info[id].gadget_id]);
for (i=0; i<ED_NUM_SCROLLBUTTONS; i++)
{
- if (((i == ED_SCROLLBUTTON_AREA_LEFT || i == ED_SCROLLBUTTON_AREA_RIGHT) &&
+ if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT ||
+ i == ED_SCROLLBUTTON_ID_AREA_RIGHT) &&
no_horizontal_scrollbar) ||
- ((i == ED_SCROLLBUTTON_AREA_UP || i == ED_SCROLLBUTTON_AREA_DOWN) &&
+ ((i == ED_SCROLLBUTTON_ID_AREA_UP ||
+ i == ED_SCROLLBUTTON_ID_AREA_DOWN) &&
no_vertical_scrollbar))
continue;
for (i=0; i<ED_NUM_SCROLLBARS; i++)
{
- if ((i == ED_SCROLLBAR_HORIZONTAL && no_horizontal_scrollbar) ||
- (i == ED_SCROLLBAR_VERTICAL && no_vertical_scrollbar))
+ if ((i == ED_SCROLLBAR_ID_HORIZONTAL && no_horizontal_scrollbar) ||
+ (i == ED_SCROLLBAR_ID_VERTICAL && no_vertical_scrollbar))
continue;
MapGadget(level_editor_gadget[scrollbar_info[i].gadget_id]);
xoffset = (ed_fieldx == MAX_ED_FIELDX ? ED_SCROLLBUTTON_XSIZE : 0);
yoffset = (ed_fieldy == MAX_ED_FIELDY ? ED_SCROLLBUTTON_YSIZE : 0);
- x = SX + scrollbutton_info[ED_SCROLLBUTTON_AREA_RIGHT].x + xoffset;
- y = SX + scrollbutton_info[ED_SCROLLBUTTON_AREA_DOWN].y + yoffset;
+ x = SX + scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_RIGHT].x + xoffset;
+ y = SX + scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_DOWN].y + yoffset;
ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_RIGHT], GDI_X, x, GDI_END);
ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_DOWN], GDI_Y, y, GDI_END);
- width = scrollbar_info[ED_SCROLLBAR_HORIZONTAL].width + xoffset;
- height = scrollbar_info[ED_SCROLLBAR_VERTICAL].height + yoffset;
+ width = scrollbar_info[ED_SCROLLBAR_ID_HORIZONTAL].width + xoffset;
+ height = scrollbar_info[ED_SCROLLBAR_ID_VERTICAL].height + yoffset;
ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL],
GDI_WIDTH, width,
redraw_mask |= REDRAW_DOOR_1;
}
-static void DrawCounterValueField(int counter_id, int value)
-{
- int x = SX + counterbutton_info[counter_id].x + ED_WIN_COUNT_XPOS;
- int y = SY + counterbutton_info[counter_id].y;
-
- XCopyArea(display, pix[PIX_DOOR], drawto, gc,
- DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS,
- DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS,
- ED_WIN_COUNT_XSIZE, ED_WIN_COUNT_YSIZE,
- x, y);
-
- DrawText(x + ED_COUNT_VALUE_XOFFSET, y + ED_COUNT_VALUE_YOFFSET,
- int2str(value, 3), FS_SMALL, FC_YELLOW);
-}
-
static void DrawDrawingWindow()
{
ClearWindow();
MapMainDrawingArea();
}
+static void DrawRandomPlacementBackgroundArea()
+{
+ int area_x = ED_AREA_RANDOM_BACKGROUND_XPOS / MINI_TILEX;
+ int area_y = ED_AREA_RANDOM_BACKGROUND_YPOS / MINI_TILEY;
+ int area_sx = SX + ED_AREA_RANDOM_BACKGROUND_XPOS;
+ int area_sy = SY + ED_AREA_RANDOM_BACKGROUND_YPOS;
+ int x, y;
+
+ ElementContent[0][0][0] = random_placement_background_element;
+
+ /* 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);
+
+ XFillRectangle(display, drawto, gc,
+ area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1,
+ MINI_TILEX + 2, MINI_TILEY + 2);
+
+ /* copy border to the right location */
+ XCopyArea(display, drawto, drawto, gc,
+ area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY,
+ area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+ DrawMiniElement(area_x, area_y, ElementContent[0][0][0]);
+
+ MapDrawingArea(GADGET_ID_RANDOM_BACKGROUND);
+}
+
static void DrawLevelInfoWindow()
{
char infotext[1024];
- int infotext_yoffset = MINI_TILEX + ED_GADGET_DISTANCE;
- int infotext_yoffset2 = ED_BORDER_SIZE;
+ int xoffset_above = 0;
+ int yoffset_above = -(MINI_TILEX + ED_GADGET_DISTANCE);
+ int xoffset_right = counter_xsize;
+ int yoffset_right = ED_BORDER_SIZE;
+ int xoffset_right2 = ED_CHECKBUTTON_XSIZE + 2 * ED_GADGET_DISTANCE;
+ int yoffset_right2 = ED_BORDER_SIZE;
+ int font_color = FC_GREEN;
int i, x, y;
ClearWindow();
UnmapLevelEditorWindowGadgets();
- DrawTextF(ED_LEVELINFO_XPOS, ED_LEVELINFO_YPOS, FC_YELLOW,
- "Level Information");
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS_YPOS,
+ "Level Settings", FS_BIG, FC_YELLOW);
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
+ "Editor Settings", FS_BIG, FC_YELLOW);
gadget_level_xsize_value = &lev_fieldx;
gadget_level_ysize_value = &lev_fieldy;
gadget_level_timescore_value = &level.score[10];
/* draw counter gadgets */
- for (i=ED_COUNTER_ID_LEVEL_XSIZE; i<=ED_COUNTER_ID_LEVEL_TIMESCORE; i++)
+ for (i=ED_COUNTER_ID_LEVEL_FIRST; i<=ED_COUNTER_ID_LEVEL_LAST; i++)
{
- x = counterbutton_info[i].x;
- y = counterbutton_info[i].y - infotext_yoffset;
+ if (counterbutton_info[i].infotext_above)
+ {
+ x = counterbutton_info[i].x + xoffset_above;
+ y = counterbutton_info[i].y + yoffset_above;
- sprintf(infotext, "%s:", counterbutton_info[i].infotext);
- infotext[MAX_INFOTEXT_LEN] = '\0';
+ sprintf(infotext, "%s:", counterbutton_info[i].infotext_above);
+ infotext[MAX_INFOTEXT_LEN] = '\0';
+ DrawTextF(x, y, font_color, infotext);
+ }
+
+ if (counterbutton_info[i].infotext_right)
+ {
+ x = counterbutton_info[i].x + xoffset_right;
+ y = counterbutton_info[i].y + yoffset_right;
+
+ sprintf(infotext, "%s", counterbutton_info[i].infotext_right);
+ infotext[MAX_INFOTEXT_LEN] = '\0';
+ DrawTextF(x, y, font_color, infotext);
+ }
- DrawTextF(x, y, FC_YELLOW, infotext);
ModifyEditorCounter(i, **counterbutton_info[i].counter_value);
MapCounterButtons(i);
}
/* draw text input gadgets */
- for (i=ED_TEXTINPUT_ID_LEVEL_NAME; i<=ED_TEXTINPUT_ID_LEVEL_AUTHOR; i++)
+ for (i=ED_TEXTINPUT_ID_LEVEL_FIRST; i<=ED_TEXTINPUT_ID_LEVEL_LAST; i++)
{
- x = textinput_info[i].x;
- y = textinput_info[i].y - infotext_yoffset;
+ x = textinput_info[i].x + xoffset_above;
+ y = textinput_info[i].y + yoffset_above;
sprintf(infotext, "%s:", textinput_info[i].infotext);
infotext[MAX_INFOTEXT_LEN] = '\0';
- DrawTextF(x, y, FC_YELLOW, infotext);
+ DrawTextF(x, y, font_color, infotext);
ModifyEditorTextInput(i, textinput_info[i].value);
MapTextInputGadget(i);
}
- x = counterbutton_info[ED_COUNTER_ID_LEVEL_RANDOM].x + counter_xsize;
- y = counterbutton_info[ED_COUNTER_ID_LEVEL_RANDOM].y + infotext_yoffset2;
+ /* draw radiobutton gadgets */
+ for (i=ED_RADIOBUTTON_ID_LEVEL_FIRST; i<=ED_RADIOBUTTON_ID_LEVEL_LAST; i++)
+ {
+ boolean checked =
+ (*radiobutton_info[i].value == radiobutton_info[i].checked_value);
+
+ x = radiobutton_info[i].x + xoffset_right2;
+ y = radiobutton_info[i].y + yoffset_right2;
- DrawTextF(x, y, FC_YELLOW, "in");
+ DrawTextF(x, y, font_color, radiobutton_info[i].text);
+ ModifyGadget(level_editor_gadget[radiobutton_info[i].gadget_id],
+ GDI_CHECKED, checked, GDI_END);
+ MapRadiobuttonGadget(i);
+ }
/* draw checkbutton gadgets */
- for (i=0; i<ED_NUM_CHECKBUTTONS; i++)
+ for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i<=ED_CHECKBUTTON_ID_LEVEL_LAST; i++)
{
- boolean checked =
- (*checkbutton_info[i].value == checkbutton_info[i].checked_value);
-
- x = checkbutton_info[i].x + ED_CHECKBUTTON_XSIZE + ED_GADGET_DISTANCE;
- y = checkbutton_info[i].y + infotext_yoffset2;
+ x = checkbutton_info[i].x + xoffset_right2;
+ y = checkbutton_info[i].y + yoffset_right2;
- DrawTextF(x, y, FC_YELLOW, checkbutton_info[i].text);
+ DrawTextF(x, y, font_color, checkbutton_info[i].text);
ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
- GDI_CHECKED, checked, GDI_END);
+ GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
MapCheckbuttonGadget(i);
}
+
+ /* draw drawing area */
+ DrawRandomPlacementBackgroundArea();
+}
+
+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.amoebe_inhalt;
+
+ /* 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);
+
+ XFillRectangle(display, drawto, gc,
+ area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1,
+ MINI_TILEX + 2, MINI_TILEY + 2);
+
+ /* copy border to the right location */
+ XCopyArea(display, drawto, drawto, gc,
+ area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY,
+ area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+ DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba",
+ FS_SMALL, font_color);
+
+ DrawMiniElement(area_x, area_y, ElementContent[0][0][0]);
+
+ MapDrawingArea(GADGET_ID_AMOEBA_CONTENT);
}
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 yoffset_right = ED_BORDER_SIZE;
+ int font_color = FC_GREEN;
int i, x, y;
for (i=0; i<MAX_ELEM_CONTENT; i++)
/* display counter to choose number of element content areas */
gadget_elem_content_value = num_areas;
- DrawCounterValueField(ED_COUNTER_ID_ELEM_CONTENT,*gadget_elem_content_value);
- x = counterbutton_info[ED_COUNTER_ID_ELEM_CONTENT].x + counter_xsize;
- y = counterbutton_info[ED_COUNTER_ID_ELEM_CONTENT].y;
- DrawTextF(x + ED_COUNT_VALUE_XOFFSET, y + ED_COUNT_VALUE_YOFFSET,
- FC_YELLOW, "number of content areas");
+
+ x = counterbutton_info[ED_COUNTER_ID_ELEM_CONTENT].x + xoffset_right;
+ y = counterbutton_info[ED_COUNTER_ID_ELEM_CONTENT].y + yoffset_right;
+ DrawTextF(x, y, font_color, "number of content areas");
ModifyEditorCounter(ED_COUNTER_ID_ELEM_CONTENT, *gadget_elem_content_value);
MapCounterButtons(ED_COUNTER_ID_ELEM_CONTENT);
/* copy border to the right location */
XCopyArea(display, drawto, drawto, gc,
- area_sx, area_sy, (5 * 4 + 1) * MINI_TILEX, 12 * MINI_TILEY,
+ area_sx, area_sy, (5 * 4 + 1) * MINI_TILEX, 11 * MINI_TILEY,
area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 0 * MINI_TILEY + 1,
- "Content", FS_SMALL, FC_YELLOW);
+ "Content", FS_SMALL, font_color);
DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 1 * MINI_TILEY + 1,
- "when", FS_SMALL, FC_YELLOW);
+ "when", FS_SMALL, font_color);
DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 2 * MINI_TILEY + 1,
- "smashed", FS_SMALL, FC_YELLOW);
+ "smashed", FS_SMALL, font_color);
for (i=0; i<*num_areas; i++)
{
DrawTextF(area_sx - SX + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
area_sy - SY + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
- FC_YELLOW, "%d", i + 1);
+ font_color, "%d", i + 1);
}
for (i=0; i<*num_areas; i++)
MapDrawingArea(GADGET_ID_ELEM_CONTENT_0 + i);
}
-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 x, y;
-
- ElementContent[0][0][0] = level.amoebe_inhalt;
-
- /* 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);
-
- XFillRectangle(display, drawto, gc,
- area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1,
- MINI_TILEX + 2, MINI_TILEY + 2);
-
- /* copy border to the right location */
- XCopyArea(display, drawto, drawto, gc,
- area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY,
- area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
-
- DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba",
- FS_SMALL, FC_YELLOW);
-
- DrawMiniElement(area_x, area_y, ElementContent[0][0][0]);
-
- MapDrawingArea(GADGET_ID_AMOEBA_CONTENT);
-}
-
#define TEXT_COLLECTING "Score for collecting"
#define TEXT_SMASHING "Score for smashing"
#define TEXT_CRACKING "Score for cracking"
static void DrawPropertiesWindow()
{
- int i, x, y;
int num_elements_in_level;
float percentage;
+ int xoffset_right = counter_xsize;
+ int yoffset_right = ED_BORDER_SIZE;
+ int xoffset_right2 = ED_CHECKBUTTON_XSIZE + 2 * ED_GADGET_DISTANCE;
+ int yoffset_right2 = ED_BORDER_SIZE;
+ int xstart = 2;
+ int ystart = 4;
+ int font_color = FC_GREEN;
+ int i, x, y;
static struct
{
int element;
ClearWindow();
UnmapLevelEditorWindowGadgets();
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS_YPOS,
+ "Element Settings", FS_BIG, FC_YELLOW);
+
/* draw some decorative border for the object */
for (y=0; y<3; y++)
for (x=0; x<3; x++)
- DrawMiniElement(2 + x , 2 + y, EL_ERDREICH);
+ DrawMiniElement(xstart + x , ystart + y, EL_ERDREICH);
XFillRectangle(display, drawto, gc,
- SX + TILEX + MINI_TILEX/2 - 1,
- SY + TILEY + MINI_TILEY/2 - 1,
+ SX + xstart * MINI_TILEX + MINI_TILEX/2 - 1,
+ SY + ystart * MINI_TILEY + MINI_TILEY/2 - 1,
TILEX + 2, TILEY + 2);
/* copy border to the right location */
XCopyArea(display, drawto, drawto, gc,
- SX + TILEX, SY + TILEY,
+ SX + xstart * MINI_TILEX,
+ SY + ystart * MINI_TILEY,
2 * TILEX, 2 * TILEY,
- SX + TILEX - MINI_TILEX/2, SY + TILEY - MINI_TILEY/2);
+ SX + xstart * MINI_TILEX - MINI_TILEX/2,
+ SY + ystart * MINI_TILEY - MINI_TILEY/2);
- DrawGraphic(1, 1, el2gfx(properties_element));
- DrawText(SX + 3*TILEX, SY + 5*TILEY/4, "Element Properties",
- FS_SMALL, FC_YELLOW);
+ DrawGraphic(xstart/2, ystart/2, el2gfx(properties_element));
+
+ /* copy the whole stuff to the definitive location */
+ XCopyArea(display, drawto, drawto, gc,
+ SX + xstart * MINI_TILEX - MINI_TILEX/2,
+ SY + ystart * MINI_TILEY - MINI_TILEY,
+ 2 * TILEX, 2 * TILEY,
+ SX + xstart * MINI_TILEX - MINI_TILEX/2,
+ SY + ystart * MINI_TILEY - MINI_TILEY/2);
+
+ DrawTextF((xstart + 3) * MINI_TILEX, (ystart + 1) * MINI_TILEY,
+ font_color, element_info[properties_element]);
num_elements_in_level = 0;
for (y=0; y<lev_fieldy; y++)
num_elements_in_level++;
percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy);
- DrawTextF(ED_PROPERTIES_XPOS, 5*TILEY, FC_YELLOW,
- "%d x contained in level (%.2f %%)",
- num_elements_in_level, percentage);
+ DrawTextF(ED_SETTINGS_XPOS, 5 * TILEY, font_color, "In this level:");
+ DrawTextF(ED_SETTINGS_XPOS + 15 * FONT2_XSIZE, 5 * TILEY, FC_YELLOW,
+ "%d (%.2f%%)", num_elements_in_level, percentage);
/* check if there are elements where a score can be chosen for */
for (i=0; elements_with_counter[i].element != -1; i++)
{
if (elements_with_counter[i].element == properties_element)
{
- int x = counterbutton_info[ED_COUNTER_ID_ELEM_SCORE].x + counter_xsize;
- int y = counterbutton_info[ED_COUNTER_ID_ELEM_SCORE].y;
+ int x = counterbutton_info[ED_COUNTER_ID_ELEM_SCORE].x + xoffset_right;
+ int y = counterbutton_info[ED_COUNTER_ID_ELEM_SCORE].y + yoffset_right;
gadget_elem_score_value = elements_with_counter[i].counter_value;
- /*
- DrawCounterValueField(ED_COUNTER_ID_SCORE, *gadget_score_value);
- */
-
- DrawTextF(x + ED_COUNT_VALUE_XOFFSET, y + ED_COUNT_VALUE_YOFFSET,
- FC_YELLOW, elements_with_counter[i].text);
+ DrawTextF(x, y, font_color, elements_with_counter[i].text);
ModifyEditorCounter(ED_COUNTER_ID_ELEM_SCORE, *gadget_elem_score_value);
MapCounterButtons(ED_COUNTER_ID_ELEM_SCORE);
break;
if (HAS_CONTENT(properties_element))
{
+
+#if 1
+ /* draw stickybutton gadget */
+ i = ED_CHECKBUTTON_ID_STICK_ELEMENT;
+ x = checkbutton_info[i].x + xoffset_right2;
+ y = checkbutton_info[i].y + yoffset_right2;
+
+ DrawTextF(x, y, font_color, checkbutton_info[i].text);
+ ModifyGadget(level_editor_gadget[checkbutton_info[i].gadget_id],
+ GDI_CHECKED, *checkbutton_info[i].value, GDI_END);
+ MapCheckbuttonGadget(i);
+#endif
+
+
if (IS_AMOEBOID(properties_element))
DrawAmoebaContentArea();
else
}
/* values for DrawLevelText() modes */
-#define TEXT_INIT 0
-#define TEXT_SETCURSOR 1
-#define TEXT_WRITECHAR 2
-#define TEXT_BACKSPACE 3
-#define TEXT_NEWLINE 4
-#define TEXT_END 5
+#define TEXT_INIT 0
+#define TEXT_SETCURSOR 1
+#define TEXT_WRITECHAR 2
+#define TEXT_BACKSPACE 3
+#define TEXT_NEWLINE 4
+#define TEXT_END 5
+#define TEXT_QUERY_TYPING 6
-static void DrawLevelText(int sx, int sy, char letter, int mode)
+static int DrawLevelText(int sx, int sy, char letter, int mode)
{
static short delete_buffer[MAX_LEV_FIELDX];
static int start_sx, start_sy;
static int last_sx, last_sy;
static boolean typing = FALSE;
int letter_element = EL_CHAR_ASCII0 + letter;
- int lx, ly;
+ int lx = 0, ly = 0;
/* map lower case letters to upper case and convert special characters */
if (letter >= 'a' && letter <= 'z')
if (mode != TEXT_INIT)
{
if (!typing)
- return;
+ return FALSE;
if (mode != TEXT_SETCURSOR)
{
if (sx > start_sx)
{
Feld[lx - 1][ly] = delete_buffer[sx - start_sx - 1];
- DrawMiniElement(sx - 1, sy, new_element3);
+ DrawMiniElement(sx - 1, sy, Feld[lx - 1][ly]);
DrawLevelText(sx - 1, sy, 0, TEXT_SETCURSOR);
}
break;
typing = FALSE;
break;
+ case TEXT_QUERY_TYPING:
+ break;
+
default:
break;
}
+
+ return typing;
}
static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy,
{
static boolean accumulated_undo = FALSE;
boolean new_undo_buffer_position = TRUE;
+ int last_border_element;
int x, y;
switch (mode)
for(x=0; x<lev_fieldx; x++)
for(y=0; y<lev_fieldy; y++)
UndoBuffer[undo_buffer_position][x][y] = Feld[x][y];
+
+ /* check if change of border style was forced by drawing operation */
+ last_border_element = BorderElement;
+ SetBorderElement();
+ if (BorderElement != last_border_element)
+ DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+
#if 0
#ifdef DEBUG
printf("level saved to undo buffer\n");
int x, y;
/* determine number of free positions for the new elements */
+ /* (maybe this statement should be formatted a bit more readable...) */
num_free_positions = 0;
for (x=0; x<lev_fieldx; x++)
for (y=0; y<lev_fieldy; y++)
- if ((free_position[x][y] = (Feld[x][y] != new_element)))
+ if ((free_position[x][y] =
+ ((random_placement_background_restricted &&
+ Feld[x][y] == random_placement_background_element) ||
+ (!random_placement_background_restricted &&
+ Feld[x][y] != new_element))) == TRUE)
num_free_positions++;
/* determine number of new elements to place there */
boolean button_release_event;
boolean inside_drawing_area = !gi->event.off_borders;
boolean draw_level = (id == GADGET_ID_DRAWING_LEVEL);
+ int actual_drawing_function;
int button = gi->event.button;
int new_element = BUTTON_ELEMENT(button);
int sx = gi->event.x, sy = gi->event.y;
int min_sx = 0, min_sy = 0;
int max_sx = gi->drawing.area_xsize - 1, max_sy = gi->drawing.area_ysize - 1;
- int lx, ly;
+ int lx = 0, ly = 0;
int min_lx = 0, min_ly = 0;
int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
int x, y;
button = 0;
#endif
-
+#if 0
if (!draw_level && drawing_function != GADGET_ID_SINGLE_ITEMS)
return;
+#endif
- switch (drawing_function)
+ /* automatically switch to 'single item' drawing mode, if needed */
+ actual_drawing_function =
+ (draw_level ? drawing_function : GADGET_ID_SINGLE_ITEMS);
+
+ switch (actual_drawing_function)
{
case GADGET_ID_SINGLE_ITEMS:
if (draw_level)
if (id == GADGET_ID_AMOEBA_CONTENT)
level.amoebe_inhalt = new_element;
+ else if (id == GADGET_ID_RANDOM_BACKGROUND)
+ random_placement_background_element = new_element;
else if (id >= GADGET_ID_ELEM_CONTENT_0 &&
id <= GADGET_ID_ELEM_CONTENT_7)
level.mampfer_inhalt[id - GADGET_ID_ELEM_CONTENT_0][sx][sy] =
{
CopyAreaToBrush(start_sx, start_sy, sx, sy, button);
CopyBrushToCursor(sx, sy);
- ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS]);
+ ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS],MB_LEFT);
draw_with_brush = TRUE;
}
else if (drawing_function == GADGET_ID_TEXT)
break;
case GADGET_ID_PICK_ELEMENT:
+
+ /*
if (button_press_event)
PickDrawingElement(button, Feld[lx][ly]);
+ */
+
if (button_release_event)
- ClickOnGadget(level_editor_gadget[last_drawing_function]);
+ ClickOnGadget(level_editor_gadget[last_drawing_function], MB_LEFT);
+ else
+ PickDrawingElement(button, Feld[lx][ly]);
+
break;
default:
{
int gadget_id = GADGET_ID_ELEMENTLIST_FIRST + i;
struct GadgetInfo *gi = level_editor_gadget[gadget_id];
- struct GadgetDesign *design = &gi->deco.design;
+ struct GadgetDesign *gd = &gi->deco.design;
+ int element = editor_element[element_shift + i];
UnmapGadget(gi);
- getMiniGraphicSource(el2gfx(editor_element[element_shift + i]),
- &design->pixmap, &design->x, &design->y);
+ getMiniGraphicSource(el2gfx(element), &gd->pixmap, &gd->x, &gd->y);
+ ModifyGadget(gi, GDI_INFO_TEXT, element_info[element], GDI_END);
MapGadget(gi);
}
break;
case GADGET_ID_CLEAR:
for(x=0; x<MAX_LEV_FIELDX; x++)
for(y=0; y<MAX_LEV_FIELDY; y++)
- Feld[x][y] = new_element3;
+ Feld[x][y] = (button == 1 ? EL_LEERRAUM : new_element);
CopyLevelToUndoBuffer(GADGET_ID_CLEAR);
DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
break;
case GADGET_ID_RANDOM_PERCENTAGE:
- *checkbutton_info[ED_CHECKBUTTON_PERCENTAGE].value =
- checkbutton_info[ED_CHECKBUTTON_PERCENTAGE].checked_value;
+ *radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].value =
+ radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].checked_value;
break;
case GADGET_ID_RANDOM_QUANTITY:
- *checkbutton_info[ED_CHECKBUTTON_QUANTITY].value =
- checkbutton_info[ED_CHECKBUTTON_QUANTITY].checked_value;
+ *radiobutton_info[ED_RADIOBUTTON_ID_QUANTITY].value =
+ radiobutton_info[ED_RADIOBUTTON_ID_QUANTITY].checked_value;
+ break;
+
+ case GADGET_ID_RANDOM_RESTRICTED:
+ *checkbutton_info[ED_CHECKBUTTON_ID_RANDOM_RESTRICTED].value ^= TRUE;
+ break;
+
+ case GADGET_ID_DOUBLE_SPEED:
+ *checkbutton_info[ED_CHECKBUTTON_ID_DOUBLE_SPEED].value ^= TRUE;
+ break;
+
+ case GADGET_ID_STICK_ELEMENT:
+ *checkbutton_info[ED_CHECKBUTTON_ID_STICK_ELEMENT].value ^= TRUE;
break;
default:
PickDrawingElement(button, new_element);
- if (!HAS_CONTENT(properties_element))
+ if (!HAS_CONTENT(properties_element) ||
+ !stick_element_properties_window)
{
properties_element = new_element;
if (edit_mode == ED_MODE_PROPERTIES)
DrawPropertiesWindow();
}
+
+ if (drawing_function == GADGET_ID_PICK_ELEMENT)
+ ClickOnGadget(level_editor_gadget[last_drawing_function], MB_LEFT);
}
#ifdef DEBUG
else if (gi->event.type == GD_EVENT_PRESSED)
void HandleLevelEditorKeyInput(KeySym key)
{
- if (edit_mode == ED_MODE_DRAWING)
+ char letter = getCharFromKeySym(key);
+ int button = MB_LEFT;
+
+ if (drawing_function == GADGET_ID_TEXT &&
+ DrawLevelText(0, 0, 0, TEXT_QUERY_TYPING) == TRUE)
+ {
+ if (letter)
+ DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
+ else if (key == XK_Delete || key == XK_BackSpace)
+ DrawLevelText(0, 0, 0, TEXT_BACKSPACE);
+ else if (key == XK_Return)
+ DrawLevelText(0, 0, 0, TEXT_NEWLINE);
+ }
+ else if (button_status == MB_RELEASED)
{
- char letter = getCharFromKeySym(key);
+ int i, id;
- if (drawing_function == GADGET_ID_TEXT)
+ switch (key)
{
- if (letter)
- DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
- else if (key == XK_Delete || key == XK_BackSpace)
- DrawLevelText(0, 0, 0, TEXT_BACKSPACE);
- else if (key == XK_Return)
- DrawLevelText(0, 0, 0, TEXT_NEWLINE);
- }
- else if (button_status == MB_RELEASED)
- {
- int i, id;
-
- switch (key)
- {
- case XK_Left:
- id = GADGET_ID_SCROLL_LEFT;
- break;
- case XK_Right:
- id = GADGET_ID_SCROLL_RIGHT;
- break;
- case XK_Up:
- id = GADGET_ID_SCROLL_UP;
- break;
- case XK_Down:
- id = GADGET_ID_SCROLL_DOWN;
- break;
-
- default:
- id = GADGET_ID_NONE;
- break;
- }
+ case XK_Left:
+ id = GADGET_ID_SCROLL_LEFT;
+ break;
+ case XK_Right:
+ id = GADGET_ID_SCROLL_RIGHT;
+ break;
+ case XK_Up:
+ id = GADGET_ID_SCROLL_UP;
+ break;
+ case XK_Down:
+ id = GADGET_ID_SCROLL_DOWN;
+ break;
+ case XK_Page_Up:
+ id = GADGET_ID_ELEMENTLIST_UP;
+ button = 3;
+ break;
+ case XK_Page_Down:
+ id = GADGET_ID_ELEMENTLIST_DOWN;
+ button = 3;
+ break;
- if (id != GADGET_ID_NONE)
- ClickOnGadget(level_editor_gadget[id]);
- else if (letter == '.')
- ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS]);
- else
- for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
- if (letter && letter == control_info[i].shortcut)
- ClickOnGadget(level_editor_gadget[i]);
+ default:
+ id = GADGET_ID_NONE;
+ break;
}
+
+ if (id != GADGET_ID_NONE)
+ ClickOnGadget(level_editor_gadget[id], button);
+ else if (letter == '.')
+ ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button);
+ else
+ for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
+ if (letter && letter == control_info[i].shortcut)
+ if (!anyTextGadgetActive())
+ ClickOnGadget(level_editor_gadget[i], button);
}
}
int sy = gi->event.y;
int lx = sx + level_xpos;
int ly = sy + level_ypos;
+ int min_sx = 0, min_sy = 0;
+ int max_sx = gi->drawing.area_xsize - 1;
+ int max_sy = gi->drawing.area_ysize - 1;
ClearEditorGadgetInfoText();
+ /* make sure to stay inside drawing area boundaries */
+ sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
+ sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);
+
if (id == GADGET_ID_DRAWING_LEVEL)
{
if (button_status)
{
- int min_sx = 0, min_sy = 0;
- int max_sx = gi->drawing.area_xsize - 1;
- int max_sy = gi->drawing.area_ysize - 1;
int min_lx = 0, min_ly = 0;
int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
- /* make sure to stay inside drawing area boundaries */
- sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
- sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);
-
/* get positions inside level field */
lx = sx + level_xpos;
ly = sy + level_ypos;
break;
}
- DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
- "%s: %d, %d", infotext,
- ABS(lx - start_lx) + 1,
- ABS(ly - start_ly) + 1);
+ if (drawing_function == GADGET_ID_PICK_ELEMENT)
+ DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
+ "%s: %d, %d", infotext, lx, ly);
+ else
+ DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
+ "%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,
+ "%s", element_info[Feld[lx][ly]]);
else
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
"Level position: %d, %d", lx, ly);
else if (id == GADGET_ID_AMOEBA_CONTENT)
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
"Amoeba content");
+ else if (id == GADGET_ID_RANDOM_BACKGROUND)
+ DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
+ "Random placement background");
else
DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW,
- "Cruncher %d content: %d, %d",
+ "Content area %d position: %d, %d",
id - GADGET_ID_ELEM_CONTENT_0 + 1, sx, sy);
}