X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fscreens.c;h=b4f2e5fc8d46003189d0d2abf4c0435be3226116;hp=dd7f2b4bd2204cc64a7931b1d0fe271ee166e2ac;hb=12677c5a393c075d0f2d8ff25604e44e310763df;hpb=bb39d750f3dfc6a931aa21cd3400c80cbb600676 diff --git a/src/screens.c b/src/screens.c index dd7f2b4b..b4f2e5fc 100644 --- a/src/screens.c +++ b/src/screens.c @@ -181,14 +181,18 @@ #define SCREEN_CTRL_ID_NEXT_PLAYER 6 #define SCREEN_CTRL_ID_INSERT_SOLUTION 7 #define SCREEN_CTRL_ID_PLAY_SOLUTION 8 -#define SCREEN_CTRL_ID_SCROLL_UP 9 -#define SCREEN_CTRL_ID_SCROLL_DOWN 10 -#define SCREEN_CTRL_ID_SCROLL_VERTICAL 11 -#define SCREEN_CTRL_ID_NETWORK_SERVER 12 - -#define NUM_SCREEN_GADGETS 13 - -#define NUM_SCREEN_MENUBUTTONS 9 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 9 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 10 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 11 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 12 +#define SCREEN_CTRL_ID_SCROLL_UP 13 +#define SCREEN_CTRL_ID_SCROLL_DOWN 14 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 15 +#define SCREEN_CTRL_ID_NETWORK_SERVER 16 + +#define NUM_SCREEN_GADGETS 17 + +#define NUM_SCREEN_MENUBUTTONS 13 #define NUM_SCREEN_SCROLLBUTTONS 2 #define NUM_SCREEN_SCROLLBARS 1 #define NUM_SCREEN_TEXTINPUT 1 @@ -196,6 +200,8 @@ #define SCREEN_MASK_MAIN (1 << 0) #define SCREEN_MASK_MAIN_HAS_SOLUTION (1 << 1) #define SCREEN_MASK_INPUT (1 << 2) +#define SCREEN_MASK_TOUCH (1 << 3) +#define SCREEN_MASK_TOUCH2 (1 << 4) // graphic position and size values for buttons and scrollbars #define SC_MENUBUTTON_XSIZE TILEX @@ -258,6 +264,7 @@ static void ModifyGameSpeedIfNeeded(void); static void DisableVsyncIfNeeded(void); static void MapScreenMenuGadgets(int); +static void UnmapScreenMenuGadgets(int); static void MapScreenGadgets(int); static void MapScreenTreeGadgets(TreeInfo *); @@ -988,6 +995,7 @@ static struct TitleFadingInfo getTitleFading(struct TitleControlInfo *tci) ti.fade_delay = tmi.fade_delay; ti.post_delay = tmi.post_delay; ti.auto_delay = tmi.auto_delay; + ti.auto_delay_unit = tmi.auto_delay_unit; return ti; } @@ -1704,6 +1712,25 @@ static void gotoTopLevelDir(void) } } +static unsigned int getAutoDelayCounter(struct TitleFadingInfo *fi) +{ + boolean use_frame_counter = (fi->auto_delay_unit == AUTO_DELAY_UNIT_FRAMES); + + return (use_frame_counter ? video.frame_counter : Counter()); +} + +static boolean TitleAutoDelayReached(unsigned int *counter_var, + struct TitleFadingInfo *fi) +{ + return DelayReachedExt(counter_var, fi->auto_delay, getAutoDelayCounter(fi)); +} + +static void ResetTitleAutoDelay(unsigned int *counter_var, + struct TitleFadingInfo *fi) +{ + *counter_var = getAutoDelayCounter(fi); +} + void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { static unsigned int title_delay = 0; @@ -1778,12 +1805,12 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) FadeIn(REDRAW_ALL); - DelayReached(&title_delay, 0); // reset delay counter + ResetTitleAutoDelay(&title_delay, &fading); return; } - if (fading.auto_delay > 0 && DelayReached(&title_delay, fading.auto_delay)) + if (fading.auto_delay > 0 && TitleAutoDelayReached(&title_delay, &fading)) button = MB_MENU_CHOICE; if (button == MB_MENU_LEAVE) @@ -1841,7 +1868,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) FadeIn(REDRAW_ALL); - DelayReached(&title_delay, 0); // reset delay counter + ResetTitleAutoDelay(&title_delay, &fading); } else { @@ -7865,6 +7892,22 @@ void ConfigureJoystick(int player_nr) DrawSetupScreen_Input(); } +static void MapScreenMenuGadgets_OverlayTouchButtons(int y) +{ + if (y < video.screen_height / 3) + { + // remap touch gadgets to access upper part of the screen + UnmapScreenMenuGadgets(SCREEN_MASK_TOUCH); + MapScreenMenuGadgets(SCREEN_MASK_TOUCH2); + } + else if (y > 2 * video.screen_height / 3) + { + // remap touch gadgets to access lower part of the screen + MapScreenMenuGadgets(SCREEN_MASK_TOUCH); + UnmapScreenMenuGadgets(SCREEN_MASK_TOUCH2); + } +} + static boolean ConfigureVirtualButtonsMain(void) { static char *customize_step_text[] = @@ -7885,6 +7928,13 @@ static boolean ConfigureVirtualButtonsMain(void) CHAR_GRID_BUTTON_SNAP, CHAR_GRID_BUTTON_DROP }; + enum + { + ACTION_NONE, + ACTION_ESCAPE, + ACTION_BACK, + ACTION_NEXT + }; int font_nr = FONT_INPUT_1_ACTIVE; int font_height = getFontHeight(font_nr); int ypos1 = SYSIZE / 2 - font_height * 2; @@ -7918,80 +7968,45 @@ static boolean ConfigureVirtualButtonsMain(void) SetOverlayShowGrid(TRUE); + // map gadgets for setup touch buttons menu screen + MapScreenMenuGadgets(SCREEN_MASK_TOUCH); + while (!finished) { Event event; while (NextValidEvent(&event)) { + int action = ACTION_NONE; + + // ---------- handle events and set the resulting action ---------- + switch (event.type) { + case EVENT_USER: + { + UserEvent *user = (UserEvent *)&event; + int id = user->value1; + + action = (id == SCREEN_CTRL_ID_TOUCH_PREV_PAGE || + id == SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 ? ACTION_BACK : + id == SCREEN_CTRL_ID_TOUCH_NEXT_PAGE || + id == SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 ? ACTION_NEXT : + ACTION_NONE); + } + break; + case EVENT_KEYPRESS: { Key key = GetEventKey((KeyEvent *)&event, FALSE); - // press 'Escape' to abort and keep the old key bindings - if (key == KSYM_Escape) - { - for (x = 0; x < MAX_GRID_XSIZE; x++) - for (y = 0; y < MAX_GRID_YSIZE; y++) - overlay.grid_button[x][y] = grid_button_old[x][y]; - - FadeSkipNextFadeIn(); - - finished = TRUE; - - break; - } - - // press 'Enter' to keep the existing key binding - if (key == KSYM_Return || - key == KSYM_Menu || - key == KSYM_space) - { - step_nr++; - } - else if (key == KSYM_BackSpace || - key == KSYM_Back) - { - if (step_nr == 0) - { - FadeSkipNextFadeIn(); - - finished = TRUE; - - break; - } - - step_nr--; - } - else - { - break; - } - - // all virtual buttons configured - if (step_nr == 6) - { - finished = TRUE; - success = TRUE; - - break; - } - - for (x = 0; x < MAX_GRID_XSIZE; x++) - for (y = 0; y < MAX_GRID_YSIZE; y++) - grid_button_tmp[x][y] = overlay.grid_button[x][y]; - - overlay.grid_button_highlight = grid_button[step_nr]; - - // query next virtual button - - ClearField(); - - DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons"); - DrawTextSCentered(ypos1, font_nr, "Select tiles to"); - DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]); + action = (key == KSYM_Escape ? ACTION_ESCAPE : + key == KSYM_BackSpace || + key == KSYM_Back ? ACTION_BACK : + key == KSYM_Return || + key == KSYM_Menu || + key == KSYM_space ? ACTION_NEXT : + ACTION_NONE); } break; @@ -8004,6 +8019,19 @@ static boolean ConfigureVirtualButtonsMain(void) { ButtonEvent *button = (ButtonEvent *)&event; + motion_status = FALSE; + + if (button->type == EVENT_BUTTONPRESS) + button_status = button->button; + else + button_status = MB_RELEASED; + + if (HandleGadgets(button->x, button->y, button_status)) + { + // do not handle this button event anymore + break; + } + button->x += video.screen_xoffset; button->y += video.screen_yoffset; @@ -8012,18 +8040,14 @@ static boolean ConfigureVirtualButtonsMain(void) if (button->type == EVENT_BUTTONPRESS) { - button_status = button->button; - grid_button_draw = (overlay.grid_button[x][y] != grid_button[step_nr] ? grid_button[step_nr] : CHAR_GRID_BUTTON_NONE); set_grid_button = TRUE; } - else - { - button_status = MB_RELEASED; - } + + MapScreenMenuGadgets_OverlayTouchButtons(button->y); } break; @@ -8031,6 +8055,14 @@ static boolean ConfigureVirtualButtonsMain(void) { MotionEvent *motion = (MotionEvent *)&event; + motion_status = TRUE; + + if (HandleGadgets(motion->x, motion->y, button_status)) + { + // do not handle this button event anymore + break; + } + motion->x += video.screen_xoffset; motion->y += video.screen_yoffset; @@ -8038,6 +8070,8 @@ static boolean ConfigureVirtualButtonsMain(void) y = motion->y * overlay.grid_ysize / video.screen_height; set_grid_button = TRUE; + + MapScreenMenuGadgets_OverlayTouchButtons(motion->y); } break; @@ -8069,6 +8103,64 @@ static boolean ConfigureVirtualButtonsMain(void) break; } + // ---------- perform action set by handling events ---------- + + if (action == ACTION_ESCAPE) + { + // abort and restore the old key bindings + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + overlay.grid_button[x][y] = grid_button_old[x][y]; + + FadeSkipNextFadeIn(); + + finished = TRUE; + } + else if (action == ACTION_BACK) + { + // keep the configured key bindings and go to previous page + + step_nr--; + + if (step_nr < 0) + { + FadeSkipNextFadeIn(); + + finished = TRUE; + } + } + else if (action == ACTION_NEXT) + { + // keep the configured key bindings and go to next page + + step_nr++; + + // all virtual buttons configured + if (step_nr == 6) + { + finished = TRUE; + success = TRUE; + } + } + + if (action != ACTION_NONE && !finished) + { + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + grid_button_tmp[x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = grid_button[step_nr]; + + // configure next virtual button + + ClearField(); + + DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons"); + DrawTextSCentered(ypos1, font_nr, "Select tiles to"); + DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]); + } + if (set_grid_button) { overlay.grid_button[x][y] = @@ -8098,6 +8190,9 @@ void ConfigureVirtualButtons(void) { boolean success = ConfigureVirtualButtonsMain(); + UnmapScreenMenuGadgets(SCREEN_MASK_TOUCH | + SCREEN_MASK_TOUCH2); + if (success) { int font_nr = FONT_TITLE_1; @@ -8280,141 +8375,120 @@ void HandleGameActions(void) // ---------- new screen button stuff -------------------------------------- -static void getScreenMenuButtonPos(int *x, int *y, int gadget_id) -{ - switch (gadget_id) - { - case SCREEN_CTRL_ID_PREV_LEVEL: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.prev_level.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.prev_level.y); - break; - - case SCREEN_CTRL_ID_NEXT_LEVEL: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.next_level.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.next_level.y); - break; - - case SCREEN_CTRL_ID_FIRST_LEVEL: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.first_level.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.first_level.y); - break; - - case SCREEN_CTRL_ID_LAST_LEVEL: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.last_level.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.last_level.y); - break; - - case SCREEN_CTRL_ID_LEVEL_NUMBER: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.level_number.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.level_number.y); - break; - - case SCREEN_CTRL_ID_PREV_PLAYER: - *x = mSX + TILEX * 10; - *y = mSY + TILEY * MENU_SCREEN_START_YPOS; - break; - - case SCREEN_CTRL_ID_NEXT_PLAYER: - *x = mSX + TILEX * 12; - *y = mSY + TILEY * MENU_SCREEN_START_YPOS; - break; - - case SCREEN_CTRL_ID_INSERT_SOLUTION: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.insert_solution.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.insert_solution.y); - break; - - case SCREEN_CTRL_ID_PLAY_SOLUTION: - *x = mSX + GDI_ACTIVE_POS(menu.main.button.play_solution.x); - *y = mSY + GDI_ACTIVE_POS(menu.main.button.play_solution.y); - break; - - default: - Error(ERR_EXIT, "unknown gadget ID %d", gadget_id); - } -} - static struct { int gfx_unpressed, gfx_pressed; - void (*get_gadget_position)(int *, int *, int); + struct MenuPosInfo *pos; int gadget_id; int screen_mask; unsigned int event_mask; + boolean is_touch_button; char *infotext; } menubutton_info[NUM_SCREEN_MENUBUTTONS] = { { IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.prev_level, SCREEN_CTRL_ID_PREV_LEVEL, SCREEN_MASK_MAIN, GD_EVENT_PRESSED | GD_EVENT_REPEATED, - "previous level" + FALSE, "previous level" }, { IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.next_level, SCREEN_CTRL_ID_NEXT_LEVEL, SCREEN_MASK_MAIN, GD_EVENT_PRESSED | GD_EVENT_REPEATED, - "next level" + FALSE, "next level" }, { IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.first_level, SCREEN_CTRL_ID_FIRST_LEVEL, SCREEN_MASK_MAIN, GD_EVENT_RELEASED, - "first level" + FALSE, "first level" }, { IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.last_level, SCREEN_CTRL_ID_LAST_LEVEL, SCREEN_MASK_MAIN, GD_EVENT_RELEASED, - "last level" + FALSE, "last level" }, { IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.level_number, SCREEN_CTRL_ID_LEVEL_NUMBER, SCREEN_MASK_MAIN, GD_EVENT_RELEASED, - "level number" + FALSE, "level number" }, { IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE, - getScreenMenuButtonPos, + &menu.setup.button.prev_player, SCREEN_CTRL_ID_PREV_PLAYER, SCREEN_MASK_INPUT, GD_EVENT_PRESSED | GD_EVENT_REPEATED, - "previous player" + FALSE, "previous player" }, { IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE, - getScreenMenuButtonPos, + &menu.setup.button.next_player, SCREEN_CTRL_ID_NEXT_PLAYER, SCREEN_MASK_INPUT, GD_EVENT_PRESSED | GD_EVENT_REPEATED, - "next player" + FALSE, "next player" }, { IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.insert_solution, SCREEN_CTRL_ID_INSERT_SOLUTION, SCREEN_MASK_MAIN_HAS_SOLUTION, GD_EVENT_RELEASED, - "insert solution tape" + FALSE, "insert solution tape" }, { IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE, - getScreenMenuButtonPos, + &menu.main.button.play_solution, SCREEN_CTRL_ID_PLAY_SOLUTION, SCREEN_MASK_MAIN_HAS_SOLUTION, GD_EVENT_RELEASED, - "play solution tape" + FALSE, "play solution tape" + }, + { + IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK, + &menu.setup.button.touch_back, + SCREEN_CTRL_ID_TOUCH_PREV_PAGE, + SCREEN_MASK_TOUCH, + GD_EVENT_RELEASED, + TRUE, "previous page" + }, + { + IMG_MENU_BUTTON_TOUCH_NEXT, IMG_MENU_BUTTON_TOUCH_NEXT, + &menu.setup.button.touch_next, + SCREEN_CTRL_ID_TOUCH_NEXT_PAGE, + SCREEN_MASK_TOUCH, + GD_EVENT_RELEASED, + TRUE, "next page" + }, + { + IMG_MENU_BUTTON_TOUCH_BACK2, IMG_MENU_BUTTON_TOUCH_BACK2, + &menu.setup.button.touch_back2, + SCREEN_CTRL_ID_TOUCH_PREV_PAGE2, + SCREEN_MASK_TOUCH2, + GD_EVENT_RELEASED, + TRUE, "previous page" + }, + { + IMG_MENU_BUTTON_TOUCH_NEXT2, IMG_MENU_BUTTON_TOUCH_NEXT2, + &menu.setup.button.touch_next2, + SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2, + SCREEN_MASK_TOUCH2, + GD_EVENT_RELEASED, + TRUE, "next page" }, }; @@ -8488,6 +8562,8 @@ static void CreateScreenMenubuttons(void) for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++) { + struct MenuPosInfo *pos = menubutton_info[i].pos; + boolean is_touch_button = menubutton_info[i].is_touch_button; Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed; int gfx_unpressed, gfx_pressed; int x, y, width, height; @@ -8496,7 +8572,8 @@ static void CreateScreenMenubuttons(void) event_mask = menubutton_info[i].event_mask; - menubutton_info[i].get_gadget_position(&x, &y, id); + x = (is_touch_button ? pos->x : mSX + GDI_ACTIVE_POS(pos->x)); + y = (is_touch_button ? pos->y : mSY + GDI_ACTIVE_POS(pos->y)); width = graphic_info[menubutton_info[i].gfx_pressed].width; height = graphic_info[menubutton_info[i].gfx_pressed].height; @@ -8510,6 +8587,12 @@ static void CreateScreenMenubuttons(void) gd_x2 = graphic_info[gfx_pressed].src_x; gd_y2 = graphic_info[gfx_pressed].src_y; + if (is_touch_button) + { + gd_x2 += graphic_info[gfx_pressed].pressed_xoffset; + gd_y2 += graphic_info[gfx_pressed].pressed_yoffset; + } + gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_IMAGE_ID, gfx_unpressed, @@ -8523,6 +8606,7 @@ static void CreateScreenMenubuttons(void) GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2, GDI_DIRECT_DRAW, FALSE, + GDI_OVERLAY_TOUCH_BUTTON, is_touch_button, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleScreenGadgets, GDI_END); @@ -8747,7 +8831,7 @@ void FreeScreenGadgets(void) FreeGadget(screen_gadget[i]); } -void MapScreenMenuGadgets(int screen_mask) +static void MapScreenMenuGadgets(int screen_mask) { int i; @@ -8775,7 +8859,7 @@ static void UnmapScreenMenuGadgets(int screen_mask) } } -void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets) +static void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets) { if (map_gadgets) MapScreenMenuGadgets(screen_mask); @@ -8783,7 +8867,7 @@ void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets) UnmapScreenMenuGadgets(screen_mask); } -void MapScreenGadgets(int num_entries) +static void MapScreenGadgets(int num_entries) { int i; @@ -8797,7 +8881,7 @@ void MapScreenGadgets(int num_entries) MapGadget(screen_gadget[scrollbar_info[i].gadget_id]); } -void MapScreenTreeGadgets(TreeInfo *ti) +static void MapScreenTreeGadgets(TreeInfo *ti) { MapScreenGadgets(numTreeInfoInGroup(ti)); } @@ -8850,6 +8934,13 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) PlaySolutionTape(); break; + case SCREEN_CTRL_ID_TOUCH_PREV_PAGE: + case SCREEN_CTRL_ID_TOUCH_NEXT_PAGE: + case SCREEN_CTRL_ID_TOUCH_PREV_PAGE2: + case SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2: + PushUserEvent(USEREVENT_GADGET_PRESSED, id, 0); + break; + case SCREEN_CTRL_ID_SCROLL_UP: if (game_status == GAME_MODE_LEVELS) HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);