#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
LoadLevel(level_nr);
LoadScore(level_nr);
+ SaveLevelSetup_SeriesInfo();
+
// set this after "ChangeViewportPropertiesIfNeeded()" (which may reset it)
SetDrawDeactivationMask(REDRAW_NONE);
SetDrawBackgroundMask(REDRAW_FIELD);
LoadTape(level_nr);
DrawCompleteVideoDisplay();
+ SaveLevelSetup_SeriesInfo();
+
/* needed because DrawPreviewLevelInitial() takes some time */
BackToFront();
/* SyncDisplay(); */
DrawTextF(xstart1, ystart2, font_header, "Version");
DrawTextF(xstart2, ystart2, font_text, getProgramVersionString());
+ if (!strEqual(getProgramVersionString(), getProgramRealVersionString()))
+ {
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Version (real)");
+ DrawTextF(xstart2, ystart2, font_text, getProgramRealVersionString());
+ }
+
ystart2 += ystep;
DrawTextF(xstart1, ystart2, font_header, "Platform");
DrawTextF(xstart2, ystart2, font_text, PLATFORM_STRING);
while (!got_key_event)
{
- if (PendingEvent()) /* got event */
- {
- Event event;
-
- NextEvent(&event);
+ Event event;
+ if (NextValidEvent(&event))
+ {
switch (event.type)
{
case EVENT_KEYPRESS:
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;
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;
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
char *text;
} custom[] =
{
- { &custom_key.left, "Joystick Left" },
- { &custom_key.right, "Joystick Right" },
- { &custom_key.up, "Joystick Up" },
- { &custom_key.down, "Joystick Down" },
+ { &custom_key.left, "Axis/Pad Left" },
+ { &custom_key.right, "Axis/Pad Right" },
+ { &custom_key.up, "Axis/Pad Up" },
+ { &custom_key.down, "Axis/Pad Down" },
{ &custom_key.snap, "Button 1/A/X" },
{ &custom_key.drop, "Button 2/B/Y" }
};
while (!finished)
{
- if (PendingEvent()) /* got event */
- {
- Event event;
-
- NextEvent(&event);
+ Event event;
+ if (NextValidEvent(&event))
+ {
switch (event.type)
{
case EVENT_KEYPRESS:
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 <gabomdq@gmail.com> */
#define MARKER_BUTTON 1
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
}
*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;
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;
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);
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;
}
if (event.key.keysym.sym == KSYM_Escape)
{
+ /* leave screen */
success = FALSE;
done = TRUE;
}
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);