renamed function 'NextEvent' to 'WaitEvent'
[rocksndiamonds.git] / src / screens.c
index 265c9e2f45d1a7e0456031e680df77035eb7af5b..0a0f1f25b7a22a8092be8511a199641347d6e98c 100644 (file)
 #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
@@ -1478,6 +1482,8 @@ void DrawMainMenu()
   LoadLevel(level_nr);
   LoadScore(level_nr);
 
+  SaveLevelSetup_SeriesInfo();
+
   // set this after "ChangeViewportPropertiesIfNeeded()" (which may reset it)
   SetDrawDeactivationMask(REDRAW_NONE);
   SetDrawBackgroundMask(REDRAW_FIELD);
@@ -1781,6 +1787,8 @@ void HandleMainMenu_SelectLevel(int step, int direction, int selected_level_nr)
     LoadTape(level_nr);
     DrawCompleteVideoDisplay();
 
+    SaveLevelSetup_SeriesInfo();
+
     /* needed because DrawPreviewLevelInitial() takes some time */
     BackToFront();
     /* SyncDisplay(); */
@@ -3304,6 +3312,13 @@ void DrawInfoScreen_Version()
   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);
@@ -5593,7 +5608,7 @@ static Key getSetupKey()
     {
       Event event;
 
-      NextEvent(&event);
+      WaitEvent(&event);
 
       switch (event.type)
       {
@@ -5627,7 +5642,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 +5822,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 +5943,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
@@ -6003,10 +6045,10 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
     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"   }
   };
@@ -6252,7 +6294,7 @@ void CustomizeKeyboard(int player_nr)
     {
       Event event;
 
-      NextEvent(&event);
+      WaitEvent(&event);
 
       switch (event.type)
       {
@@ -6336,180 +6378,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 <gabomdq@gmail.com> */
 
 #define MARKER_BUTTON          1
@@ -6519,17 +6387,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 +6413,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 +6451,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 +6502,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 +6648,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 +6677,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
 
            if (event.key.keysym.sym == KSYM_Escape)
            {
+             /* leave screen */
              success = FALSE;
              done = TRUE;
            }
@@ -6814,7 +6701,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);