added support for special media buttons on Amazon Fire TV remote control
[rocksndiamonds.git] / src / screens.c
index 6e26fdf55e4f75e1c8b57b4349269ce1b691191c..d9abbb6f5b822b4ed7b99dad6d95dbea52c001b3 100644 (file)
@@ -1413,7 +1413,6 @@ void DrawMainMenu()
   ExpireSoundLoops(FALSE);
 
   KeyboardAutoRepeatOn();
-  ActivateJoystick();
 
   audio.sound_deactivated = FALSE;
 
@@ -1849,11 +1848,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       pos = choice + dy;
   }
 
-  if (pos == MAIN_CONTROL_LEVELS && dx != 0 && button)
-  {
-    HandleMainMenu_SelectLevel(1, (dx < 0 ? -1 : +1), NO_DIRECT_LEVEL_SELECT);
-  }
-  else if (pos == MAIN_CONTROL_FIRST_LEVEL && !button)
+  if (pos == MAIN_CONTROL_FIRST_LEVEL && !button)
   {
     HandleMainMenu_SelectLevel(MAX_LEVELS, -1, NO_DIRECT_LEVEL_SELECT);
   }
@@ -1882,6 +1877,12 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
        choice = pos;
       }
+      else if (dx != 0)
+      {
+       if (choice != MAIN_CONTROL_INFO &&
+           choice != MAIN_CONTROL_SETUP)
+         HandleMainMenu_SelectLevel(1, dx, NO_DIRECT_LEVEL_SELECT);
+      }
     }
     else
     {
@@ -2449,6 +2450,27 @@ void HandleMenuScreen(int mx, int my, int dx, int dy, int button,
 
        choice = choice_store[mode] = first_entry + y;
       }
+      else if (dx < 0)
+      {
+       PlaySound(SND_MENU_ITEM_SELECTING);
+
+       for (i = 0; menu_info[i].type != 0; i++)
+       {
+         if (menu_info[i].type & TYPE_LEAVE_MENU)
+         {
+           void (*menu_callback_function)(void) = menu_info[i].value;
+
+           FadeSetLeaveMenu();
+
+           menu_callback_function();
+
+           /* absolutely needed because function changes 'menu_info'! */
+           break;
+         }
+       }
+
+       return;
+      }
     }
     else if (!(menu_info[first_entry + y].type & TYPE_GHOSTED))
     {
@@ -3291,8 +3313,8 @@ void DrawInfoScreen_Version()
   DrawTextF(xstart2, ystart2, font_text, TARGET_STRING);
 
   ystart2 += ystep;
-  DrawTextF(xstart1, ystart2, font_header, "Compile time");
-  DrawTextF(xstart2, ystart2, font_text, getCompileDateString());
+  DrawTextF(xstart1, ystart2, font_header, "Source date");
+  DrawTextF(xstart2, ystart2, font_text, getSourceDateString());
 
   ystart2 += 3 * ystep;
   DrawTextF(xstart1, ystart2, font_header, "Library");
@@ -3974,6 +3996,30 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
        ti->cl_cursor = y;
       }
+      else if (dx < 0)
+      {
+       if (game_status == GAME_MODE_SETUP)
+       {
+         if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED ||
+             setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY ||
+             setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
+           execSetupGame();
+         else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
+                  setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
+                  setup_mode == SETUP_MODE_CHOOSE_RENDERING)
+           execSetupGraphics();
+         else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
+                  setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
+                  setup_mode == SETUP_MODE_CHOOSE_VOLUME_MUSIC)
+           execSetupSound();
+         else if (setup_mode == SETUP_MODE_CHOOSE_TOUCH_CONTROL ||
+                  setup_mode == SETUP_MODE_CHOOSE_MOVE_DISTANCE ||
+                  setup_mode == SETUP_MODE_CHOOSE_DROP_DISTANCE)
+           execSetupTouch();
+         else
+           execSetupArtwork();
+       }
+      }
     }
     else
     {
@@ -4095,13 +4141,13 @@ void DrawChooseLevelNr()
 
     ti->node_top = &level_number;
     ti->sort_priority = 10000 + value;
-    ti->color = (level.no_valid_file ? FC_BLUE :
+    ti->color = (level.no_level_file ? FC_BLUE :
                 LevelStats_getSolved(i) ? FC_GREEN :
                 LevelStats_getPlayed(i) ? FC_YELLOW : FC_RED);
 
-    sprintf(identifier, "%d", value);
-    sprintf(name, "%03d: %s", value,
-           (level.no_valid_file ? "(no file)" : level.name));
+    snprintf(identifier, sizeof(identifier), "%d", value);
+    snprintf(name, sizeof(name), "%03d: %s", value,
+            (level.no_level_file ? "(no file)" : level.name));
 
     setString(&ti->identifier, identifier);
     setString(&ti->name, name);
@@ -4143,7 +4189,6 @@ void DrawHallOfFame(int highlight_position)
 
   /* (this is needed when called from GameEnd() after winning a game) */
   KeyboardAutoRepeatOn();
-  ActivateJoystick();
 
   /* (this is needed when called from GameEnd() after winning a game) */
   SetDrawDeactivationMask(REDRAW_NONE);
@@ -4151,6 +4196,8 @@ void DrawHallOfFame(int highlight_position)
 
   if (highlight_position < 0) 
     LoadScore(level_nr);
+  else
+    SetAnimStatus(GAME_MODE_PSEUDO_SCORESNEW);
 
   FadeSetEnterScreen();
 
@@ -5190,14 +5237,12 @@ static void execSetupChooseMusic()
   DrawSetupScreen();
 }
 
-#if !defined(PLATFORM_ANDROID)
 static void execSetupInput()
 {
   setup_mode = SETUP_MODE_INPUT;
 
   DrawSetupScreen();
 }
-#endif
 
 static void execSetupShortcuts()
 {
@@ -5261,12 +5306,8 @@ static struct TokenInfo setup_info_main[] =
   { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics"              },
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
   { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
-#if !defined(PLATFORM_ANDROID)
   { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices"         },
   { TYPE_ENTER_MENU,   execSetupTouch,         "Touch Controls"        },
-#else
-  { TYPE_ENTER_MENU,   execSetupTouch,         "Touch Controls"        },
-#endif
   { TYPE_ENTER_MENU,   execSetupShortcuts,     "Key Shortcuts"         },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
@@ -5279,9 +5320,10 @@ static struct TokenInfo setup_info_game[] =
 {
   { TYPE_SWITCH,       &setup.team_mode,       "Team-Mode (Multi-Player):" },
   { TYPE_YES_NO,       &setup.input_on_focus,  "Only Move Focussed Player:" },
+  { TYPE_SWITCH,       &setup.time_limit,      "Time Limit:"           },
   { TYPE_SWITCH,       &setup.handicap,        "Handicap:"             },
   { TYPE_SWITCH,       &setup.skip_levels,     "Skip Unsolved Levels:" },
-  { TYPE_SWITCH,       &setup.time_limit,      "Time Limit:"           },
+  { TYPE_SWITCH,       &setup.increment_levels,"Increment Solved Levels:" },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record Tapes:"    },
   { TYPE_ENTER_LIST,   execSetupChooseGameSpeed, "Game Speed:"         },
   { TYPE_STRING,       &game_speed_text,       ""                      },
@@ -5309,9 +5351,10 @@ static struct TokenInfo setup_info_editor[] =
   { TYPE_SWITCH,       &setup.editor.el_supaplex,      "Supaplex:"     },
   { TYPE_SWITCH,       &setup.editor.el_diamond_caves, "Diamond Caves II:" },
   { TYPE_SWITCH,       &setup.editor.el_dx_boulderdash,"DX-Boulderdash:" },
-#endif
   { TYPE_SWITCH,       &setup.editor.el_chars,         "Text Characters:" },
   { TYPE_SWITCH, &setup.editor.el_steel_chars, "Text Characters (Steel):" },
+#endif
+  { TYPE_SWITCH,       &setup.editor.el_classic,  "Classic Elements:" },
   { TYPE_SWITCH,       &setup.editor.el_custom,  "Custom & Group Elements:" },
 #if 0
   { TYPE_SWITCH,       &setup.editor.el_headlines,     "Headlines:"    },
@@ -5905,9 +5948,6 @@ void DrawSetupScreen_Input()
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Setup Input");
 
-  DrawTextSCentered(SYSIZE - 20, FONT_TITLE_2,
-                   "Joysticks deactivated on this screen");
-
   for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
   {
     if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST))
@@ -5979,8 +6019,6 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
   };
   int text_font_nr = (active ? FONT_MENU_1_ACTIVE : FONT_MENU_1);
 
-  InitJoysticks();
-
   custom_key = setup.input[player_nr].key;
 
   DrawText(mSX + 11 * 32, mSY + 2 * 32, int2str(player_nr + 1, 1),
@@ -5994,8 +6032,10 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
   if (setup.input[player_nr].use_joystick)
   {
     char *device_name = setup.input[player_nr].joy.device_name;
-    char *text = joystick_name[getJoystickNrFromDeviceName(device_name)];
-    int font_nr = (joystick.fd[player_nr] < 0 ? FONT_VALUE_OLD : FONT_VALUE_1);
+    int joystick_nr = getJoystickNrFromDeviceName(device_name);
+    boolean joystick_active = CheckJoystickOpened(joystick_nr);
+    char *text = joystick_name[joystick_nr];
+    int font_nr = (joystick_active ? FONT_VALUE_1 : FONT_VALUE_OLD);
 
     DrawText(mSX + 8 * 32, mSY + 3 * 32, text, font_nr);
     DrawText(mSX + 32, mSY + 4 * 32, "Calibrate", text_font_nr);
@@ -6150,10 +6190,7 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
       else if (y == 2)
       {
        if (setup.input[input_player_nr].use_joystick)
-       {
-         InitJoysticks();
          CalibrateJoystick(input_player_nr);
-       }
        else
          CustomizeKeyboard(input_player_nr);
       }
@@ -6308,7 +6345,10 @@ static boolean CalibrateJoystickMain(int player_nr)
   int new_joystick_ylower = JOYSTICK_YMIDDLE;
   int new_joystick_xmiddle, new_joystick_ymiddle;
 
-  int joystick_fd = joystick.fd[player_nr];
+  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;
@@ -6319,7 +6359,7 @@ static boolean CalibrateJoystickMain(int player_nr)
   if (joystick.status == JOYSTICK_NOT_AVAILABLE)
     return FALSE;
 
-  if (joystick_fd < 0 || !setup.input[player_nr].use_joystick)
+  if (!joystick_active || !setup.input[player_nr].use_joystick)
     return FALSE;
 
   FadeSetEnterMenu();
@@ -6344,12 +6384,12 @@ static boolean CalibrateJoystickMain(int player_nr)
   DrawTextSCentered(mSY - SY + 12 * 32, FONT_TITLE_1, "and");
   DrawTextSCentered(mSY - SY + 13 * 32, FONT_TITLE_1, "press any button!");
 
-  joy_value = Joystick(player_nr);
+  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_fd, &joy_x, &joy_y, NULL, NULL))
+  if (!ReadJoystick(joystick_nr, &joy_x, &joy_y, NULL, NULL))
     return FALSE;
 
   new_joystick_xmiddle = joy_x;
@@ -6359,11 +6399,12 @@ static boolean CalibrateJoystickMain(int player_nr)
 
   FadeIn(REDRAW_FIELD);
 
-  while (Joystick(player_nr) & JOY_BUTTON);    /* wait for released button */
+  /* wait for potentially still pressed button to be released */
+  while (JoystickExt(joystick_nr, TRUE) & JOY_BUTTON);
 
   while (result < 0)
   {
-    if (PendingEvent())                /* got event */
+    while (PendingEvent())             /* got event */
     {
       Event event;
 
@@ -6399,7 +6440,7 @@ static boolean CalibrateJoystickMain(int player_nr)
       }
     }
 
-    if (!ReadJoystick(joystick_fd, &joy_x, &joy_y, NULL, NULL))
+    if (!ReadJoystick(joystick_nr, &joy_x, &joy_y, NULL, NULL))
       return FALSE;
 
     new_joystick_xleft  = MIN(new_joystick_xleft,  joy_x);
@@ -6416,7 +6457,7 @@ static boolean CalibrateJoystickMain(int player_nr)
 
     CheckJoystickData();
 
-    joy_value = Joystick(player_nr);
+    joy_value = JoystickExt(joystick_nr, TRUE);
 
     if (joy_value & JOY_BUTTON && check_remaining == 0)
       result = 1;
@@ -6445,14 +6486,14 @@ static boolean CalibrateJoystickMain(int player_nr)
   }
 
   /* calibrated center position (joystick should now be centered) */
-  if (!ReadJoystick(joystick_fd, &joy_x, &joy_y, NULL, NULL))
+  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 (Joystick(player_nr) & JOY_BUTTON)
+  while (JoystickExt(joystick_nr, TRUE) & JOY_BUTTON)
   {
     if (PendingEvent())                /* got event */
     {
@@ -6493,8 +6534,6 @@ void CalibrateJoystick(int player_nr)
 
 void DrawSetupScreen()
 {
-  DeactivateJoystick();
-
   if (setup_mode == SETUP_MODE_INPUT)
     DrawSetupScreen_Input();
   else if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)