X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=d86fa57267864ca83e626f6917683fddb8966c8a;hb=e4b2e4f943c20af98956d30fd3014888e9f75416;hp=dbac21b31e47d8625abb9f940bf84b7d12139bdc;hpb=e6370be7540fca6b56553f6532f060f6eaef581b;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index dbac21b3..d86fa572 100644 --- a/src/screens.c +++ b/src/screens.c @@ -126,6 +126,7 @@ // other screen text constants #define STR_CHOOSE_TREE_EDIT "Edit" #define MENU_CHOOSE_TREE_FONT(x) (FONT_TEXT_1 + (x)) +#define MENU_CHOOSE_TREE_COLOR(ti, a) TREE_COLOR(ti, a) // for input setup functions #define SETUPINPUT_SCREEN_POS_START 0 @@ -1629,9 +1630,8 @@ void DrawMainMenu(void) return; } - // leveldir_current may be invalid (level group, parent link) - if (!validLevelSeries(leveldir_current)) - leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid); + // leveldir_current may be invalid (level group, parent link, node copy) + leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid); if (leveldir_current != leveldir_last_valid) { @@ -1738,6 +1738,8 @@ void DrawMainMenu(void) SetMouseCursor(CURSOR_DEFAULT); OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2); + + SyncEmscriptenFilesystem(); } static void gotoTopLevelDir(void) @@ -2155,6 +2157,9 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SaveLevelSetup_LastSeries(); SaveLevelSetup_SeriesInfo(); + // restore level set if chosen from "last played level set" menu + RestoreLastPlayedLevels(&leveldir_current); + if (setup.internal.choose_from_top_leveldir) gotoTopLevelDir(); @@ -2212,7 +2217,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SaveLevelSetup_LastSeries(); SaveLevelSetup_SeriesInfo(); - if (Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED)) + if (!setup.ask_on_quit_program || + Request("Do you really want to quit?", REQ_ASK | REQ_STAY_CLOSED)) SetGameStatus(GAME_MODE_QUIT); } } @@ -4408,9 +4414,8 @@ static void drawChooseTreeText(int y, boolean active, TreeInfo *ti) int entry_pos = first_entry + y; TreeInfo *node_first = getTreeInfoFirstGroupEntry(ti); TreeInfo *node = getTreeInfoFromPos(node_first, entry_pos); - int node_color = (node->color == FC_YELLOW ? FC_GREEN : node->color); - int color = (active ? FC_YELLOW : node_color); - int font_nr = MENU_CHOOSE_TREE_FONT(color); + int font_color = MENU_CHOOSE_TREE_COLOR(node, active); + int font_nr = MENU_CHOOSE_TREE_FONT(font_color); int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset; int xpos = MENU_SCREEN_START_XPOS; int ypos = MENU_SCREEN_START_YPOS + y; @@ -4845,6 +4850,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, HandleMainMenu_SelectLevel(0, 0, new_level_nr); } + else if (game_status == GAME_MODE_LEVELS) + { + // store level set if chosen from "last played level set" menu + StoreLastPlayedLevels(leveldir_current); + } else if (game_status == GAME_MODE_NAMES) { if (mx >= sx1_edit_name && mx <= sx2_edit_name) @@ -4869,6 +4879,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, LoadLevelSetup_LastSeries(); LoadLevelSetup_SeriesInfo(); + // update list of last played level sets + UpdateLastPlayedLevels_TreeInfo(); + TapeErase(); ToggleFullscreenIfNeeded(); @@ -5038,6 +5051,12 @@ void DrawHallOfFame(int level_nr, int highlight_position) else SetAnimStatus(GAME_MODE_PSEUDO_SCORESNEW); + LoadServerScore(level_nr); + + // correct highlight position after adding server scores + if (highlight_position >= 0) + highlight_position = scores.last_added; + FadeSetEnterScreen(); FadeOut(fade_mask); @@ -5056,6 +5075,24 @@ void DrawHallOfFame(int level_nr, int highlight_position) FadeIn(fade_mask); } +static char *getHallOfFameScoreText(int nr) +{ + if (!level.rate_time_over_score) + return int2str(scores.entry[nr].score, 5); // show normal score + + if (level.use_step_counter) + return int2str(scores.entry[nr].time, 5); // show number of steps + + static char score_text[10]; + int time_seconds = scores.entry[nr].time / FRAMES_PER_SECOND; + int mm = (time_seconds / 60) % 60; + int ss = (time_seconds % 60); + + sprintf(score_text, "%02d:%02d", mm, ss); // show playing time + + return score_text; +} + static void drawHallOfFameList(int level_nr, int first_entry, int highlight_position) { @@ -5089,10 +5126,10 @@ static void drawHallOfFameList(int level_nr, int first_entry, for (j = 0; j < num_dots; j++) DrawText(mSX + dx2 + j * getFontWidth(font_nr3), sy, ".", font_nr3); - if (!strEqual(highscore[entry].Name, EMPTY_PLAYER_NAME)) - DrawText(mSX + dx2, sy, highscore[entry].Name, font_nr2); + if (!strEqual(scores.entry[entry].name, EMPTY_PLAYER_NAME)) + DrawText(mSX + dx2, sy, scores.entry[entry].name, font_nr2); - DrawText(mSX + dx3, sy, int2str(highscore[entry].Score, 5), font_nr4); + DrawText(mSX + dx3, sy, getHallOfFameScoreText(entry), font_nr4); } redraw_mask |= REDRAW_FIELD; @@ -6719,6 +6756,8 @@ static struct TokenInfo setup_info_game[] = { TYPE_SWITCH, &setup.count_score_after_game,"Count Score After Game:" }, { TYPE_SWITCH, &setup.show_scores_after_game,"Show Scores After Game:" }, { TYPE_YES_NO, &setup.ask_on_game_over, "Ask on Game Over:" }, + { TYPE_YES_NO, &setup.ask_on_quit_game, "Ask on Quit Game:" }, + { TYPE_YES_NO, &setup.ask_on_quit_program, "Ask on Quit Program:" }, { TYPE_SWITCH, &setup.autorecord, "Auto-Record Tapes:" }, { TYPE_ENTER_LIST, execSetupChooseGameSpeed, "Game Speed:" }, { TYPE_STRING, &game_speed_text, "" },