cleaned up configuring virtual buttons
[rocksndiamonds.git] / src / screens.c
index bd59b4cd4d8c46493fdf78c4dff95d1624c069bd..3a90c9571dd8aba39f387d6951a7989deb02d351 100644 (file)
@@ -258,6 +258,7 @@ static void ModifyGameSpeedIfNeeded(void);
 static void DisableVsyncIfNeeded(void);
 
 static void MapScreenMenuGadgets(int);
+static void UnmapScreenMenuGadgets(int);
 static void MapScreenGadgets(int);
 static void MapScreenTreeGadgets(TreeInfo *);
 
@@ -988,6 +989,7 @@ static struct TitleFadingInfo getTitleFading(struct TitleControlInfo *tci)
   ti.fade_delay = tmi.fade_delay;
   ti.post_delay = tmi.post_delay;
   ti.auto_delay = tmi.auto_delay;
+  ti.auto_delay_unit = tmi.auto_delay_unit;
 
   return ti;
 }
@@ -1704,6 +1706,25 @@ static void gotoTopLevelDir(void)
   }
 }
 
+static unsigned int getAutoDelayCounter(struct TitleFadingInfo *fi)
+{
+  boolean use_frame_counter = (fi->auto_delay_unit == AUTO_DELAY_UNIT_FRAMES);
+
+  return (use_frame_counter ? video.frame_counter : Counter());
+}
+
+static boolean TitleAutoDelayReached(unsigned int *counter_var,
+                                    struct TitleFadingInfo *fi)
+{
+  return DelayReachedExt(counter_var, fi->auto_delay, getAutoDelayCounter(fi));
+}
+
+static void ResetTitleAutoDelay(unsigned int *counter_var,
+                               struct TitleFadingInfo *fi)
+{
+  *counter_var = getAutoDelayCounter(fi);
+}
+
 void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 {
   static unsigned int title_delay = 0;
@@ -1778,12 +1799,12 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
     FadeIn(REDRAW_ALL);
 
-    DelayReached(&title_delay, 0);     // reset delay counter
+    ResetTitleAutoDelay(&title_delay, &fading);
 
     return;
   }
 
-  if (fading.auto_delay > 0 && DelayReached(&title_delay, fading.auto_delay))
+  if (fading.auto_delay > 0 && TitleAutoDelayReached(&title_delay, &fading))
     button = MB_MENU_CHOICE;
 
   if (button == MB_MENU_LEAVE)
@@ -1841,7 +1862,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
       FadeIn(REDRAW_ALL);
 
-      DelayReached(&title_delay, 0);   // reset delay counter
+      ResetTitleAutoDelay(&title_delay, &fading);
     }
     else
     {
@@ -1938,7 +1959,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
   static boolean button_pressed_last = FALSE;
   boolean button_pressed = FALSE;
   int pos = choice;
-  int i;
+  int i = 0;   // needed to prevent compiler warning due to bad code below
 
   if (button == MB_MENU_INITIALIZE)
   {
@@ -4530,7 +4551,7 @@ void DrawChooseLevelNr(void)
   for (i = leveldir_current->first_level; i <= leveldir_current->last_level;i++)
   {
     TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_LEVEL_NR);
-    char identifier[32], name[32];
+    char identifier[32], name[64];
     int value = i;
 
     // temporarily load level info to get level name
@@ -4705,7 +4726,8 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button)
 
     FadeSound(SND_BACKGROUND_SCORES);
 
-    if (game_status_last_screen == GAME_MODE_PLAYING &&
+    if (button == MB_MENU_CHOICE &&
+       game_status_last_screen == GAME_MODE_PLAYING &&
        setup.auto_play_next_level && setup.increment_levels &&
        level_nr < leveldir_current->last_level &&
        !network_playing)
@@ -6164,6 +6186,17 @@ static struct
   { &setup.touch.grid_ysize[1],                execSetupChooseGridYSize_1      },
   { &setup.touch.grid_ysize[1],                &grid_size_text[1][1]           },
 
+  { &setup.internal.menu_game,         execSetupGame                   },
+  { &setup.internal.menu_editor,       execSetupEditor                 },
+  { &setup.internal.menu_graphics,     execSetupGraphics               },
+  { &setup.internal.menu_sound,                execSetupSound                  },
+  { &setup.internal.menu_artwork,      execSetupArtwork                },
+  { &setup.internal.menu_input,                execSetupInput                  },
+  { &setup.internal.menu_touch,                execSetupTouch                  },
+  { &setup.internal.menu_shortcuts,    execSetupShortcuts              },
+  { &setup.internal.menu_exit,         execExitSetup                   },
+  { &setup.internal.menu_save_and_exit,        execSaveAndExitSetup            },
+
   { NULL,                              NULL                            }
 };
 
@@ -7873,6 +7906,13 @@ static boolean ConfigureVirtualButtonsMain(void)
     CHAR_GRID_BUTTON_SNAP,
     CHAR_GRID_BUTTON_DROP
   };
+  enum
+  {
+    ACTION_NONE,
+    ACTION_ESCAPE,
+    ACTION_BACK,
+    ACTION_NEXT
+  };
   int font_nr = FONT_INPUT_1_ACTIVE;
   int font_height = getFontHeight(font_nr);
   int ypos1 = SYSIZE / 2 - font_height * 2;
@@ -7912,74 +7952,23 @@ static boolean ConfigureVirtualButtonsMain(void)
 
     while (NextValidEvent(&event))
     {
+      int action = ACTION_NONE;
+
+      // ---------- handle events and set the resulting action ----------
+
       switch (event.type)
       {
         case EVENT_KEYPRESS:
          {
            Key key = GetEventKey((KeyEvent *)&event, FALSE);
 
-           // press 'Escape' to abort and keep the old key bindings
-           if (key == KSYM_Escape)
-           {
-             for (x = 0; x < MAX_GRID_XSIZE; x++)
-               for (y = 0; y < MAX_GRID_YSIZE; y++)
-                 overlay.grid_button[x][y] = grid_button_old[x][y];
-
-             FadeSkipNextFadeIn();
-
-             finished = TRUE;
-
-             break;
-           }
-
-           // press 'Enter' to keep the existing key binding
-           if (key == KSYM_Return ||
-               key == KSYM_Menu ||
-               key == KSYM_space)
-           {
-             step_nr++;
-           }
-           else if (key == KSYM_BackSpace ||
-                    key == KSYM_Back)
-           {
-             if (step_nr == 0)
-             {
-               FadeSkipNextFadeIn();
-
-               finished = TRUE;
-
-               break;
-             }
-
-             step_nr--;
-           }
-           else
-           {
-             break;
-           }
-
-           // all virtual buttons configured
-           if (step_nr == 6)
-           {
-             finished = TRUE;
-             success = TRUE;
-
-             break;
-           }
-
-           for (x = 0; x < MAX_GRID_XSIZE; x++)
-             for (y = 0; y < MAX_GRID_YSIZE; y++)
-               grid_button_tmp[x][y] = overlay.grid_button[x][y];
-
-           overlay.grid_button_highlight = grid_button[step_nr];
-
-           // query next virtual button
-
-           ClearField();
-
-           DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons");
-           DrawTextSCentered(ypos1, font_nr, "Select tiles to");
-           DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]);
+           action = (key == KSYM_Escape ?      ACTION_ESCAPE :
+                     key == KSYM_BackSpace ||
+                     key == KSYM_Back ?        ACTION_BACK :
+                     key == KSYM_Return ||
+                     key == KSYM_Menu ||
+                     key == KSYM_space ?       ACTION_NEXT :
+                     ACTION_NONE);
          }
          break;
 
@@ -7992,6 +7981,13 @@ static boolean ConfigureVirtualButtonsMain(void)
          {
            ButtonEvent *button = (ButtonEvent *)&event;
 
+           motion_status = FALSE;
+
+           if (button->type == EVENT_BUTTONPRESS)
+             button_status = button->button;
+           else
+             button_status = MB_RELEASED;
+
            button->x += video.screen_xoffset;
            button->y += video.screen_yoffset;
 
@@ -8000,18 +7996,12 @@ static boolean ConfigureVirtualButtonsMain(void)
 
            if (button->type == EVENT_BUTTONPRESS)
            {
-             button_status = button->button;
-
              grid_button_draw =
                (overlay.grid_button[x][y] != grid_button[step_nr] ?
                 grid_button[step_nr] : CHAR_GRID_BUTTON_NONE);
 
              set_grid_button = TRUE;
            }
-           else
-           {
-             button_status = MB_RELEASED;
-           }
          }
          break;
 
@@ -8019,6 +8009,8 @@ static boolean ConfigureVirtualButtonsMain(void)
          {
            MotionEvent *motion = (MotionEvent *)&event;
 
+           motion_status = TRUE;
+
            motion->x += video.screen_xoffset;
            motion->y += video.screen_yoffset;
 
@@ -8057,6 +8049,64 @@ static boolean ConfigureVirtualButtonsMain(void)
          break;
       }
 
+      // ---------- perform action set by handling events ----------
+
+      if (action == ACTION_ESCAPE)
+      {
+       // abort and restore the old key bindings
+
+       for (x = 0; x < MAX_GRID_XSIZE; x++)
+         for (y = 0; y < MAX_GRID_YSIZE; y++)
+           overlay.grid_button[x][y] = grid_button_old[x][y];
+
+       FadeSkipNextFadeIn();
+
+       finished = TRUE;
+      }
+      else if (action == ACTION_BACK)
+      {
+       // keep the configured key bindings and go to previous page
+
+       step_nr--;
+
+       if (step_nr < 0)
+       {
+         FadeSkipNextFadeIn();
+
+         finished = TRUE;
+       }
+      }
+      else if (action == ACTION_NEXT)
+      {
+       // keep the configured key bindings and go to next page
+
+       step_nr++;
+
+       // all virtual buttons configured
+       if (step_nr == 6)
+       {
+         finished = TRUE;
+         success = TRUE;
+       }
+      }
+
+      if (action != ACTION_NONE && !finished)
+      {
+       for (x = 0; x < MAX_GRID_XSIZE; x++)
+         for (y = 0; y < MAX_GRID_YSIZE; y++)
+           grid_button_tmp[x][y] = overlay.grid_button[x][y];
+
+       overlay.grid_button_highlight = grid_button[step_nr];
+
+       // configure next virtual button
+
+       ClearField();
+
+       DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons");
+       DrawTextSCentered(ypos1, font_nr, "Select tiles to");
+       DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]);
+      }
+
       if (set_grid_button)
       {
        overlay.grid_button[x][y] =
@@ -8268,64 +8318,10 @@ void HandleGameActions(void)
 
 // ---------- new screen button stuff --------------------------------------
 
-static void getScreenMenuButtonPos(int *x, int *y, int gadget_id)
-{
-  switch (gadget_id)
-  {
-    case SCREEN_CTRL_ID_PREV_LEVEL:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.prev_level.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.prev_level.y);
-      break;
-
-    case SCREEN_CTRL_ID_NEXT_LEVEL:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.next_level.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.next_level.y);
-      break;
-
-    case SCREEN_CTRL_ID_FIRST_LEVEL:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.first_level.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.first_level.y);
-      break;
-
-    case SCREEN_CTRL_ID_LAST_LEVEL:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.last_level.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.last_level.y);
-      break;
-
-    case SCREEN_CTRL_ID_LEVEL_NUMBER:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.level_number.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.level_number.y);
-      break;
-
-    case SCREEN_CTRL_ID_PREV_PLAYER:
-      *x = mSX + TILEX * 10;
-      *y = mSY + TILEY * MENU_SCREEN_START_YPOS;
-      break;
-
-    case SCREEN_CTRL_ID_NEXT_PLAYER:
-      *x = mSX + TILEX * 12;
-      *y = mSY + TILEY * MENU_SCREEN_START_YPOS;
-      break;
-
-    case SCREEN_CTRL_ID_INSERT_SOLUTION:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.insert_solution.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.insert_solution.y);
-      break;
-
-    case SCREEN_CTRL_ID_PLAY_SOLUTION:
-      *x = mSX + GDI_ACTIVE_POS(menu.main.button.play_solution.x);
-      *y = mSY + GDI_ACTIVE_POS(menu.main.button.play_solution.y);
-      break;
-
-    default:
-      Error(ERR_EXIT, "unknown gadget ID %d", gadget_id);
-  }
-}
-
 static struct
 {
   int gfx_unpressed, gfx_pressed;
-  void (*get_gadget_position)(int *, int *, int);
+  struct MenuPosInfo *pos;
   int gadget_id;
   int screen_mask;
   unsigned int event_mask;
@@ -8334,7 +8330,7 @@ static struct
 {
   {
     IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.prev_level,
     SCREEN_CTRL_ID_PREV_LEVEL,
     SCREEN_MASK_MAIN,
     GD_EVENT_PRESSED | GD_EVENT_REPEATED,
@@ -8342,7 +8338,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.next_level,
     SCREEN_CTRL_ID_NEXT_LEVEL,
     SCREEN_MASK_MAIN,
     GD_EVENT_PRESSED | GD_EVENT_REPEATED,
@@ -8350,7 +8346,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.first_level,
     SCREEN_CTRL_ID_FIRST_LEVEL,
     SCREEN_MASK_MAIN,
     GD_EVENT_RELEASED,
@@ -8358,7 +8354,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.last_level,
     SCREEN_CTRL_ID_LAST_LEVEL,
     SCREEN_MASK_MAIN,
     GD_EVENT_RELEASED,
@@ -8366,7 +8362,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.level_number,
     SCREEN_CTRL_ID_LEVEL_NUMBER,
     SCREEN_MASK_MAIN,
     GD_EVENT_RELEASED,
@@ -8374,7 +8370,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.setup.button.prev_player,
     SCREEN_CTRL_ID_PREV_PLAYER,
     SCREEN_MASK_INPUT,
     GD_EVENT_PRESSED | GD_EVENT_REPEATED,
@@ -8382,7 +8378,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.setup.button.next_player,
     SCREEN_CTRL_ID_NEXT_PLAYER,
     SCREEN_MASK_INPUT,
     GD_EVENT_PRESSED | GD_EVENT_REPEATED,
@@ -8390,7 +8386,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.insert_solution,
     SCREEN_CTRL_ID_INSERT_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
     GD_EVENT_RELEASED,
@@ -8398,7 +8394,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE,
-    getScreenMenuButtonPos,
+    &menu.main.button.play_solution,
     SCREEN_CTRL_ID_PLAY_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
     GD_EVENT_RELEASED,
@@ -8476,6 +8472,7 @@ static void CreateScreenMenubuttons(void)
 
   for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++)
   {
+    struct MenuPosInfo *pos = menubutton_info[i].pos;
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
     int gfx_unpressed, gfx_pressed;
     int x, y, width, height;
@@ -8484,18 +8481,11 @@ static void CreateScreenMenubuttons(void)
 
     event_mask = menubutton_info[i].event_mask;
 
-    menubutton_info[i].get_gadget_position(&x, &y, id);
+    x = mSX + GDI_ACTIVE_POS(pos->x);
+    y = mSY + GDI_ACTIVE_POS(pos->y);
 
-    if (menubutton_info[i].screen_mask == SCREEN_MASK_MAIN_HAS_SOLUTION)
-    {
-      width  = graphic_info[menubutton_info[i].gfx_pressed].width;
-      height = graphic_info[menubutton_info[i].gfx_pressed].height;
-    }
-    else
-    {
-      width = SC_MENUBUTTON_XSIZE;
-      height = SC_MENUBUTTON_YSIZE;
-    }
+    width  = graphic_info[menubutton_info[i].gfx_pressed].width;
+    height = graphic_info[menubutton_info[i].gfx_pressed].height;
 
     gfx_unpressed = menubutton_info[i].gfx_unpressed;
     gfx_pressed   = menubutton_info[i].gfx_pressed;
@@ -8743,7 +8733,7 @@ void FreeScreenGadgets(void)
     FreeGadget(screen_gadget[i]);
 }
 
-void MapScreenMenuGadgets(int screen_mask)
+static void MapScreenMenuGadgets(int screen_mask)
 {
   int i;
 
@@ -8771,7 +8761,7 @@ static void UnmapScreenMenuGadgets(int screen_mask)
   }
 }
 
-void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets)
+static void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets)
 {
   if (map_gadgets)
     MapScreenMenuGadgets(screen_mask);
@@ -8779,7 +8769,7 @@ void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets)
     UnmapScreenMenuGadgets(screen_mask);
 }
 
-void MapScreenGadgets(int num_entries)
+static void MapScreenGadgets(int num_entries)
 {
   int i;
 
@@ -8793,7 +8783,7 @@ void MapScreenGadgets(int num_entries)
     MapGadget(screen_gadget[scrollbar_info[i].gadget_id]);
 }
 
-void MapScreenTreeGadgets(TreeInfo *ti)
+static void MapScreenTreeGadgets(TreeInfo *ti)
 {
   MapScreenGadgets(numTreeInfoInGroup(ti));
 }