X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=83c436140e665996b01aed85bf21115ffdebbc04;hb=1638f687279338a97d28e2a770fd63e7c789bdf8;hp=be86d2e69a0d0cc7d68b9d6cf200c5ecaab75315;hpb=becf6867226b0c3d24f12a9ed76440f36234c9e8;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index be86d2e6..83c43614 100644 --- a/src/screens.c +++ b/src/screens.c @@ -23,6 +23,10 @@ #include "init.h" #include "config.h" + +#define DEBUG_JOYSTICKS 0 + + /* screens on the info screen */ #define INFO_MODE_MAIN 0 #define INFO_MODE_TITLE 1 @@ -5627,7 +5631,9 @@ static Key getSetupKey() static int getSetupValueFont(int type, void *value) { - if (type & TYPE_KEY) + if (type & TYPE_GHOSTED) + return FONT_OPTION_OFF; + else if (type & TYPE_KEY) return (type & TYPE_QUERY ? FONT_INPUT_1_ACTIVE : FONT_VALUE_1); else if (type & TYPE_STRING) return FONT_VALUE_2; @@ -5805,6 +5811,28 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) ToggleFullscreenOrChangeWindowScalingIfNeeded(); } +static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig) +{ + static struct TokenInfo *setup_info_hide = NULL; + int list_size = 0; + int list_pos = 0; + int i; + + /* determine maximum list size of target list */ + while (setup_info_orig[list_size++].type != 0); + + /* free, allocate and clear memory for target list */ + checked_free(setup_info_hide); + setup_info_hide = checked_calloc(list_size * sizeof(struct TokenInfo)); + + /* copy setup info list without setup entries marked as hidden */ + for (i = 0; setup_info_orig[i].type != 0; i++) + if (!hideSetupEntry(setup_info_orig[i].value)) + setup_info_hide[list_pos++] = setup_info_orig[i]; + + return setup_info_hide; +} + static void DrawSetupScreen_Generic() { int fade_mask = REDRAW_FIELD; @@ -5904,6 +5932,9 @@ static void DrawSetupScreen_Generic() title_string = "Setup Shortcuts"; } + /* use modified setup info without setup entries marked as hidden */ + setup_info = getSetupInfoFinal(setup_info); + DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, title_string); // determine maximal number of setup entries that can be displayed on screen @@ -6336,180 +6367,6 @@ void CustomizeKeyboard(int player_nr) DrawSetupScreen_Input(); } -#if 0 -static boolean OLD_CalibrateJoystickMain(int player_nr) -{ - int new_joystick_xleft = JOYSTICK_XMIDDLE; - int new_joystick_xright = JOYSTICK_XMIDDLE; - int new_joystick_yupper = JOYSTICK_YMIDDLE; - int new_joystick_ylower = JOYSTICK_YMIDDLE; - int new_joystick_xmiddle, new_joystick_ymiddle; - - char *device_name = setup.input[player_nr].joy.device_name; - int joystick_nr = getJoystickNrFromDeviceName(device_name); - boolean joystick_active = CheckJoystickOpened(joystick_nr); - - int x, y, last_x, last_y, xpos = 8, ypos = 3; - boolean check[3][3]; - int check_remaining = 3 * 3; - int joy_x, joy_y; - int joy_value; - int result = -1; - - if (joystick.status == JOYSTICK_NOT_AVAILABLE) - return FALSE; - - if (!joystick_active || !setup.input[player_nr].use_joystick) - return FALSE; - - FadeSetEnterMenu(); - FadeOut(REDRAW_FIELD); - - ClearField(); - - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - DrawFixedGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0); - check[x][y] = FALSE; - } - } - - DrawTextSCentered(mSY - SY + 6 * 32, FONT_TITLE_1, "Rotate joystick"); - DrawTextSCentered(mSY - SY + 7 * 32, FONT_TITLE_1, "in all directions"); - DrawTextSCentered(mSY - SY + 9 * 32, FONT_TITLE_1, "if all balls"); - DrawTextSCentered(mSY - SY + 10 * 32, FONT_TITLE_1, "are marked,"); - DrawTextSCentered(mSY - SY + 11 * 32, FONT_TITLE_1, "center joystick"); - DrawTextSCentered(mSY - SY + 12 * 32, FONT_TITLE_1, "and"); - DrawTextSCentered(mSY - SY + 13 * 32, FONT_TITLE_1, "press any button!"); - - joy_value = JoystickExt(joystick_nr, TRUE); - last_x = (joy_value & JOY_LEFT ? -1 : joy_value & JOY_RIGHT ? +1 : 0); - last_y = (joy_value & JOY_UP ? -1 : joy_value & JOY_DOWN ? +1 : 0); - - /* eventually uncalibrated center position (joystick could be uncentered) */ - if (!ReadJoystick(joystick_nr, &joy_x, &joy_y, NULL, NULL)) - return FALSE; - - new_joystick_xmiddle = joy_x; - new_joystick_ymiddle = joy_y; - - DrawFixedGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0); - - FadeIn(REDRAW_FIELD); - - /* wait for potentially still pressed button to be released */ - while (JoystickExt(joystick_nr, TRUE) & JOY_BUTTON); - - while (result < 0) - { - while (PendingEvent()) /* got event */ - { - Event event; - - NextEvent(&event); - - switch (event.type) - { - case EVENT_KEYPRESS: - switch (GetEventKey((KeyEvent *)&event, TRUE)) - { - case KSYM_Return: - if (check_remaining == 0) - result = 1; - break; - - case KSYM_Escape: - FadeSkipNextFadeIn(); - result = 0; - break; - - default: - break; - } - break; - - case EVENT_KEYRELEASE: - key_joystick_mapping = 0; - break; - - default: - HandleOtherEvents(&event); - break; - } - } - - if (!ReadJoystick(joystick_nr, &joy_x, &joy_y, NULL, NULL)) - return FALSE; - - new_joystick_xleft = MIN(new_joystick_xleft, joy_x); - new_joystick_xright = MAX(new_joystick_xright, joy_x); - new_joystick_yupper = MIN(new_joystick_yupper, joy_y); - new_joystick_ylower = MAX(new_joystick_ylower, joy_y); - - setup.input[player_nr].joy.xleft = new_joystick_xleft; - setup.input[player_nr].joy.yupper = new_joystick_yupper; - setup.input[player_nr].joy.xright = new_joystick_xright; - setup.input[player_nr].joy.ylower = new_joystick_ylower; - setup.input[player_nr].joy.xmiddle = new_joystick_xmiddle; - setup.input[player_nr].joy.ymiddle = new_joystick_ymiddle; - - CheckJoystickData(); - - joy_value = JoystickExt(joystick_nr, TRUE); - - if (joy_value & JOY_BUTTON && check_remaining == 0) - result = 1; - - x = (joy_value & JOY_LEFT ? -1 : joy_value & JOY_RIGHT ? +1 : 0); - y = (joy_value & JOY_UP ? -1 : joy_value & JOY_DOWN ? +1 : 0); - - if (x != last_x || y != last_y) - { - DrawFixedGraphic(xpos + last_x, ypos + last_y, - IMG_MENU_CALIBRATE_YELLOW, 0); - DrawFixedGraphic(xpos + x, ypos + y, - IMG_MENU_CALIBRATE_RED, 0); - - last_x = x; - last_y = y; - - if (check_remaining > 0 && !check[x+1][y+1]) - { - check[x+1][y+1] = TRUE; - check_remaining--; - } - } - - BackToFront(); - } - - /* calibrated center position (joystick should now be centered) */ - if (!ReadJoystick(joystick_nr, &joy_x, &joy_y, NULL, NULL)) - return FALSE; - - new_joystick_xmiddle = joy_x; - new_joystick_ymiddle = joy_y; - - /* wait until the last pressed button was released */ - while (JoystickExt(joystick_nr, TRUE) & JOY_BUTTON) - { - if (PendingEvent()) /* got event */ - { - Event event; - - NextEvent(&event); - HandleOtherEvents(&event); - - BackToFront(); - } - } - - return TRUE; -} -#endif - /* game controller mapping generator by Gabriel Jacobo */ #define MARKER_BUTTON 1 @@ -6519,17 +6376,20 @@ static boolean OLD_CalibrateJoystickMain(int player_nr) static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) { #if defined(TARGET_SDL2) - static Bitmap *controller, *button, *axis_x, *axis_y; - Bitmap *marker; - boolean bitmaps_initialized = FALSE; + static boolean bitmaps_initialized = FALSE; boolean screen_initialized = FALSE; - const char *name = NULL; + static Bitmap *controller, *button, *axis_x, *axis_y; + char *name; boolean success = TRUE; boolean done = FALSE, next = FALSE; Event event; int alpha = 200, alpha_step = -1; int alpha_ticks = 0; char mapping[4096], temp[4096]; + int font_name = FONT_TEXT_1; + int font_info = FONT_REQUEST; + int ystep1 = getFontHeight(font_name) + 2; + int ystep2 = getFontHeight(font_info) + 2; int i, j; struct @@ -6542,27 +6402,27 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) } *step, *prev_step, steps[] = { - { 370, 175, MARKER_BUTTON, "a", }, - { 410, 142, MARKER_BUTTON, "b", }, - { 334, 145, MARKER_BUTTON, "x", }, - { 372, 115, MARKER_BUTTON, "y", }, - { 176, 145, MARKER_BUTTON, "back", }, - { 230, 145, MARKER_BUTTON, "guide", }, - { 285, 145, MARKER_BUTTON, "start", }, - { 124, 220, MARKER_BUTTON, "dpleft", }, - { 160, 248, MARKER_BUTTON, "dpdown", }, - { 192, 220, MARKER_BUTTON, "dpright", }, - { 160, 192, MARKER_BUTTON, "dpup", }, - { 64, 60, MARKER_BUTTON, "leftshoulder", }, - { 102, 10, MARKER_AXIS_Y, "lefttrigger", }, - { 396, 60, MARKER_BUTTON, "rightshoulder", }, - { 360, 10, MARKER_AXIS_Y, "righttrigger", }, - { 87, 161, MARKER_BUTTON, "leftstick", }, - { 296, 230, MARKER_BUTTON, "rightstick", }, - { 87, 161, MARKER_AXIS_X, "leftx", }, - { 87, 161, MARKER_AXIS_Y, "lefty", }, - { 296, 230, MARKER_AXIS_X, "rightx", }, - { 296, 230, MARKER_AXIS_Y, "righty", }, + { 356, 155, MARKER_BUTTON, "a", }, + { 396, 122, MARKER_BUTTON, "b", }, + { 320, 125, MARKER_BUTTON, "x", }, + { 358, 95, MARKER_BUTTON, "y", }, + { 162, 125, MARKER_BUTTON, "back", }, + { 216, 125, MARKER_BUTTON, "guide", }, + { 271, 125, MARKER_BUTTON, "start", }, + { 110, 200, MARKER_BUTTON, "dpleft", }, + { 146, 228, MARKER_BUTTON, "dpdown", }, + { 178, 200, MARKER_BUTTON, "dpright", }, + { 146, 172, MARKER_BUTTON, "dpup", }, + { 50, 40, MARKER_BUTTON, "leftshoulder", }, + { 88, -10, MARKER_AXIS_Y, "lefttrigger", }, + { 382, 40, MARKER_BUTTON, "rightshoulder", }, + { 346, -10, MARKER_AXIS_Y, "righttrigger", }, + { 73, 141, MARKER_BUTTON, "leftstick", }, + { 282, 210, MARKER_BUTTON, "rightstick", }, + { 73, 141, MARKER_AXIS_X, "leftx", }, + { 73, 141, MARKER_AXIS_Y, "lefty", }, + { 282, 210, MARKER_AXIS_X, "rightx", }, + { 282, 210, MARKER_AXIS_Y, "righty", }, }; unsigned int event_frame_delay = 0; @@ -6580,24 +6440,28 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) bitmaps_initialized = TRUE; } + name = getFormattedJoystickName(SDL_JoystickName(joystick)); + +#if DEBUG_JOYSTICKS /* print info about the joystick we are watching */ - name = SDL_JoystickName(joystick); - Error(ERR_DEBUG, "Watching joystick %d: (%s)\n", - SDL_JoystickInstanceID(joystick), - (name ? name : "(unknown joystick)")); - Error(ERR_DEBUG, "Joystick has %d axes, %d hats, %d balls, and %d buttons\n", + Error(ERR_DEBUG, "watching joystick %d: (%s)\n", + SDL_JoystickInstanceID(joystick), name); + Error(ERR_DEBUG, "joystick has %d axes, %d hats, %d balls, and %d buttons\n", SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick), SDL_JoystickNumBalls(joystick), SDL_JoystickNumButtons(joystick)); +#endif /* initialize mapping with GUID and name */ SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joystick), temp, sizeof(temp)); snprintf(mapping, sizeof(mapping), "%s,%s,platform:%s,", - temp, name ? name : "Unknown Joystick", SDL_GetPlatform()); + temp, name, SDL_GetPlatform()); /* loop through all steps (buttons and axes), getting joystick events */ for (i = 0; i < SDL_arraysize(steps) && !done;) { + Bitmap *marker = button; /* initialize with reliable default value */ + step = &steps[i]; strcpy(step->mapping, mapping); step->axis = -1; @@ -6627,43 +6491,49 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) alpha_step = 1; } + int controller_x = SX + (SXSIZE - controller->width) / 2; + int controller_y = SY + ystep2; + + int marker_x = controller_x + step->x; + int marker_y = controller_y + step->y; + + int ystart1 = mSY - 2 * SY + controller_y + controller->height; + int ystart2 = ystart1 + ystep1 + ystep2; + ClearField(); - DrawTextSCentered(mSY - SY + 22 * 16, FONT_REQUEST, + DrawTextSCentered(ystart1, font_name, name); + + DrawTextSCentered(ystart2 + 0 * ystep2, font_info, "Press buttons and move axes on"); - DrawTextSCentered(mSY - SY + 23 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 1 * ystep2, font_info, "your controller when indicated."); - DrawTextSCentered(mSY - SY + 24 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 2 * ystep2, font_info, "(Your controller may look different.)"); #if defined(PLATFORM_ANDROID) - DrawTextSCentered(mSY - SY + 26 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 4 * ystep2, font_info, "To correct a mistake,"); - DrawTextSCentered(mSY - SY + 27 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 5 * ystep2, font_info, "press the 'back' button."); - DrawTextSCentered(mSY - SY + 28 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 6 * ystep2, font_info, "To skip a button or axis,"); - DrawTextSCentered(mSY - SY + 29 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 7 * ystep2, font_info, "press the 'menu' button."); #else - DrawTextSCentered(mSY - SY + 26 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 4 * ystep2, font_info, "To correct a mistake,"); - DrawTextSCentered(mSY - SY + 27 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 5 * ystep2, font_info, "press the 'backspace' key."); - DrawTextSCentered(mSY - SY + 28 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 6 * ystep2, font_info, "To skip a button or axis,"); - DrawTextSCentered(mSY - SY + 29 * 16, FONT_REQUEST, + DrawTextSCentered(ystart2 + 7 * ystep2, font_info, "press the 'return' key."); - DrawTextSCentered(mSY - SY + 30 * 16, FONT_REQUEST, + + DrawTextSCentered(ystart2 + 8 * ystep2, font_info, "To exit, press the 'escape' key."); #endif - int controller_x = gfx.sx + (gfx.sxsize - controller->width) / 2; - int controller_y = gfx.sy; - - int marker_x = controller_x + step->x; - int marker_y = controller_y + step->y; - BlitBitmapMasked(controller, drawto, 0, 0, controller->width, controller->height, controller_x, controller_y); @@ -6767,14 +6637,19 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) if (event.key.keysym.sym == KSYM_BackSpace || event.key.keysym.sym == KSYM_Back) { - /* undo this step */ - if (i > 0) + if (i == 0) { - prev_step = &steps[--i]; - strcpy(mapping, prev_step->mapping); - next = TRUE; + /* leave screen */ + success = FALSE; + done = TRUE; } + /* undo this step */ + prev_step = &steps[i - 1]; + strcpy(mapping, prev_step->mapping); + i--; + next = TRUE; + break; } @@ -6791,6 +6666,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) if (event.key.keysym.sym == KSYM_Escape) { + /* leave screen */ success = FALSE; done = TRUE; } @@ -6814,7 +6690,9 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) if (success) { +#if DEBUG_JOYSTICKS Error(ERR_DEBUG, "New game controller mapping:\n\n%s\n\n", mapping); +#endif // activate mapping for this game SDL_GameControllerAddMapping(mapping);