ED_ELEMENTLIST_BUTTONS_VERT)
/* values for the setting windows */
-#define ED_SETTINGS_XPOS MINI_TILEX
+#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)
+#define ED_SETTINGS2_YPOS (ED_SETTINGS_YPOS + 12 * TILEY - 2)
/* values for counter gadgets */
#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_SETTINGS_XPOS
-#define ED_COUNT_ELEM_CONTENT_YPOS (17 * MINI_TILEY)
+#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 + 22)
#define ED_CHECKBUTTON_CHECKED_XPOS ED_BUTTON_PLUS_XPOS
-#define ED_CHECKBUTTON_CHECKED_YPOS (ED_BUTTON_PLUS_YPOS + 22)
+#define ED_CHECKBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 22)
+#define ED_STICKYBUTTON_YPOS (ED_BUTTON_MINUS_YPOS + 88)
#define GADGET_ID_NONE -1
/* buttons for level settings */
#define GADGET_ID_RANDOM_PERCENTAGE 106
#define GADGET_ID_RANDOM_QUANTITY 107
-#define GADGET_ID_DOUBLE_SPEED 108
+#define GADGET_ID_RANDOM_RESTRICTED 108
+#define GADGET_ID_DOUBLE_SPEED 109
+#define GADGET_ID_STICK_ELEMENT 110
+
+/* another drawing area for random placement */
+#define GADGET_ID_RANDOM_BACKGROUND 111
-#define NUM_EDITOR_GADGETS 109
+#define NUM_EDITOR_GADGETS 112
/* radio button numbers */
#define RADIO_NR_NONE 0
#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
-#define ED_NUM_COUNTERBUTTONS 8
-
/* 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_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
-#define ED_NUM_TEXTINPUT 2
-
/* values for checkbutton gadgets */
-#define ED_CHECKBUTTON_DOUBLE_SPEED 0
+#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_NUM_CHECKBUTTONS 1
+#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_PERCENTAGE 0
-#define ED_RADIOBUTTON_QUANTITY 1
+#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
"score for each 10 seconds left", NULL
},
{
- ED_SETTINGS_XPOS, ED_COUNTER_YPOS(8),
+ ED_SETTINGS_XPOS, ED_COUNTER2_YPOS(8),
1, 100,
GADGET_ID_LEVEL_RANDOM_DOWN, GADGET_ID_LEVEL_RANDOM_UP,
GADGET_ID_LEVEL_RANDOM_TEXT,
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
{
} radiobutton_info[ED_NUM_RADIOBUTTONS] =
{
{
- ED_SETTINGS_XPOS + 160, ED_COUNTER_YPOS(8),
+ 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"
},
{
- ED_SETTINGS_XPOS + 340, ED_COUNTER_YPOS(8),
+ ED_SETTINGS_XPOS + 340, ED_COUNTER2_YPOS(8),
GADGET_ID_RANDOM_QUANTITY,
RADIO_NR_RANDOM_ELEMENTS,
&random_placement_method, RANDOM_USE_QUANTITY,
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"
}
};
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()
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 gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
boolean checked;
int i;
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;
+ gd_y = DOOR_GFX_PAGEY1 + ED_CHECKBUTTON_YPOS;
for (i=0; i<ED_NUM_RADIOBUTTONS; i++)
{
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_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_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);
{
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_X, SX + checkbutton_info[i].x,
GDI_HEIGHT, ED_CHECKBUTTON_YSIZE,
GDI_TYPE, GD_TYPE_CHECK_BUTTON,
GDI_CHECKED, *checkbutton_info[i].value,
- 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_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);
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,
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];
ClearWindow();
UnmapLevelEditorWindowGadgets();
- DrawText(SX + ED_SETTINGS_XPOS, SY + ED_SETTINGS_YPOS,
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS_YPOS,
"Level Settings", FS_BIG, FC_YELLOW);
- DrawText(SX + ED_SETTINGS_XPOS, SY + ED_SETTINGS2_YPOS,
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
"Editor Settings", FS_BIG, FC_YELLOW);
gadget_level_xsize_value = &lev_fieldx;
}
/* draw radiobutton gadgets */
- for (i=0; i<ED_NUM_RADIOBUTTONS; i++)
+ 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);
}
/* 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++)
{
x = checkbutton_info[i].x + xoffset_right2;
y = checkbutton_info[i].y + yoffset_right2;
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()
/* 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,
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 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);
-}
-
#define TEXT_COLLECTING "Score for collecting"
#define TEXT_SMASHING "Score for smashing"
#define TEXT_CRACKING "Score for cracking"
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;
ClearWindow();
UnmapLevelEditorWindowGadgets();
- DrawText(SX + ED_SETTINGS_XPOS, SY + ED_SETTINGS_YPOS,
+ DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS_YPOS,
"Element Settings", FS_BIG, FC_YELLOW);
/* draw some decorative border for the object */
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,
+ 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 Properties");
+ font_color, element_info[properties_element]);
num_elements_in_level = 0;
for (y=0; y<lev_fieldy; y++)
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 */
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;
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] =
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], 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;
break;
case GADGET_ID_RANDOM_PERCENTAGE:
- *radiobutton_info[ED_RADIOBUTTON_PERCENTAGE].value =
- radiobutton_info[ED_RADIOBUTTON_PERCENTAGE].checked_value;
+ *radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].value =
+ radiobutton_info[ED_RADIOBUTTON_ID_PERCENTAGE].checked_value;
break;
case GADGET_ID_RANDOM_QUANTITY:
- *radiobutton_info[ED_RADIOBUTTON_QUANTITY].value =
- radiobutton_info[ED_RADIOBUTTON_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_DOUBLE_SPEED].value ^= TRUE;
+ *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)
char letter = getCharFromKeySym(key);
int button = MB_LEFT;
- if (drawing_function == GADGET_ID_TEXT)
+ if (drawing_function == GADGET_ID_TEXT &&
+ DrawLevelText(0, 0, 0, TEXT_QUERY_TYPING) == TRUE)
{
if (letter)
DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
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);
}