X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=920f0861ccf408ed2d16f36831b4b937c861f700;hb=2443a8a09966a9940e1420c91d24a297325c2a00;hp=fe5dc3589467eb20eadc0f66da11f37212034e9c;hpb=6504e94ad5344b188eae829e8136b804437e70bf;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index fe5dc358..920f0861 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); @@ -1305,7 +1313,7 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll) static void CreateControlButtons() { - Bitmap gd_bitmap = pix[PIX_DOOR]; + Bitmap *gd_bitmap = pix[PIX_DOOR]; struct GadgetInfo *gi; unsigned long event_mask; int i; @@ -1394,6 +1402,7 @@ static void CreateControlButtons() 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); @@ -1451,6 +1460,7 @@ static void CreateControlButtons() 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); @@ -1463,7 +1473,7 @@ static void CreateControlButtons() /* create buttons for element list */ for (i=0; ix + 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)); @@ -3916,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); - 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); - } + RequestExitLevelEditor(TRUE); /* if level has changed, ask user */ break; default: @@ -3984,40 +3994,53 @@ void HandleLevelEditorKeyInput(Key key) { if (letter) DrawLevelText(0, 0, letter, TEXT_WRITECHAR); - else if (key == KEY_Delete || key == KEY_BackSpace) + else if (key == KSYM_Delete || key == KSYM_BackSpace) DrawLevelText(0, 0, 0, TEXT_BACKSPACE); - else if (key == KEY_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 KEY_Left: + case KSYM_Left: id = GADGET_ID_SCROLL_LEFT; break; - case KEY_Right: + case KSYM_Right: id = GADGET_ID_SCROLL_RIGHT; break; - case KEY_Up: + case KSYM_Up: id = GADGET_ID_SCROLL_UP; break; - case KEY_Down: + case KSYM_Down: id = GADGET_ID_SCROLL_DOWN; break; - case KEY_Page_Up: + case KSYM_Page_Up: id = GADGET_ID_SCROLL_LIST_UP; button = MB_RIGHTBUTTON; break; - case KEY_Page_Down: + case KSYM_Page_Down: id = GADGET_ID_SCROLL_LIST_DOWN; 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; } @@ -4025,7 +4048,7 @@ void HandleLevelEditorKeyInput(Key key) ClickOnGadget(level_editor_gadget[id], button); else if (letter == '.') ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button); - else if (key == KEY_space || key == KEY_Return) + else if (key == KSYM_space || key == KSYM_Return) 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(); @@ -4097,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); @@ -4205,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); + } +}