X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=36003a113e49271edcd56479f2101848d124aa08;hb=bd0a94b2fe778016135d2ebc4fd3c84d3b72b62f;hp=bcecaa8848529d57450a55acb412473da730a1b5;hpb=b5d58347438b481c0f071df7281a1453566951ba;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index bcecaa88..36003a11 100644 --- a/src/editor.c +++ b/src/editor.c @@ -17,6 +17,7 @@ #include "misc.h" #include "buttons.h" #include "files.h" +#include "game.h" /* positions in the level editor */ #define ED_WIN_MB_LEFT_XPOS 7 @@ -35,11 +36,17 @@ #define ED_SCROLL_UP 4 #define ED_SCROLL_DOWN 8 -/* delay value to avoid too fast scrolling etc. */ -#define CHOICE_DELAY_VALUE 100 +/* screens in the level editor */ +#define ED_MODE_DRAWING 0 +#define ED_MODE_INFO 1 +#define ED_MODE_PROPERTIES 2 /* how many steps can be cancelled */ -#define NUM_UNDO_STEPS 10 +#define NUM_UNDO_STEPS (10 + 1) + +/* values for random placement */ +#define RANDOM_USE_PERCENTAGE 0 +#define RANDOM_USE_NUM_OBJECTS 1 /* values for the control window */ #define ED_CTRL_BUTTONS_GFX_YPOS 236 @@ -59,7 +66,13 @@ #define ED_NUM_CTRL2_BUTTONS (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT) #define ED_NUM_CTRL_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS) -/* control button names */ +/* values for other gadgets */ +#define ED_SCORE_XPOS TILEX +#define ED_SCORE_YPOS (7 * TILEY) +#define ED_COUNT_VALUE_XOFFSET 5 +#define ED_COUNT_VALUE_YOFFSET 3 + +/* control button identifiers */ #define ED_CTRL_ID_SINGLE_ITEMS 0 #define ED_CTRL_ID_CONNECTED_ITEMS 1 #define ED_CTRL_ID_LINE 2 @@ -67,7 +80,7 @@ #define ED_CTRL_ID_RECTANGLE 4 #define ED_CTRL_ID_FILLED_BOX 5 #define ED_CTRL_ID_WRAP_UP 6 -#define ED_CTRL_ID_ITEM_PROPERTIES 7 +#define ED_CTRL_ID_PROPERTIES 7 #define ED_CTRL_ID_FLOOD_FILL 8 #define ED_CTRL_ID_WRAP_LEFT 9 #define ED_CTRL_ID_WRAP_RIGHT 11 @@ -81,20 +94,60 @@ #define ED_CTRL_ID_TEST 20 #define ED_CTRL_ID_EXIT 21 +/* counter button identifiers */ +#define ED_CTRL_ID_SCORE_DOWN 22 +#define ED_CTRL_ID_SCORE_UP 23 + +/* drawing area identifiers */ +#define ED_CTRL_ID_DRAWING_LEVEL 24 + +#define ED_NUM_GADGETS 25 + +/* values for counter gadgets */ +#define ED_COUNTER_SCORE 0 + +#define ED_NUM_COUNTERS 1 + +static struct +{ + int x, y; + int gadget_id; +} counter_info[ED_NUM_COUNTERS] = +{ + { ED_SCORE_XPOS, ED_SCORE_YPOS, ED_CTRL_ID_SCORE_DOWN } +}; + /* forward declaration for internal use */ -void HandleDrawingFunction(int, int, int); +static void DrawDrawingWindow(); +static void DrawPropertiesWindow(int); +static void CopyLevelToUndoBuffer(); +static void HandleDrawingAreas(struct GadgetInfo *); +static void HandleCounterButtons(struct GadgetInfo *); +static void HandleControlButtons(struct GadgetInfo *); -static struct GadgetInfo *control_button_gadget[ED_NUM_CTRL_BUTTONS]; -static boolean control_button_gadgets_created = FALSE; +static struct GadgetInfo *level_editor_gadget[ED_NUM_GADGETS]; +static boolean level_editor_gadgets_created = FALSE; static int drawing_function = ED_CTRL_ID_SINGLE_ITEMS; +static short OrigBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY]; static int undo_buffer_position = 0; static int undo_buffer_steps = 0; +static int random_placement_percentage = 10; +static int random_placement_num_objects = 10; +#if 0 +static int random_placement_method = RANDOM_USE_PERCENTAGE; +#else +static int random_placement_method = RANDOM_USE_NUM_OBJECTS; +#endif + +/* pointer to score value */ +static int *gadget_score_value; + static int level_xpos,level_ypos; -static boolean edit_mode; +static int edit_mode; static boolean name_typing; static int new_element1 = EL_MAUERWERK; static int new_element2 = EL_LEERRAUM; @@ -396,7 +449,7 @@ int editor_element[] = }; int elements_in_list = sizeof(editor_element)/sizeof(int); -void ScrollMiniLevel(int from_x, int from_y, int scroll) +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); @@ -423,224 +476,18 @@ void ScrollMiniLevel(int from_x, int from_y, int scroll) BackToFront(); } -void HandlePressedControlButtons() -{ - static unsigned long button_delay = 0; - int i = 0; - - /* buttons with action when held pressed */ - int gadget_id[] = - { - ED_CTRL_ID_WRAP_UP, - ED_CTRL_ID_WRAP_LEFT, - ED_CTRL_ID_WRAP_RIGHT, - ED_CTRL_ID_WRAP_DOWN, - -1 - }; - - if (!DelayReached(&button_delay, CHOICE_DELAY_VALUE)) - return; - - while (gadget_id[i] != -1) - { - int id = gadget_id[i++]; - int state = control_button_gadget[id]->state; - int button = control_button_gadget[id]->event.button; - int step = (button == 1 ? 1 : button == 2 ? 5 : 10); - - if (state != GD_BUTTON_PRESSED) - continue; - - switch (id) - { - case ED_CTRL_ID_WRAP_LEFT: - if (level_xpos >= 0) - { - if (lev_fieldx < 2*SCR_FIELDX - 2) - break; - - level_xpos -= step; - if (level_xpos <- 1) - level_xpos = -1; - if (button == 1) - ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_RIGHT); - else - DrawMiniLevel(level_xpos, level_ypos); - } - break; - - case ED_CTRL_ID_WRAP_RIGHT: - if (level_xpos <= lev_fieldx - 2*SCR_FIELDX) - { - if (lev_fieldx < 2*SCR_FIELDX - 2) - break; - - level_xpos += step; - if (level_xpos > lev_fieldx - 2*SCR_FIELDX + 1) - level_xpos = lev_fieldx - 2*SCR_FIELDX + 1; - if (button == 1) - ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_LEFT); - else - DrawMiniLevel(level_xpos, level_ypos); - } - break; - - case ED_CTRL_ID_WRAP_UP: - if (level_ypos >= 0) - { - if (lev_fieldy < 2*SCR_FIELDY - 2) - break; - - level_ypos -= step; - if (level_ypos < -1) - level_ypos = -1; - if (button == 1) - ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_DOWN); - else - DrawMiniLevel(level_xpos, level_ypos); - } - break; - - case ED_CTRL_ID_WRAP_DOWN: - if (level_ypos <= lev_fieldy - 2*SCR_FIELDY) - { - if (lev_fieldy < 2*SCR_FIELDY - 2) - break; - - level_ypos += step; - if (level_ypos > lev_fieldy - 2*SCR_FIELDY + 1) - level_ypos = lev_fieldy - 2*SCR_FIELDY + 1; - if (button == 1) - ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_UP); - else - DrawMiniLevel(level_xpos, level_ypos); - } - break; - - default: - break; - } - } -} - -void HandleLevelEditorControlButtons(struct GadgetInfo *gi) +void InitLevelEditorGadgets() { - int event_type = gi->event.type; - - /* - int button = gi->event.button; - */ - - int id; - int i, x, y; - - /* get the button id */ - for (i=0; iid == control_button_gadget[i]->id) - id = i; - - switch (id) - { - case ED_CTRL_ID_SINGLE_ITEMS: - case ED_CTRL_ID_CONNECTED_ITEMS: - case ED_CTRL_ID_LINE: - case ED_CTRL_ID_TEXT: - case ED_CTRL_ID_RECTANGLE: - case ED_CTRL_ID_FILLED_BOX: - case ED_CTRL_ID_FLOOD_FILL: - case ED_CTRL_ID_RANDOM_PLACEMENT: - case ED_CTRL_ID_BRUSH: - drawing_function = id; - break; - - case ED_CTRL_ID_CLEAR: - if (Request("Are you sure to clear this level ?", REQ_ASK)) - { - for(x=0; xevent.type; + + printf("HandleControlButtons: (%d,%d) (%d,%d) [%d] ", + gi->x, gi->y, + gi->event.x, gi->event.y, gi->event.button); + + if (event_type == GD_EVENT_PRESSED) + printf("GD_EVENT_PRESSED\n"); + else if (event_type == GD_EVENT_RELEASED) + printf("GD_EVENT_RELEASED\n"); + else if (event_type == GD_EVENT_MOVING) + printf("GD_EVENT_MOVING\n"); + else + printf("?\n"); } -void MapLevelEditorControlButtons() +#endif + + + +static void CreateCounterButtons(int counter_id) { int i; - if (!control_button_gadgets_created) - CreateLevelEditorControlButtons(); + for (i=0; i<2; i++) + { + Pixmap gd_pixmap = pix[PIX_DOOR]; + struct GadgetInfo *gi; + int gd_xoffset; + int gd_x1, gd_x2, gd_y; + int id = counter_info[counter_id].gadget_id + i; + unsigned long event_mask; + + event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; - for (i=0; ilev_fieldx-2*SCR_FIELDX+1) - level_xpos = lev_fieldx-2*SCR_FIELDX+1; - if (lev_fieldx<2*SCR_FIELDX-2) + if (level_xpos > lev_fieldx - 2*SCR_FIELDX + 1) + level_xpos = lev_fieldx - 2*SCR_FIELDX + 1; + if (lev_fieldx < 2*SCR_FIELDX - 2) level_xpos = -1; - if (level_ypos<-1) + if (level_ypos < -1) level_ypos = -1; - if (level_ypos>lev_fieldy-2*SCR_FIELDY+1) - level_ypos = lev_fieldy-2*SCR_FIELDY+1; - if (lev_fieldy<2*SCR_FIELDY-2) + if (level_ypos > lev_fieldy - 2*SCR_FIELDY + 1) + level_ypos = lev_fieldy - 2*SCR_FIELDY + 1; + if (lev_fieldy < 2*SCR_FIELDY - 2) level_ypos = -1; } @@ -1017,9 +999,10 @@ void LevelEd(int mx, int my, int button) int y = (my-SY)/MINI_TILEY; */ - + /* HandlePressedControlButtons(); - HandleDrawingFunction(mx, my, button); + HandleDrawingFunctions(mx, my, button); + */ if (use_floodfill) /********** FLOOD FILL **********/ { @@ -1071,7 +1054,7 @@ void LevelEd(int mx, int my, int button) if (((choice == ED_BUTTON_EUP && element_shift>0) || (choice == ED_BUTTON_EDOWN && element_shift=0) { - if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY)) break; if (lev_fieldx<2*SCR_FIELDX-2) break; @@ -1163,7 +1149,7 @@ void LevelEd(int mx, int my, int button) case ED_BUTTON_RIGHT: if (level_xpos<=lev_fieldx-2*SCR_FIELDX) { - if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY)) break; if (lev_fieldx<2*SCR_FIELDX-2) break; @@ -1180,7 +1166,7 @@ void LevelEd(int mx, int my, int button) case ED_BUTTON_UP: if (level_ypos>=0) { - if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY)) break; if (lev_fieldy<2*SCR_FIELDY-2) break; @@ -1197,7 +1183,7 @@ void LevelEd(int mx, int my, int button) case ED_BUTTON_DOWN: if (level_ypos<=lev_fieldy-2*SCR_FIELDY) { - if (!DelayReached(&choice_delay, CHOICE_DELAY_VALUE)) + if (!DelayReached(&choice_delay, GADGET_FRAME_DELAY)) break; if (lev_fieldy<2*SCR_FIELDY-2) break; @@ -1270,13 +1256,13 @@ void LevelEd(int mx, int my, int button) } - else /********** KONTROLL-FENSTER **********/ + else if (edit_mode == ED_MODE_INFO)/********** KONTROLL-FENSTER **********/ { 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, CHOICE_DELAY_VALUE)) + DelayReached(&choice_delay, GADGET_FRAME_DELAY)) { if (!(choice % 2)) step = -step; @@ -1416,7 +1402,7 @@ void LevelEd(int mx, int my, int button) VXSIZE,VYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2); OpenDoor(DOOR_OPEN_2); - edit_mode = TRUE; + edit_mode = ED_MODE_DRAWING; break; case ED_BUTTON_CLEAR: if (Request("Are you sure to clear this level ?",REQ_ASK)) @@ -1431,7 +1417,7 @@ void LevelEd(int mx, int my, int button) if (leveldir[leveldir_nr].readonly || Request("Exit without saving ?",REQ_ASK | REQ_STAY_OPEN)) { - CloseDoor(DOOR_CLOSE_BOTH); + CloseDoor(DOOR_CLOSE_ALL); game_status=MAINMENU; DrawMainMenu(); } @@ -1469,7 +1455,7 @@ void LevelEd(int mx, int my, int button) Ur[x][y]=Feld[x][y]; SaveLevel(level_nr); } - CloseDoor(DOOR_CLOSE_BOTH); + CloseDoor(DOOR_CLOSE_ALL); game_status=MAINMENU; DrawMainMenu(); } @@ -1665,6 +1651,124 @@ void LevelNameTyping(KeySym key) } } +static void DrawCounterValueField(int counter_id, int value) +{ + int x = SX + counter_info[counter_id].x + ED_WIN_COUNT_XPOS; + int y = SY + counter_info[counter_id].y; + + XCopyArea(display, pix[PIX_DOOR], drawto, gc, + DOOR_GFX_PAGEX4 + ED_WIN_COUNT_XPOS, + DOOR_GFX_PAGEY1 + ED_WIN_COUNT_YPOS, + ED_WIN_COUNT_XSIZE, ED_WIN_COUNT_YSIZE, + x, y); + + DrawText(x + ED_COUNT_VALUE_XOFFSET, y + ED_COUNT_VALUE_YOFFSET, + int2str(value, 3), FS_SMALL, FC_YELLOW); +} + +#define TEXT_COLLECTING "Score for collecting" +#define TEXT_SMASHING "Score for smashing" +#define TEXT_CRACKING "Score for cracking" +#define TEXT_SPEED "Speed of growth" +#define TEXT_DURATION "Duration when activated" + +static void DrawDrawingWindow() +{ + ClearWindow(); + UnmapLevelEditorWindowGadgets(); + MapMainDrawingArea(); + AdjustLevelScrollPosition(); + DrawMiniLevel(level_xpos, level_ypos); +} + +static void DrawPropertiesWindow(int element) +{ + int i, x, y; + int num_elements_in_level; + 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_LEER, &level.dauer_sieb, TEXT_DURATION }, + { EL_ABLENK_AUS, &level.dauer_ablenk, TEXT_DURATION }, + { -1, NULL, NULL } + }; + + ClearWindow(); + UnmapLevelEditorWindowGadgets(); + + DrawGraphic(1, 1, el2gfx(element)); + DrawText(SX + 3*TILEX, SY + 5*TILEY/4, "Element Properties", + FS_SMALL, FC_YELLOW); + + num_elements_in_level = 0; + for(y=0; y 0) + { + x = RND(lev_fieldx); + y = RND(lev_fieldy); + + if (Feld[x][y] != new_element) + { + Feld[x][y] = new_element; + elements_left--; + } + } + } + + DrawMiniLevel(level_xpos, level_ypos); +} + +static void HandleDrawingAreas(struct GadgetInfo *gi) +{ + static boolean started_inside_drawing_area = FALSE; + boolean inside_drawing_area; boolean button_press_event; boolean button_release_event; - boolean copy_to_undo_buffer = FALSE; int new_element; - int sx = (mx - SX) / MINI_TILEX; - int sy = (my - SY) / MINI_TILEY; - int lx = sx + level_xpos; - int ly = sy + level_ypos; + int button = gi->event.button; + int mx = SX + gi->event.x * MINI_TILEX; + int my = SX + gi->event.y * MINI_TILEY; + int min_mx = SX, max_mx = SX + SXSIZE -1; + int min_my = SY, max_my = SY + SYSIZE -1; + int sx, sy; + int lx, ly; int x, y; - button_press_event = (last_button == 0 && button != 0); - button_release_event = (last_button != 0 && button == 0); - last_button = button; + if (edit_mode != ED_MODE_DRAWING) + return; + + button_press_event = (gi->event.type == GD_EVENT_PRESSED); + button_release_event = (gi->event.type == GD_EVENT_RELEASED); + + inside_drawing_area = + (mx >= min_mx && mx <= max_mx && my >= min_my && my <= max_my); - if (mx < SX || mx >= SX + SXSIZE || my < SY || my >= SY + SYSIZE) + mx = (mx < min_mx ? min_mx : mx > max_mx ? max_mx : mx); + my = (my < min_my ? min_my : my > max_my ? max_my : my); + sx = (mx - SX) / MINI_TILEX; + sy = (my - SY) / MINI_TILEY; + lx = sx + level_xpos; + ly = sy + level_ypos; + + if (button_press_event) + started_inside_drawing_area = inside_drawing_area; + + if (!started_inside_drawing_area) return; - if (sx > lev_fieldx || sy > lev_fieldy || + printf("%d,%d, %d,%d, %d,%d, %d,%d.\n", + gi->event.x, gi->event.y, mx, my, sx, sy, lx, ly); + + if ((!button && !button_release_event) || + sx > lev_fieldx || sy > lev_fieldy || (sx == 0 && level_xpos<0) || (sx == 2*SCR_FIELDX - 1 && level_xpos > lev_fieldx - 2*SCR_FIELDX) || (sy == 0 && level_ypos < 0) || @@ -1846,7 +2027,7 @@ void HandleDrawingFunction(int mx, int my, int button) { case ED_CTRL_ID_SINGLE_ITEMS: if (button_release_event) - copy_to_undo_buffer = TRUE; + CopyLevelToUndoBuffer(); if (!button) break; @@ -1882,7 +2063,7 @@ void HandleDrawingFunction(int mx, int my, int button) static int last_sy = -1; if (button_release_event) - copy_to_undo_buffer = TRUE; + CopyLevelToUndoBuffer(); if (button) { @@ -1916,11 +2097,12 @@ void HandleDrawingFunction(int mx, int my, int button) { last_sx = start_sx = sx; last_sy = start_sy = sy; + draw_func(sx, sy, sx, sy, new_element, FALSE); } else if (button_release_event) { - draw_func(start_sx, start_sy, sx, sy, last_element, TRUE); - copy_to_undo_buffer = TRUE; + draw_func(start_sx, start_sy, sx, sy, new_element, TRUE); + CopyLevelToUndoBuffer(); } else if (last_sx != sx || last_sy != sy) { @@ -1932,65 +2114,418 @@ void HandleDrawingFunction(int mx, int my, int button) } break; - case 999: + case ED_CTRL_ID_FLOOD_FILL: + if (button_press_event && Feld[lx][ly] != new_element) { - static int last_sx = -1; - static int last_sy = -1; + FloodFill(lx, ly, new_element); + DrawMiniLevel(level_xpos, level_ypos); + CopyLevelToUndoBuffer(); + } + break; - if (last_sx == -1) - { - Feld[lx][ly] = new_element; - DrawMiniElement(sx, sy, new_element); + default: + break; + } +} - last_sx = sx; - last_sy = sy; - } - else if (last_sx != sx || last_sy != sy) - { - DrawLine(last_sx, last_sy, sx, sy, new_element, TRUE); - last_sx = -1; - last_sy = -1; - } - /* - last_sx = sx; - last_sy = sy; - */ - } +#if 0 + +static void HandlePressedControlButtons() +{ + static unsigned long button_delay = 0; + int i; + + /* buttons with action when held pressed */ + int gadget_id[] = + { + ED_CTRL_ID_WRAP_UP, + ED_CTRL_ID_WRAP_LEFT, + ED_CTRL_ID_WRAP_RIGHT, + ED_CTRL_ID_WRAP_DOWN, + ED_CTRL_ID_SCORE_DOWN, + ED_CTRL_ID_SCORE_UP, + -1 + }; + + if (!DelayReached(&button_delay, GADGET_FRAME_DELAY)) + return; + + for (i=0; gadget_id[i] != -1; i++) + { + int id = gadget_id[i]; + int state = level_editor_gadget[id]->state; + int button = level_editor_gadget[id]->event.button; + int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + + if (state != GD_BUTTON_PRESSED) + continue; + + switch (id) + { + case ED_CTRL_ID_WRAP_LEFT: + if (level_xpos >= 0) + { + if (lev_fieldx < 2*SCR_FIELDX - 2) + break; + + level_xpos -= step; + if (level_xpos <- 1) + level_xpos = -1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_RIGHT); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_RIGHT: + if (level_xpos <= lev_fieldx - 2*SCR_FIELDX) + { + if (lev_fieldx < 2*SCR_FIELDX - 2) + break; + + level_xpos += step; + if (level_xpos > lev_fieldx - 2*SCR_FIELDX + 1) + level_xpos = lev_fieldx - 2*SCR_FIELDX + 1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_LEFT); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_UP: + if (level_ypos >= 0) + { + if (lev_fieldy < 2*SCR_FIELDY - 2) + break; + + level_ypos -= step; + if (level_ypos < -1) + level_ypos = -1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_DOWN); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_DOWN: + if (level_ypos <= lev_fieldy - 2*SCR_FIELDY) + { + if (lev_fieldy < 2*SCR_FIELDY - 2) + break; + + level_ypos += step; + if (level_ypos > lev_fieldy - 2*SCR_FIELDY + 1) + level_ypos = lev_fieldy - 2*SCR_FIELDY + 1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_UP); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_SCORE_DOWN: + case ED_CTRL_ID_SCORE_UP: + *gadget_score_value += (id == ED_CTRL_ID_SCORE_DOWN ? -step : step); + if (*gadget_score_value < 0) + *gadget_score_value = 0; + else if (*gadget_score_value > 255) + *gadget_score_value = 255; + + DrawCounterValueField(ED_COUNTER_SCORE, *gadget_score_value); + break; + + default: + break; + } + } +} + +#endif + + + +static void HandleCounterButtons(struct GadgetInfo *gi) +{ + int id = gi->custom_id; + int button = gi->event.button; + int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + + switch (id) + { + case ED_CTRL_ID_SCORE_DOWN: + case ED_CTRL_ID_SCORE_UP: + *gadget_score_value += (id == ED_CTRL_ID_SCORE_DOWN ? -step : step); + if (*gadget_score_value < 0) + *gadget_score_value = 0; + else if (*gadget_score_value > 255) + *gadget_score_value = 255; + + DrawCounterValueField(ED_COUNTER_SCORE, *gadget_score_value); + break; + + default: break; + } +} + +static void HandleControlButtons(struct GadgetInfo *gi) +{ + int id = gi->custom_id; + int button = gi->event.button; + int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + int new_element; + int player_present = FALSE; + int level_changed = FALSE; + int x, y; + new_element = (button == 1 ? new_element1 : + button == 2 ? new_element2 : + button == 3 ? new_element3 : 0); + + if (id < ED_NUM_CTRL1_BUTTONS && edit_mode != ED_MODE_DRAWING) + { + DrawDrawingWindow(); + edit_mode = ED_MODE_DRAWING; + } + + switch (id) + { + case ED_CTRL_ID_SINGLE_ITEMS: + case ED_CTRL_ID_CONNECTED_ITEMS: + case ED_CTRL_ID_LINE: + case ED_CTRL_ID_TEXT: + case ED_CTRL_ID_RECTANGLE: + case ED_CTRL_ID_FILLED_BOX: case ED_CTRL_ID_FLOOD_FILL: - if (!button) + case ED_CTRL_ID_BRUSH: + drawing_function = id; + break; + + case ED_CTRL_ID_WRAP_LEFT: + if (level_xpos >= 0) + { + if (lev_fieldx < 2*SCR_FIELDX - 2) + break; + + level_xpos -= step; + if (level_xpos <- 1) + level_xpos = -1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_RIGHT); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_RIGHT: + if (level_xpos <= lev_fieldx - 2*SCR_FIELDX) + { + if (lev_fieldx < 2*SCR_FIELDX - 2) + break; + + level_xpos += step; + if (level_xpos > lev_fieldx - 2*SCR_FIELDX + 1) + level_xpos = lev_fieldx - 2*SCR_FIELDX + 1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_LEFT); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_UP: + if (level_ypos >= 0) + { + if (lev_fieldy < 2*SCR_FIELDY - 2) + break; + + level_ypos -= step; + if (level_ypos < -1) + level_ypos = -1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_DOWN); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_WRAP_DOWN: + if (level_ypos <= lev_fieldy - 2*SCR_FIELDY) + { + if (lev_fieldy < 2*SCR_FIELDY - 2) + break; + + level_ypos += step; + if (level_ypos > lev_fieldy - 2*SCR_FIELDY + 1) + level_ypos = lev_fieldy - 2*SCR_FIELDY + 1; + if (button == 1) + ScrollMiniLevel(level_xpos, level_ypos, ED_SCROLL_UP); + else + DrawMiniLevel(level_xpos, level_ypos); + } + break; + + case ED_CTRL_ID_PROPERTIES: + DrawPropertiesWindow(new_element); + edit_mode = ED_MODE_PROPERTIES; + break; + + case ED_CTRL_ID_RANDOM_PLACEMENT: + RandomPlacement(button); + CopyLevelToUndoBuffer(); + break; + + case ED_CTRL_ID_UNDO: + if (undo_buffer_steps == 0) + { + Request("Undo buffer empty !", REQ_CONFIRM); break; + } - if (button_press_event && Feld[lx][ly] != new_element) + undo_buffer_position = + (undo_buffer_position - 1 + NUM_UNDO_STEPS) % NUM_UNDO_STEPS; + undo_buffer_steps--; + + for(x=0; xevent.type == GD_EVENT_PRESSED) + printf("default: HandleControlButtons: GD_EVENT_PRESSED\n"); + else if (gi->event.type == GD_EVENT_RELEASED) + printf("default: HandleControlButtons: GD_EVENT_RELEASED\n"); + else if (gi->event.type == GD_EVENT_MOVING) + printf("default: HandleControlButtons: GD_EVENT_MOVING\n"); + else + printf("default: HandleControlButtons: ?\n"); + break; } }