X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=7967566e8d6326e2e0cd9dd8fc1917c6e4c061c8;hb=03f1156cc40e36c17e19a1c9ee02f0cbd70b8989;hp=6f0208de91732e8b3a37df2b4c1a359a25a81eb1;hpb=b124c56f1cf069a6c77802919b1a9cbbedb77029;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 6f0208de..7967566e 100644 --- a/src/screens.c +++ b/src/screens.c @@ -48,13 +48,14 @@ /* screens on the info screen */ #define INFO_MODE_MAIN 0 -#define INFO_MODE_ELEMENTS 1 -#define INFO_MODE_MUSIC 2 -#define INFO_MODE_CREDITS 3 -#define INFO_MODE_PROGRAM 4 -#define INFO_MODE_LEVELSET 5 +#define INFO_MODE_TITLE 1 +#define INFO_MODE_ELEMENTS 2 +#define INFO_MODE_MUSIC 3 +#define INFO_MODE_CREDITS 4 +#define INFO_MODE_PROGRAM 5 +#define INFO_MODE_LEVELSET 6 -#define MAX_INFO_MODES 6 +#define MAX_INFO_MODES 7 /* for various menu stuff */ #define MENU_SCREEN_START_XPOS 1 @@ -115,9 +116,12 @@ static void DrawChooseLevel(void); static void DrawInfoScreen(void); static void DrawSetupScreen(void); +static void DrawInfoScreenExt(int); +static void DrawInfoScreen_NotAvailable(char *, char *); static void DrawInfoScreen_HelpAnim(int, int, boolean); static void DrawInfoScreen_HelpText(int, int, int, int); static void HandleInfoScreen_Main(int, int, int, int, int); +static void HandleInfoScreen_TitleScreen(int); static void HandleInfoScreen_Elements(int); static void HandleInfoScreen_Music(int); static void HandleInfoScreen_Credits(int); @@ -201,40 +205,6 @@ static void drawChooseTreeCursor(int ypos, int color) game_status = last_game_status; /* restore current game status */ } -static void PlayMenuSound() -{ - int sound = menu.sound[game_status]; - - if (sound == SND_UNDEFINED) - return; - - if (sound_info[sound].loop) - PlaySoundLoop(sound); - else - PlaySound(sound); -} - -static void PlayMenuSoundIfLoop() -{ - int sound = menu.sound[game_status]; - - if (sound == SND_UNDEFINED) - return; - - if (sound_info[sound].loop) - PlaySoundLoop(sound); -} - -static void PlayMenuMusic() -{ - int music = menu.music[game_status]; - - if (music == MUS_UNDEFINED) - return; - - PlayMusic(music); -} - void DrawHeadline() { DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, PROGRAM_TITLE_STRING); @@ -299,12 +269,14 @@ void DrawTitleScreenImage(int nr) if (width > WIN_XSIZE) { + /* image width too large for window => center image horizontally */ src_x = (width - WIN_XSIZE) / 2; width = WIN_XSIZE; } if (height > WIN_YSIZE) { + /* image height too large for window => center image vertically */ src_y = (height - WIN_YSIZE) / 2; height = WIN_YSIZE; } @@ -312,11 +284,7 @@ void DrawTitleScreenImage(int nr) dst_x = (WIN_XSIZE - width) / 2; dst_y = (WIN_YSIZE - height) / 2; -#if 1 ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); -#else - DrawBackground(0, 0, WIN_XSIZE, WIN_YSIZE); -#endif if (DrawingOnBackground(dst_x, dst_y)) BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y); @@ -332,23 +300,8 @@ void DrawTitleScreen() SetMainBackgroundImage(IMG_BACKGROUND_TITLE); -#if 0 - CloseDoor(DOOR_CLOSE_1); -#endif - - PlayMenuSound(); - PlayMenuMusic(); - HandleTitleScreen(0, 0, 0, 0, MB_MENU_INITIALIZE); -#if 0 -#if 1 - FadeIn(1000); -#else - FadeToFront(); -#endif -#endif - StopAnimation(); } @@ -376,6 +329,10 @@ static void DrawMainMenuExt(int fade_delay) audio.sound_deactivated = FALSE; +#if 1 + GetPlayerConfig(); +#endif + /* needed if last screen was the playing screen, invoked from level editor */ if (level_editor_test_game) { @@ -427,7 +384,9 @@ static void DrawMainMenuExt(int fade_delay) if (setup.handicap && level_nr > leveldir_current->handicap_level) level_nr = leveldir_current->handicap_level; +#if 0 GetPlayerConfig(); +#endif LoadLevel(level_nr); SetMainBackgroundImage(IMG_BACKGROUND_MAIN); @@ -533,6 +492,8 @@ static void DrawMainMenuExt(int fade_delay) #if 0 FadeToFront(); +#endif +#if 0 InitAnimation(); #endif @@ -546,6 +507,7 @@ static void DrawMainMenuExt(int fade_delay) PlayMenuSound(); PlayMenuMusic(); +#if 0 #if 1 OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); #else @@ -554,6 +516,11 @@ static void DrawMainMenuExt(int fade_delay) else OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); #endif +#endif + +#if 0 + InitAnimation(); +#endif #if 1 /* map gadgets for main menu screen */ @@ -561,18 +528,25 @@ static void DrawMainMenuExt(int fade_delay) #endif #if 1 - if (fade_delay > 0) - FadeIn(fade_delay); - else - BackToFront(); +#if 1 + FadeIn(fade_delay); +#else + BackToFront(); +#endif +#endif +#if 1 InitAnimation(); #endif + +#if 1 + OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); +#endif } void DrawMainMenu() { - DrawMainMenuExt(FALSE); + DrawMainMenuExt(0); } #if 0 @@ -612,13 +586,37 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) boolean return_to_main_menu = FALSE; boolean use_fading_main_menu = TRUE; boolean use_cross_fading = TRUE; - int fade_delay = 1000; - int post_delay = 500; + int fade_delay = 500; + int post_delay = fade_delay / 2; if (button == MB_MENU_INITIALIZE) { + int last_game_status = game_status; /* save current game status */ title_nr = 0; + if (game_status == GAME_MODE_INFO) + { + if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) + { + DrawInfoScreen_NotAvailable("Title screen information:", + "No title screen for this level set."); + + return; + } + + FadeSoundsAndMusic(); + + FadeOut(fade_delay, post_delay); + } + + /* force TITLE music on title info screen */ + game_status = GAME_MODE_TITLE; + + PlayMenuSound(); + PlayMenuMusic(); + + game_status = last_game_status; /* restore current game status */ + DrawTitleScreenImage(title_nr); FadeIn(fade_delay); @@ -632,6 +630,15 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_CHOICE) { + if (game_status == GAME_MODE_INFO && + graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) + { + info_mode = INFO_MODE_MAIN; + DrawInfoScreen(); + + return; + } + title_nr++; if (!use_cross_fading) @@ -650,12 +657,14 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) drawto = drawto_last; if (use_cross_fading) - FadeCross(bitmap_db_title, fade_delay); + FadeCross(fade_delay); else FadeIn(fade_delay); } else { + FadeSoundsAndMusic(); + FadeOut(fade_delay, post_delay); return_to_main_menu = TRUE; @@ -664,14 +673,24 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (return_to_main_menu) { + int menu_fade_delay = (use_fading_main_menu ? fade_delay : 0); + RedrawBackground(); -#if 1 - OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); -#endif + if (game_status == GAME_MODE_INFO) + { + OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - game_status = GAME_MODE_MAIN; - DrawMainMenuExt(use_fading_main_menu ? fade_delay : 0); + info_mode = INFO_MODE_MAIN; + DrawInfoScreenExt(menu_fade_delay); + } + else /* default: return to main menu */ + { + OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); + + game_status = GAME_MODE_MAIN; + DrawMainMenuExt(menu_fade_delay); + } } } @@ -843,6 +862,12 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) static struct TokenInfo *info_info; static int num_info_info; +static void execInfoTitleScreen() +{ + info_mode = INFO_MODE_TITLE; + DrawInfoScreen(); +} + static void execInfoElements() { info_mode = INFO_MODE_ELEMENTS; @@ -881,6 +906,7 @@ static void execExitInfo() 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" }, @@ -892,7 +918,7 @@ static struct TokenInfo info_info_main[] = { 0, NULL, NULL } }; -static void DrawInfoScreen_Main() +static void DrawInfoScreen_Main(int fade_delay) { int i; @@ -928,6 +954,18 @@ static void DrawInfoScreen_Main() num_info_info++; } +#if 1 + + HandleInfoScreen_Main(0, 0, 0, 0, MB_MENU_INITIALIZE); + + PlayMenuSound(); + PlayMenuMusic(); + + FadeIn(fade_delay); + InitAnimation(); + +#else + FadeToFront(); InitAnimation(); @@ -935,6 +973,7 @@ static void DrawInfoScreen_Main() PlayMenuMusic(); HandleInfoScreen_Main(0, 0, 0, 0, MB_MENU_INITIALIZE); +#endif } void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) @@ -1020,6 +1059,24 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) } } +void DrawInfoScreen_NotAvailable(char *text_title, char *text_error) +{ + int ystart = 150; + int ybottom = SYSIZE - 20; + + SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET); + + ClearWindow(); + DrawHeadline(); + + DrawTextSCentered(100, FONT_TEXT_1, text_title); + + DrawTextSCentered(ybottom, FONT_TEXT_4, + "Press any key or button for info menu"); + + DrawTextSCentered(ystart, FONT_TEXT_2, text_error); +} + void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init) { static int infoscreen_step[MAX_INFO_ELEMENTS_ON_SCREEN]; @@ -1180,6 +1237,16 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) max_chars_per_line, max_lines_per_text); } +void DrawInfoScreen_TitleScreen() +{ + DrawTitleScreen(); +} + +void HandleInfoScreen_TitleScreen(int button) +{ + HandleTitleScreen(0, 0, 0, 0, button); +} + void DrawInfoScreen_Elements() { SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS); @@ -1388,49 +1455,213 @@ void HandleInfoScreen_Music(int button) PlaySoundLoop(list->music); } -void DrawInfoScreen_Credits() +static boolean DrawInfoScreen_CreditsScreen(int screen_nr) { int ystart = 150, ystep = 30; int ybottom = SYSIZE - 20; - SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS); - - FadeSoundsAndMusic(); - ClearWindow(); DrawHeadline(); DrawTextSCentered(100, FONT_TEXT_1, "Credits:"); - DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, "DOS port of the game:"); - DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, "Guido Schulz"); - DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, "Additional toons:"); - DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, "Karl Hörnell"); - DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2, - "...and many thanks to all contributors"); - DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, "of new levels!"); + + if (screen_nr == 0) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Special thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Peter Liepa"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for creating"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "\"Boulder Dash\""); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "in the year"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3, + "1984"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, + "published by"); + DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3, + "First Star Software"); + } + else if (screen_nr == 1) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Special thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Klaus Heinz & Volker Wertich"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for creating"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "\"Emerald Mine\""); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "in the year"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3, + "1987"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, + "published by"); + DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3, + "Kingsoft"); + } + else if (screen_nr == 2) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Special thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Michael Stopp & Philip Jespersen"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for creating"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "\"Supaplex\""); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "in the year"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3, + "1991"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, + "published by"); + DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3, + "Digital Integration"); + } + else if (screen_nr == 3) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Special thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Hiroyuki Imabayashi"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for creating"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "\"Sokoban\""); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "in the year"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3, + "1982"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, + "published by"); + DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3, + "Thinking Rabbit"); + } + else if (screen_nr == 4) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Special thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Alan Bond"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "and"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "Jürgen Bonhagen"); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "for the continuous creation"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2, + "of outstanding level sets"); + } + else if (screen_nr == 5) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Peter Elzner"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for ideas and inspiration by"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "Diamond Caves"); + + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2, + "Thanks to"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_3, + "Steffest"); + DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_2, + "for ideas and inspiration by"); + DrawTextSCentered(ystart + 8 * ystep, FONT_TEXT_3, + "DX-Boulderdash"); + } + else if (screen_nr == 6) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "David Tritscher"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for the new Emerald Mine engine"); + } + else if (screen_nr == 7) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "Thanks to"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, + "Guido Schulz"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, + "for the initial DOS port"); + + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2, + "Thanks to"); + DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3, + "Karl Hörnell"); + DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, + "for some additional toons"); + } + else if (screen_nr == 8) + { + DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, + "And not to forget:"); + DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_2, + "Many thanks to"); + DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_3, + "All those who contributed"); + DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, + "levels to this game"); + DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_3, + "since 1995"); + } + else + { + return FALSE; + } DrawTextSCentered(ybottom, FONT_TEXT_4, - "Press any key or button for info menu"); + "Press any key or button for next page"); + + return TRUE; +} + +void DrawInfoScreen_Credits() +{ + SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS); + + FadeSoundsAndMusic(); + + HandleInfoScreen_Credits(MB_MENU_INITIALIZE); } void HandleInfoScreen_Credits(int button) { - int button_released = !button; + static int screen_nr = 0; - if (button == MB_MENU_LEAVE) + if (button == MB_MENU_INITIALIZE) + { + screen_nr = 0; + + DrawInfoScreen_CreditsScreen(screen_nr); + } + else if (button == MB_MENU_LEAVE) { info_mode = INFO_MODE_MAIN; DrawInfoScreen(); return; } - - if (button_released) + else if (button == MB_MENU_CHOICE) { - FadeSoundsAndMusic(); + screen_nr++; - info_mode = INFO_MODE_MAIN; - DrawInfoScreen(); + if (!DrawInfoScreen_CreditsScreen(screen_nr)) + { + FadeSoundsAndMusic(); + + info_mode = INFO_MODE_MAIN; + DrawInfoScreen(); + } } else { @@ -1561,11 +1792,13 @@ void HandleInfoScreen_LevelSet(int button) } } -void DrawInfoScreen() +static void DrawInfoScreenExt(int fade_delay) { SetMainBackgroundImage(IMG_BACKGROUND_INFO); - if (info_mode == INFO_MODE_ELEMENTS) + if (info_mode == INFO_MODE_TITLE) + DrawInfoScreen_TitleScreen(); + else if (info_mode == INFO_MODE_ELEMENTS) DrawInfoScreen_Elements(); else if (info_mode == INFO_MODE_MUSIC) DrawInfoScreen_Music(); @@ -1576,18 +1809,27 @@ void DrawInfoScreen() else if (info_mode == INFO_MODE_LEVELSET) DrawInfoScreen_LevelSet(); else - DrawInfoScreen_Main(); + DrawInfoScreen_Main(fade_delay); - if (info_mode != INFO_MODE_MUSIC) + if (info_mode != INFO_MODE_MAIN && + info_mode != INFO_MODE_TITLE && + info_mode != INFO_MODE_MUSIC) { PlayMenuSound(); PlayMenuMusic(); } } +void DrawInfoScreen() +{ + DrawInfoScreenExt(0); +} + void HandleInfoScreen(int mx, int my, int dx, int dy, int button) { - if (info_mode == INFO_MODE_ELEMENTS) + if (info_mode == INFO_MODE_TITLE) + HandleInfoScreen_TitleScreen(button); + else if (info_mode == INFO_MODE_ELEMENTS) HandleInfoScreen_Elements(button); else if (info_mode == INFO_MODE_MUSIC) HandleInfoScreen_Music(button); @@ -2331,10 +2573,15 @@ static struct TokenInfo setup_info_editor[] = #endif { TYPE_SWITCH, &setup.editor.el_chars, "Text Characters:" }, { TYPE_SWITCH, &setup.editor.el_custom, "Custom & Group Elements:" }, +#if 0 { TYPE_SWITCH, &setup.editor.el_headlines, "Headlines:" }, +#endif { TYPE_SWITCH, &setup.editor.el_user_defined, "User defined element list:" }, { TYPE_SWITCH, &setup.editor.el_dynamic, "Dynamic level elements:" }, { TYPE_EMPTY, NULL, "" }, + { TYPE_SWITCH, &setup.editor.el_by_game, "Show elements by game:" }, + { TYPE_SWITCH, &setup.editor.el_by_type, "Show elements by type:" }, + { TYPE_EMPTY, NULL, "" }, { TYPE_SWITCH, &setup.editor.show_element_token, "Show element token:" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" },