X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Feditor.c;h=fef23e2b5d3ba6fb172af8e1205a82aa10320606;hp=7c4976892e53c51f0c3796312c0aa99f6be592e2;hb=c4baa69cc8d5e8398425e67498b49f4b77f8e477;hpb=046d80f9a1b3fad9d4d3d3aa92dcb3689849aebf diff --git a/src/editor.c b/src/editor.c index 7c497689..fef23e2b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -19,6 +19,8 @@ #include "buttons.h" #include "files.h" +#define CHOICE_DELAY_VALUE 100 + static int level_xpos,level_ypos; static BOOL edit_mode; static BOOL name_typing; @@ -29,6 +31,61 @@ static int new_element3 = EL_ERDREICH; int element_shift; int editor_element[] = { + EL_CHAR_A + ('B' - 'A'), + EL_CHAR_A + ('O' - 'A'), + EL_CHAR_A + ('U' - 'A'), + EL_CHAR_A + ('L' - 'A'), + + EL_CHAR_MINUS, + EL_CHAR_A + ('D' - 'A'), + EL_CHAR_A + ('E' - 'A'), + EL_CHAR_A + ('R' - 'A'), + + EL_CHAR_A + ('D' - 'A'), + EL_CHAR_A + ('A' - 'A'), + EL_CHAR_A + ('S' - 'A'), + EL_CHAR_A + ('H' - 'A'), + + EL_SPIELFIGUR, + EL_LEERRAUM, + EL_ERDREICH, + EL_BETON, + + EL_FELSBODEN, + EL_SIEB2_LEER, + EL_AUSGANG_ZU, + EL_AUSGANG_AUF, + + EL_EDELSTEIN_BD, + EL_BUTTERFLY_O, + EL_FIREFLY_O, + EL_FELSBROCKEN, + + EL_BUTTERFLY_L, + EL_FIREFLY_L, + EL_BUTTERFLY_R, + EL_FIREFLY_R, + + EL_AMOEBE_BD, + EL_BUTTERFLY_U, + EL_FIREFLY_U, + EL_LEERRAUM, + + EL_CHAR_A + ('E' - 'A'), + EL_CHAR_A + ('M' - 'A'), + EL_CHAR_A + ('E' - 'A'), + EL_CHAR_MINUS, + + EL_CHAR_A + ('R' - 'A'), + EL_CHAR_A + ('A' - 'A'), + EL_CHAR_A + ('L' - 'A'), + EL_CHAR_A + ('D' - 'A'), + + EL_CHAR_A + ('M' - 'A'), + EL_CHAR_A + ('I' - 'A'), + EL_CHAR_A + ('N' - 'A'), + EL_CHAR_A + ('E' - 'A'), + EL_SPIELFIGUR, EL_LEERRAUM, EL_ERDREICH, @@ -36,70 +93,54 @@ int editor_element[] = EL_BETON, EL_MAUERWERK, - EL_MAUER_LEBT, EL_FELSBODEN, - EL_SIEB_LEER, - EL_SIEB2_LEER, - EL_KOKOSNUSS, - EL_BOMBE, EL_EDELSTEIN, EL_DIAMANT, - EL_EDELSTEIN2, - EL_EDELSTEIN3, + EL_KOKOSNUSS, + EL_BOMBE, + EL_ERZ_EDEL, + EL_ERZ_DIAM, EL_MORAST_LEER, EL_MORAST_VOLL, + + EL_DYNAMIT_AUS, + EL_DYNAMIT, EL_AUSGANG_ZU, EL_AUSGANG_AUF, - EL_KAEFER, - EL_FLIEGER, EL_MAMPFER, - EL_MAMPFER2, + EL_KAEFER_O, + EL_FLIEGER_O, + EL_ROBOT, - EL_ZOMBIE, - EL_PACMAN, - EL_DYNAMIT_AUS, - EL_DYNAMIT, + EL_KAEFER_L, + EL_FLIEGER_L, + EL_KAEFER_R, + EL_FLIEGER_R, + + EL_ABLENK_AUS, + EL_KAEFER_U, + EL_FLIEGER_U, + EL_UNSICHTBAR, EL_BADEWANNE1, EL_SALZSAEURE, EL_BADEWANNE2, - EL_BADEWANNE, + EL_LEERRAUM, EL_BADEWANNE3, EL_BADEWANNE4, EL_BADEWANNE5, - EL_UNSICHTBAR, + EL_LEERRAUM, EL_TROPFEN, EL_AMOEBE_TOT, EL_AMOEBE_NASS, EL_AMOEBE_NORM, - EL_AMOEBE_VOLL, - EL_LIFE, - EL_LIFE_ASYNC, - EL_ABLENK_AUS, - - EL_ERZ_EDEL, - EL_ERZ_DIAM, - EL_ERZ_EDEL2, - EL_ERZ_EDEL3, - - EL_ZEIT_VOLL, - EL_ZEIT_LEER, - - EL_DYNABOMB_NR, - EL_DYNABOMB_SZ, - -/* - EL_BIRNE_AUS, - EL_BIRNE_EIN, -*/ - EL_SCHLUESSEL1, EL_SCHLUESSEL2, EL_SCHLUESSEL3, @@ -115,20 +156,92 @@ int editor_element[] = EL_PFORTE3X, EL_PFORTE4X, - EL_KAEFER_R, - EL_KAEFER_O, - EL_KAEFER_L, - EL_KAEFER_U, + EL_CHAR_A + ('M' - 'A'), + EL_CHAR_A + ('O' - 'A'), + EL_CHAR_A + ('R' - 'A'), + EL_CHAR_A + ('E' - 'A'), - EL_FLIEGER_R, - EL_FLIEGER_O, - EL_FLIEGER_L, - EL_FLIEGER_U, + EL_PFEIL_L, + EL_PFEIL_R, + EL_PFEIL_O, + EL_PFEIL_U, - EL_PACMAN_R, + EL_AMOEBE_VOLL, + EL_EDELSTEIN_GELB, + EL_EDELSTEIN_ROT, + EL_EDELSTEIN_LILA, + + EL_ERZ_EDEL_BD, + EL_ERZ_EDEL_GELB, + EL_ERZ_EDEL_ROT, + EL_ERZ_EDEL_LILA, + + EL_LIFE, EL_PACMAN_O, + EL_ZEIT_VOLL, + EL_ZEIT_LEER, + EL_PACMAN_L, + EL_MAMPFER2, + EL_PACMAN_R, + EL_MAUER_LEBT, + + EL_LIFE_ASYNC, EL_PACMAN_U, + EL_BIRNE_AUS, + EL_BIRNE_EIN, + + EL_DYNABOMB_NR, + EL_DYNABOMB_SZ, + EL_DYNABOMB_XL, + EL_BADEWANNE, + + EL_MAULWURF, + EL_PINGUIN, + EL_SCHWEIN, + EL_DRACHE, + + EL_SONDE, + EL_LEERRAUM, + EL_LEERRAUM, + EL_LEERRAUM, + + EL_CHAR_A + ('S' - 'A'), + EL_CHAR_A + ('O' - 'A'), + EL_CHAR_A + ('K' - 'A'), + EL_CHAR_A + ('O' - 'A'), + + EL_CHAR_MINUS, + EL_CHAR_A + ('B' - 'A'), + EL_CHAR_A + ('A' - 'A'), + EL_CHAR_A + ('N' - 'A'), + + EL_SOKOBAN_OBJEKT, + EL_SOKOBAN_FELD_LEER, + EL_SOKOBAN_FELD_VOLL, + EL_BETON, + +/* + EL_CHAR_A + ('D' - 'A'), + EL_CHAR_A + ('Y' - 'A'), + EL_CHAR_A + ('N' - 'A'), + EL_CHAR_A + ('A' - 'A'), + + EL_CHAR_A + ('B' - 'A'), + EL_CHAR_A + ('L' - 'A'), + EL_CHAR_A + ('A' - 'A'), + EL_CHAR_A + ('S' - 'A'), + + EL_CHAR_MINUS, + EL_CHAR_A + ('T' - 'A'), + EL_CHAR_A + ('E' - 'A'), + EL_CHAR_A + ('R' - 'A'), +*/ + + EL_LEERRAUM, + EL_LEERRAUM, + EL_LEERRAUM, + EL_LEERRAUM, EL_CHAR_AUSRUF, EL_CHAR_ZOLL, @@ -239,26 +352,26 @@ void DrawLevelEd() else graphic = GFX_LEERRAUM; - DrawMiniGraphicExtHiRes(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_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); } - DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc, - DOOR_GFX_PAGEX1+ED_WIN_MB_LEFT_XPOS, - DOOR_GFX_PAGEY1+ED_WIN_MB_LEFT_YPOS, - el2gfx(new_element1)); - DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc, - DOOR_GFX_PAGEX1+ED_WIN_MB_MIDDLE_XPOS, - DOOR_GFX_PAGEY1+ED_WIN_MB_MIDDLE_YPOS, - el2gfx(new_element2)); - DrawMiniGraphicExtHiRes(pix[PIX_DB_DOOR],gc, - DOOR_GFX_PAGEX1+ED_WIN_MB_RIGHT_XPOS, - DOOR_GFX_PAGEY1+ED_WIN_MB_RIGHT_YPOS, - el2gfx(new_element3)); + 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, @@ -490,7 +603,7 @@ void FloodFill(int from_x, int from_y, int fill_element) { int i,x,y; int old_element; - static int check[4][2] = { -1,0, 0,-1, 1,0, 0,1 }; + static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} }; static int safety = 0; safety++; @@ -558,69 +671,61 @@ void LevelEd(int mx, int my, int button) } else /********** EDIT/CTRL-FENSTER **********/ { + static long choice_delay = 0; int choice = CheckElemButtons(mx,my,button); int elem_pos = choice-ED_BUTTON_ELEM; - switch(choice) + if (((choice == ED_BUTTON_EUP && element_shift>0) || + (choice == ED_BUTTON_EDOWN && + element_shift0) || - (choice==ED_BUTTON_EDOWN && - element_shiftelements_in_list-MAX_ELEM_X*MAX_ELEM_Y) - element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y; - if (element_shift % MAX_ELEM_X) - element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X); - - for(i=0;i=0 && elem_poselements_in_list-MAX_ELEM_X*MAX_ELEM_Y) + element_shift = elements_in_list-MAX_ELEM_X*MAX_ELEM_Y; + if (element_shift % MAX_ELEM_X) + element_shift += MAX_ELEM_X-(element_shift % MAX_ELEM_X); + + for(i=0;i=0 && elem_pos=0) { + if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + break; if (lev_fieldx<2*SCR_FIELDX-2) break; @@ -653,13 +760,13 @@ void LevelEd(int mx, int my, int button) ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_RIGHT); else DrawMiniLevel(level_xpos,level_ypos); - BackToFront(); - Delay(100000); } break; case ED_BUTTON_RIGHT: if (level_xpos<=lev_fieldx-2*SCR_FIELDX) { + if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + break; if (lev_fieldx<2*SCR_FIELDX-2) break; @@ -670,13 +777,13 @@ void LevelEd(int mx, int my, int button) ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_LEFT); else DrawMiniLevel(level_xpos,level_ypos); - BackToFront(); - Delay(100000); } break; case ED_BUTTON_UP: if (level_ypos>=0) { + if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + break; if (lev_fieldy<2*SCR_FIELDY-2) break; @@ -687,13 +794,13 @@ void LevelEd(int mx, int my, int button) ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_DOWN); else DrawMiniLevel(level_xpos,level_ypos); - BackToFront(); - Delay(100000); } break; case ED_BUTTON_DOWN: if (level_ypos<=lev_fieldy-2*SCR_FIELDY) { + if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + break; if (lev_fieldy<2*SCR_FIELDY-2) break; @@ -704,8 +811,6 @@ void LevelEd(int mx, int my, int button) ScrollMiniLevel(level_xpos,level_ypos,ED_SCROLL_UP); else DrawMiniLevel(level_xpos,level_ypos); - BackToFront(); - Delay(100000); } break; default: @@ -758,11 +863,11 @@ void LevelEd(int mx, int my, int button) } else /********** KONTROLL-FENSTER **********/ { - static long choice_delay = 0; int choice = CheckCountButtons(mx,my,button); int step = (button==1 ? 1 : button==2 ? 5 : button==3 ? 10 : 0); - if (choice>=0 && choice<36 && DelayReached(&choice_delay,10)) + if (choice >= 0 && choice < 36 && + DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) { if (!(choice % 2)) step = -step; @@ -910,7 +1015,8 @@ void LevelEd(int mx, int my, int button) } break; case ED_BUTTON_UNDO: - if (AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN)) + if (leveldir[leveldir_nr].readonly || + AreYouSure("Exit without saving ?",AYS_ASK | AYS_STAY_OPEN)) { CloseDoor(DOOR_CLOSE_BOTH); game_status=MAINMENU; @@ -925,6 +1031,13 @@ void LevelEd(int mx, int my, int button) case ED_BUTTON_EXIT: { int figur_vorhanden = FALSE; + + if (leveldir[leveldir_nr].readonly) + { + AreYouSure("This level is read only !",AYS_CONFIRM); + break; + } + for(y=0;y0) + else if ((key==XK_Delete || key==XK_BackSpace) && len>0) { level.name[len-1] = 0; len--;