added graphic definition for activated state for level set info button
[rocksndiamonds.git] / src / screens.c
index bf495c1586ede1346c618dfd2c205cd6dca0ac6d..3e0dd34395e10bed20fe43594895ee2a65dead76 100644 (file)
@@ -1579,8 +1579,9 @@ static void DrawInfoScreen_Headline(int screen_nr, int num_screens,
   else
   {
     char *text_format = (use_global_screens ? "for %s" : "for \"%s\"");
+    int text_format_len = strlen(text_format) - strlen("%s");
     int max_text_len = SXSIZE / getFontWidth(FONT_TITLE_2);
-    int max_name_len = max_text_len - strlen(text_format) - strlen("%s");
+    int max_name_len = max_text_len - text_format_len;
     char name_cut[max_name_len];
     char *name_full = (use_global_screens ? getProgramTitleString() :
                       leveldir_current->name);
@@ -1597,6 +1598,7 @@ static void DrawTitleScreenImage(int nr, boolean initial)
 {
   int graphic = getTitleScreenGraphic(nr, initial);
   Bitmap *bitmap = graphic_info[graphic].bitmap;
+  int draw_masked = graphic_info[graphic].draw_masked;
   int width  = graphic_info[graphic].width;
   int height = graphic_info[graphic].height;
   int src_x = graphic_info[graphic].src_x;
@@ -1629,7 +1631,7 @@ static void DrawTitleScreenImage(int nr, boolean initial)
 
   ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
-  if (DrawingOnBackground(dst_x, dst_y))
+  if (DrawingOnBackground(dst_x, dst_y) && draw_masked)
     BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
   else
     BlitBitmap(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
@@ -3069,11 +3071,23 @@ static int getMenuTextStep(int spacing_height, int font_nr)
   return getFontHeight(font_nr) + getMenuTextSpacing(spacing_height, font_nr);
 }
 
+static int getHeadlineSpacing(void)
+{
+  // special compatibility handling for "R'n'D jue 2022" game editions
+  int spacing_check = menu.headline1_spacing[GAME_MODE_SCOREINFO];
+  int spacing = (game_status == GAME_MODE_SCOREINFO ?
+                menu.headline1_spacing[GAME_MODE_SCOREINFO] :
+                menu.headline1_spacing_info[info_mode]);
+  int font = MENU_INFO_FONT_TITLE;
+
+  return (spacing_check != -2 ? getMenuTextStep(spacing, font) : 0);
+}
+
 void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
 {
   int font_error = FONT_TEXT_2;
   int font_foot  = MENU_INFO_FONT_FOOT;
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO);
@@ -3096,7 +3110,7 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
   static int infoscreen_frame[MAX_INFO_ELEMENTS_IN_ARRAY];
   int font_foot = MENU_INFO_FONT_FOOT;
   int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT;
-  int ystart = mSY + MENU_SCREEN_INFO_YSTART;
+  int ystart = mSY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
   int ystep = MENU_SCREEN_INFO_YSTEP;
   int element, action, direction;
@@ -3219,7 +3233,7 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
   int font_height = getFontHeight(font_nr);
   int yoffset = (TILEX - 2 * font_height) / 2;
   int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT + TILEX + MINI_TILEX;
-  int ystart = mSY + MENU_SCREEN_INFO_YSTART + yoffset;
+  int ystart = mSY + MENU_SCREEN_INFO_YSTART + yoffset + getHeadlineSpacing();
   int ystep = TILEY + 4;
   int pad_left = xstart - SX;
   int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT;
@@ -3564,7 +3578,7 @@ static void DrawInfoScreen_Version(void)
   int ystep_head = getMenuTextStep(spacing_head,  font_head);
   int ystep_para = getMenuTextStep(spacing_para,  font_text);
   int ystep_line = getMenuTextStep(spacing_line,  font_text);
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
   int xstart1 = mSX - SX + 2 * xstep;
   int xstart2 = mSX - SX + 18 * xstep;
@@ -3821,11 +3835,13 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
     int lines = height / getFontHeight(font_text);
     int padx = (width - chars * getFontWidth(font_text)) / 2;
     int line_spacing = getMenuTextSpacing(spacing_line, font_text);
+    int xstart = mSX + padx;
+    int ystart = mSY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
     boolean autowrap = FALSE;
     boolean centered = TRUE;
     boolean parse_comments = TRUE;
 
-    DrawTextFile(mSX + padx, mSY + MENU_SCREEN_INFO_YSTART,
+    DrawTextFile(xstart, ystart,
                 filename, font_text, chars, -1, lines, line_spacing, -1,
                 autowrap, centered, parse_comments);
   }
@@ -3839,7 +3855,7 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
 
     // if y position set to "-1", use static default value
     if (tmi->y == -1)
-      tmi->y = MENU_SCREEN_INFO_YSTART;
+      tmi->y = MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
 
     // if width set to "-1", automatically determine by playfield width
     if (tmi->width == -1)
@@ -5476,16 +5492,18 @@ static void DrawScoreInfo_Content(int entry_nr)
   struct ScoreEntry *entry = &scores.entry[entry_nr];
   char *pos_text = getHallOfFameRankText(entry_nr, 0);
   char *tape_date = getHallOfFameTapeDateText(entry);
-  int font_head  = MENU_INFO_FONT_HEAD;
-  int font_text  = MENU_INFO_FONT_TEXT;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_para  = menu.paragraph_spacing[GAME_MODE_SCOREINFO];
-  int spacing_line  = menu.line_spacing[GAME_MODE_SCOREINFO];
+  int font_head = MENU_INFO_FONT_HEAD;
+  int font_text = MENU_INFO_FONT_TEXT;
+  int font_foot = MENU_INFO_FONT_FOOT;
+  int spacing_para = menu.paragraph_spacing[GAME_MODE_SCOREINFO];
+  int spacing_line = menu.line_spacing[GAME_MODE_SCOREINFO];
+  int spacing_left = menu.left_spacing[GAME_MODE_SCOREINFO];
+  int spacing_top  = menu.top_spacing[GAME_MODE_SCOREINFO];
   int xstep = getFontWidth(font_text);
-  int ystep_para  = getMenuTextStep(spacing_para,  font_text);
-  int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int xstart  = mSX - SX + menu.left_spacing[GAME_MODE_SCOREINFO];
-  int ystart  = mSY - SY + menu.top_spacing[GAME_MODE_SCOREINFO];
+  int ystep_para = getMenuTextStep(spacing_para,  font_text);
+  int ystep_line = getMenuTextStep(spacing_line,  font_text);
+  int xstart  = mSX - SX + spacing_left;
+  int ystart  = mSY - SY + spacing_top + getHeadlineSpacing();
   int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO];
   int xstart1 = xstart + xstep;
   int xstart2 = xstart + xstep * 12;
@@ -5496,7 +5514,7 @@ static void DrawScoreInfo_Content(int entry_nr)
   boolean play_visible = !strEqual(tape_date, UNKNOWN_NAME);
   int font_width = getFontWidth(font_text);
   int font_height = getFontHeight(font_text);
-  int tape_date_width  = getTextWidth(tape_date, font_text);
+  int tape_date_width = getTextWidth(tape_date, font_text);
   int pad_left = xstart2;
   int pad_right = menu.right_spacing[GAME_MODE_SCOREINFO];
   int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
@@ -9523,7 +9541,7 @@ void HandleGameActions(void)
 
 static struct
 {
-  int gfx_unpressed, gfx_pressed;
+  int gfx_unpressed, gfx_pressed, gfx_active;
   struct MenuPosInfo *pos;
   boolean *check_value;
   int gadget_id;
@@ -9534,7 +9552,7 @@ static struct
 } menubutton_info[NUM_SCREEN_MENUBUTTONS] =
 {
   {
-    IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE, -1,
     &menu.main.button.prev_level, NULL,
     SCREEN_CTRL_ID_PREV_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9542,7 +9560,7 @@ static struct
     FALSE, "previous level"
   },
   {
-    IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE, -1,
     &menu.main.button.next_level, NULL,
     SCREEN_CTRL_ID_NEXT_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9550,7 +9568,7 @@ static struct
     FALSE, "next level"
   },
   {
-    IMG_MENU_BUTTON_PREV_LEVEL2, IMG_MENU_BUTTON_PREV_LEVEL2_ACTIVE,
+    IMG_MENU_BUTTON_PREV_LEVEL2, IMG_MENU_BUTTON_PREV_LEVEL2_ACTIVE, -1,
     &menu.scores.button.prev_level, NULL,
     SCREEN_CTRL_ID_PREV_LEVEL2,
     SCREEN_MASK_SCORES | SCREEN_MASK_SCORES_INFO,
@@ -9558,7 +9576,7 @@ static struct
     FALSE, "previous level"
   },
   {
-    IMG_MENU_BUTTON_NEXT_LEVEL2, IMG_MENU_BUTTON_NEXT_LEVEL2_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_LEVEL2, IMG_MENU_BUTTON_NEXT_LEVEL2_ACTIVE, -1,
     &menu.scores.button.next_level, NULL,
     SCREEN_CTRL_ID_NEXT_LEVEL2,
     SCREEN_MASK_SCORES | SCREEN_MASK_SCORES_INFO,
@@ -9566,7 +9584,7 @@ static struct
     FALSE, "next level"
   },
   {
-    IMG_MENU_BUTTON_PREV_SCORE, IMG_MENU_BUTTON_PREV_SCORE_ACTIVE,
+    IMG_MENU_BUTTON_PREV_SCORE, IMG_MENU_BUTTON_PREV_SCORE_ACTIVE, -1,
     &menu.scores.button.prev_score, NULL,
     SCREEN_CTRL_ID_PREV_SCORE,
     SCREEN_MASK_SCORES_INFO,
@@ -9574,7 +9592,7 @@ static struct
     FALSE, "previous score"
   },
   {
-    IMG_MENU_BUTTON_NEXT_SCORE, IMG_MENU_BUTTON_NEXT_SCORE_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_SCORE, IMG_MENU_BUTTON_NEXT_SCORE_ACTIVE, -1,
     &menu.scores.button.next_score, NULL,
     SCREEN_CTRL_ID_NEXT_SCORE,
     SCREEN_MASK_SCORES_INFO,
@@ -9582,7 +9600,7 @@ static struct
     FALSE, "next score"
   },
   {
-    IMG_MENU_BUTTON_PLAY_TAPE, IMG_MENU_BUTTON_PLAY_TAPE,
+    IMG_MENU_BUTTON_PLAY_TAPE, IMG_MENU_BUTTON_PLAY_TAPE, -1,
     &menu.scores.button.play_tape, NULL,
     SCREEN_CTRL_ID_PLAY_TAPE,
     SCREEN_MASK_SCORES_INFO,
@@ -9590,7 +9608,7 @@ static struct
     FALSE, "play tape"
   },
   {
-    IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE, -1,
     &menu.main.button.first_level, NULL,
     SCREEN_CTRL_ID_FIRST_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9598,7 +9616,7 @@ static struct
     FALSE, "first level"
   },
   {
-    IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE, -1,
     &menu.main.button.last_level, NULL,
     SCREEN_CTRL_ID_LAST_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9606,7 +9624,7 @@ static struct
     FALSE, "last level"
   },
   {
-    IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE,
+    IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE, -1,
     &menu.main.button.level_number, NULL,
     SCREEN_CTRL_ID_LEVEL_NUMBER,
     SCREEN_MASK_MAIN,
@@ -9614,7 +9632,7 @@ static struct
     FALSE, "level number"
   },
   {
-    IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE,
+    IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE, -1,
     &menu.setup.button.prev_player, NULL,
     SCREEN_CTRL_ID_PREV_PLAYER,
     SCREEN_MASK_INPUT,
@@ -9622,7 +9640,7 @@ static struct
     FALSE, "previous player"
   },
   {
-    IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE,
+    IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE, -1,
     &menu.setup.button.next_player, NULL,
     SCREEN_CTRL_ID_NEXT_PLAYER,
     SCREEN_MASK_INPUT,
@@ -9630,7 +9648,7 @@ static struct
     FALSE, "next player"
   },
   {
-    IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE,
+    IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE, -1,
     &menu.main.button.insert_solution, NULL,
     SCREEN_CTRL_ID_INSERT_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
@@ -9638,7 +9656,7 @@ static struct
     FALSE, "insert solution tape"
   },
   {
-    IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE,
+    IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE, -1,
     &menu.main.button.play_solution, NULL,
     SCREEN_CTRL_ID_PLAY_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
@@ -9647,6 +9665,7 @@ static struct
   },
   {
     IMG_MENU_BUTTON_LEVELSET_INFO, IMG_MENU_BUTTON_LEVELSET_INFO_ACTIVE,
+    IMG_MENU_BUTTON_LEVELSET_INFO_PRESSED,
     &menu.main.button.levelset_info, NULL,
     SCREEN_CTRL_ID_LEVELSET_INFO,
     SCREEN_MASK_MAIN_HAS_SET_INFO,
@@ -9654,7 +9673,7 @@ static struct
     FALSE, "show level set info"
   },
   {
-    IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE,
+    IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE, -1,
     &menu.main.button.switch_ecs_aga, &setup.prefer_aga_graphics,
     SCREEN_CTRL_ID_SWITCH_ECS_AGA,
     SCREEN_MASK_MAIN,
@@ -9662,7 +9681,7 @@ static struct
     FALSE, "switch ECS/AGA chipset"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK,
+    IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK, -1,
     &menu.setup.button.touch_back, NULL,
     SCREEN_CTRL_ID_TOUCH_PREV_PAGE,
     SCREEN_MASK_TOUCH,
@@ -9670,7 +9689,7 @@ static struct
     TRUE, "previous page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_NEXT, IMG_MENU_BUTTON_TOUCH_NEXT,
+    IMG_MENU_BUTTON_TOUCH_NEXT, IMG_MENU_BUTTON_TOUCH_NEXT, -1,
     &menu.setup.button.touch_next, NULL,
     SCREEN_CTRL_ID_TOUCH_NEXT_PAGE,
     SCREEN_MASK_TOUCH,
@@ -9678,7 +9697,7 @@ static struct
     TRUE, "next page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_BACK2, IMG_MENU_BUTTON_TOUCH_BACK2,
+    IMG_MENU_BUTTON_TOUCH_BACK2, IMG_MENU_BUTTON_TOUCH_BACK2, -1,
     &menu.setup.button.touch_back2, NULL,
     SCREEN_CTRL_ID_TOUCH_PREV_PAGE2,
     SCREEN_MASK_TOUCH2,
@@ -9686,7 +9705,7 @@ static struct
     TRUE, "previous page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_NEXT2, IMG_MENU_BUTTON_TOUCH_NEXT2,
+    IMG_MENU_BUTTON_TOUCH_NEXT2, IMG_MENU_BUTTON_TOUCH_NEXT2, -1,
     &menu.setup.button.touch_next2, NULL,
     SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2,
     SCREEN_MASK_TOUCH2,
@@ -9772,8 +9791,11 @@ static void CreateScreenMenubuttons(void)
     boolean is_score_button = (screen_mask & SCREEN_MASK_SCORES_INFO);
     boolean has_gfx_pressed = (menubutton_info[i].gfx_pressed ==
                                menubutton_info[i].gfx_unpressed);
+    boolean has_gfx_active = (menubutton_info[i].gfx_active != -1);
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
+    Bitmap *gd_bitmap_unpressed_alt, *gd_bitmap_pressed_alt;
     int gfx_unpressed, gfx_pressed;
+    int gfx_unpressed_alt, gfx_pressed_alt;
     int x, y, width, height;
     int gd_x1, gd_x2, gd_y1, gd_y2;
     int gd_x1a, gd_x2a, gd_y1a, gd_y2a;
@@ -9795,16 +9817,33 @@ static void CreateScreenMenubuttons(void)
 
     gfx_unpressed = menubutton_info[i].gfx_unpressed;
     gfx_pressed   = menubutton_info[i].gfx_pressed;
+    gfx_unpressed_alt = gfx_unpressed;
+    gfx_pressed_alt   = gfx_pressed;
+
+    if (has_gfx_active)
+    {
+      gfx_unpressed_alt = menubutton_info[i].gfx_active;
+
+      type = GD_TYPE_CHECK_BUTTON_2;
+
+      if (menubutton_info[i].check_value != NULL)
+       checked = *menubutton_info[i].check_value;
+    }
+
     gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
     gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_bitmap_unpressed_alt = graphic_info[gfx_unpressed_alt].bitmap;
+    gd_bitmap_pressed_alt   = graphic_info[gfx_pressed_alt].bitmap;
+
     gd_x1 = graphic_info[gfx_unpressed].src_x;
     gd_y1 = graphic_info[gfx_unpressed].src_y;
     gd_x2 = graphic_info[gfx_pressed].src_x;
     gd_y2 = graphic_info[gfx_pressed].src_y;
-    gd_x1a = gd_x1;
-    gd_y1a = gd_y1;
-    gd_x2a = gd_x2;
-    gd_y2a = gd_y2;
+
+    gd_x1a = graphic_info[gfx_unpressed_alt].src_x;
+    gd_y1a = graphic_info[gfx_unpressed_alt].src_y;
+    gd_x2a = graphic_info[gfx_pressed_alt].src_x;
+    gd_y2a = graphic_info[gfx_pressed_alt].src_y;
 
     if (has_gfx_pressed)
     {
@@ -9820,7 +9859,9 @@ static void CreateScreenMenubuttons(void)
       gd_y2a += graphic_info[gfx_pressed].active_yoffset;
 
       type = GD_TYPE_CHECK_BUTTON;
-      checked = *menubutton_info[i].check_value;
+
+      if (menubutton_info[i].check_value != NULL)
+       checked = *menubutton_info[i].check_value;
     }
 
     if (is_score_button)
@@ -9879,8 +9920,8 @@ static void CreateScreenMenubuttons(void)
                      GDI_CHECKED, checked,
                      GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1,
                      GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2,
-                      GDI_ALT_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1a, gd_y1a,
-                      GDI_ALT_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2a, gd_y2a,
+                      GDI_ALT_DESIGN_UNPRESSED, gd_bitmap_unpressed_alt, gd_x1a, gd_y1a,
+                      GDI_ALT_DESIGN_PRESSED, gd_bitmap_pressed_alt, gd_x2a, gd_y2a,
                      GDI_DIRECT_DRAW, FALSE,
                      GDI_OVERLAY_TOUCH_BUTTON, is_touch_button,
                      GDI_EVENT_MASK, event_mask,