added button to play tape to score info page (not used yet)
[rocksndiamonds.git] / src / screens.c
index a18d8d4a11462d51d6db46837036e5cd095cbd2f..30159ccf36bd7578f7e7c1641c8498de617deaea 100644 (file)
 #define MENU_CHOOSE_TREE_FONT(x)       (FONT_TEXT_1 + (x))
 #define MENU_CHOOSE_TREE_COLOR(ti, a)  TREE_COLOR(ti, a)
 
+#define TEXT_NEXT_PAGE                 "Press any key or button for next page"
+#define TEXT_INFO_MENU                 "Press any key or button for info menu"
+
 // for input setup functions
 #define SETUPINPUT_SCREEN_POS_START    0
 #define SETUPINPUT_SCREEN_POS_EMPTY1   3
 #define SCREEN_CTRL_ID_NEXT_LEVEL2     3
 #define SCREEN_CTRL_ID_PREV_SCORE      4
 #define SCREEN_CTRL_ID_NEXT_SCORE      5
-#define SCREEN_CTRL_ID_FIRST_LEVEL     6
-#define SCREEN_CTRL_ID_LAST_LEVEL      7
-#define SCREEN_CTRL_ID_LEVEL_NUMBER    8
-#define SCREEN_CTRL_ID_PREV_PLAYER     9
-#define SCREEN_CTRL_ID_NEXT_PLAYER     10
-#define SCREEN_CTRL_ID_INSERT_SOLUTION 11
-#define SCREEN_CTRL_ID_PLAY_SOLUTION   12
-#define SCREEN_CTRL_ID_SWITCH_ECS_AGA  13
-#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 14
-#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 15
-#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2        16
-#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2        17
-
-#define NUM_SCREEN_MENUBUTTONS         18
-
-#define SCREEN_CTRL_ID_SCROLL_UP       18
-#define SCREEN_CTRL_ID_SCROLL_DOWN     19
-#define SCREEN_CTRL_ID_SCROLL_VERTICAL 20
-#define SCREEN_CTRL_ID_NETWORK_SERVER  21
-
-#define NUM_SCREEN_GADGETS             22
+#define SCREEN_CTRL_ID_PLAY_TAPE       6
+#define SCREEN_CTRL_ID_FIRST_LEVEL     7
+#define SCREEN_CTRL_ID_LAST_LEVEL      8
+#define SCREEN_CTRL_ID_LEVEL_NUMBER    9
+#define SCREEN_CTRL_ID_PREV_PLAYER     10
+#define SCREEN_CTRL_ID_NEXT_PLAYER     11
+#define SCREEN_CTRL_ID_INSERT_SOLUTION 12
+#define SCREEN_CTRL_ID_PLAY_SOLUTION   13
+#define SCREEN_CTRL_ID_SWITCH_ECS_AGA  14
+#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 15
+#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 16
+#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2        17
+#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2        18
+
+#define NUM_SCREEN_MENUBUTTONS         19
+
+#define SCREEN_CTRL_ID_SCROLL_UP       19
+#define SCREEN_CTRL_ID_SCROLL_DOWN     20
+#define SCREEN_CTRL_ID_SCROLL_VERTICAL 21
+#define SCREEN_CTRL_ID_NETWORK_SERVER  22
+
+#define NUM_SCREEN_GADGETS             23
 
 #define NUM_SCREEN_SCROLLBUTTONS       2
 #define NUM_SCREEN_SCROLLBARS          1
@@ -296,7 +300,8 @@ static void MapScreenTreeGadgets(TreeInfo *);
 static void UnmapScreenTreeGadgets(void);
 
 static void UpdateScreenMenuGadgets(int, boolean);
-static void AdjustScoreInfoButtons(int, int, int);
+static void AdjustScoreInfoButtons_SelectScore(int, int, int);
+static void AdjustScoreInfoButtons_PlayTape(int, int);
 
 static boolean OfferUploadTapes(void);
 static void execOfferUploadTapes(void);
@@ -2922,8 +2927,7 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
   DrawTextSCentered(ystart1, font_title, text_title);
   DrawTextSCentered(ystart2, font_error, text_error);
 
-  DrawTextSCentered(ybottom, font_foot,
-                   "Press any key or button for info menu");
+  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
   FadeIn(REDRAW_FIELD);
 }
@@ -2954,9 +2958,7 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
     DrawHeadline();
 
     DrawTextSCentered(ystart1, font_title, "The Game Elements:");
-
-    DrawTextSCentered(ybottom, font_foot,
-                     "Press any key or button for next page");
+    DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_PAGE);
 
     FrameCounter = 0;
   }
@@ -3242,11 +3244,8 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       ClearField();
       DrawHeadline();
 
-      DrawTextSCentered(ystart, font_title,
-                       "No music info for this level set.");
-
-      DrawTextSCentered(ybottom, font_foot,
-                       "Press any key or button for info menu");
+      DrawTextSCentered(ystart, font_title, "No music info for this level set.");
+      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
       return;
     }
@@ -3370,8 +3369,7 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       ystart += ystep_head;
     }
 
-    DrawTextSCentered(ybottom, FONT_TEXT_4,
-                     "Press any key or button for next page");
+    DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_PAGE);
 
     if (button != MB_MENU_INITIALIZE)
       FadeIn(REDRAW_FIELD);
@@ -3412,8 +3410,10 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
               filename, font_text, chars, -1, lines, line_spacing, -1,
               autowrap, centered, parse_comments);
 
-  DrawTextSCentered(ybottom, font_foot,
-                   "Press any key or button for next page");
+  boolean last_screen = (screen_nr == num_credits_screens - 1);
+  char *text_foot = (last_screen ? TEXT_INFO_MENU : TEXT_NEXT_PAGE);
+
+  DrawTextSCentered(ybottom, font_foot, text_foot);
 }
 
 static void DrawInfoScreen_Credits(void)
@@ -3461,11 +3461,8 @@ void HandleInfoScreen_Credits(int dx, int dy, int button)
       ClearField();
       DrawHeadline();
 
-      DrawTextSCentered(ystart, font_title,
-                       "No credits for this level set.");
-
-      DrawTextSCentered(ybottom, font_foot,
-                       "Press any key or button for info menu");
+      DrawTextSCentered(ystart, font_title, "No credits for this level set.");
+      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
       return;
     }
@@ -3544,8 +3541,10 @@ static void DrawInfoScreen_ProgramScreen(int screen_nr)
               filename, font_text, chars, -1, lines, line_spacing, -1,
               autowrap, centered, parse_comments);
 
-  DrawTextSCentered(ybottom, font_foot,
-                   "Press any key or button for next page");
+  boolean last_screen = (screen_nr == num_program_info_screens - 1);
+  char *text_foot = (last_screen ? TEXT_INFO_MENU : TEXT_NEXT_PAGE);
+
+  DrawTextSCentered(ybottom, font_foot, text_foot);
 }
 
 static void DrawInfoScreen_Program(void)
@@ -3583,11 +3582,8 @@ void HandleInfoScreen_Program(int dx, int dy, int button)
       ClearField();
       DrawHeadline();
 
-      DrawTextSCentered(ystart, font_title,
-                       "No program info available.");
-
-      DrawTextSCentered(ybottom, font_foot,
-                       "Press any key or button for info menu");
+      DrawTextSCentered(ystart, font_title, "No program info available.");
+      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
       return;
     }
@@ -3800,8 +3796,7 @@ static void DrawInfoScreen_Version(void)
   DrawTextF(xstart2, ystart, font_text, "%s", setup.system.sdl_audiodriver);
   DrawTextF(xstart3, ystart, font_text, "%s", driver_name);
 
-  DrawTextSCentered(ybottom, font_foot,
-                   "Press any key or button for info menu");
+  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
   FadeIn(REDRAW_FIELD);
 }
@@ -3837,6 +3832,7 @@ static void DrawInfoScreen_LevelSet(void)
   struct TitleMessageInfo *tmi = &readme;
   char *filename = getLevelSetInfoFilename();
   char *title = "Level Set Information:";
+  int font_foot = MENU_INFO_FONT_FOOT;
   int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
@@ -3888,8 +3884,7 @@ static void DrawInfoScreen_LevelSet(void)
               filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
               tmi->autowrap, tmi->centered, tmi->parse_comments);
 
-  DrawTextSCentered(ybottom, FONT_TEXT_4,
-                   "Press any key or button for info menu");
+  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
 
   FadeIn(REDRAW_FIELD);
 }
@@ -5780,10 +5775,13 @@ static void DrawScoreInfo_Content(int entry_nr)
   int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO];
   int xstart1 = mSX - SX + 2 * xstep;
   int xstart2 = mSX - SX + 13 * xstep;
-  int button_x = SX + xstart1;
-  int button_y1, button_y2;
+  int select_x = SX + xstart1;
+  int select_y1, select_y2;
+  int play_x, play_y;
+  int play_height = screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE]->height;
   int font_width = getFontWidth(font_text);
   int font_height = getFontHeight(font_text);
+  int tape_date_width  = getTextWidth(entry->tape_date, font_text);
   int pad_left = xstart2;
   int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT;
   int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
@@ -5820,7 +5818,7 @@ static void DrawScoreInfo_Content(int entry_nr)
                          TRUE, FALSE, FALSE);
   ystart += ystep_para + (lines > 0 ? lines - 1 : 0) * font_height;
 
-  button_y1 = SY + ystart;
+  select_y1 = SY + ystart;
   ystart += graphic_info[IMG_MENU_BUTTON_PREV_SCORE].height;
 
   DrawTextF(xstart1, ystart, font_head, "Rank");
@@ -5853,6 +5851,9 @@ static void DrawScoreInfo_Content(int entry_nr)
 
   ystart += ystep_line;
 
+  play_x = SX + xstart2 + tape_date_width + font_width;
+  play_y = SY + ystart + (font_height - play_height) / 2;
+
   DrawTextF(xstart1, ystart, font_head, "Tape Date");
   DrawTextF(xstart2, ystart, font_text, entry->tape_date);
   ystart += ystep_line;
@@ -5871,11 +5872,12 @@ static void DrawScoreInfo_Content(int entry_nr)
                          TRUE, FALSE, FALSE);
   ystart += ystep_line;
 
-  button_y2 = SY + ystart;
+  select_y2 = SY + ystart;
 
   DrawTextSCentered(ybottom, font_foot, "Press any key or button to go back");
 
-  AdjustScoreInfoButtons(button_x, button_y1, button_y2);
+  AdjustScoreInfoButtons_SelectScore(select_x, select_y1, select_y2);
+  AdjustScoreInfoButtons_PlayTape(play_x, play_y);
 }
 
 static void DrawScoreInfo(int entry_nr)
@@ -5916,6 +5918,10 @@ static void HandleScoreInfo_SelectScore(int step, int direction)
   }
 }
 
+static void HandleScoreInfo_PlayTape(void)
+{
+}
+
 void HandleScoreInfo(int mx, int my, int dx, int dy, int button)
 {
   boolean button_action = (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE);
@@ -9815,6 +9821,14 @@ static struct
     GD_EVENT_PRESSED | GD_EVENT_REPEATED,
     FALSE, "next score"
   },
+  {
+    IMG_MENU_BUTTON_PLAY_TAPE, IMG_MENU_BUTTON_PLAY_TAPE,
+    &menu.scores.button.play_tape, NULL,
+    SCREEN_CTRL_ID_PLAY_TAPE,
+    SCREEN_MASK_SCORES_INFO,
+    GD_EVENT_RELEASED,
+    FALSE, "play tape"
+  },
   {
     IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE,
     &menu.main.button.first_level, NULL,
@@ -9988,6 +10002,8 @@ static void CreateScreenMenubuttons(void)
     boolean is_touch_button = menubutton_info[i].is_touch_button;
     boolean is_check_button = menubutton_info[i].check_value != NULL;
     boolean is_score_button = (screen_mask & SCREEN_MASK_SCORES_INFO);
+    boolean has_gfx_pressed = (menubutton_info[i].gfx_pressed ==
+                               menubutton_info[i].gfx_unpressed);
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
     int gfx_unpressed, gfx_pressed;
     int x, y, width, height;
@@ -10018,7 +10034,7 @@ static void CreateScreenMenubuttons(void)
     gd_x2a = gd_x2;
     gd_y2a = gd_y2;
 
-    if (is_touch_button)
+    if (has_gfx_pressed)
     {
       gd_x2 += graphic_info[gfx_pressed].pressed_xoffset;
       gd_y2 += graphic_info[gfx_pressed].pressed_yoffset;
@@ -10372,7 +10388,7 @@ static void UnmapScreenTreeGadgets(void)
   UnmapScreenGadgets();
 }
 
-static void AdjustScoreInfoButtons(int x, int y1, int y2)
+static void AdjustScoreInfoButtons_SelectScore(int x, int y1, int y2)
 {
   struct GadgetInfo *gi_1 = screen_gadget[SCREEN_CTRL_ID_PREV_SCORE];
   struct GadgetInfo *gi_2 = screen_gadget[SCREEN_CTRL_ID_NEXT_SCORE];
@@ -10386,6 +10402,15 @@ static void AdjustScoreInfoButtons(int x, int y1, int y2)
     ModifyGadget(gi_2, GDI_X, x, GDI_Y, y2, GDI_END);
 }
 
+static void AdjustScoreInfoButtons_PlayTape(int x, int y)
+{
+  struct GadgetInfo *gi = screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE];
+  struct MenuPosInfo *pos = menubutton_info[SCREEN_CTRL_ID_PLAY_TAPE].pos;
+
+  if (pos->x == -1 && pos->y == -1)
+    ModifyGadget(gi, GDI_X, x, GDI_Y, y, GDI_END);
+}
+
 static void HandleScreenGadgets(struct GadgetInfo *gi)
 {
   int id = gi->custom_id;
@@ -10420,6 +10445,10 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       HandleScoreInfo_SelectScore(step, +1);
       break;
 
+    case SCREEN_CTRL_ID_PLAY_TAPE:
+      HandleScoreInfo_PlayTape();
+      break;
+
     case SCREEN_CTRL_ID_FIRST_LEVEL:
       HandleMainMenu_SelectLevel(MAX_LEVELS, -1, NO_DIRECT_LEVEL_SELECT);
       break;