X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=17513d2c834a326dca593d8901b601484ec8b8ac;hb=bbea8429d449be9badea09afeb8ab7b4e4a42877;hp=3a90c9571dd8aba39f387d6951a7989deb02d351;hpb=67a6bf41eb5b913335c2f89ea1405c0dfb54360b;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 3a90c957..17513d2c 100644 --- a/src/screens.c +++ b/src/screens.c @@ -181,14 +181,19 @@ #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_SWITCH_ECS_AGA 9 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 10 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 11 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 12 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 13 +#define SCREEN_CTRL_ID_SCROLL_UP 14 +#define SCREEN_CTRL_ID_SCROLL_DOWN 15 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 16 +#define SCREEN_CTRL_ID_NETWORK_SERVER 17 + +#define NUM_SCREEN_GADGETS 18 + +#define NUM_SCREEN_MENUBUTTONS 14 #define NUM_SCREEN_SCROLLBUTTONS 2 #define NUM_SCREEN_SCROLLBARS 1 #define NUM_SCREEN_TEXTINPUT 1 @@ -196,6 +201,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 @@ -6249,6 +6256,7 @@ static struct TokenInfo setup_info_game[] = { TYPE_ENTER_LIST, execSetupChooseScrollDelay, "Scroll Delay:" }, { TYPE_STRING, &scroll_delay_text, "" }, #endif + { TYPE_SWITCH, &setup.forced_scroll_delay,"Scroll Delay in EM engine:" }, { TYPE_ENTER_LIST, execSetupChooseSnapshotMode,"Game Engine Snapshot Mode:" }, { TYPE_STRING, &snapshot_mode_text, "" }, { TYPE_SWITCH, &setup.show_snapshot_buttons,"Show Snapshot Buttons:" }, @@ -7886,6 +7894,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[] = @@ -7946,6 +7970,9 @@ static boolean ConfigureVirtualButtonsMain(void) SetOverlayShowGrid(TRUE); + // map gadgets for setup touch buttons menu screen + MapScreenMenuGadgets(SCREEN_MASK_TOUCH); + while (!finished) { Event event; @@ -7958,6 +7985,19 @@ static boolean ConfigureVirtualButtonsMain(void) 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); @@ -7988,6 +8028,12 @@ static boolean ConfigureVirtualButtonsMain(void) 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; @@ -8002,6 +8048,8 @@ static boolean ConfigureVirtualButtonsMain(void) set_grid_button = TRUE; } + + MapScreenMenuGadgets_OverlayTouchButtons(button->y); } break; @@ -8011,6 +8059,12 @@ static boolean ConfigureVirtualButtonsMain(void) 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; @@ -8018,6 +8072,8 @@ static boolean ConfigureVirtualButtonsMain(void) y = motion->y * overlay.grid_ysize / video.screen_height; set_grid_button = TRUE; + + MapScreenMenuGadgets_OverlayTouchButtons(motion->y); } break; @@ -8136,6 +8192,9 @@ void ConfigureVirtualButtons(void) { boolean success = ConfigureVirtualButtonsMain(); + UnmapScreenMenuGadgets(SCREEN_MASK_TOUCH | + SCREEN_MASK_TOUCH2); + if (success) { int font_nr = FONT_TITLE_1; @@ -8322,83 +8381,125 @@ static struct { int gfx_unpressed, gfx_pressed; struct MenuPosInfo *pos; + boolean *check_value; 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, - &menu.main.button.prev_level, + &menu.main.button.prev_level, NULL, 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, - &menu.main.button.next_level, + &menu.main.button.next_level, NULL, 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, - &menu.main.button.first_level, + &menu.main.button.first_level, NULL, 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, - &menu.main.button.last_level, + &menu.main.button.last_level, NULL, 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, - &menu.main.button.level_number, + &menu.main.button.level_number, NULL, 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, - &menu.setup.button.prev_player, + &menu.setup.button.prev_player, NULL, 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, - &menu.setup.button.next_player, + &menu.setup.button.next_player, NULL, 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, - &menu.main.button.insert_solution, + &menu.main.button.insert_solution, NULL, 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, - &menu.main.button.play_solution, + &menu.main.button.play_solution, NULL, SCREEN_CTRL_ID_PLAY_SOLUTION, SCREEN_MASK_MAIN_HAS_SOLUTION, GD_EVENT_RELEASED, - "play solution tape" + FALSE, "play solution tape" + }, + { + IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE, + &menu.main.button.switch_ecs_aga, &setup.prefer_aga_graphics, + SCREEN_CTRL_ID_SWITCH_ECS_AGA, + SCREEN_MASK_MAIN, + GD_EVENT_RELEASED | GD_EVENT_OFF_BORDERS, + FALSE, "switch ECS/AGA chipset" + }, + { + IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK, + &menu.setup.button.touch_back, NULL, + 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, NULL, + 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, NULL, + 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, NULL, + SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2, + SCREEN_MASK_TOUCH2, + GD_EVENT_RELEASED, + TRUE, "next page" }, }; @@ -8473,16 +8574,21 @@ 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; + boolean is_check_button = menubutton_info[i].check_value != NULL; Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed; int gfx_unpressed, gfx_pressed; int x, y, width, height; int gd_x1, gd_x2, gd_y1, gd_y2; + int gd_x1a, gd_x2a, gd_y1a, gd_y2a; int id = menubutton_info[i].gadget_id; + int type = GD_TYPE_NORMAL_BUTTON; + boolean checked = FALSE; event_mask = menubutton_info[i].event_mask; - x = mSX + GDI_ACTIVE_POS(pos->x); - y = mSY + GDI_ACTIVE_POS(pos->y); + 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; @@ -8495,6 +8601,27 @@ static void CreateScreenMenubuttons(void) gd_y1 = graphic_info[gfx_unpressed].src_y; gd_x2 = graphic_info[gfx_pressed].src_x; gd_y2 = graphic_info[gfx_pressed].src_y; + gd_x1a = gd_x1; + gd_y1a = gd_y1; + gd_x2a = gd_x2; + gd_y2a = gd_y2; + + if (is_touch_button) + { + gd_x2 += graphic_info[gfx_pressed].pressed_xoffset; + gd_y2 += graphic_info[gfx_pressed].pressed_yoffset; + } + + if (is_check_button) + { + gd_x1a += graphic_info[gfx_unpressed].active_xoffset; + gd_y1a += graphic_info[gfx_unpressed].active_yoffset; + gd_x2a += graphic_info[gfx_pressed].active_xoffset; + gd_y2a += graphic_info[gfx_pressed].active_yoffset; + + type = GD_TYPE_CHECK_BUTTON; + checked = *menubutton_info[i].check_value; + } gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, @@ -8504,11 +8631,15 @@ static void CreateScreenMenubuttons(void) GDI_Y, y, GDI_WIDTH, width, GDI_HEIGHT, height, - GDI_TYPE, GD_TYPE_NORMAL_BUTTON, + GDI_TYPE, type, GDI_STATE, GD_BUTTON_UNPRESSED, + GDI_CHECKED, checked, GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1, GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2, + GDI_ALT_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1a, gd_y1a, + GDI_ALT_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2a, gd_y2a, GDI_DIRECT_DRAW, FALSE, + GDI_OVERLAY_TOUCH_BUTTON, is_touch_button, GDI_EVENT_MASK, event_mask, GDI_CALLBACK_ACTION, HandleScreenGadgets, GDI_END); @@ -8836,6 +8967,18 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) PlaySolutionTape(); break; + case SCREEN_CTRL_ID_SWITCH_ECS_AGA: + setup.prefer_aga_graphics = !setup.prefer_aga_graphics; + DrawMainMenu(); + 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);