X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=2dc2ad81bb100ad1c9c993dd3a7ab91c519df52d;hb=22c1545e660b56b81728829aec43de128934ae04;hp=0e4c09c9599e961e5137c9021bc91bab6556abee;hpb=55d92c70b761cebffe3c760ce0c76eea2b30c076;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 0e4c09c9..2dc2ad81 100644 --- a/src/screens.c +++ b/src/screens.c @@ -77,8 +77,9 @@ #define SETUP_MODE_CHOOSE_TOUCH_CONTROL 28 #define SETUP_MODE_CHOOSE_MOVE_DISTANCE 29 #define SETUP_MODE_CHOOSE_DROP_DISTANCE 30 +#define SETUP_MODE_CHOOSE_TRANSPARENCY 31 -#define MAX_SETUP_MODES 31 +#define MAX_SETUP_MODES 32 #define MAX_MENU_MODES MAX(MAX_INFO_MODES, MAX_SETUP_MODES) @@ -107,6 +108,7 @@ #define STR_SETUP_CHOOSE_TOUCH_CONTROL "Control Type" #define STR_SETUP_CHOOSE_MOVE_DISTANCE "Move Distance" #define STR_SETUP_CHOOSE_DROP_DISTANCE "Drop Distance" +#define STR_SETUP_CHOOSE_TRANSPARENCY "Transparency" /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -207,6 +209,7 @@ static void HandleSetupScreen_Generic(int, int, int, int, int); static void HandleSetupScreen_Input(int, int, int, int, int); static void CustomizeKeyboard(int); static void ConfigureJoystick(int); +static void ConfigureVirtualButtons(); static void execSetupGame(void); static void execSetupGraphics(void); static void execSetupSound(void); @@ -275,6 +278,9 @@ static TreeInfo *move_distance_current = NULL; static TreeInfo *drop_distances = NULL; static TreeInfo *drop_distance_current = NULL; +static TreeInfo *transparencies = NULL; +static TreeInfo *transparency_current = NULL; + static TreeInfo *level_number = NULL; static TreeInfo *level_number_current = NULL; @@ -451,6 +457,27 @@ static struct { -1, NULL }, }; +static struct +{ + int value; + char *text; +} transparencies_list[] = +{ + { 0, "0 % (Opaque)" }, + { 10, "10 %" }, + { 20, "20 %" }, + { 30, "30 %" }, + { 40, "40 %" }, + { 50, "50 %" }, + { 60, "60 %" }, + { 70, "70 %" }, + { 80, "80 %" }, + { 90, "90 %" }, + { 100, "100 % (Invisible)" }, + + { -1, NULL }, +}; + #define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \ (s) <= GAME_MODE_SETUP ? (s) : \ (s) == GAME_MODE_PSEUDO_TYPENAME ? \ @@ -4075,7 +4102,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, execSetupSound(); else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL || setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE || - setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE) + setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE || + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) execSetupTouch(); else execSetupArtwork(); @@ -4227,7 +4255,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, execSetupSound(); else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL || setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE || - setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE) + setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE || + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) execSetupTouch(); else execSetupArtwork(); @@ -4293,7 +4322,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, execSetupSound(); else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL || setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE || - setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE) + setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE || + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) execSetupTouch(); else execSetupArtwork(); @@ -4560,6 +4590,7 @@ static char *volume_music_text; static char *touch_controls_text; static char *move_distance_text; static char *drop_distance_text; +static char *transparency_text; static void execSetupMain() { @@ -5257,6 +5288,20 @@ static void execSetupChooseDropDistance() DrawSetupScreen(); } +static void execSetupChooseTransparency() +{ + setup_mode = SETUP_MODE_CHOOSE_TRANSPARENCY; + + DrawSetupScreen(); +} + +static void execSetupConfigureVirtualButtons() +{ + ConfigureVirtualButtons(); + + DrawSetupScreen(); +} + static void execSetupTouch() { if (touch_controls == NULL) @@ -5387,14 +5432,60 @@ static void execSetupTouch() drop_distance_current = drop_distances; } + if (transparencies == NULL) + { + int i; + + for (i = 0; transparencies_list[i].value != -1; i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[32], name[32]; + int value = transparencies_list[i].value; + char *text = transparencies_list[i].text; + + ti->node_top = &transparencies; + ti->sort_priority = value; + + sprintf(identifier, "%d", value); + sprintf(name, "%s", text); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + setString(&ti->infotext, STR_SETUP_CHOOSE_TRANSPARENCY); + + pushTreeInfo(&transparencies, ti); + } + + /* sort transparency values to start with lowest transparency value */ + sortTreeInfo(&transparencies); + + /* set current transparency value to configured transparency value */ + transparency_current = + getTreeInfoFromIdentifier(transparencies, + i_to_a(setup.touch.transparency)); + + /* if that fails, set current transparency to reliable default value */ + if (transparency_current == NULL) + transparency_current = + getTreeInfoFromIdentifier(transparencies, + i_to_a(TOUCH_TRANSPARENCY_DEFAULT)); + + /* if that also fails, set current transparency to first available value */ + if (transparency_current == NULL) + transparency_current = transparencies; + } + setup.touch.control_type = touch_control_current->identifier; setup.touch.move_distance = atoi(move_distance_current->identifier); setup.touch.drop_distance = atoi(drop_distance_current->identifier); + setup.touch.transparency = atoi(transparency_current->identifier); /* needed for displaying volume text instead of identifier */ touch_controls_text = touch_control_current->name; move_distance_text = move_distance_current->name; drop_distance_text = drop_distance_current->name; + transparency_text = transparency_current->name; setup_mode = SETUP_MODE_TOUCH; @@ -5561,6 +5652,9 @@ static struct { &setup.touch.drop_distance, execSetupChooseDropDistance }, { &setup.touch.drop_distance, &drop_distance_text }, + { &setup.touch.transparency, execSetupChooseTransparency }, + { &setup.touch.transparency, &transparency_text }, + { NULL, NULL } }; @@ -5743,6 +5837,21 @@ static struct TokenInfo setup_info_touch[] = { 0, NULL, NULL } }; +static struct TokenInfo setup_info_touch_virtual_buttons[] = +{ + { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, + { TYPE_STRING, &touch_controls_text, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_ENTER_LIST, execSetupChooseTransparency, "Transparency:" }, + { TYPE_STRING, &transparency_text, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_ENTER_LIST, execSetupConfigureVirtualButtons, "Configure Virtual Buttons" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + + { 0, NULL, NULL } +}; + static struct TokenInfo setup_info_touch_wipe_gestures[] = { { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, @@ -6176,7 +6285,9 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_touch; title_string = STR_SETUP_TOUCH; - if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) + if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) + setup_info = setup_info_touch_virtual_buttons; + else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) setup_info = setup_info_touch_wipe_gestures; } else if (setup_mode == SETUP_MODE_SHORTCUTS) @@ -6898,6 +7009,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) controller->width, controller->height, controller_x, controller_y); + SDL_SetSurfaceBlendMode(marker->surface_masked, SDL_BLENDMODE_BLEND); SDL_SetSurfaceAlphaMod(marker->surface_masked, alpha); BlitBitmapMasked(marker, drawto, 0, 0, @@ -7152,6 +7264,264 @@ void ConfigureJoystick(int player_nr) DrawSetupScreen_Input(); } +boolean ConfigureVirtualButtonsMain() +{ + static char *customize_step_text[] = + { + "Move Left", + "Move Right", + "Move Up", + "Move Down", + "Snap Field", + "Drop Element" + }; + char grid_button[] = + { + CHAR_GRID_BUTTON_LEFT, + CHAR_GRID_BUTTON_RIGHT, + CHAR_GRID_BUTTON_UP, + CHAR_GRID_BUTTON_DOWN, + CHAR_GRID_BUTTON_SNAP, + CHAR_GRID_BUTTON_DROP + }; + int font_nr = FONT_INPUT_1_ACTIVE; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; + boolean success = FALSE; + boolean finished = FALSE; + int step_nr = 0; + char grid_button_draw = CHAR_GRID_BUTTON_NONE; + char grid_button_old[MAX_GRID_XSIZE][MAX_GRID_YSIZE]; + char grid_button_tmp[MAX_GRID_XSIZE][MAX_GRID_YSIZE]; + boolean set_grid_button = FALSE; + int nr = GRID_ACTIVE_NR(); + int x, y; + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + grid_button_old[x][y] = grid_button_tmp[x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = grid_button[step_nr]; + + FadeSetEnterMenu(); + FadeOut(REDRAW_FIELD); + + 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]); + + FadeIn(REDRAW_FIELD); + + SetOverlayShowGrid(TRUE); + + while (!finished) + { + Event event; + + while (NextValidEvent(&event)) + { + switch (event.type) + { + 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]); + } + break; + + case EVENT_KEYRELEASE: + key_joystick_mapping = 0; + break; + + case EVENT_BUTTONPRESS: + case EVENT_BUTTONRELEASE: + { + ButtonEvent *button = (ButtonEvent *)&event; + + button->x += video.screen_xoffset; + button->y += video.screen_yoffset; + + x = button->x * overlay.grid_xsize / video.screen_width; + y = button->y * overlay.grid_ysize / video.screen_height; + + 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; + } + } + break; + + case EVENT_MOTIONNOTIFY: + { + MotionEvent *motion = (MotionEvent *)&event; + + motion->x += video.screen_xoffset; + motion->y += video.screen_yoffset; + + x = motion->x * overlay.grid_xsize / video.screen_width; + y = motion->y * overlay.grid_ysize / video.screen_height; + + set_grid_button = TRUE; + } + break; + +#if defined(TARGET_SDL2) + case SDL_WINDOWEVENT: + HandleWindowEvent((WindowEvent *) &event); + + // check if device has been rotated + if (nr != GRID_ACTIVE_NR()) + { + nr = GRID_ACTIVE_NR(); + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + grid_button_old[x][y] = grid_button_tmp[x][y] = + overlay.grid_button[x][y]; + } + + break; + + case SDL_APP_WILLENTERBACKGROUND: + case SDL_APP_DIDENTERBACKGROUND: + case SDL_APP_WILLENTERFOREGROUND: + case SDL_APP_DIDENTERFOREGROUND: + HandlePauseResumeEvent((PauseResumeEvent *) &event); + break; +#endif + + default: + HandleOtherEvents(&event); + break; + } + + if (set_grid_button) + { + overlay.grid_button[x][y] = + (grid_button_draw != CHAR_GRID_BUTTON_NONE ? grid_button_draw : + grid_button_tmp[x][y] == grid_button[step_nr] ? CHAR_GRID_BUTTON_NONE : + grid_button_tmp[x][y]); + + set_grid_button = FALSE; + } + } + + BackToFront(); + } + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + setup.touch.grid_button[nr][x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = CHAR_GRID_BUTTON_NONE; + + SetOverlayShowGrid(FALSE); + + return success; +} + +void ConfigureVirtualButtons() +{ + boolean success = ConfigureVirtualButtonsMain(); + + if (success) + { + int font_nr = FONT_TITLE_1; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; + unsigned int wait_frame_delay = 0; + unsigned int wait_frame_delay_value = 2000; + + ResetDelayCounter(&wait_frame_delay); + + ClearField(); + + DrawTextSCentered(ypos1, font_nr, "Virtual buttons"); + DrawTextSCentered(ypos2, font_nr, "configured!"); + + while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + BackToFront(); + + ClearEventQueue(); + } +} + void DrawSetupScreen() { if (setup_mode == SETUP_MODE_INPUT) @@ -7186,6 +7556,8 @@ void DrawSetupScreen() DrawChooseTree(&move_distance_current); else if (setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE) DrawChooseTree(&drop_distance_current); + else if (setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) + DrawChooseTree(&transparency_current); else DrawSetupScreen_Generic(); @@ -7238,6 +7610,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &move_distance_current); else if (setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE) HandleChooseTree(mx, my, dx, dy, button, &drop_distance_current); + else if (setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) + HandleChooseTree(mx, my, dx, dy, button, &transparency_current); else HandleSetupScreen_Generic(mx, my, dx, dy, button); }