X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=a080e7a841741720ef8da2c24a44706050ca39e9;hb=dbe7aa7335e0e0553b3c123736a703544ef54f71;hp=92a9466ca0053ae1eb96454d031ec07cabb9510c;hpb=5cfa9e64469aaad50920c9031daf877ca3093241;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 92a9466c..a080e7a8 100644 --- a/src/screens.c +++ b/src/screens.c @@ -312,6 +312,8 @@ static void HandleHallOfFame_SelectLevel(int, int); static char *getHallOfFameRankText(int, int); static char *getHallOfFameScoreText(int, int); +static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *); + static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; static int info_mode = INFO_MODE_MAIN; @@ -1456,6 +1458,11 @@ static void clearMenuListArea(void) // clear menu list area, but not title or scrollbar DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, scrollbar_xpos - mSX, NUM_MENU_ENTRIES_ON_SCREEN * 32); + + // special compatibility handling for "Snake Bite" graphics set + if (strPrefix(leveldir_current->identifier, "snake_bite")) + ClearRectangle(drawto, mSX, mSY + MENU_SCREEN_START_YPOS * 32, + scrollbar_xpos - mSX, NUM_MENU_ENTRIES_ON_SCREEN * 32); } static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) @@ -1693,6 +1700,18 @@ void DrawMainMenu(void) return; } + // needed if last screen was the playing screen, invoked from hall of fame + if (score_info_tape_play) + { + CloseDoor(DOOR_CLOSE_ALL); + + SetGameStatus(GAME_MODE_SCOREINFO); + + DrawScoreInfo(scores.last_entry_nr); + + return; + } + // leveldir_current may be invalid (level group, parent link, node copy) leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid); @@ -2545,6 +2564,9 @@ static void DrawInfoScreen_Main(void) info_info = info_info_main; + // use modified info screen info without info screen entries marked as hidden + info_info = getSetupInfoFinal(info_info); + // determine maximal number of info entries that can be displayed on screen num_info_info = 0; for (i = 0; info_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++) @@ -4761,6 +4783,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (mx || my) // mouse input { + scores.was_just_playing = FALSE; + x = (mx - amSX) / 32; y = (my - amSY) / 32 - MENU_SCREEN_START_YPOS; @@ -4769,6 +4793,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (dx || dy) // keyboard or scrollbar/scrollbutton input { + scores.was_just_playing = FALSE; + // move cursor instead of scrolling when already at start/end of list if (dy == -1 * SCROLL_LINE && ti->cl_first == 0) dy = -1; @@ -5037,16 +5063,16 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (game_status == GAME_MODE_SCORES) { - if (game_status_last_screen == GAME_MODE_PLAYING && - setup.auto_play_next_level && setup.increment_levels && + if (setup.auto_play_next_level && setup.increment_levels && scores.last_level_nr < leveldir_current->last_level && + scores.was_just_playing && !network_playing) { StartGameActions(network.enabled, setup.autorecord, level.random_seed); return; } - else + else if (!scores.was_just_playing) { SetGameStatus(GAME_MODE_SCOREINFO); @@ -5246,6 +5272,7 @@ static void DrawHallOfFame_setScoreEntries(void) void DrawHallOfFame(int level_nr) { scores.last_level_nr = level_nr; + scores.was_just_playing = (game_status_last_screen == GAME_MODE_PLAYING); // (this is needed when called from GameEnd() after winning a game) KeyboardAutoRepeatOn(); @@ -5299,6 +5326,28 @@ static char *getHallOfFameScoreText(int nr, int size) return getHallOfFameTimeText(nr); // show playing time } +static char *getHallOfFameTapeDateText(struct ScoreEntry *entry) +{ + static char tape_date[MAX_ISO_DATE_LEN + 1]; + int i, j; + + if (!strEqual(entry->tape_date, UNKNOWN_NAME) || + strEqual(entry->tape_basename, UNDEFINED_FILENAME)) + return entry->tape_date; + + for (i = 0, j = 0; i < 8; i++, j++) + { + tape_date[j] = entry->tape_basename[i]; + + if (i == 3 || i == 5) + tape_date[++j] = '-'; + } + + tape_date[MAX_ISO_DATE_LEN] = '\0'; + + return tape_date; +} + static void HandleHallOfFame_SelectLevel(int step, int direction) { int old_level_nr = scores.last_level_nr; @@ -5355,6 +5404,7 @@ 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_title = MENU_INFO_FONT_TITLE; int font_head = MENU_INFO_FONT_HEAD; int font_text = MENU_INFO_FONT_TEXT; @@ -5374,10 +5424,10 @@ static void DrawScoreInfo_Content(int entry_nr) int select_y1, select_y2; int play_x, play_y; int play_height = screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE]->height; - boolean play_visible = (entry->id != -1); + 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(entry->tape_date, font_text); + int tape_date_width = getTextWidth(tape_date, font_text); int pad_left = xstart2; int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT; int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width; @@ -5386,7 +5436,7 @@ static void DrawScoreInfo_Content(int entry_nr) ClearField(); - // redraw score selection buttons (which have just been erased) + // redraw level selection buttons (which have just been erased) RedrawScreenMenuGadgets(SCREEN_MASK_SCORES); if (score_entries == NULL) @@ -5451,7 +5501,7 @@ static void DrawScoreInfo_Content(int entry_nr) play_y = SY + ystart + (font_height - play_height) / 2; DrawTextF(xstart1, ystart, font_head, "Tape Date"); - DrawTextF(xstart2, ystart, font_text, entry->tape_date); + DrawTextF(xstart2, ystart, font_text, tape_date); ystart += ystep_line; DrawTextF(xstart1, ystart, font_head, "Platform"); @@ -5479,13 +5529,31 @@ static void DrawScoreInfo_Content(int entry_nr) static void DrawScoreInfo(int entry_nr) { scores.last_entry_nr = entry_nr; - - SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO); + score_info_tape_play = FALSE; UnmapAllGadgets(); + FreeScreenGadgets(); + CreateScreenGadgets(); + FadeOut(REDRAW_FIELD); + // needed if different viewport properties defined after playing score tape + ChangeViewportPropertiesIfNeeded(); + + // set this after "ChangeViewportPropertiesIfNeeded()" (which may reset it) + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + + // needed if different background image defined after playing score tape + SetMainBackgroundImage(IMG_BACKGROUND_SCORES); + SetMainBackgroundImageIfDefined(IMG_BACKGROUND_SCOREINFO); + + // special compatibility handling for "Snake Bite" graphics set + if (strPrefix(leveldir_current->identifier, "snake_bite")) + ClearRectangle(gfx.background_bitmap, gfx.real_sx, gfx.real_sy + 64, + gfx.full_sxsize, gfx.full_sysize - 64); + DrawScoreInfo_Content(entry_nr); // map gadgets for score info screen @@ -5516,6 +5584,12 @@ static void HandleScoreInfo_SelectScore(int step, int direction) static void HandleScoreInfo_PlayTape(void) { + if (!PlayScoreTape(scores.last_entry_nr)) + { + DrawScoreInfo_Content(scores.last_entry_nr); + + FadeIn(REDRAW_FIELD); + } } void HandleScoreInfo(int mx, int my, int dx, int dy, int button) @@ -5542,7 +5616,7 @@ void HandleScoreInfo(int mx, int my, int dx, int dy, int button) SetGameStatus(GAME_MODE_SCORES); - DrawHallOfFame(level_nr); + DrawHallOfFame(scores.last_level_nr); } else if (dx) { @@ -7134,6 +7208,15 @@ static struct { &setup.internal.menu_exit, execExitSetup }, { &setup.internal.menu_save_and_exit, execSaveAndExitSetup }, + { &setup.internal.info_title, execInfoTitleScreen }, + { &setup.internal.info_elements, execInfoElements }, + { &setup.internal.info_music, execInfoMusic }, + { &setup.internal.info_credits, execInfoCredits }, + { &setup.internal.info_program, execInfoProgram }, + { &setup.internal.info_version, execInfoVersion }, + { &setup.internal.info_levelset, execInfoLevelSet }, + { &setup.internal.info_exit, execExitInfo }, + { NULL, NULL } }; @@ -9652,12 +9735,18 @@ static void CreateScreenMenubuttons(void) // if x/y set to -1, dynamically place buttons next to title text int title_width = getTextWidth(INFOTEXT_SCORE_ENTRY, FONT_TITLE_1); + // special compatibility handling for "Snake Bite" graphics set + if (strPrefix(leveldir_current->identifier, "snake_bite")) + title_width = strlen(INFOTEXT_SCORE_ENTRY) * 32; + + // use "SX" here to center buttons (ignore horizontal draw offset) if (pos->x == -1) x = (id == SCREEN_CTRL_ID_PREV_LEVEL2 ? SX + (SXSIZE - title_width) / 2 - width * 3 / 2 : id == SCREEN_CTRL_ID_NEXT_LEVEL2 ? SX + (SXSIZE + title_width) / 2 + width / 2 : 0); + // use "mSY" here to place buttons (respect vertical draw offset) if (pos->y == -1) y = (id == SCREEN_CTRL_ID_PREV_LEVEL2 || id == SCREEN_CTRL_ID_NEXT_LEVEL2 ? mSY + MENU_TITLE1_YPOS : 0);