X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=661c8cdb5cc4eba2081dc9d5e71abcc794fa0514;hb=672ed29e8d8d5c6994489455539a29c4a0665551;hp=3ad1096be0decb5fb111dbe7e467f48d19dc1da4;hpb=3e57e03f559affcfaee4f975afab011cfd598d5c;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 3ad1096b..661c8cdb 100644 --- a/src/screens.c +++ b/src/screens.c @@ -92,6 +92,17 @@ #define MAX_MENU_MODES MAX(MAX_INFO_MODES, MAX_SETUP_MODES) +// info screen titles +#define STR_INFO_MAIN "Info Screen" +#define STR_INFO_TITLE "Title Screen" +#define STR_INFO_ELEMENTS "Game Elements" +#define STR_INFO_MUSIC "Game Music" +#define STR_INFO_CREDITS "Credits" +#define STR_INFO_PROGRAM "Program Info" +#define STR_INFO_VERSION "Version Info" +#define STR_INFO_LEVELSET "Level Set Info" +#define STR_INFO_EXIT "Exit" + // setup screen titles #define STR_SETUP_MAIN "Setup" #define STR_SETUP_GAME "Game & Menu" @@ -131,9 +142,11 @@ #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" #define TEXT_MAIN_MENU "Press any key or button for main menu" +#define TEXT_INFO_MENU "Press any key or button for info menu" +#define TEXT_NEXT_PAGE "Press any key or button for next page" +#define TEXT_NEXT_MENU (info_screens_from_main ? \ + TEXT_MAIN_MENU : TEXT_INFO_MENU) // for input setup functions #define SETUPINPUT_SCREEN_POS_START 0 @@ -201,20 +214,21 @@ #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 SCREEN_CTRL_ID_LEVELSET_INFO 14 +#define SCREEN_CTRL_ID_SWITCH_ECS_AGA 15 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 16 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 17 +#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2 18 +#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2 19 -#define NUM_SCREEN_MENUBUTTONS 19 +#define NUM_SCREEN_MENUBUTTONS 20 -#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 SCREEN_CTRL_ID_SCROLL_UP 20 +#define SCREEN_CTRL_ID_SCROLL_DOWN 21 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 22 +#define SCREEN_CTRL_ID_NETWORK_SERVER 23 -#define NUM_SCREEN_GADGETS 23 +#define NUM_SCREEN_GADGETS 24 #define NUM_SCREEN_SCROLLBUTTONS 2 #define NUM_SCREEN_SCROLLBARS 1 @@ -222,11 +236,12 @@ #define SCREEN_MASK_MAIN (1 << 0) #define SCREEN_MASK_MAIN_HAS_SOLUTION (1 << 1) -#define SCREEN_MASK_INPUT (1 << 2) -#define SCREEN_MASK_TOUCH (1 << 3) -#define SCREEN_MASK_TOUCH2 (1 << 4) -#define SCREEN_MASK_SCORES (1 << 5) -#define SCREEN_MASK_SCORES_INFO (1 << 6) +#define SCREEN_MASK_MAIN_HAS_SET_INFO (1 << 2) +#define SCREEN_MASK_INPUT (1 << 3) +#define SCREEN_MASK_TOUCH (1 << 4) +#define SCREEN_MASK_TOUCH2 (1 << 5) +#define SCREEN_MASK_SCORES (1 << 6) +#define SCREEN_MASK_SCORES_INFO (1 << 7) // graphic position and size values for buttons and scrollbars #define SC_MENUBUTTON_XSIZE TILEX @@ -921,6 +936,11 @@ static struct MainControlInfo main_controls[] = }; +static boolean hasLevelSetInfo(void) +{ + return (getLevelSetInfoFilename(0) != NULL); +} + static int getTitleScreenGraphic(int nr, boolean initial) { return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr; @@ -1807,6 +1827,7 @@ void DrawMainMenu(void) MapTapeButtons(); MapScreenMenuGadgets(SCREEN_MASK_MAIN); UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SOLUTION, hasSolutionTape()); + UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SET_INFO, hasLevelSetInfo()); // copy actual game door content to door double buffer for OpenDoor() BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); @@ -2402,15 +2423,15 @@ static void execExitInfo(void) static struct TokenInfo info_info_main[] = { - { TYPE_ENTER_SCREEN, execInfoTitleScreen, "Title Screen" }, - { TYPE_ENTER_SCREEN, execInfoElements, "Elements Info" }, - { TYPE_ENTER_SCREEN, execInfoMusic, "Music Info" }, - { TYPE_ENTER_SCREEN, execInfoCredits, "Credits" }, - { TYPE_ENTER_SCREEN, execInfoProgram, "Program Info" }, - { TYPE_ENTER_SCREEN, execInfoVersion, "Version Info" }, - { TYPE_ENTER_SCREEN, execInfoLevelSet, "Level Set Info" }, + { TYPE_ENTER_SCREEN, execInfoTitleScreen, STR_INFO_TITLE }, + { TYPE_ENTER_SCREEN, execInfoElements, STR_INFO_ELEMENTS }, + { TYPE_ENTER_SCREEN, execInfoMusic, STR_INFO_MUSIC }, + { TYPE_ENTER_SCREEN, execInfoCredits, STR_INFO_CREDITS }, + { TYPE_ENTER_SCREEN, execInfoProgram, STR_INFO_PROGRAM }, + { TYPE_ENTER_SCREEN, execInfoVersion, STR_INFO_VERSION }, + { TYPE_ENTER_SCREEN, execInfoLevelSet, STR_INFO_LEVELSET }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execExitInfo, "Exit" }, + { TYPE_LEAVE_MENU, execExitInfo, STR_INFO_EXIT }, { 0, NULL, NULL } }; @@ -2580,7 +2601,7 @@ static void DrawInfoScreen_Main(void) OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Info Screen"); + DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, STR_INFO_MAIN); info_info = info_info_main; @@ -2970,7 +2991,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, TEXT_INFO_MENU); + DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU); FadeIn(REDRAW_FIELD); } @@ -3290,7 +3311,7 @@ void HandleInfoScreen_Music(int dx, int dy, int button) DrawHeadline(); DrawTextSCentered(ystart, font_title, "No music info for this level set."); - DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU); + DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU); return; } @@ -3589,7 +3610,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, TEXT_INFO_MENU); + DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU); FadeIn(REDRAW_FIELD); } @@ -3710,7 +3731,7 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens, } boolean last_screen = (screen_nr == num_screens - 1); - char *text_foot = (last_screen ? TEXT_INFO_MENU : TEXT_NEXT_PAGE); + char *text_foot = (last_screen ? TEXT_NEXT_MENU : TEXT_NEXT_PAGE); DrawTextSCentered(ybottom, font_foot, text_foot); } @@ -3790,7 +3811,7 @@ void HandleInfoScreen_Generic(int dx, int dy, int button) DrawHeadline(); DrawTextSCentered(ystart, font_title, text_no_info); - DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU); + DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU); return; } @@ -3863,6 +3884,8 @@ static void DrawInfoScreen(void) void DrawInfoScreen_FromMainMenu(int nr) { + int fade_mask = REDRAW_FIELD; + if (nr < INFO_MODE_MAIN || nr >= MAX_INFO_MODES) return; @@ -3873,8 +3896,26 @@ void DrawInfoScreen_FromMainMenu(int nr) info_mode = nr; info_screens_from_main = TRUE; + if (redraw_mask & REDRAW_ALL) + fade_mask = REDRAW_ALL; + + if (CheckFadeAll()) + fade_mask = REDRAW_ALL; + + UnmapAllGadgets(); + FadeMenuSoundsAndMusic(); + FadeSetEnterScreen(); + FadeOut(fade_mask); + + FadeSkipNextFadeOut(); + + // needed if different viewport properties defined for info screen + ChangeViewportPropertiesIfNeeded(); + + SetMainBackgroundImage(IMG_BACKGROUND_INFO); + DrawInfoScreen(); } @@ -9540,6 +9581,14 @@ static struct GD_EVENT_RELEASED, FALSE, "play solution tape" }, + { + IMG_MENU_BUTTON_LEVELSET_INFO, IMG_MENU_BUTTON_LEVELSET_INFO_ACTIVE, + &menu.main.button.levelset_info, NULL, + SCREEN_CTRL_ID_LEVELSET_INFO, + SCREEN_MASK_MAIN_HAS_SET_INFO, + GD_EVENT_RELEASED, + FALSE, "show level set info" + }, { IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE, &menu.main.button.switch_ecs_aga, &setup.prefer_aga_graphics, @@ -9732,6 +9781,20 @@ static void CreateScreenMenubuttons(void) id == SCREEN_CTRL_ID_NEXT_LEVEL2 ? mSY + MENU_TITLE1_YPOS : 0); } + if (id == SCREEN_CTRL_ID_LEVELSET_INFO) + { + if (pos->x == -1 && pos->y == -1) + { + // use "SX" here to place button (ignore draw offsets) + x = SX + SXSIZE - 2 * TILESIZE; + y = SY + SYSIZE - 2 * TILESIZE; + + // special compatibility handling for "BD2K3" graphics set + if (strPrefix(leveldir_current->identifier, "BD2K3")) + x = SX + TILESIZE + MINI_TILESIZE; + } + } + gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, GDI_IMAGE_ID, gfx_unpressed, @@ -10148,6 +10211,10 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) PlaySolutionTape(); break; + case SCREEN_CTRL_ID_LEVELSET_INFO: + DrawInfoScreen_FromMainMenu(INFO_MODE_LEVELSET); + break; + case SCREEN_CTRL_ID_SWITCH_ECS_AGA: setup.prefer_aga_graphics = !setup.prefer_aga_graphics; DrawMainMenu();