+ }
+ }
+}
+
+static void CreateDrawingAreas()
+{
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+ int id;
+ int i;
+
+ event_mask =
+ GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
+ GD_EVENT_OFF_BORDERS;
+
+ /* one for the level drawing area ... */
+ id = GADGET_ID_DRAWING_LEVEL;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, SX,
+ GDI_Y, SY,
+ GDI_TYPE, GD_TYPE_DRAWING_AREA,
+ GDI_AREA_SIZE, ed_fieldx, ed_fieldy,
+ 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;
+
+ /* ... up to eight areas for element content ... */
+ for (i=0; i<MAX_ELEM_CONTENT; i++)
+ {
+ int gx = SX + ED_AREA_ELEM_CONTENT_XPOS + 5 * (i % 4) * MINI_TILEX;
+ int gy = SX + ED_AREA_ELEM_CONTENT_YPOS + 6 * (i / 4) * MINI_TILEY;
+
+ id = GADGET_ID_ELEM_CONTENT_0 + i;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, gx,
+ GDI_Y, gy,
+ GDI_WIDTH, 3 * MINI_TILEX,
+ GDI_HEIGHT, 3 * 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;
+ }
+
+ /* ... one for the amoeba content */
+ id = GADGET_ID_AMOEBA_CONTENT;
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_X, SX + ED_AREA_ELEM_CONTENT_XPOS,
+ GDI_Y, SY + ED_AREA_ELEM_CONTENT_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;
+
+ /* ... 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()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_TEXTINPUT; i++)
+ {
+ Pixmap gd_pixmap = pix[PIX_DOOR];
+ int gd_x, gd_y;
+ struct GadgetInfo *gi;
+ unsigned long event_mask;
+ char infotext[1024];
+ int id = textinput_info[i].gadget_id;
+
+ event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
+
+ gd_x = DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS;
+ gd_y = DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS;
+
+ sprintf(infotext, "Enter %s", textinput_info[i].infotext);
+ infotext[MAX_INFOTEXT_LEN] = '\0';
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_INFO_TEXT, infotext,
+ GDI_X, SX + textinput_info[i].x,
+ GDI_Y, SY + textinput_info[i].y,
+ GDI_TYPE, GD_TYPE_TEXTINPUT_ALPHANUMERIC,
+ GDI_TEXT_VALUE, textinput_info[i].value,
+ 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,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_ACTION, HandleTextInputGadgets,
+ GDI_END);
+
+ if (gi == NULL)
+ Error(ERR_EXIT, "cannot create gadget");
+
+ level_editor_gadget[id] = gi;
+ }
+}
+
+static void CreateScrollbarGadgets()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_SCROLLBARS; i++)
+ {
+ int id = scrollbar_info[i].gadget_id;
+ Pixmap gd_pixmap = pix[PIX_DOOR];
+ int gd_x1, gd_x2, gd_y1, gd_y2;
+ struct GadgetInfo *gi;
+ int items_max, items_visible, item_position;
+ unsigned long event_mask;
+
+ if (scrollbar_info[i].type == GD_TYPE_SCROLLBAR_HORIZONTAL)
+ {
+ items_max = MAX(lev_fieldx + 2, ed_fieldx);
+ items_visible = ed_fieldx;
+ item_position = 0;
+ }
+ else
+ {
+ items_max = MAX(lev_fieldy + 2, ed_fieldy);
+ items_visible = ed_fieldy;
+ item_position = 0;
+ }
+
+ event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
+
+ gd_x1 = DOOR_GFX_PAGEX8 + scrollbar_info[i].xpos;
+ gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE;
+ gd_y1 = DOOR_GFX_PAGEY1 + scrollbar_info[i].ypos;
+ gd_y2 = DOOR_GFX_PAGEY1 + scrollbar_info[i].ypos;
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_INFO_TEXT, scrollbar_info[i].infotext,
+ GDI_X, SX + scrollbar_info[i].x,
+ GDI_Y, SY + scrollbar_info[i].y,
+ GDI_WIDTH, scrollbar_info[i].width,
+ GDI_HEIGHT, scrollbar_info[i].height,
+ GDI_TYPE, scrollbar_info[i].type,
+ GDI_SCROLLBAR_ITEMS_MAX, items_max,
+ GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
+ GDI_SCROLLBAR_ITEM_POSITION, item_position,
+ GDI_STATE, GD_BUTTON_UNPRESSED,
+ GDI_DESIGN_UNPRESSED, gd_pixmap, gd_x1, gd_y1,
+ GDI_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y2,
+ GDI_DESIGN_BORDER, ED_BORDER_SIZE,
+ 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;
+ }
+}
+
+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;
+
+ 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;
+
+ checked =
+ (*radiobutton_info[i].value == radiobutton_info[i].checked_value);
+
+ 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_X, SX + checkbutton_info[i].x,
+ GDI_Y, SY + checkbutton_info[i].y,
+ GDI_WIDTH, ED_CHECKBUTTON_XSIZE,
+ 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_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;
+ }
+}
+
+void CreateLevelEditorGadgets()
+{
+ CreateControlButtons();
+ CreateCounterButtons();
+ CreateDrawingAreas();
+ CreateTextInputGadgets();
+ CreateScrollbarGadgets();
+ CreateCheckbuttonGadgets();
+}
+
+static void MapControlButtons()
+{
+ int i;
+
+ for (i=0; i<ED_NUM_CTRL_BUTTONS; i++)
+ MapGadget(level_editor_gadget[i]);
+ for (i=0; i<ED_NUM_ELEMENTLIST_BUTTONS; i++)
+ MapGadget(level_editor_gadget[GADGET_ID_ELEMENTLIST_FIRST + i]);
+}
+
+static void MapCounterButtons(int id)
+{
+ MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]);
+ MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]);
+ MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]);
+}
+
+static void MapDrawingArea(int id)
+{
+ MapGadget(level_editor_gadget[id]);
+}
+
+static void MapTextInputGadget(int id)
+{
+ 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]);
+}
+
+static void MapMainDrawingArea()
+{
+ boolean no_horizontal_scrollbar = (lev_fieldx + 2 <= ed_fieldx);
+ boolean no_vertical_scrollbar = (lev_fieldy + 2 <= ed_fieldy);
+ int i;
+
+ for (i=0; i<ED_NUM_SCROLLBUTTONS; i++)
+ {
+ if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT ||
+ i == ED_SCROLLBUTTON_ID_AREA_RIGHT) &&
+ no_horizontal_scrollbar) ||
+ ((i == ED_SCROLLBUTTON_ID_AREA_UP ||
+ i == ED_SCROLLBUTTON_ID_AREA_DOWN) &&
+ no_vertical_scrollbar))
+ continue;
+
+ MapGadget(level_editor_gadget[scrollbutton_info[i].gadget_id]);
+ }
+
+ for (i=0; i<ED_NUM_SCROLLBARS; i++)
+ {
+ 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]);
+ }
+
+ MapDrawingArea(GADGET_ID_DRAWING_LEVEL);
+}
+
+static void UnmapDrawingArea(int id)
+{
+ UnmapGadget(level_editor_gadget[id]);
+}
+
+void UnmapLevelEditorWindowGadgets()
+{
+ int i;
+
+ for (i=0; i<NUM_EDITOR_GADGETS; i++)
+ if (level_editor_gadget[i]->x < DX)
+ UnmapGadget(level_editor_gadget[i]);
+}
+
+void UnmapLevelEditorGadgets()
+{
+ int i;
+
+ for (i=0; i<NUM_EDITOR_GADGETS; i++)
+ UnmapGadget(level_editor_gadget[i]);
+}
+
+void DrawLevelEd()
+{
+ int i, x, y, graphic;
+
+ edit_mode = ED_MODE_DRAWING;
+
+ CloseDoor(DOOR_CLOSE_ALL);
+
+ OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
+
+ if (level_editor_test_game)
+ {
+ for(x=0; x<lev_fieldx; x++)
+ for(y=0; y<lev_fieldy; y++)
+ Feld[x][y] = Ur[x][y];
+
+ for(x=0; x<lev_fieldx; x++)
+ for(y=0; y<lev_fieldy; y++)
+ Ur[x][y] = FieldBackup[x][y];
+
+ level_editor_test_game = FALSE;
+ }
+ else
+ {
+ level_xpos = -1;
+ level_ypos = -1;
+ undo_buffer_position = -1;
+ undo_buffer_steps = -1;
+ CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
+ }
+
+ /*
+ DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+ FadeToFront();
+ */
+
+ XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY1,
+ DXSIZE,DYSIZE,
+ DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
+ XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX6+ED_BUTTON_ELEM_XPOS,
+ DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS,
+ 4*ED_BUTTON_ELEM_XSIZE,5*ED_BUTTON_ELEM_YSIZE,
+ DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS,
+ DOOR_GFX_PAGEY1+ED_BUTTON_EUP_Y2POS);
+
+ for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
+ {
+ if (i < elements_in_list)
+ graphic = el2gfx(editor_element[i + element_shift]);
+ else
+ graphic = GFX_LEERRAUM;
+
+ DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX1+ED_BUTTON_ELEM_XPOS+3 +
+ (i%MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
+ DOOR_GFX_PAGEY1+ED_BUTTON_ELEM_YPOS+3 +
+ (i/MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
+ graphic);
+ }
+
+ DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS,
+ DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS,
+ el2gfx(new_element1));
+ DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS,
+ DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS,
+ el2gfx(new_element2));
+ DrawMiniGraphicExt(pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS,
+ DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS,
+ el2gfx(new_element3));
+ DrawTextExt(pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS,
+ DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
+ int2str(level_nr,2),FS_SMALL,FC_SPECIAL1);
+ XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+3,
+ DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
+ 7,FONT3_YSIZE,
+ DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS,
+ DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
+ XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX2+ED_WIN_LEVELNR_XPOS+14,
+ DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS,
+ 7,FONT3_YSIZE,
+ DOOR_GFX_PAGEX1+ED_WIN_LEVELNR_XPOS+9,
+ DOOR_GFX_PAGEY1+ED_WIN_LEVELNR_YPOS);
+
+ XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
+ DOOR_GFX_PAGEX6,DOOR_GFX_PAGEY2,
+ VXSIZE,VYSIZE,
+ DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
+
+ /* draw bigger door */
+ XCopyArea(display, pix[PIX_DOOR], drawto, gc,
+ DOOR_GFX_PAGEX7, 0,
+ 108, 64,
+ EX - 4, EY - 12);
+
+ /* draw new control window */
+ XCopyArea(display, pix[PIX_DOOR], drawto, gc,
+ DOOR_GFX_PAGEX8, 236,
+ EXSIZE, EYSIZE,
+ EX, EY);
+
+ redraw_mask |= REDRAW_ALL;
+
+ OpenDoor(DOOR_OPEN_1);
+
+ strcpy(level_editor_gadget[GADGET_ID_LEVEL_NAME]->text.value, level.name);
+
+ MapControlButtons();
+
+ /*
+ MapMainDrawingArea();
+ */
+
+ DrawDrawingWindow();
+ FadeToFront();
+
+ /*
+ OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2);
+ */
+}
+
+static void AdjustDrawingAreaGadgets()
+{
+ int ed_xsize = lev_fieldx + 2;
+ int ed_ysize = lev_fieldy + 2;
+ int max_ed_fieldx = MAX_ED_FIELDX;
+ int max_ed_fieldy = MAX_ED_FIELDY;
+ boolean horizontal_scrollbar_needed;
+ boolean vertical_scrollbar_needed;
+ int x, y, width, height;
+ int xoffset, yoffset;
+
+ /* check if we need any scrollbars */
+ horizontal_scrollbar_needed = (ed_xsize > max_ed_fieldx);
+ vertical_scrollbar_needed = (ed_ysize > max_ed_fieldy);
+
+ /* check if we have a smaller editor field because of scrollbars */
+ if (horizontal_scrollbar_needed)
+ max_ed_fieldy = MAX_ED_FIELDY - 1;
+ if (vertical_scrollbar_needed)
+ max_ed_fieldx = MAX_ED_FIELDX - 1;
+
+ /* check again if we now need more scrollbars because of less space */
+ horizontal_scrollbar_needed = (ed_xsize > max_ed_fieldx);
+ vertical_scrollbar_needed = (ed_ysize > max_ed_fieldy);
+
+ /* check if editor field gets even smaller after adding new scrollbars */
+ if (horizontal_scrollbar_needed)
+ max_ed_fieldy = MAX_ED_FIELDY - 1;
+ if (vertical_scrollbar_needed)
+ max_ed_fieldx = MAX_ED_FIELDX - 1;
+
+ ed_fieldx = (ed_xsize < MAX_ED_FIELDX ? ed_xsize : max_ed_fieldx);
+ ed_fieldy = (ed_ysize < MAX_ED_FIELDY ? ed_ysize : max_ed_fieldy);
+
+ ModifyGadget(level_editor_gadget[GADGET_ID_DRAWING_LEVEL],
+ GDI_WIDTH, ed_fieldx * MINI_TILEX,
+ GDI_HEIGHT, ed_fieldy * MINI_TILEY,
+ GDI_AREA_SIZE, ed_fieldx, ed_fieldy,
+ GDI_END);
+
+ 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_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_ID_HORIZONTAL].width + xoffset;
+ height = scrollbar_info[ED_SCROLLBAR_ID_VERTICAL].height + yoffset;
+
+ ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL],
+ GDI_WIDTH, width,
+ GDI_SCROLLBAR_ITEMS_VISIBLE, ed_fieldx,
+ GDI_END);
+ ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_VERTICAL],
+ GDI_HEIGHT, height,
+ GDI_SCROLLBAR_ITEMS_VISIBLE, ed_fieldy,
+ GDI_END);
+}
+
+static void AdjustLevelScrollPosition()
+{
+ if (level_xpos < -1)
+ level_xpos = -1;
+ if (level_xpos > lev_fieldx - ed_fieldx + 1)
+ level_xpos = lev_fieldx - ed_fieldx + 1;
+ if (lev_fieldx < ed_fieldx - 2)
+ level_xpos = -1;
+
+ if (level_ypos < -1)
+ level_ypos = -1;
+ if (level_ypos > lev_fieldy - ed_fieldy + 1)
+ level_ypos = lev_fieldy - ed_fieldy + 1;
+ if (lev_fieldy < ed_fieldy - 2)
+ level_ypos = -1;
+}
+
+static void AdjustEditorScrollbar(int id)
+{
+ struct GadgetInfo *gi = level_editor_gadget[id];
+ int items_max, items_visible, item_position;
+
+ if (id == GADGET_ID_SCROLL_HORIZONTAL)
+ {
+ items_max = MAX(lev_fieldx + 2, ed_fieldx);
+ items_visible = ed_fieldx;
+ item_position = level_xpos + 1;
+ }
+ else
+ {
+ items_max = MAX(lev_fieldy + 2, ed_fieldy);
+ items_visible = ed_fieldy;
+ item_position = level_ypos + 1;
+ }
+
+ if (item_position > items_max - items_visible)
+ item_position = items_max - items_visible;
+
+ ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max,
+ GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
+}
+
+static void ModifyEditorTextInput(int textinput_id, char *new_text)
+{
+ int gadget_id = textinput_info[textinput_id].gadget_id;
+ struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+
+ ModifyGadget(gi, GDI_TEXT_VALUE, new_text, GDI_END);
+}
+
+static void ModifyEditorCounter(int counter_id, int new_value)
+{
+ int *counter_value = *counterbutton_info[counter_id].counter_value;
+ int gadget_id = counterbutton_info[counter_id].gadget_id_text;
+ struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+
+ ModifyGadget(gi, GDI_NUMBER_VALUE, new_value, GDI_END);
+
+ if (counter_value != NULL)
+ *counter_value = gi->text.number_value;
+}
+
+static void PickDrawingElement(int button, int element)
+{
+ if (button < 1 || button > 3)
+ return;
+
+ if (button == 1)
+ {
+ new_element1 = element;
+ DrawMiniGraphicExt(drawto, gc,
+ DX + ED_WIN_MB_LEFT_XPOS,
+ DY + ED_WIN_MB_LEFT_YPOS,
+ el2gfx(new_element1));
+ }
+ else if (button == 2)
+ {
+ new_element2 = element;
+ DrawMiniGraphicExt(drawto, gc,
+ DX + ED_WIN_MB_MIDDLE_XPOS,
+ DY + ED_WIN_MB_MIDDLE_YPOS,
+ el2gfx(new_element2));
+ }
+ else
+ {
+ new_element3 = element;
+ DrawMiniGraphicExt(drawto, gc,
+ DX + ED_WIN_MB_RIGHT_XPOS,
+ DY + ED_WIN_MB_RIGHT_YPOS,
+ el2gfx(new_element3));
+ }
+
+ redraw_mask |= REDRAW_DOOR_1;
+}
+
+static void DrawDrawingWindow()
+{
+ ClearWindow();
+ UnmapLevelEditorWindowGadgets();
+ AdjustDrawingAreaGadgets();
+ AdjustLevelScrollPosition();
+ AdjustEditorScrollbar(GADGET_ID_SCROLL_HORIZONTAL);
+ AdjustEditorScrollbar(GADGET_ID_SCROLL_VERTICAL);
+ DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+ 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 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();
+
+ 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_random_value = &random_placement_value;
+ gadget_level_collect_value = &level.edelsteine;
+ gadget_level_timelimit_value = &level.time;
+ gadget_level_timescore_value = &level.score[10];
+
+ /* draw counter gadgets */
+ for (i=ED_COUNTER_ID_LEVEL_FIRST; i<=ED_COUNTER_ID_LEVEL_LAST; i++)
+ {
+ 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_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);
+ }
+
+ ModifyEditorCounter(i, **counterbutton_info[i].counter_value);
+ MapCounterButtons(i);
+ }
+
+ /* draw text input gadgets */
+ for (i=ED_TEXTINPUT_ID_LEVEL_FIRST; i<=ED_TEXTINPUT_ID_LEVEL_LAST; i++)
+ {
+ 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, font_color, infotext);
+ ModifyEditorTextInput(i, textinput_info[i].value);
+ MapTextInputGadget(i);
+ }
+
+ /* 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, 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=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;
+
+ 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);
+ }
+
+ /* 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 *num_areas = &MampferMax;
+ 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 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++)
+ for (y=0; y<3; y++)
+ for (x=0; x<3; x++)
+ ElementContent[i][x][y] = level.mampfer_inhalt[i][x][y];
+
+ for (i=0; i<MAX_ELEM_CONTENT; i++)
+ UnmapDrawingArea(GADGET_ID_ELEM_CONTENT_0 + i);
+
+ /* display counter to choose number of element content areas */
+ gadget_elem_content_value = num_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);
+
+ /* delete content areas in case of reducing number of them */
+ XFillRectangle(display, backbuffer, gc,
+ SX, area_sy - MINI_TILEX,
+ SXSIZE, 12 * MINI_TILEY);
+
+ /* draw some decorative border for the objects */
+ for (i=0; i<*num_areas; i++)
+ {
+ for (y=0; y<4; y++)
+ for (x=0; x<4; x++)
+ DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
+ EL_ERDREICH);
+
+ XFillRectangle(display, drawto, gc,
+ area_sx + 5 * (i % 4) * MINI_TILEX + MINI_TILEX/2 - 1,
+ area_sy + 6 * (i / 4) * MINI_TILEY + MINI_TILEY/2 - 1,
+ 3 * MINI_TILEX + 2, 3 * MINI_TILEY + 2);
+ }
+
+ /* copy border to the right location */
+ XCopyArea(display, drawto, drawto, gc,
+ 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, font_color);
+ DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 1 * MINI_TILEY + 1,
+ "when", FS_SMALL, font_color);
+ DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 2 * MINI_TILEY + 1,
+ "smashed", FS_SMALL, font_color);
+
+ for (i=0; i<*num_areas; i++)
+ {
+ for (y=0; y<3; y++)
+ for (x=0; x<3; x++)
+ DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
+ ElementContent[i][x][y]);
+
+ DrawTextF(area_sx - SX + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
+ area_sy - SY + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
+ font_color, "%d", i + 1);
+ }
+
+ for (i=0; i<*num_areas; i++)
+ MapDrawingArea(GADGET_ID_ELEM_CONTENT_0 + i);
+}
+
+#define TEXT_COLLECTING "Score for collecting"
+#define TEXT_SMASHING "Score for smashing"
+#define TEXT_CRACKING "Score for cracking"
+#define TEXT_SPEED "Speed of amoeba growth"
+#define TEXT_DURATION "Duration when activated"
+
+static void DrawPropertiesWindow()
+{
+ 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;
+ int *counter_value;
+ char *text;
+ } elements_with_counter[] =
+ {
+ { EL_EDELSTEIN, &level.score[0], TEXT_COLLECTING },
+ { EL_EDELSTEIN_BD, &level.score[0], TEXT_COLLECTING },
+ { EL_EDELSTEIN_GELB,&level.score[0], TEXT_COLLECTING },
+ { EL_EDELSTEIN_ROT, &level.score[0], TEXT_COLLECTING },
+ { EL_EDELSTEIN_LILA,&level.score[0], TEXT_COLLECTING },
+ { EL_DIAMANT, &level.score[1], TEXT_COLLECTING },
+ { EL_KAEFER_R, &level.score[2], TEXT_SMASHING },
+ { EL_KAEFER_O, &level.score[2], TEXT_SMASHING },
+ { EL_KAEFER_L, &level.score[2], TEXT_SMASHING },
+ { EL_KAEFER_U, &level.score[2], TEXT_SMASHING },
+ { EL_BUTTERFLY_R, &level.score[2], TEXT_SMASHING },
+ { EL_BUTTERFLY_O, &level.score[2], TEXT_SMASHING },
+ { EL_BUTTERFLY_L, &level.score[2], TEXT_SMASHING },
+ { EL_BUTTERFLY_U, &level.score[2], TEXT_SMASHING },
+ { EL_FLIEGER_R, &level.score[3], TEXT_SMASHING },
+ { EL_FLIEGER_O, &level.score[3], TEXT_SMASHING },
+ { EL_FLIEGER_L, &level.score[3], TEXT_SMASHING },
+ { EL_FLIEGER_U, &level.score[3], TEXT_SMASHING },
+ { EL_FIREFLY_R, &level.score[3], TEXT_SMASHING },
+ { EL_FIREFLY_O, &level.score[3], TEXT_SMASHING },
+ { EL_FIREFLY_L, &level.score[3], TEXT_SMASHING },
+ { EL_FIREFLY_U, &level.score[3], TEXT_SMASHING },
+ { EL_MAMPFER, &level.score[4], TEXT_SMASHING },
+ { EL_MAMPFER2, &level.score[4], TEXT_SMASHING },
+ { EL_ROBOT, &level.score[5], TEXT_SMASHING },
+ { EL_PACMAN_R, &level.score[6], TEXT_SMASHING },
+ { EL_PACMAN_O, &level.score[6], TEXT_SMASHING },
+ { EL_PACMAN_L, &level.score[6], TEXT_SMASHING },
+ { EL_PACMAN_U, &level.score[6], TEXT_SMASHING },
+ { EL_KOKOSNUSS, &level.score[7], TEXT_CRACKING },
+ { EL_DYNAMIT_AUS, &level.score[8], TEXT_COLLECTING },
+ { EL_SCHLUESSEL1, &level.score[9], TEXT_COLLECTING },
+ { EL_SCHLUESSEL2, &level.score[9], TEXT_COLLECTING },
+ { EL_SCHLUESSEL3, &level.score[9], TEXT_COLLECTING },
+ { EL_SCHLUESSEL4, &level.score[9], TEXT_COLLECTING },
+ { EL_AMOEBE_NASS, &level.tempo_amoebe, TEXT_SPEED },
+ { EL_AMOEBE_NORM, &level.tempo_amoebe, TEXT_SPEED },
+ { EL_AMOEBE_VOLL, &level.tempo_amoebe, TEXT_SPEED },
+ { EL_AMOEBE_BD, &level.tempo_amoebe, TEXT_SPEED },
+ { EL_SIEB_INAKTIV, &level.dauer_sieb, TEXT_DURATION },
+ { EL_ABLENK_AUS, &level.dauer_ablenk, TEXT_DURATION },
+ { -1, NULL, NULL }
+ };
+
+ 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(xstart + x , ystart + y, EL_ERDREICH);
+
+ XFillRectangle(display, drawto, gc,
+ 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 + xstart * MINI_TILEX,
+ SY + ystart * MINI_TILEY,
+ 2 * TILEX, 2 * TILEY,
+ SX + xstart * MINI_TILEX - MINI_TILEX/2,
+ SY + ystart * MINI_TILEY - MINI_TILEY/2);
+
+ 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++)
+ for (x=0; x<lev_fieldx; x++)
+ if (Feld[x][y] == properties_element)
+ num_elements_in_level++;
+ percentage = num_elements_in_level * 100.0 / (lev_fieldx * lev_fieldy);
+
+ 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 + xoffset_right;
+ int y = counterbutton_info[ED_COUNTER_ID_ELEM_SCORE].y + yoffset_right;
+
+ gadget_elem_score_value = elements_with_counter[i].counter_value;
+
+ 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
+ DrawElementContentAreas();
+ }
+}
+
+static void swap_numbers(int *i1, int *i2)
+{
+ int help = *i1;
+
+ *i1 = *i2;
+ *i2 = help;
+}
+
+static void swap_number_pairs(int *x1, int *y1, int *x2, int *y2)
+{
+ int help_x = *x1;
+ int help_y = *y1;
+
+ *x1 = *x2;
+ *x2 = help_x;
+
+ *y1 = *y2;
+ *y2 = help_y;
+}
+
+static void DrawLineElement(int sx, int sy, int element, boolean change_level)
+{
+ int lx = sx + level_xpos;
+ int ly = sy + level_ypos;
+
+ DrawMiniElement(sx, sy, (element < 0 ? Feld[lx][ly] : element));