X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=871aa1645a8a7d25db21e5e0379bf80bc3aa5f08;hb=86e110774e5210b326e6867b134bd638d93554d3;hp=50988c0d88b527cd13e7078b21c36a2bd5151cf3;hpb=f5356588a234e34e349c0b1eba02008655fdee87;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 50988c0d..871aa164 100644 --- a/src/editor.c +++ b/src/editor.c @@ -1,23 +1,23 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1995-2001 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* editor.c * +* editor.c * ***********************************************************/ #include +#include "libgame/libgame.h" + #include "editor.h" #include "screens.h" #include "tools.h" -#include "misc.h" -#include "buttons.h" #include "files.h" #include "game.h" #include "tape.h" @@ -288,13 +288,14 @@ #define GADGET_ID_DOUBLE_SPEED 73 #define GADGET_ID_GRAVITY 74 #define GADGET_ID_STICK_ELEMENT 75 +#define GADGET_ID_EM_SLIPPERY_GEMS 76 /* another drawing area for random placement */ -#define GADGET_ID_RANDOM_BACKGROUND 76 +#define GADGET_ID_RANDOM_BACKGROUND 77 /* gadgets for buttons in element list */ -#define GADGET_ID_ELEMENTLIST_FIRST 77 -#define GADGET_ID_ELEMENTLIST_LAST (77 + ED_NUM_ELEMENTLIST_BUTTONS - 1) +#define GADGET_ID_ELEMENTLIST_FIRST 78 +#define GADGET_ID_ELEMENTLIST_LAST (78 + ED_NUM_ELEMENTLIST_BUTTONS - 1) #define NUM_EDITOR_GADGETS (GADGET_ID_ELEMENTLIST_LAST + 1) @@ -356,8 +357,9 @@ #define ED_CHECKBUTTON_ID_GRAVITY 1 #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED 2 #define ED_CHECKBUTTON_ID_STICK_ELEMENT 3 +#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS 4 -#define ED_NUM_CHECKBUTTONS 4 +#define ED_NUM_CHECKBUTTONS 5 #define ED_CHECKBUTTON_ID_LEVEL_FIRST ED_CHECKBUTTON_ID_DOUBLE_SPEED #define ED_CHECKBUTTON_ID_LEVEL_LAST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED @@ -670,6 +672,12 @@ static struct GADGET_ID_STICK_ELEMENT, &stick_element_properties_window, "stick window to edit content", "stick window to edit content" + }, + { + ED_SETTINGS_XPOS, ED_COUNTER_YPOS(4), + GADGET_ID_EM_SLIPPERY_GEMS, + &level.em_slippery_gems, + "slip down from certain flat walls","use EM style slipping behaviour" } }; @@ -690,10 +698,10 @@ static int new_element1 = EL_MAUERWERK; static int new_element2 = EL_LEERRAUM; static int new_element3 = EL_ERDREICH; -#define BUTTON_ELEMENT(button) (button == 1 ? new_element1 : \ - button == 2 ? new_element2 : \ - button == 3 ? new_element3 : EL_LEERRAUM) -#define BUTTON_STEPSIZE(button) (button == 1 ? 1 : button == 2 ? 5 : 10) +#define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \ + (button) == 2 ? new_element2 : \ + (button) == 3 ? new_element3 : EL_LEERRAUM) +#define BUTTON_STEPSIZE(button) ((button) == 1 ? 1 : (button) == 2 ? 5 : 10) /* forward declaration for internal use */ static void ModifyEditorCounter(int, int); @@ -751,15 +759,15 @@ int editor_element[] = EL_ERDREICH, EL_BETON, - EL_FELSBODEN, - EL_SIEB2_INAKTIV, + EL_BD_WALL, + EL_MAGIC_WALL_BD_OFF, EL_AUSGANG_ZU, EL_AUSGANG_AUF, EL_EDELSTEIN_BD, EL_BUTTERFLY_UP, EL_FIREFLY_UP, - EL_FELSBROCKEN, + EL_BD_ROCK, EL_BUTTERFLY_LEFT, EL_FIREFLY_LEFT, @@ -799,7 +807,7 @@ int editor_element[] = EL_BETON, EL_MAUERWERK, EL_FELSBODEN, - EL_SIEB_INAKTIV, + EL_MAGIC_WALL_OFF, EL_EDELSTEIN, EL_DIAMANT, @@ -933,8 +941,13 @@ int editor_element[] = EL_LEERRAUM, EL_MOLE_DOWN, - EL_LEERRAUM, - EL_LEERRAUM, + EL_BALLOON, + EL_BALLOON_SEND_ANY, + + EL_BALLOON_SEND_LEFT, + EL_BALLOON_SEND_RIGHT, + EL_BALLOON_SEND_UP, + EL_BALLOON_SEND_DOWN, EL_SONDE, EL_MAUER_X, @@ -946,6 +959,17 @@ int editor_element[] = EL_SPEED_PILL, EL_BLACK_ORB, + EL_EMC_STEEL_WALL_1, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + + EL_CHAR('S'), EL_CHAR('O'), EL_CHAR('K'), @@ -1041,6 +1065,11 @@ int editor_element[] = EL_CHAR('I'), EL_CHAR('I'), + EL_PEARL, + EL_CRYSTAL, + EL_WALL_PEARL, + EL_WALL_CRYSTAL, + EL_BELT1_LEFT, EL_BELT1_MIDDLE, EL_BELT1_RIGHT, @@ -1076,6 +1105,11 @@ int editor_element[] = EL_SWITCHGATE_SWITCH_1, EL_ENVELOPE, + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_SWITCH_OFF, + EL_LEERRAUM, + EL_LANDMINE, EL_SAND_INVISIBLE, EL_STEEL_SLANTED, @@ -1086,10 +1120,50 @@ int editor_element[] = EL_LIGHT_SWITCH_OFF, EL_LIGHT_SWITCH_ON, - EL_FORCE_FIELD_PASSIVE, + EL_SHIELD_PASSIVE, + EL_SHIELD_ACTIVE, EL_EXTRA_TIME, EL_LEERRAUM, - EL_FORCE_FIELD_ACTIVE, + + EL_CHAR('D'), + EL_CHAR('X'), + EL_CHAR('-'), + EL_CHAR(' '), + + EL_CHAR('B'), + EL_CHAR('O'), + EL_CHAR('U'), + EL_CHAR('L'), + + EL_CHAR('-'), + EL_CHAR('D'), + EL_CHAR('E'), + EL_CHAR('R'), + + EL_CHAR('D'), + EL_CHAR('A'), + EL_CHAR('S'), + EL_CHAR('H'), + + EL_SPRING, + EL_TUBE_RIGHT_DOWN, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_DOWN, + + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_RIGHT, + EL_TUBE_CROSS, + EL_TUBE_VERT_LEFT, + + EL_TUBE_VERTICAL, + EL_TUBE_RIGHT_UP, + EL_TUBE_HORIZ_UP, + EL_TUBE_LEFT_UP, + + EL_TRAP_INACTIVE, + EL_DX_SUPABOMB, + EL_LEERRAUM, + EL_LEERRAUM, /* EL_CHAR('D'), @@ -1195,19 +1269,31 @@ int editor_element[] = }; int elements_in_list = sizeof(editor_element)/sizeof(int); +static char *getElementInfoText(int element) +{ + char *info_text = "unknown"; + + if (element < NUM_LEVEL_ELEMENTS) + info_text = element_info[element].editor_description; + else + Error(ERR_WARN, "no element description for element %d", element); + + return info_text; +} + static void ScrollMiniLevel(int from_x, int from_y, int scroll) { int x,y; int dx = (scroll == ED_SCROLL_LEFT ? -1 : scroll == ED_SCROLL_RIGHT ? 1 : 0); int dy = (scroll == ED_SCROLL_UP ? -1 : scroll == ED_SCROLL_DOWN ? 1 : 0); - XCopyArea(display, drawto, drawto, gc, - SX + (dx == -1 ? MINI_TILEX : 0), - SY + (dy == -1 ? MINI_TILEY : 0), - (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0), - (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0), - SX + (dx == +1 ? MINI_TILEX : 0), - SY + (dy == +1 ? MINI_TILEY : 0)); + BlitBitmap(drawto, drawto, + SX + (dx == -1 ? MINI_TILEX : 0), + SY + (dy == -1 ? MINI_TILEY : 0), + (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0), + (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0), + SX + (dx == +1 ? MINI_TILEX : 0), + SY + (dy == +1 ? MINI_TILEY : 0)); if (dx) { x = (dx == 1 ? 0 : ed_fieldx - 1); @@ -1227,7 +1313,7 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll) static void CreateControlButtons() { - Pixmap gd_pixmap = pix[PIX_DOOR]; + Bitmap *gd_bitmap = pix[PIX_DOOR]; struct GadgetInfo *gi; unsigned long event_mask; int i; @@ -1311,11 +1397,12 @@ static void CreateControlButtons() GDI_STATE, GD_BUTTON_UNPRESSED, GDI_RADIO_NR, 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_x1, gd_y2, - GDI_ALT_DESIGN_PRESSED, gd_pixmap, gd_x2, gd_y2, + GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1, + GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y1, + GDI_ALT_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y2, + GDI_ALT_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2, GDI_EVENT_MASK, event_mask, + GDI_CALLBACK_INFO, HandleEditorGadgetInfoText, GDI_CALLBACK_ACTION, HandleControlButtons, GDI_END); @@ -1370,9 +1457,10 @@ static void CreateControlButtons() GDI_HEIGHT, height, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, 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_UNPRESSED, gd_bitmap, gd_x1, gd_y1, + GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2, GDI_EVENT_MASK, event_mask, + GDI_CALLBACK_INFO, HandleEditorGadgetInfoText, GDI_CALLBACK_ACTION, HandleControlButtons, GDI_END); @@ -1385,7 +1473,7 @@ static void CreateControlButtons() /* create buttons for element list */ for (i=0; ifirst_level, + leveldir_current->last_level); ModifyEditorCounter(counter_id, *counterbutton_info[counter_id].value); MapCounterButtons(counter_id); } @@ -2043,17 +2138,17 @@ void DrawLevelEd() } /* copy default editor door content to main double buffer */ - XCopyArea(display, pix[PIX_DOOR], drawto, gc, - DOOR_GFX_PAGEX6, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); + BlitBitmap(pix[PIX_DOOR], drawto, + DOOR_GFX_PAGEX6, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY); /* draw mouse button brush elements */ - DrawMiniGraphicExt(drawto, gc, + DrawMiniGraphicExt(drawto, DX + ED_WIN_MB_LEFT_XPOS, DY + ED_WIN_MB_LEFT_YPOS, el2gfx(new_element1)); - DrawMiniGraphicExt(drawto, gc, + DrawMiniGraphicExt(drawto, DX + ED_WIN_MB_MIDDLE_XPOS, DY + ED_WIN_MB_MIDDLE_YPOS, el2gfx(new_element2)); - DrawMiniGraphicExt(drawto, gc, + DrawMiniGraphicExt(drawto, DX + ED_WIN_MB_RIGHT_XPOS, DY + ED_WIN_MB_RIGHT_YPOS, el2gfx(new_element3)); @@ -2061,18 +2156,16 @@ void DrawLevelEd() DrawSpecialEditorDoor(); /* draw new control window */ - XCopyArea(display, pix[PIX_DOOR], drawto, gc, - DOOR_GFX_PAGEX8, 236, - EXSIZE, EYSIZE, - EX, EY); + BlitBitmap(pix[PIX_DOOR], drawto, + DOOR_GFX_PAGEX8, 236, EXSIZE, EYSIZE, EX, EY); redraw_mask |= REDRAW_ALL; MapControlButtons(); /* copy actual editor door content to door double buffer for OpenDoor() */ - XCopyArea(display, drawto, pix[PIX_DB_DOOR], gc, - DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); + BlitBitmap(drawto, pix[PIX_DB_DOOR], + DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); DrawEditModeWindow(); @@ -2228,21 +2321,21 @@ static void PickDrawingElement(int button, int element) if (button == 1) { new_element1 = element; - DrawMiniGraphicExt(drawto, gc, + DrawMiniGraphicExt(drawto, 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, + DrawMiniGraphicExt(drawto, DX + ED_WIN_MB_MIDDLE_XPOS, DY + ED_WIN_MB_MIDDLE_YPOS, el2gfx(new_element2)); } else { new_element3 = element; - DrawMiniGraphicExt(drawto, gc, + DrawMiniGraphicExt(drawto, DX + ED_WIN_MB_RIGHT_XPOS, DY + ED_WIN_MB_RIGHT_YPOS, el2gfx(new_element3)); } @@ -2277,14 +2370,14 @@ static void DrawRandomPlacementBackgroundArea() for (x=0; x<2; x++) DrawMiniElement(area_x + x, area_y + y, EL_ERDREICH); - XFillRectangle(display, drawto, gc, + ClearRectangle(drawto, 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); + BlitBitmap(drawto, drawto, + 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]); @@ -2399,14 +2492,14 @@ static void DrawAmoebaContentArea() for (x=0; x<2; x++) DrawMiniElement(area_x + x, area_y + y, EL_ERDREICH); - XFillRectangle(display, drawto, gc, + ClearRectangle(drawto, 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); + BlitBitmap(drawto, drawto, + 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); @@ -2445,7 +2538,7 @@ static void DrawElementContentAreas() MapCounterButtons(counter_id); /* delete content areas in case of reducing number of them */ - XFillRectangle(display, backbuffer, gc, + ClearRectangle(backbuffer, SX, area_sy - MINI_TILEX, SXSIZE, 12 * MINI_TILEY); @@ -2457,16 +2550,16 @@ static void DrawElementContentAreas() DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y, EL_ERDREICH); - XFillRectangle(display, drawto, gc, + ClearRectangle(drawto, 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); + BlitBitmap(drawto, drawto, + 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); @@ -2560,7 +2653,7 @@ static void DrawPropertiesWindow() { EL_AMOEBE_NORM, &level.amoeba_speed, TEXT_SPEED }, { EL_AMOEBE_VOLL, &level.amoeba_speed, TEXT_SPEED }, { EL_AMOEBE_BD, &level.amoeba_speed, TEXT_SPEED }, - { EL_SIEB_INAKTIV, &level.time_magic_wall, TEXT_DURATION }, + { EL_MAGIC_WALL_OFF,&level.time_magic_wall, TEXT_DURATION }, { EL_ABLENK_AUS, &level.time_wheel, TEXT_DURATION }, { -1, NULL, NULL } }; @@ -2576,31 +2669,31 @@ static void DrawPropertiesWindow() for (x=0; x<3; x++) DrawMiniElement(xstart + x , ystart + y, EL_ERDREICH); - XFillRectangle(display, drawto, gc, + ClearRectangle(drawto, 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); + BlitBitmap(drawto, drawto, + 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); + BlitBitmap(drawto, drawto, + 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]); + font_color, getElementInfoText(properties_element)); num_elements_in_level = 0; for (y=0; yx + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, el2gfx(new_element)); - DrawMiniGraphicExt(window, gc, + DrawMiniGraphicExt(window, gi->x + sx * MINI_TILEX, gi->y + sy * MINI_TILEY, el2gfx(new_element)); @@ -3471,7 +3553,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) { CopyAreaToBrush(start_sx, start_sy, sx, sy, button); CopyBrushToCursor(sx, sy); - ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS],MB_LEFT); + ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], + MB_LEFTBUTTON); draw_with_brush = TRUE; } else if (drawing_function == GADGET_ID_TEXT) @@ -3500,7 +3583,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi) case GADGET_ID_PICK_ELEMENT: if (button_release_event) - ClickOnGadget(level_editor_gadget[last_drawing_function], MB_LEFT); + ClickOnGadget(level_editor_gadget[last_drawing_function], + MB_LEFTBUTTON); else PickDrawingElement(button, Feld[lx][ly]); @@ -3716,8 +3800,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) int element = editor_element[element_shift + i]; UnmapGadget(gi); - getMiniGraphicSource(el2gfx(element), &gd->pixmap, &gd->x, &gd->y); - ModifyGadget(gi, GDI_INFO_TEXT, element_info[element], GDI_END); + getMiniGraphicSource(el2gfx(element), &gd->bitmap, &gd->x, &gd->y); + ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END); MapGadget(gi); } break; @@ -3811,7 +3895,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; case GADGET_ID_SAVE: - if (leveldir[leveldir_nr].readonly) + if (leveldir_current->readonly) { Request("This level is read only !", REQ_CONFIRM); break; @@ -3862,27 +3946,7 @@ static void HandleControlButtons(struct GadgetInfo *gi) break; case GADGET_ID_EXIT: - if (!LevelChanged() || - Request("Level has changed! Exit without saving ?", - REQ_ASK | REQ_STAY_OPEN)) - { - CloseDoor(DOOR_CLOSE_1); - - /* - CloseDoor(DOOR_CLOSE_ALL); - */ - - game_status = MAINMENU; - DrawMainMenu(); - } - else - { - CloseDoor(DOOR_CLOSE_1); - XCopyArea(display, pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], gc, - DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE,DYSIZE, - DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); - OpenDoor(DOOR_OPEN_1); - } + RequestExitLevelEditor(TRUE); /* if level has changed, ask user */ break; default: @@ -3903,7 +3967,8 @@ static void HandleControlButtons(struct GadgetInfo *gi) } if (drawing_function == GADGET_ID_PICK_ELEMENT) - ClickOnGadget(level_editor_gadget[last_drawing_function], MB_LEFT); + ClickOnGadget(level_editor_gadget[last_drawing_function], + MB_LEFTBUTTON); } #ifdef DEBUG else if (gi->event.type == GD_EVENT_PRESSED) @@ -3919,50 +3984,63 @@ static void HandleControlButtons(struct GadgetInfo *gi) } } -void HandleLevelEditorKeyInput(KeySym key) +void HandleLevelEditorKeyInput(Key key) { - char letter = getCharFromKeySym(key); - int button = MB_LEFT; + char letter = getCharFromKey(key); + int button = MB_LEFTBUTTON; 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) + else if (key == KSYM_Delete || key == KSYM_BackSpace) DrawLevelText(0, 0, 0, TEXT_BACKSPACE); - else if (key == XK_Return) + else if (key == KSYM_Return) DrawLevelText(0, 0, 0, TEXT_NEWLINE); + else if (key == KSYM_Escape) + DrawLevelText(0, 0, 0, TEXT_END); } else if (button_status == MB_RELEASED) { - int i, id; + int i, id = GADGET_ID_NONE; switch (key) { - case XK_Left: + case KSYM_Left: id = GADGET_ID_SCROLL_LEFT; break; - case XK_Right: + case KSYM_Right: id = GADGET_ID_SCROLL_RIGHT; break; - case XK_Up: + case KSYM_Up: id = GADGET_ID_SCROLL_UP; break; - case XK_Down: + case KSYM_Down: id = GADGET_ID_SCROLL_DOWN; break; - case XK_Page_Up: + case KSYM_Page_Up: id = GADGET_ID_SCROLL_LIST_UP; - button = 3; + button = MB_RIGHTBUTTON; break; - case XK_Page_Down: + case KSYM_Page_Down: id = GADGET_ID_SCROLL_LIST_DOWN; - button = 3; + button = MB_RIGHTBUTTON; break; + case KSYM_Escape: + if (edit_mode == ED_MODE_DRAWING) + { + RequestExitLevelEditor(setup.ask_on_escape); + } + else + { + DrawDrawingWindow(); + edit_mode = ED_MODE_DRAWING; + } + break; + default: - id = GADGET_ID_NONE; break; } @@ -3970,7 +4048,7 @@ void HandleLevelEditorKeyInput(KeySym key) ClickOnGadget(level_editor_gadget[id], button); else if (letter == '.') ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button); - else if (key == XK_space || key == XK_Return) + else if (key == KSYM_Return || key == setup.shortcut.toggle_pause) ClickOnGadget(level_editor_gadget[GADGET_ID_TEST], button); else for (i=0; ievent.type == GD_EVENT_INFO_LEAVING) + return; + /* misuse this function to delete brush cursor, if needed */ if (edit_mode == ED_MODE_DRAWING && draw_with_brush) DeleteBrushFromCursor(); @@ -4042,6 +4126,9 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) ClearEditorGadgetInfoText(); + if (gi->event.type == GD_EVENT_INFO_LEAVING) + return; + /* 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); @@ -4124,7 +4211,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) } else if (drawing_function == GADGET_ID_PICK_ELEMENT) DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, - "%s", element_info[Feld[lx][ly]]); + "%s", getElementInfoText(Feld[lx][ly])); else DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FC_YELLOW, "Level position: %d, %d", lx, ly); @@ -4150,3 +4237,27 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi) "Content area %d position: %d, %d", id - GADGET_ID_ELEM_CONTENT_0 + 1, sx, sy); } + +void RequestExitLevelEditor(boolean ask_if_level_has_changed) +{ + if (!ask_if_level_has_changed || + !LevelChanged() || + Request("Level has changed! Exit without saving ?", + REQ_ASK | REQ_STAY_OPEN)) + { + CloseDoor(DOOR_CLOSE_1); + /* + CloseDoor(DOOR_CLOSE_ALL); + */ + game_status = MAINMENU; + DrawMainMenu(); + } + else + { + CloseDoor(DOOR_CLOSE_1); + BlitBitmap(pix[PIX_DB_DOOR], pix[PIX_DB_DOOR], + DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1, DXSIZE,DYSIZE, + DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1); + OpenDoor(DOOR_OPEN_1); + } +}