From 61197199259de5b82ba53a78d7ba7e837ffac2c9 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 3 Feb 2007 18:51:45 +0100 Subject: [PATCH] rnd-20070203-2-src --- src/conftime.h | 2 +- src/libgame/setup.c | 28 ++--- src/libgame/setup.h | 2 +- src/main.h | 3 +- src/screens.c | 288 +++++++++++++++++++++++++++++++++++++++----- 5 files changed, 271 insertions(+), 52 deletions(-) diff --git a/src/conftime.h b/src/conftime.h index 03241ab1..77568905 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2007-02-03 03:18" +#define COMPILE_DATE_STRING "2007-02-03 18:40" diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 355eefed..75db82ef 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -498,31 +498,19 @@ char *getLevelSetInfoFilename() return NULL; } -char *getLevelSetMessageFilename() +char *getLevelSetTitleMessageFilename(int nr, boolean initial) { static char *filename = NULL; - char *basenames[] = - { - "MESSAGE", - "MESSAGE.TXT", - "MESSAGE.txt", - "Message", - "Message.txt", - "message", - "message.txt", + char basename[32]; - NULL - }; - int i; + sprintf(basename, "%s_%d.txt", + (initial ? "titlemessage_initial" : "titlemessage"), nr + 1); - for (i = 0; basenames[i] != NULL; i++) - { - checked_free(filename); - filename = getPath2(getCurrentLevelDir(), basenames[i]); + checked_free(filename); + filename = getPath2(getCurrentLevelDir(), basename); - if (fileExists(filename)) - return filename; - } + if (fileExists(filename)) + return filename; return NULL; } diff --git a/src/libgame/setup.h b/src/libgame/setup.h index 6dc15e9c..38a53e81 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -230,7 +230,7 @@ char *getEditorSetupFilename(void); char *getHelpAnimFilename(void); char *getHelpTextFilename(void); char *getLevelSetInfoFilename(void); -char *getLevelSetMessageFilename(void); +char *getLevelSetTitleMessageFilename(int, boolean); char *getImageFilename(char *); char *getCustomImageFilename(char *); char *getCustomSoundFilename(char *); diff --git a/src/main.h b/src/main.h index b199412c..fb577b77 100644 --- a/src/main.h +++ b/src/main.h @@ -821,7 +821,8 @@ #define MAX_ELEMENT_NAME_LEN 32 #define MAX_TAPES_PER_SET 1024 #define MAX_SCORE_ENTRIES 100 -#define MAX_NUM_TITLE_SCREENS 5 +#define MAX_NUM_TITLE_IMAGES 5 +#define MAX_NUM_TITLE_MESSAGES 5 #define MAX_NUM_AMOEBA 100 diff --git a/src/screens.c b/src/screens.c index 460468d9..941ad125 100644 --- a/src/screens.c +++ b/src/screens.c @@ -162,8 +162,6 @@ static void MapScreenTreeGadgets(TreeInfo *); static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; -static boolean show_titlescreen_initial = TRUE; - static int setup_mode = SETUP_MODE_MAIN; static int info_mode = INFO_MODE_MAIN; @@ -206,6 +204,26 @@ static Bitmap *scrollbar_bitmap[NUM_SCROLLBAR_BITMAPS]; #endif +/* title display and control definitions */ + +#define MAX_NUM_TITLE_SCREENS (2 * MAX_NUM_TITLE_IMAGES + \ + 2 * MAX_NUM_TITLE_MESSAGES) + +static boolean show_title_initial = TRUE; +static int num_title_screens = 0; + +struct TitleControlInfo +{ + boolean is_image; + boolean initial; + int local_nr; +}; + +struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS]; + + +/* main menu display and control definitions */ + #define MAIN_CONTROL_NAME 0 #define MAIN_CONTROL_LEVELS 1 #define MAIN_CONTROL_SCORES 2 @@ -370,6 +388,44 @@ static struct MainControlInfo main_controls[] = }; +static int getTitleScreenGraphic(int nr, boolean initial) +{ + return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr; +} + +static void InitializeTitleControlsExt_AddTitleInfo(boolean is_image, + boolean initial, int nr) +{ + title_controls[num_title_screens].is_image = is_image; + title_controls[num_title_screens].initial = initial; + title_controls[num_title_screens].local_nr = nr; + + num_title_screens++; +} + +static void InitializeTitleControls_CheckTitleInfo(boolean initial) +{ + int i; + + for (i = 0; i < MAX_NUM_TITLE_IMAGES; i++) + if (graphic_info[getTitleScreenGraphic(i, initial)].bitmap != NULL) + InitializeTitleControlsExt_AddTitleInfo(TRUE, initial, i); + + for (i = 0; i < MAX_NUM_TITLE_MESSAGES; i++) + if (getLevelSetTitleMessageFilename(i, initial) != NULL) + InitializeTitleControlsExt_AddTitleInfo(FALSE, initial, i); +} + +static void InitializeTitleControls() +{ + num_title_screens = 0; + + if (show_title_initial) + InitializeTitleControls_CheckTitleInfo(TRUE); + + InitializeTitleControls_CheckTitleInfo(FALSE); +} + static void InitializeMainControls() { boolean local_team_mode = (!options.network && setup.team_mode); @@ -656,12 +712,6 @@ static int getLevelRangeTextPos() } #endif -static int getTitleScreenGraphic() -{ - return (show_titlescreen_initial ? IMG_TITLESCREEN_INITIAL_1 : - IMG_TITLESCREEN_1); -} - int effectiveGameStatus() { if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE) @@ -670,9 +720,9 @@ int effectiveGameStatus() return game_status; } -void DrawTitleScreenImage(int nr) +void DrawTitleScreenImage(int nr, boolean initial) { - int graphic = getTitleScreenGraphic() + nr; + int graphic = getTitleScreenGraphic(nr, initial); Bitmap *bitmap = graphic_info[graphic].bitmap; #if 1 int width = graphic_info[graphic].width; @@ -729,8 +779,9 @@ void DrawTitleScreenImage(int nr) title.auto_delay_final = graphic_info[graphic].auto_delay; } -void DrawTitleScreenMessage(char *filename) +void DrawTitleScreenMessage(int nr, boolean initial) { + char *filename = getLevelSetTitleMessageFilename(nr, initial); int font_nr = FONT_TEXT_1; int font_width; int font_height; @@ -833,12 +884,29 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) SetDrawtoField(DRAW_BACKBUFFER); #endif +#if 1 + if (setup.show_titlescreen && (show_title_initial || levelset_has_changed)) + { + /* needed to be able to skip title screen, if no image or message defined */ + InitializeTitleControls(); + + if (num_title_screens > 0) + { + game_status = GAME_MODE_TITLE; + + DrawTitleScreen(); + + return; + } + } +#else if (setup.show_titlescreen && ((levelset_has_changed && (graphic_info[IMG_TITLESCREEN_1].bitmap != NULL || - getLevelSetMessageFilename() != NULL)) || - (show_titlescreen_initial && - graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL))) + getLevelSetMessageFilename(1, FALSE) != NULL)) || + (show_title_initial && + (graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL || + getLevelSetMessageFilename(1, TRUE) != NULL)))) { game_status = GAME_MODE_TITLE; @@ -846,6 +914,7 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) return; } +#endif /* level_nr may have been set to value over handicap with level editor */ if (setup.handicap && level_nr > leveldir_current->handicap_level) @@ -1000,6 +1069,165 @@ 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; + boolean return_to_main_menu = FALSE; + boolean use_fading_main_menu = TRUE; + boolean use_cross_fading = !show_title_initial; /* default */ + struct TitleControlInfo *tci; + + if (button == MB_MENU_INITIALIZE) + { + int last_game_status = game_status; /* save current game status */ + + title_delay = 0; + title_screen_nr = 0; + tci = &title_controls[title_screen_nr]; + + /* determine number of title screens to display (images and messages) */ + InitializeTitleControls(); + + if (game_status == GAME_MODE_INFO) + { + if (num_title_screens == 0) + { + 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 (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; + } + + 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 && num_title_screens == 0) + { + FadeOut(REDRAW_FIELD); + + info_mode = INFO_MODE_MAIN; + DrawAndFadeInInfoScreen(REDRAW_FIELD); + + return; + } + + 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 (tci->is_image) + DrawTitleScreenImage(tci->local_nr, tci->initial); + else + DrawTitleScreenMessage(tci->local_nr, tci->initial); + + if (use_cross_fading) + FadeCross(REDRAW_ALL); + else + FadeIn(REDRAW_ALL); + + DelayReached(&title_delay, 0); /* reset delay counter */ + } + else + { + FadeSoundsAndMusic(); + + FadeOut(REDRAW_ALL); + + return_to_main_menu = TRUE; + } + } + + if (return_to_main_menu) + { + /* show initial title images and messages only once at program start */ + show_title_initial = FALSE; + + RedrawBackground(); + + 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; @@ -1008,9 +1236,9 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) char *filename = getLevelSetMessageFilename(); boolean return_to_main_menu = FALSE; boolean use_fading_main_menu = TRUE; - boolean use_cross_fading = !show_titlescreen_initial; /* default */ + boolean use_cross_fading = !show_title_initial; /* default */ boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL && - filename == NULL); + getLevelSetMessageFilename(1, FALSE) == NULL); if (button == MB_MENU_INITIALIZE) { @@ -1020,9 +1248,10 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_nr = 0; showing_message = FALSE; - if (show_titlescreen_initial && - graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL) - show_titlescreen_initial = 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) { @@ -1049,9 +1278,9 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) game_status = last_game_status; /* restore current game status */ - if (graphic_info[getTitleScreenGraphic()].bitmap != NULL) + if (graphic_info[getTitleScreenGraphic(0, show_title_initial)].bitmap != NULL) { - DrawTitleScreenImage(title_nr); + DrawTitleScreenImage(title_nr, show_title_initial); } else { @@ -1096,16 +1325,16 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_nr++; - if (show_titlescreen_initial && - (title_nr >= MAX_NUM_TITLE_SCREENS || + if (show_title_initial && + (title_nr >= MAX_NUM_TITLE_IMAGES || graphic_info[IMG_TITLESCREEN_INITIAL_1 + title_nr].bitmap == NULL)) { - show_titlescreen_initial = FALSE; + show_title_initial = FALSE; title_nr = 0; /* restart with title screens for current level set */ } - anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode; + anim_mode = graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].anim_mode; use_cross_fading = (anim_mode == ANIM_FADE ? FALSE : anim_mode == ANIM_CROSSFADE ? TRUE : @@ -1114,13 +1343,13 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (!use_cross_fading) FadeOut(REDRAW_ALL); - if (title_nr < MAX_NUM_TITLE_SCREENS && - graphic_info[getTitleScreenGraphic() + title_nr].bitmap != NULL) + if (title_nr < MAX_NUM_TITLE_IMAGES && + graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].bitmap != NULL) { if (use_cross_fading) FadeCrossSaveBackbuffer(); - DrawTitleScreenImage(title_nr); + DrawTitleScreenImage(title_nr, show_title_initial); if (use_cross_fading) FadeCross(REDRAW_ALL); @@ -1157,7 +1386,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (return_to_main_menu) { - show_titlescreen_initial = FALSE; + show_title_initial = FALSE; RedrawBackground(); @@ -1177,6 +1406,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) } } } +#endif void HandleMainMenu_SelectLevel(int step, int direction) { -- 2.34.1