X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=6f6e7a13dec6b5c2c28e709dbdd3e75e23c19d42;hb=d93d679ebb98f8466d0d0a8231356da1e6d2d62b;hp=458f9422473217ee0fd210ba6b3c189fbea08da3;hpb=131ac4bdd9abf7dfd6e47616f175a96e5b98f55a;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 458f9422..6f6e7a13 100644 --- a/src/screens.c +++ b/src/screens.c @@ -78,8 +78,13 @@ #define SETUP_MODE_CHOOSE_MOVE_DISTANCE 29 #define SETUP_MODE_CHOOSE_DROP_DISTANCE 30 #define SETUP_MODE_CHOOSE_TRANSPARENCY 31 +#define SETUP_MODE_CHOOSE_GRID_XSIZE_0 32 +#define SETUP_MODE_CHOOSE_GRID_YSIZE_0 33 +#define SETUP_MODE_CHOOSE_GRID_XSIZE_1 34 +#define SETUP_MODE_CHOOSE_GRID_YSIZE_1 35 +#define SETUP_MODE_CONFIG_VIRT_BUTTONS 36 -#define MAX_SETUP_MODES 32 +#define MAX_SETUP_MODES 37 #define MAX_MENU_MODES MAX(MAX_INFO_MODES, MAX_SETUP_MODES) @@ -109,6 +114,10 @@ #define STR_SETUP_CHOOSE_MOVE_DISTANCE "Move Distance" #define STR_SETUP_CHOOSE_DROP_DISTANCE "Drop Distance" #define STR_SETUP_CHOOSE_TRANSPARENCY "Transparency" +#define STR_SETUP_CHOOSE_GRID_XSIZE_0 "Horiz. Buttons" +#define STR_SETUP_CHOOSE_GRID_YSIZE_0 "Vert. Buttons" +#define STR_SETUP_CHOOSE_GRID_XSIZE_1 "Horiz. Buttons" +#define STR_SETUP_CHOOSE_GRID_YSIZE_1 "Vert. Buttons" /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -281,6 +290,9 @@ static TreeInfo *drop_distance_current = NULL; static TreeInfo *transparencies = NULL; static TreeInfo *transparency_current = NULL; +static TreeInfo *grid_sizes[2][2] = { { NULL, NULL }, { NULL, NULL } }; +static TreeInfo *grid_size_current[2][2] = { { NULL, NULL }, { NULL, NULL } }; + static TreeInfo *level_number = NULL; static TreeInfo *level_number_current = NULL; @@ -478,6 +490,46 @@ static struct { -1, NULL }, }; +static struct +{ + int value; + char *text; +} grid_sizes_list[] = +{ + { 3, "3" }, + { 4, "4" }, + { 5, "5" }, + { 6, "6" }, + { 7, "7" }, + { 8, "8" }, + { 9, "9" }, + { 10, "10" }, + { 11, "11" }, + { 12, "12" }, + { 13, "13" }, + { 14, "14" }, + { 15, "15" }, + { 16, "16" }, + { 17, "17" }, + { 18, "18" }, + { 19, "19" }, + { 20, "20" }, + { 21, "21" }, + { 22, "22" }, + { 23, "23" }, + { 24, "24" }, + { 25, "25" }, + { 26, "26" }, + { 27, "27" }, + { 28, "28" }, + { 29, "29" }, + { 30, "30" }, + { 31, "31" }, + { 32, "32" }, + + { -1, NULL }, +}; + #define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \ (s) <= GAME_MODE_SETUP ? (s) : \ (s) == GAME_MODE_PSEUDO_TYPENAME ? \ @@ -4103,7 +4155,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, 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_TRANSPARENCY) + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1) execSetupTouch(); else execSetupArtwork(); @@ -4256,7 +4312,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, 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_TRANSPARENCY) + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1) execSetupTouch(); else execSetupArtwork(); @@ -4323,7 +4383,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, 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_TRANSPARENCY) + setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0 || + setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1 || + setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1) execSetupTouch(); else execSetupArtwork(); @@ -4591,6 +4655,7 @@ static char *touch_controls_text; static char *move_distance_text; static char *drop_distance_text; static char *transparency_text; +static char *grid_size_text[2][2]; static void execSetupMain() { @@ -5295,19 +5360,51 @@ static void execSetupChooseTransparency() DrawSetupScreen(); } +static void execSetupChooseGridXSize_0() +{ + setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_0; + + DrawSetupScreen(); +} + +static void execSetupChooseGridYSize_0() +{ + setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_0; + + DrawSetupScreen(); +} + +static void execSetupChooseGridXSize_1() +{ + setup_mode = SETUP_MODE_CHOOSE_GRID_XSIZE_1; + + DrawSetupScreen(); +} + +static void execSetupChooseGridYSize_1() +{ + setup_mode = SETUP_MODE_CHOOSE_GRID_YSIZE_1; + + DrawSetupScreen(); +} + static void execSetupConfigureVirtualButtons() { + setup_mode = SETUP_MODE_CONFIG_VIRT_BUTTONS; + ConfigureVirtualButtons(); + setup_mode = SETUP_MODE_TOUCH; + DrawSetupScreen(); } static void execSetupTouch() { + int i, j, k; + if (touch_controls == NULL) { - int i; - for (i = 0; touch_controls_list[i].value != NULL; i++) { TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); @@ -5348,8 +5445,6 @@ static void execSetupTouch() if (move_distances == NULL) { - int i; - for (i = 0; distances_list[i].value != -1; i++) { TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); @@ -5392,8 +5487,6 @@ static void execSetupTouch() if (drop_distances == NULL) { - int i; - for (i = 0; distances_list[i].value != -1; i++) { TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); @@ -5436,8 +5529,6 @@ static void execSetupTouch() if (transparencies == NULL) { - int i; - for (i = 0; transparencies_list[i].value != -1; i++) { TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); @@ -5478,17 +5569,92 @@ static void execSetupTouch() transparency_current = transparencies; } + for (i = 0; i < 2; i++) + { + for (j = 0; j < 2; j++) + { + if (grid_sizes[i][j] == NULL) + { + for (k = 0; grid_sizes_list[k].value != -1; k++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[32], name[32]; + int value = grid_sizes_list[k].value; + char *text = grid_sizes_list[k].text; + + ti->node_top = &grid_sizes[i][j]; + 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, + (i == 0 ? + (j == 0 ? + STR_SETUP_CHOOSE_GRID_XSIZE_0 : + STR_SETUP_CHOOSE_GRID_YSIZE_0) : + (j == 0 ? + STR_SETUP_CHOOSE_GRID_XSIZE_1 : + STR_SETUP_CHOOSE_GRID_YSIZE_1))); + + pushTreeInfo(&grid_sizes[i][j], ti); + } + + /* sort grid size values to start with lowest grid size value */ + sortTreeInfo(&grid_sizes[i][j]); + + /* set current grid size value to configured grid size value */ + grid_size_current[i][j] = + getTreeInfoFromIdentifier(grid_sizes[i][j], + i_to_a(j == 0 ? + setup.touch.grid_xsize[i] : + setup.touch.grid_ysize[i])); + + /* if that fails, set current grid size to reliable default value */ + if (grid_size_current[i][j] == NULL) + grid_size_current[i][j] = + getTreeInfoFromIdentifier(grid_sizes[i][j], + i_to_a(j == 0 ? + DEFAULT_GRID_XSIZE(i) : + DEFAULT_GRID_YSIZE(i))); + + /* if that also fails, set current grid size to first available value */ + if (grid_size_current[i][j] == NULL) + grid_size_current[i][j] = grid_sizes[i][j]; + } + } + } + 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 */ + for (i = 0; i < 2; i++) + { + setup.touch.grid_xsize[i] = atoi(grid_size_current[i][0]->identifier); + setup.touch.grid_ysize[i] = atoi(grid_size_current[i][1]->identifier); + + if (i == GRID_ACTIVE_NR()) + { + overlay.grid_xsize = setup.touch.grid_xsize[i]; + overlay.grid_ysize = setup.touch.grid_ysize[i]; + } + } + + /* needed for displaying value 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; + for (i = 0; i < 2; i++) + for (j = 0; j < 2; j++) + grid_size_text[i][j] = grid_size_current[i][j]->name; + setup_mode = SETUP_MODE_TOUCH; DrawSetupScreen(); @@ -5657,6 +5823,18 @@ static struct { &setup.touch.transparency, execSetupChooseTransparency }, { &setup.touch.transparency, &transparency_text }, + { &setup.touch.grid_xsize[0], execSetupChooseGridXSize_0 }, + { &setup.touch.grid_xsize[0], &grid_size_text[0][0] }, + + { &setup.touch.grid_ysize[0], execSetupChooseGridYSize_0 }, + { &setup.touch.grid_ysize[0], &grid_size_text[0][1] }, + + { &setup.touch.grid_xsize[1], execSetupChooseGridXSize_1 }, + { &setup.touch.grid_xsize[1], &grid_size_text[1][0] }, + + { &setup.touch.grid_ysize[1], execSetupChooseGridYSize_1 }, + { &setup.touch.grid_ysize[1], &grid_size_text[1][1] }, + { NULL, NULL } }; @@ -5839,11 +6017,15 @@ static struct TokenInfo setup_info_touch[] = { 0, NULL, NULL } }; -static struct TokenInfo setup_info_touch_virtual_buttons[] = +static struct TokenInfo setup_info_touch_virtual_buttons_0[] = { { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, { TYPE_STRING, &touch_controls_text, "" }, { TYPE_EMPTY, NULL, "" }, + { TYPE_ENTER_LIST, execSetupChooseGridXSize_0, "Horizontal Buttons (Landscape):" }, + { TYPE_STRING, &grid_size_text[0][0], "" }, + { TYPE_ENTER_LIST, execSetupChooseGridYSize_0, "Vertical Buttons (Landscape):" }, + { TYPE_STRING, &grid_size_text[0][1], "" }, { TYPE_ENTER_LIST, execSetupChooseTransparency, "Transparency:" }, { TYPE_STRING, &transparency_text, "" }, { TYPE_EMPTY, NULL, "" }, @@ -5854,6 +6036,31 @@ static struct TokenInfo setup_info_touch_virtual_buttons[] = { 0, NULL, NULL } }; +static struct TokenInfo setup_info_touch_virtual_buttons_1[] = +{ + { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, + { TYPE_STRING, &touch_controls_text, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_ENTER_LIST, execSetupChooseGridXSize_1, "Horizontal Buttons (Portrait):" }, + { TYPE_STRING, &grid_size_text[1][0], "" }, + { TYPE_ENTER_LIST, execSetupChooseGridYSize_1, "Vertical Buttons (Portrait):" }, + { TYPE_STRING, &grid_size_text[1][1], "" }, + { 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_virtual_buttons[] = +{ + setup_info_touch_virtual_buttons_0, + setup_info_touch_virtual_buttons_1 +}; + static struct TokenInfo setup_info_touch_wipe_gestures[] = { { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, @@ -6288,7 +6495,7 @@ static void DrawSetupScreen_Generic() title_string = STR_SETUP_TOUCH; if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) - setup_info = setup_info_touch_virtual_buttons; + setup_info = setup_info_touch_virtual_buttons[GRID_ACTIVE_NR()]; else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) setup_info = setup_info_touch_wipe_gestures; } @@ -7560,6 +7767,14 @@ void DrawSetupScreen() DrawChooseTree(&drop_distance_current); else if (setup_mode == SETUP_MODE_CHOOSE_TRANSPARENCY) DrawChooseTree(&transparency_current); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0) + DrawChooseTree(&grid_size_current[0][0]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0) + DrawChooseTree(&grid_size_current[0][1]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1) + DrawChooseTree(&grid_size_current[1][0]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1) + DrawChooseTree(&grid_size_current[1][1]); else DrawSetupScreen_Generic(); @@ -7578,6 +7793,24 @@ void RedrawSetupScreenAfterFullscreenToggle() } } +void RedrawSetupScreenAfterScreenRotation(int nr) +{ + int x, y; + + if (setup_mode == SETUP_MODE_TOUCH) + { + // update virtual button settings (depending on screen orientation) + DrawSetupScreen(); + } + else if (setup_mode == SETUP_MODE_CONFIG_VIRT_BUTTONS) + { + // save already configured virtual buttons + 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]; + } +} + void HandleSetupScreen(int mx, int my, int dx, int dy, int button) { if (setup_mode == SETUP_MODE_INPUT) @@ -7614,6 +7847,14 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) 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 if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_0) + HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[0][0]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_0) + HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[0][1]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_XSIZE_1) + HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[1][0]); + else if (setup_mode == SETUP_MODE_CHOOSE_GRID_YSIZE_1) + HandleChooseTree(mx, my, dx, dy, button, &grid_size_current[1][1]); else HandleSetupScreen_Generic(mx, my, dx, dy, button); }