X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=6654499152ebcf2fcd03d05b0936dc8ea6f2b288;hb=2f8bd98e428f73379a9173ccc9f7d03c885d641a;hp=978033fd8f1160c778a90eecae3805bd0ea10e4d;hpb=6e9374af7b69e20dbab5b8b3e06a8d4e2ffb1ddd;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 978033fd..66544991 100644 --- a/src/screens.c +++ b/src/screens.c @@ -257,7 +257,6 @@ struct TitleControlInfo struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS]; - /* main menu display and control definitions */ #define MAIN_CONTROL_NAME 0 @@ -270,9 +269,9 @@ struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS]; #define MAIN_CONTROL_QUIT 7 #define MAIN_CONTROL_PREV_LEVEL 8 #define MAIN_CONTROL_NEXT_LEVEL 9 -#define MAIN_CONTROL_CURRENT_LEVEL 10 -#define MAIN_CONTROL_FIRST_LEVEL 11 -#define MAIN_CONTROL_LAST_LEVEL 12 +#define MAIN_CONTROL_FIRST_LEVEL 10 +#define MAIN_CONTROL_LAST_LEVEL 11 +#define MAIN_CONTROL_LEVEL_NUMBER 12 #define MAIN_CONTROL_LEVEL_INFO_1 13 #define MAIN_CONTROL_LEVEL_INFO_2 14 #define MAIN_CONTROL_LEVEL_NAME 15 @@ -286,14 +285,14 @@ struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS]; #define MAIN_CONTROL_TITLE_3 23 static char str_main_text_name[10]; -static char str_main_text_current_level[10]; static char str_main_text_first_level[10]; static char str_main_text_last_level[10]; +static char str_main_text_level_number[10]; static char *main_text_name = str_main_text_name; -static char *main_text_current_level = str_main_text_current_level; static char *main_text_first_level = str_main_text_first_level; static char *main_text_last_level = str_main_text_last_level; +static char *main_text_level_number = str_main_text_level_number; static char *main_text_levels = "Levelset"; static char *main_text_scores = "Hall Of Fame"; static char *main_text_editor = "Level Creator"; @@ -390,12 +389,6 @@ static struct MainControlInfo main_controls[] = NULL, NULL, }, #endif - { - MAIN_CONTROL_CURRENT_LEVEL, - NULL, -1, - &menu.main.text.current_level, &main_text_current_level, - NULL, NULL, - }, { MAIN_CONTROL_FIRST_LEVEL, NULL, -1, @@ -408,6 +401,12 @@ static struct MainControlInfo main_controls[] = &menu.main.text.last_level, &main_text_last_level, NULL, NULL, }, + { + MAIN_CONTROL_LEVEL_NUMBER, + NULL, -1, + &menu.main.text.level_number, &main_text_level_number, + NULL, NULL, + }, { MAIN_CONTROL_LEVEL_INFO_1, NULL, -1, @@ -494,6 +493,160 @@ static struct TitleMessageInfo *getTitleMessageInfo(int nr, boolean initial) return (initial ? &titlemessage_initial[nr] : &titlemessage[nr]); } +#if 0 +static int getTitleScreenGameMode(boolean initial) +{ + return (initial ? GAME_MODE_TITLE_INITIAL : GAME_MODE_TITLE); +} +#endif + +static int getTitleMessageGameMode(boolean initial) +{ + return (initial ? GAME_MODE_TITLE_INITIAL : GAME_MODE_TITLE); +} + +#if 0 +static int getTitleScreenBackground(boolean initial) +{ + return (initial ? IMG_BACKGROUND_TITLE_INITIAL : IMG_BACKGROUND_TITLE); +} +#endif + +#if 0 +static int getTitleMessageBackground(int nr, boolean initial) +{ + return (initial ? IMG_BACKGROUND_TITLE_INITIAL : IMG_BACKGROUND_TITLE); +} +#endif + +static int getTitleBackground(int nr, boolean initial, boolean is_image) +{ + int base = (is_image ? + (initial ? IMG_BACKGROUND_TITLESCREEN_INITIAL_1 : + IMG_BACKGROUND_TITLESCREEN_1) : + (initial ? IMG_BACKGROUND_TITLEMESSAGE_INITIAL_1 : + IMG_BACKGROUND_TITLEMESSAGE_1)); + int graphic_global = (initial ? IMG_BACKGROUND_TITLE_INITIAL : + IMG_BACKGROUND_TITLE); + int graphic_local = base + nr; + + if (graphic_info[graphic_local].bitmap != NULL) + return graphic_local; + + if (graphic_info[graphic_global].bitmap != NULL) + return graphic_global; + + return IMG_UNDEFINED; +} + +static int getTitleSound(struct TitleControlInfo *tci) +{ + boolean is_image = tci->is_image; + int initial = tci->initial; + int nr = tci->local_nr; + int mode = (initial ? GAME_MODE_TITLE_INITIAL : GAME_MODE_TITLE); + int base = (is_image ? + (initial ? SND_BACKGROUND_TITLESCREEN_INITIAL_1 : + SND_BACKGROUND_TITLESCREEN_1) : + (initial ? SND_BACKGROUND_TITLEMESSAGE_INITIAL_1 : + SND_BACKGROUND_TITLEMESSAGE_1)); + int sound_global = menu.sound[mode]; + int sound_local = base + nr; + +#if 0 + printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n", + nr, initial, is_image, + sound_global, getSoundListEntry(sound_global)->filename, + sound_local, getSoundListEntry(sound_local)->filename); +#endif + + if (!strEqual(getSoundListEntry(sound_local)->filename, UNDEFINED_FILENAME)) + return sound_local; + + if (!strEqual(getSoundListEntry(sound_global)->filename, UNDEFINED_FILENAME)) + return sound_global; + + return SND_UNDEFINED; +} + +static int getTitleMusic(struct TitleControlInfo *tci) +{ + boolean is_image = tci->is_image; + int initial = tci->initial; + int nr = tci->local_nr; + int mode = (initial ? GAME_MODE_TITLE_INITIAL : GAME_MODE_TITLE); + int base = (is_image ? + (initial ? MUS_BACKGROUND_TITLESCREEN_INITIAL_1 : + MUS_BACKGROUND_TITLESCREEN_1) : + (initial ? MUS_BACKGROUND_TITLEMESSAGE_INITIAL_1 : + MUS_BACKGROUND_TITLEMESSAGE_1)); + int music_global = menu.music[mode]; + int music_local = base + nr; + +#if 0 + printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n", + nr, initial, is_image, + music_global, getMusicListEntry(music_global)->filename, + music_local, getMusicListEntry(music_local)->filename); +#endif + + if (!strEqual(getMusicListEntry(music_local)->filename, UNDEFINED_FILENAME)) + return music_local; + + if (!strEqual(getMusicListEntry(music_global)->filename, UNDEFINED_FILENAME)) + return music_global; + + return MUS_UNDEFINED; +} + +static struct TitleFadingInfo getTitleFading(struct TitleControlInfo *tci) +{ + boolean is_image = tci->is_image; + int initial = tci->initial; + int nr = tci->local_nr; + struct TitleFadingInfo ti; + + if (is_image) + { + int graphic = getTitleScreenGraphic(nr, initial); + + /* initialize fading control values to default title config settings */ + ti = (initial ? title_initial_default : title_default); + + /* override default settings with image config settings, if defined */ + if (graphic_info[graphic].anim_mode != ANIM_DEFAULT) + ti.anim_mode = graphic_info[graphic].anim_mode; + if (graphic_info[graphic].fade_delay > -1) + ti.fade_delay = graphic_info[graphic].fade_delay; + if (graphic_info[graphic].post_delay > -1) + ti.post_delay = graphic_info[graphic].post_delay; + if (graphic_info[graphic].auto_delay > -1) + ti.auto_delay = graphic_info[graphic].auto_delay; + } + else + { + if (initial) + { + ti.anim_mode = titlemessage_initial[nr].anim_mode; + ti.fade_delay = titlemessage_initial[nr].fade_delay; + ti.post_delay = titlemessage_initial[nr].post_delay; + ti.auto_delay = titlemessage_initial[nr].auto_delay; + } + else + { + ti.anim_mode = titlemessage[nr].anim_mode; + ti.fade_delay = titlemessage[nr].fade_delay; + ti.post_delay = titlemessage[nr].post_delay; + ti.auto_delay = titlemessage[nr].auto_delay; + } + } + + if (ti.anim_mode == ANIM_NONE) + ti.fade_delay = ti.post_delay = 0; + + return ti; +} + static int compareTitleControlInfo(const void *object1, const void *object2) { const struct TitleControlInfo *tci1 = (struct TitleControlInfo *)object1; @@ -504,6 +657,8 @@ static int compareTitleControlInfo(const void *object1, const void *object2) compare_result = (tci1->initial ? -1 : +1); else if (tci1->sort_priority != tci2->sort_priority) compare_result = tci1->sort_priority - tci2->sort_priority; + else if (tci1->is_image != tci2->is_image) + compare_result = (tci1->is_image ? -1 : +1); else compare_result = tci1->local_nr - tci2->local_nr; @@ -577,10 +732,10 @@ static void InitializeMainControls() int i; /* set main control text values to dynamically determined values */ - sprintf(main_text_name, "%s", local_team_mode ? "Team:" : "Name:"); - sprintf(main_text_current_level, "%s", int2str(level_nr, 3)); - sprintf(main_text_first_level, "%03d", leveldir_current->first_level); - sprintf(main_text_last_level, "%03d", leveldir_current->last_level); + sprintf(main_text_name, "%s", local_team_mode ? "Team:" : "Name:"); + sprintf(main_text_first_level, "%03d", leveldir_current->first_level); + sprintf(main_text_last_level, "%03d", leveldir_current->last_level); + sprintf(main_text_level_number, "%s", int2str(level_nr, 3)); main_text_level_year = leveldir_current->year; main_text_level_imported_from = leveldir_current->imported_from; @@ -734,8 +889,8 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, if (visibleTextPos(pos_text) && text != NULL) { struct TextPosInfo *pos = pos_text; - int x = mSX + ALIGNED_MENU_XPOS(pos); - int y = mSY + ALIGNED_MENU_YPOS(pos); + int x = mSX + ALIGNED_TEXT_XPOS(pos); + int y = mSY + ALIGNED_TEXT_YPOS(pos); #if 1 /* (check why/if this is needed) */ @@ -747,8 +902,8 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, if (visibleTextPos(pos_input) && input != NULL) { struct TextPosInfo *pos = pos_input; - int x = mSX + ALIGNED_MENU_XPOS(pos); - int y = mSY + ALIGNED_MENU_YPOS(pos); + int x = mSX + ALIGNED_TEXT_XPOS(pos); + int y = mSY + ALIGNED_TEXT_YPOS(pos); #if 1 /* (check why/if this is needed) */ @@ -788,8 +943,8 @@ static boolean insideMenuPosRect(struct MenuPosInfo *rect, int x, int y) if (rect == NULL) return FALSE; - int rect_x = ALIGNED_MENU_XPOS(rect); - int rect_y = ALIGNED_MENU_YPOS(rect); + int rect_x = ALIGNED_TEXT_XPOS(rect); + int rect_y = ALIGNED_TEXT_YPOS(rect); return (x >= rect_x && x < rect_x + rect->width && y >= rect_y && y < rect_y + rect->height); @@ -800,8 +955,8 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y) if (rect == NULL) return FALSE; - int rect_x = ALIGNED_MENU_XPOS(rect); - int rect_y = ALIGNED_MENU_YPOS(rect); + int rect_x = ALIGNED_TEXT_XPOS(rect); + int rect_y = ALIGNED_TEXT_YPOS(rect); return (x >= rect_x && x < rect_x + rect->width && y >= rect_y && y < rect_y + rect->height); @@ -924,11 +1079,12 @@ void DrawTitleScreenImage(int nr, boolean initial) height = WIN_YSIZE; } + /* always display title screens centered */ dst_x = (WIN_XSIZE - width) / 2; dst_y = (WIN_YSIZE - height) / 2; SetDrawBackgroundMask(REDRAW_ALL); - SetWindowBackgroundImage(IMG_BACKGROUND_TITLE); + SetWindowBackgroundImage(getTitleBackground(nr, initial, TRUE)); ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); @@ -940,22 +1096,35 @@ void DrawTitleScreenImage(int nr, boolean initial) redraw_mask = REDRAW_ALL; /* reset fading control values to default config settings */ +#if 1 + +#if 0 + title = getTitleFading(nr, initial, TRUE); +#endif + +#else + title.fade_delay_final = title.fade_delay; title.post_delay_final = title.post_delay; title.auto_delay_final = title.auto_delay; /* override default settings with image config settings, if defined */ + if (graphic_info[graphic].anim_mode != ANIM_DEFAULT) + title.anim_mode = graphic_info[graphic].anim_mode; if (graphic_info[graphic].fade_delay > -1) - title.fade_delay_final = graphic_info[graphic].fade_delay; + title.fade_delay = graphic_info[graphic].fade_delay; if (graphic_info[graphic].post_delay > -1) - title.post_delay_final = graphic_info[graphic].post_delay; + title.post_delay = graphic_info[graphic].post_delay; if (graphic_info[graphic].auto_delay > -1) - title.auto_delay_final = graphic_info[graphic].auto_delay; + title.auto_delay = graphic_info[graphic].auto_delay; +#endif } void DrawTitleScreenMessage(int nr, boolean initial) { char *filename = getLevelSetTitleMessageFilename(nr, initial); + struct TitleMessageInfo *tmi = getTitleMessageInfo(nr, initial); +#if 0 int font_nr = FONT_TEXT_1; int font_width; int font_height; @@ -965,26 +1134,48 @@ void DrawTitleScreenMessage(int nr, boolean initial) int sy = pad_y; int max_chars_per_line; int max_lines_per_screen; +#endif int last_game_status = game_status; /* save current game status */ if (filename == NULL) return; + /* force TITLE font on title message screen */ + game_status = getTitleMessageGameMode(initial); + + /* if chars set to "-1", automatically determine by text and font width */ + if (tmi->chars == -1) + tmi->chars = tmi->width / getFontWidth(tmi->font); + else + tmi->width = tmi->chars * getFontWidth(tmi->font); + + /* if lines set to "-1", automatically determine by text and font height */ + if (tmi->lines == -1) + tmi->lines = tmi->height / getFontHeight(tmi->font); + else + tmi->height = tmi->lines * getFontHeight(tmi->font); + SetDrawBackgroundMask(REDRAW_ALL); - SetWindowBackgroundImage(IMG_BACKGROUND_MESSAGE); + SetWindowBackgroundImage(getTitleBackground(nr, initial, FALSE)); ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); - /* force MESSAGE font on title message screen */ - game_status = GAME_MODE_MESSAGE; - +#if 0 font_width = getFontWidth(font_nr); font_height = getFontHeight(font_nr); max_chars_per_line = (WIN_XSIZE - 2 * pad_x) / font_width; max_lines_per_screen = (WIN_YSIZE - pad_y) / font_height - 1; +#endif +#if 1 + DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi), + filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + tmi->autowrap, tmi->centered, tmi->parse_comments); +#else DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, - max_lines_per_screen, -1, FALSE, FALSE, FALSE); + max_lines_per_screen, -1, tmi->autowrap, tmi->centered, + tmi->parse_comments); +#endif game_status = last_game_status; /* restore current game status */ } @@ -1032,6 +1223,11 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) int i; #endif +#if 0 + /* !!! CHANGE THIS !!! */ + title = title_default; +#endif + UnmapAllGadgets(); FadeSoundsAndMusic(); @@ -1077,6 +1273,11 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) SetDrawtoField(DRAW_BACKBUFFER); #endif +#if 1 + if (levelset_has_changed) + fading = title_default; +#endif + #if 1 if (CheckTitleScreen(levelset_has_changed)) { @@ -1207,10 +1408,25 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) DrawMaskedBorder(REDRAW_ALL); +#if 1 + if (!do_fading) + BackToFront(); + else if (fading.anim_mode == ANIM_CROSSFADE) + FadeCross(redraw_mask); + else + FadeIn(redraw_mask); +#else if (do_fading) FadeIn(redraw_mask); else BackToFront(); +#endif + +#if 1 + fading = menu.navigation; +#else + fading = title_default; +#endif SetMouseCursor(CURSOR_DEFAULT); @@ -1260,28 +1476,41 @@ static void gotoTopLevelDir() } #endif -#if 1 void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { static unsigned long title_delay = 0; static int title_screen_nr = 0; + static int last_sound = -1, last_music = -1; boolean return_to_main_menu = FALSE; boolean use_fading_main_menu = TRUE; +#if 0 #if 1 boolean use_cross_fading = FALSE; #else boolean use_cross_fading = !show_title_initial; /* default */ +#endif #endif struct TitleControlInfo *tci; + struct TitleFadingInfo fading_next; + int sound, music; if (button == MB_MENU_INITIALIZE) { +#if 1 + boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE); +#endif + +#if 0 int last_game_status = game_status; /* save current game status */ +#endif title_delay = 0; title_screen_nr = 0; tci = &title_controls[title_screen_nr]; + last_sound = SND_UNDEFINED; + last_music = MUS_UNDEFINED; + #if 0 /* determine number of title screens to display (images and messages) */ InitializeTitleControls(); @@ -1294,48 +1523,62 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) DrawInfoScreen_NotAvailable("Title screen information:", "No title screen for this level set."); - title.auto_delay_final = -1; + /* use default settings for fading, but always disable auto delay */ + fading = title_default; + fading.auto_delay = -1; return; } FadeSoundsAndMusic(); +#if 1 + if (use_cross_fading) + FadeCrossSaveBackbuffer(); + else + FadeOut(REDRAW_ALL); +#else FadeOut(REDRAW_ALL); +#endif } - /* force TITLE music on title info screen */ - game_status = GAME_MODE_TITLE; - - PlayMenuSound(); - PlayMenuMusic(); - - game_status = last_game_status; /* restore current game status */ - if (tci->is_image) - { DrawTitleScreenImage(tci->local_nr, tci->initial); - } else - { DrawTitleScreenMessage(tci->local_nr, tci->initial); - title.fade_delay_final = title.fade_delay; - title.post_delay_final = title.post_delay; - title.auto_delay_final = -1; - } + fading = getTitleFading(tci); + +#if 1 + sound = getTitleSound(tci); + music = getTitleMusic(tci); + + if (sound != last_sound) + PlayMenuSoundExt(sound); + if (music != last_music) + PlayMenuMusicExt(music); + + last_sound = sound; + last_music = music; +#endif SetMouseCursor(CURSOR_NONE); +#if 1 + if (use_cross_fading) + FadeCross(REDRAW_ALL); + else + FadeIn(REDRAW_ALL); +#else FadeIn(REDRAW_ALL); +#endif DelayReached(&title_delay, 0); /* reset delay counter */ return; } - if (title.auto_delay_final > -1 && - DelayReached(&title_delay, title.auto_delay_final)) + if (fading.auto_delay > -1 && DelayReached(&title_delay, fading.auto_delay)) button = MB_MENU_CHOICE; if (button == MB_MENU_LEAVE) @@ -1345,7 +1588,9 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_CHOICE) { - int anim_mode; +#if 1 + boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE); +#endif if (game_status == GAME_MODE_INFO && num_title_screens == 0) { @@ -1360,223 +1605,91 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_screen_nr++; tci = &title_controls[title_screen_nr]; - if (tci->is_image) - anim_mode = - graphic_info[getTitleScreenGraphic(tci->local_nr, - tci->initial)].anim_mode; - else - anim_mode = ANIM_FADE; /* ??? */ - - use_cross_fading = (anim_mode == ANIM_FADE ? FALSE : - anim_mode == ANIM_CROSSFADE ? TRUE : - use_cross_fading); - if (title_screen_nr < num_title_screens) { - if (!use_cross_fading) - FadeOut(REDRAW_ALL); - - if (use_cross_fading) - FadeCrossSaveBackbuffer(); +#if 1 +#if 0 + boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE); +#endif +#else + int anim_mode; if (tci->is_image) - DrawTitleScreenImage(tci->local_nr, tci->initial); + anim_mode = + graphic_info[getTitleScreenGraphic(tci->local_nr, + tci->initial)].anim_mode; else - DrawTitleScreenMessage(tci->local_nr, tci->initial); - - if (use_cross_fading) - FadeCross(REDRAW_ALL); - else - FadeIn(REDRAW_ALL); + anim_mode = ANIM_FADE; /* ??? */ - DelayReached(&title_delay, 0); /* reset delay counter */ - } - else - { - FadeSoundsAndMusic(); - - FadeOut(REDRAW_ALL); - - return_to_main_menu = TRUE; - } - } - - if (return_to_main_menu) - { - RedrawBackground(); - - SetMouseCursor(CURSOR_DEFAULT); - - if (game_status == GAME_MODE_INFO) - { - OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - - info_mode = INFO_MODE_MAIN; - DrawInfoScreenExt(REDRAW_ALL, use_fading_main_menu); - } - 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(REDRAW_ALL, use_fading_main_menu); - } - } -} - -#else - -void HandleTitleScreen(int mx, int my, int dx, int dy, int button) -{ - static unsigned long title_delay = 0; - static int title_nr = 0; - static boolean showing_message = FALSE; - char *filename = getLevelSetMessageFilename(); - boolean return_to_main_menu = FALSE; - boolean use_fading_main_menu = TRUE; - boolean use_cross_fading = !show_title_initial; /* default */ - boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL && - getLevelSetMessageFilename(1, FALSE) == NULL); - - if (button == MB_MENU_INITIALIZE) - { - int last_game_status = game_status; /* save current game status */ - - title_delay = 0; - title_nr = 0; - showing_message = FALSE; - - if (show_title_initial && - graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL && - getLevelSetMessageFilename(1, TRUE) == NULL) - show_title_initial = FALSE; - - if (game_status == GAME_MODE_INFO) - { - if (no_title_info) - { - DrawInfoScreen_NotAvailable("Title screen information:", - "No title screen for this level set."); - - title.auto_delay_final = -1; - - return; - } - - FadeSoundsAndMusic(); - - FadeOut(REDRAW_ALL); - } - - /* force TITLE music on title info screen */ - game_status = GAME_MODE_TITLE; - - PlayMenuSound(); - PlayMenuMusic(); - - game_status = last_game_status; /* restore current game status */ - - if (graphic_info[getTitleScreenGraphic(0, show_title_initial)].bitmap != NULL) - { - DrawTitleScreenImage(title_nr, show_title_initial); - } - else - { - DrawTitleScreenMessage(filename); - - showing_message = TRUE; - - title.fade_delay_final = title.fade_delay; - title.post_delay_final = title.post_delay; - title.auto_delay_final = -1; - } - - FadeIn(REDRAW_ALL); - - DelayReached(&title_delay, 0); /* reset delay counter */ - - return; - } - - if (title.auto_delay_final > -1 && - DelayReached(&title_delay, title.auto_delay_final)) - button = MB_MENU_CHOICE; - - if (button == MB_MENU_LEAVE) - { - return_to_main_menu = TRUE; - use_fading_main_menu = FALSE; - } - else if (button == MB_MENU_CHOICE) - { - int anim_mode; - - if (game_status == GAME_MODE_INFO && no_title_info) - { - FadeOut(REDRAW_FIELD); - - info_mode = INFO_MODE_MAIN; - DrawAndFadeInInfoScreen(REDRAW_FIELD); + use_cross_fading = (anim_mode == ANIM_FADE ? FALSE : + anim_mode == ANIM_CROSSFADE ? TRUE : + use_cross_fading); +#endif - return; - } + sound = getTitleSound(tci); + music = getTitleMusic(tci); - title_nr++; + if (sound == SND_UNDEFINED || sound != last_sound) + FadeSounds(); + if (music == MUS_UNDEFINED || music != last_music) + FadeMusic(); - if (show_title_initial && - (title_nr >= MAX_NUM_TITLE_IMAGES || - graphic_info[IMG_TITLESCREEN_INITIAL_1 + title_nr].bitmap == NULL)) - { - show_title_initial = FALSE; + if (use_cross_fading) + FadeCrossSaveBackbuffer(); + else + FadeOut(REDRAW_ALL); - title_nr = 0; /* restart with title screens for current level set */ - } + if (tci->is_image) + DrawTitleScreenImage(tci->local_nr, tci->initial); + else + DrawTitleScreenMessage(tci->local_nr, tci->initial); - anim_mode = graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].anim_mode; + fading_next = getTitleFading(tci); - use_cross_fading = (anim_mode == ANIM_FADE ? FALSE : - anim_mode == ANIM_CROSSFADE ? TRUE : - use_cross_fading); +#if 1 + sound = getTitleSound(tci); + music = getTitleMusic(tci); - if (!use_cross_fading) - FadeOut(REDRAW_ALL); + if (sound != last_sound) + PlayMenuSoundExt(sound); + if (music != last_music) + PlayMenuMusicExt(music); - if (title_nr < MAX_NUM_TITLE_IMAGES && - graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].bitmap != NULL) - { - if (use_cross_fading) - FadeCrossSaveBackbuffer(); + last_sound = sound; + last_music = music; +#endif - DrawTitleScreenImage(title_nr, show_title_initial); + /* last screen already faded out, next screen has no animation */ + if (!use_cross_fading && fading_next.anim_mode == ANIM_NONE) + fading = fading_next; if (use_cross_fading) FadeCross(REDRAW_ALL); else FadeIn(REDRAW_ALL); - DelayReached(&title_delay, 0); /* reset delay counter */ - } - else if (!showing_message && filename != NULL) - { - if (use_cross_fading) - FadeCrossSaveBackbuffer(); - - DrawTitleScreenMessage(filename); - - if (use_cross_fading) - FadeCross(REDRAW_ALL); - else - FadeIn(REDRAW_ALL); + fading = fading_next; DelayReached(&title_delay, 0); /* reset delay counter */ - - showing_message = TRUE; } else { FadeSoundsAndMusic(); +#if 1 + { +#if 0 + boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE); +#endif + + if (use_cross_fading) + FadeCrossSaveBackbuffer(); + else + FadeOut(REDRAW_ALL); + } +#else FadeOut(REDRAW_ALL); +#endif return_to_main_menu = TRUE; } @@ -1584,10 +1697,10 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (return_to_main_menu) { - show_title_initial = FALSE; - RedrawBackground(); + SetMouseCursor(CURSOR_DEFAULT); + if (game_status == GAME_MODE_INFO) { OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); @@ -1604,7 +1717,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) } } } -#endif void HandleMainMenu_SelectLevel(int step, int direction) { @@ -1632,7 +1744,7 @@ void HandleMainMenu_SelectLevel(int step, int direction) if (new_level_nr != old_level_nr) { - struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL); + struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_LEVEL_NUMBER); PlaySound(SND_MENU_ITEM_SELECTING); @@ -2047,10 +2159,19 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading) DrawMaskedBorder(REDRAW_ALL); +#if 1 + if (!do_fading) + BackToFront(); + else if (fading.anim_mode == ANIM_CROSSFADE) + FadeCross(redraw_mask); + else + FadeIn(redraw_mask); +#else if (do_fading) FadeIn(redraw_mask); else BackToFront(); +#endif InitAnimation(); } @@ -3091,23 +3212,20 @@ void HandleInfoScreen_Version(int button) void DrawInfoScreen_LevelSet() { - int ystart1 = mSY - SY + 100; - int ystart2 = mSY - SY + 150; - int ybottom = mSY - SY + SYSIZE - 20; + struct TitleMessageInfo *tmi = &readme; char *filename = getLevelSetInfoFilename(); -#if 1 - int font_nr = FONT_INFO_LEVELSET; -#else - int font_nr = FONT_LEVEL_NUMBER; -#endif - int font_width = getFontWidth(font_nr); - int font_height = getFontHeight(font_nr); - int pad_x = 32; - int pad_y = 150; - int sx = mSX + pad_x; - int sy = mSY + pad_y; - int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; - int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; + + /* if chars set to "-1", automatically determine by text and font width */ + if (tmi->chars == -1) + tmi->chars = tmi->width / getFontWidth(tmi->font); + else + tmi->width = tmi->chars * getFontWidth(tmi->font); + + /* if lines set to "-1", automatically determine by text and font height */ + if (tmi->lines == -1) + tmi->lines = tmi->height / getFontHeight(tmi->font); + else + tmi->height = tmi->lines * getFontHeight(tmi->font); SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET); @@ -3116,17 +3234,18 @@ void DrawInfoScreen_LevelSet() ClearWindow(); DrawHeadline(); - DrawTextSCentered(ystart1, FONT_TEXT_1, "Level Set Information:"); - - DrawTextSCentered(ybottom, FONT_TEXT_4, - "Press any key or button for info menu"); + DrawTextCentered(mSY + 100, FONT_TEXT_1, "Level Set Information:"); if (filename != NULL) - DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1, - max_lines_per_screen, -1, TRUE, FALSE, TRUE); + DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi), + filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + tmi->autowrap, tmi->centered, tmi->parse_comments); else - DrawTextSCentered(ystart2, FONT_TEXT_2, - "No information for this level set."); + DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2, + "No information for this level set."); + + DrawTextCentered(mSY + SYSIZE - 20, FONT_TEXT_4, + "Press any key or button for info menu"); FadeIn(REDRAW_FIELD); } @@ -3195,6 +3314,8 @@ void DrawAndFadeInInfoScreen(int redraw_mask) void DrawInfoScreen() { + fading = menu.destination; + DrawInfoScreenExt(REDRAW_ALL, FALSE); } @@ -3231,8 +3352,8 @@ void HandleTypeName(int newxpos, Key key) struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME); #if 1 struct TextPosInfo *pos = mci->pos_input; - int startx = mSX + ALIGNED_MENU_XPOS(pos); - int starty = mSY + ALIGNED_MENU_YPOS(pos); + int startx = mSX + ALIGNED_TEXT_XPOS(pos); + int starty = mSY + ALIGNED_TEXT_YPOS(pos); #endif #if 1 static int xpos = 0; @@ -3267,7 +3388,7 @@ void HandleTypeName(int newxpos, Key key) #if 0 /* add one character width for added cursor character */ pos->width += font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_active_nr); DrawText(startx + xpos * font_width, starty, "_", font_active_nr); @@ -3283,7 +3404,7 @@ void HandleTypeName(int newxpos, Key key) #if 0 /* add one character width for added name text character */ pos->width += font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_active_nr); DrawText(startx + xpos * font_width, starty, "_", font_active_nr); @@ -3298,7 +3419,7 @@ void HandleTypeName(int newxpos, Key key) #if 0 /* remove one character width for removed name text character */ pos->width -= font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_active_nr); DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr); @@ -3309,7 +3430,7 @@ void HandleTypeName(int newxpos, Key key) #if 0 /* remove one character width for removed cursor text character */ pos->width -= font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_nr); DrawText(startx + xpos * font_width, starty, " ", font_active_nr); @@ -3333,7 +3454,7 @@ void HandleTypeName(int newxpos, Key key) if (is_active) { pos->width = (strlen(setup.player_name) + 1) * font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_active_nr); DrawText(startx + xpos * font_width, starty, "_", font_active_nr); @@ -3341,7 +3462,7 @@ void HandleTypeName(int newxpos, Key key) else { pos->width = strlen(setup.player_name) * font_width; - startx = mSX + ALIGNED_MENU_XPOS(pos); + startx = mSX + ALIGNED_TEXT_XPOS(pos); DrawText(startx, starty, setup.player_name, font_nr); }