X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=bd5eb569e6954b7698e639910e039fb983d55afa;hb=dff0e0c8702770fe23992f07964ebe9ed54e9f7c;hp=dcfd35b891704ee818f77a0e6c35ceabdcebb9e9;hpb=cb81cac37a6a681c0ee295918e5ef919fbef1e90;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index dcfd35b8..bd5eb569 100644 --- a/src/screens.c +++ b/src/screens.c @@ -23,6 +23,7 @@ #include "cartoons.h" #include "network.h" #include "init.h" +#include "config.h" /* screens in the setup menu */ #define SETUP_MODE_MAIN 0 @@ -54,9 +55,10 @@ #define INFO_MODE_MUSIC 3 #define INFO_MODE_CREDITS 4 #define INFO_MODE_PROGRAM 5 -#define INFO_MODE_LEVELSET 6 +#define INFO_MODE_VERSION 6 +#define INFO_MODE_LEVELSET 7 -#define MAX_INFO_MODES 7 +#define MAX_INFO_MODES 8 /* for various menu stuff */ #define MENU_SCREEN_START_XPOS 1 @@ -153,6 +155,7 @@ static void HandleInfoScreen_Elements(int); static void HandleInfoScreen_Music(int); static void HandleInfoScreen_Credits(int); static void HandleInfoScreen_Program(int); +static void HandleInfoScreen_Version(int); static void MapScreenMenuGadgets(int); static void MapScreenTreeGadgets(TreeInfo *); @@ -228,7 +231,7 @@ static char main_text_first_level[10]; static char main_text_last_level[10]; static char main_input_name[MAX_PLAYER_NAME_LEN + 1]; -static struct +struct MainControlInfo { int nr; @@ -242,8 +245,9 @@ static struct struct MenuPosInfo *pos_input; char *input; int font_input; -} -main_controls[] = +}; + +static struct MainControlInfo main_controls[] = { { MAIN_CONTROL_NAME, @@ -294,6 +298,7 @@ main_controls[] = NULL, NULL, -1, }, #if 0 + /* (these two buttons are real gadgets) */ { MAIN_CONTROL_PREV_LEVEL, &menu.main.button.prev_level, IMG_MENU_BUTTON_PREV_LEVEL, @@ -380,15 +385,16 @@ static void InitializeMainControls() /* set main control screen positions to dynamically determined values */ for (i = 0; main_controls[i].nr != -1; i++) { - int nr = main_controls[i].nr; - struct MenuPosInfo *pos_button = main_controls[i].pos_button; - struct MenuPosInfo *pos_text = main_controls[i].pos_text; - struct MenuPosInfo *pos_input = main_controls[i].pos_input; - char *text = main_controls[i].text; - char *input = main_controls[i].input; - int button_graphic = main_controls[i].button_graphic; - int font_text = main_controls[i].font_text; - int font_input = main_controls[i].font_input; + struct MainControlInfo *mci = &main_controls[i]; + int nr = mci->nr; + struct MenuPosInfo *pos_button = mci->pos_button; + struct MenuPosInfo *pos_text = mci->pos_text; + struct MenuPosInfo *pos_input = mci->pos_input; + char *text = mci->text; + char *input = mci->input; + int button_graphic = mci->button_graphic; + int font_text = mci->font_text; + int font_input = mci->font_input; int font_text_width = (font_text != -1 ? getFontWidth(font_text) : 0); int font_text_height = (font_text != -1 ? getFontHeight(font_text) : 0); @@ -458,68 +464,100 @@ static void InitializeMainControls() } } -static void DrawCursorAndText_Main(int pos, boolean active) +static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, + boolean active_input) { int i; for (i = 0; main_controls[i].nr != -1; i++) { - if (main_controls[i].nr == pos || pos == -1) + struct MainControlInfo *mci = &main_controls[i]; + + if (mci->nr == nr || nr == -1) { - struct MenuPosInfo *pos_button = main_controls[i].pos_button; - struct MenuPosInfo *pos_text = main_controls[i].pos_text; - struct MenuPosInfo *pos_input = main_controls[i].pos_input; - char *text = main_controls[i].text; - char *input = main_controls[i].input; - int button_graphic = main_controls[i].button_graphic; - int font_text = main_controls[i].font_text; - int font_input = main_controls[i].font_input; - - if (active) + struct MenuPosInfo *pos_button = mci->pos_button; + struct MenuPosInfo *pos_text = mci->pos_text; + struct MenuPosInfo *pos_input = mci->pos_input; + char *text = mci->text; + char *input = mci->input; + int button_graphic = mci->button_graphic; + int font_text = mci->font_text; + int font_input = mci->font_input; + + if (active_text) { button_graphic = BUTTON_GRAPHIC_ACTIVE(button_graphic); font_text = FONT_ACTIVE(font_text); } + if (active_input) + { + font_input = FONT_ACTIVE(font_input); + } + if (pos_button != NULL) { - int button_x = mSX + pos_button->x; - int button_y = mSY + pos_button->y; + struct MenuPosInfo *pos = pos_button; + int x = mSX + pos->x; + int y = mSY + pos->y; - DrawBackground(button_x,button_y, pos_button->width,pos_button->height); - DrawGraphicThruMaskExt(drawto, button_x, button_y, button_graphic, 0); + DrawBackgroundForGraphic(x, y, pos->width, pos->height, button_graphic); + DrawGraphicThruMaskExt(drawto, x, y, button_graphic, 0); } if (pos_text != NULL && text != NULL) { - int text_x = mSX + ALIGNED_XPOS(pos_text->x, pos_text->width, - pos_text->align); - int text_y = mSY + pos_text->y; + struct MenuPosInfo *pos = pos_text; + int x = mSX + ALIGNED_MENU_XPOS(pos); + int y = mSY + ALIGNED_MENU_YPOS(pos); - DrawBackground(text_x, text_y, pos_text->width, pos_text->height); - DrawText(text_x, text_y, text, font_text); + DrawBackgroundForFont(x, y, pos->width, pos->height, font_text); + DrawText(x, y, text, font_text); } if (pos_input != NULL && input != NULL) { - int input_x = mSX + ALIGNED_XPOS(pos_input->x, pos_input->width, - pos_input->align); - int input_y = mSY + pos_input->y; + struct MenuPosInfo *pos = pos_input; + int x = mSX + ALIGNED_MENU_XPOS(pos); + int y = mSY + ALIGNED_MENU_YPOS(pos); - DrawBackground(input_x, input_y, pos_input->width, pos_input->height); - DrawText(input_x, input_y, input, font_input); + DrawBackgroundForFont(x, y, pos->width, pos->height, font_input); + DrawText(x, y, input, font_input); } } } } +static void DrawCursorAndText_Main(int nr, boolean active_text) +{ + DrawCursorAndText_Main_Ext(nr, active_text, FALSE); +} + +#if 0 +static void DrawCursorAndText_Main_Input(int nr, boolean active_text) +{ + DrawCursorAndText_Main_Ext(nr, active_text, TRUE); +} +#endif + +static struct MainControlInfo *getMainControlInfo(int nr) +{ + int i; + + for (i = 0; main_controls[i].nr != -1; i++) + if (main_controls[i].nr == nr) + return &main_controls[i]; + + return NULL; +} + static boolean insideMenuPosRect(struct MenuPosInfo *rect, int x, int y) { if (rect == NULL) return FALSE; - int rect_x = ALIGNED_XPOS(rect->x, rect->width, rect->align); - int rect_y = rect->y; + int rect_x = ALIGNED_MENU_XPOS(rect); + int rect_y = ALIGNED_MENU_YPOS(rect); return (x >= rect_x && x < rect_x + rect->width && y >= rect_y && y < rect_y + rect->height); @@ -542,7 +580,7 @@ static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) if (active) graphic = BUTTON_GRAPHIC_ACTIVE(graphic); - DrawBackground(x, y, TILEX, TILEY); + DrawBackgroundForGraphic(x, y, TILEX, TILEY, graphic); DrawGraphicThruMaskExt(drawto, x, y, graphic, 0); } @@ -607,13 +645,28 @@ static int getTitleScreenGraphic() IMG_TITLESCREEN_1); } +int effectiveGameStatus() +{ + if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE) + return GAME_MODE_TITLE; + + return game_status; +} + void DrawTitleScreenImage(int nr) { int graphic = getTitleScreenGraphic() + nr; Bitmap *bitmap = graphic_info[graphic].bitmap; +#if 1 + int width = graphic_info[graphic].width; + int height = graphic_info[graphic].height; + int src_x = graphic_info[graphic].src_x; + int src_y = graphic_info[graphic].src_y; +#else int width = graphic_info[graphic].src_image_width; int height = graphic_info[graphic].src_image_height; int src_x = 0, src_y = 0; +#endif int dst_x, dst_y; if (bitmap == NULL) @@ -659,6 +712,41 @@ void DrawTitleScreenImage(int nr) title.auto_delay_final = graphic_info[graphic].auto_delay; } +void DrawTitleScreenMessage(char *filename) +{ + int font_nr = FONT_TEXT_1; + int font_width; + int font_height; + int pad_x = 16; + int pad_y = 32; + int sx = pad_x; + int sy = pad_y; + int max_chars_per_line; + int max_lines_per_screen; + int last_game_status = game_status; /* save current game status */ + + if (filename == NULL) + return; + + SetDrawBackgroundMask(REDRAW_ALL); + SetWindowBackgroundImageIfDefined(IMG_BACKGROUND_MESSAGE); + + ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); + + /* force MESSAGE font on title message screen */ + game_status = GAME_MODE_MESSAGE; + + 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; + + DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line, + max_lines_per_screen, FALSE); + + game_status = last_game_status; /* restore current game status */ +} + void DrawTitleScreen() { KeyboardAutoRepeatOff(); @@ -724,13 +812,14 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading) /* needed if last screen (level choice) changed graphics, sounds or music */ ReloadCustomArtwork(0); -#ifdef TARGET_SDL +#if defined(TARGET_SDL) SetDrawtoField(DRAW_BACKBUFFER); #endif if (setup.show_titlescreen && ((levelset_has_changed && - graphic_info[IMG_TITLESCREEN_1].bitmap != NULL) || + (graphic_info[IMG_TITLESCREEN_1].bitmap != NULL || + getLevelSetMessageFilename() != NULL)) || (show_titlescreen_initial && graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL))) { @@ -898,9 +987,13 @@ 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_titlescreen_initial; /* default */ + boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL && + filename == NULL); if (button == MB_MENU_INITIALIZE) { @@ -908,6 +1001,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_delay = 0; title_nr = 0; + showing_message = FALSE; if (show_titlescreen_initial && graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL) @@ -915,11 +1009,13 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (game_status == GAME_MODE_INFO) { - if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) + if (no_title_info) { DrawInfoScreen_NotAvailable("Title screen information:", "No title screen for this level set."); + title.auto_delay_final = -1; + return; } @@ -936,7 +1032,20 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) game_status = last_game_status; /* restore current game status */ - DrawTitleScreenImage(title_nr); + if (graphic_info[getTitleScreenGraphic()].bitmap != NULL) + { + DrawTitleScreenImage(title_nr); + } + 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); @@ -958,11 +1067,12 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { int anim_mode; - if (game_status == GAME_MODE_INFO && - graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) + if (game_status == GAME_MODE_INFO && no_title_info) { + FadeOut(REDRAW_FIELD); + info_mode = INFO_MODE_MAIN; - DrawInfoScreen(); + DrawAndFadeInInfoScreen(REDRAW_FIELD); return; } @@ -1002,6 +1112,22 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) 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); + + DelayReached(&title_delay, 0); /* reset delay counter */ + + showing_message = TRUE; + } else { FadeSoundsAndMusic(); @@ -1061,9 +1187,18 @@ void HandleMainMenu_SelectLevel(int step, int direction) if (new_level_nr != old_level_nr) { + struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL); + + PlaySound(SND_MENU_ITEM_SELECTING); + level_nr = new_level_nr; +#if 1 + DrawText(mSX + mci->pos_text->x, mSY + mci->pos_text->y, + int2str(level_nr, 3), mci->font_text); +#else DrawText(mSX + 11 * 32, mSY + 3 * 32, int2str(level_nr, 3), FONT_VALUE_1); +#endif LoadLevel(level_nr); DrawPreviewLevel(TRUE); @@ -1128,6 +1263,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) { if (pos != choice) { + PlaySound(SND_MENU_ITEM_ACTIVATING); + DrawCursorAndText_Main(choice, FALSE); DrawCursorAndText_Main(pos, TRUE); @@ -1136,6 +1273,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else { + PlaySound(SND_MENU_ITEM_SELECTING); + if (pos == MAIN_CONTROL_NAME) { game_status = GAME_MODE_PSEUDO_TYPENAME; @@ -1370,6 +1509,12 @@ static void execInfoProgram() DrawInfoScreen(); } +static void execInfoVersion() +{ + info_mode = INFO_MODE_VERSION; + DrawInfoScreen(); +} + static void execInfoLevelSet() { info_mode = INFO_MODE_LEVELSET; @@ -1389,6 +1534,7 @@ static struct TokenInfo info_info_main[] = { TYPE_ENTER_SCREEN, execInfoMusic, "Music Info" }, { TYPE_ENTER_SCREEN, execInfoCredits, "Credits" }, { TYPE_ENTER_SCREEN, execInfoProgram, "Program Info" }, + { TYPE_ENTER_SCREEN, execInfoVersion, "Version Info" }, { TYPE_ENTER_SCREEN, execInfoLevelSet, "Level Set Info" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execExitInfo, "Exit" }, @@ -1536,6 +1682,8 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) { if (y != choice) { + PlaySound(SND_MENU_ITEM_ACTIVATING); + #if 1 DrawCursorAndText_Info(choice, FALSE); DrawCursorAndText_Info(y, TRUE); @@ -1549,6 +1697,8 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button) } else if (!(info_info[y].type & TYPE_GHOSTED)) { + PlaySound(SND_MENU_ITEM_SELECTING); + if (info_info[y].type & TYPE_ENTER_OR_LEAVE) { void (*menu_callback_function)(void) = info_info[choice].value; @@ -1561,20 +1711,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 ystart1 = 100; + int ystart2 = 150; int ybottom = SYSIZE - 20; SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET); + FadeOut(REDRAW_FIELD); + ClearWindow(); DrawHeadline(); - DrawTextSCentered(100, FONT_TEXT_1, text_title); + DrawTextSCentered(ystart1, FONT_TEXT_1, text_title); + DrawTextSCentered(ystart2, FONT_TEXT_2, text_error); DrawTextSCentered(ybottom, FONT_TEXT_4, "Press any key or button for info menu"); - DrawTextSCentered(ystart, FONT_TEXT_2, text_error); + FadeIn(REDRAW_FIELD); } void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init) @@ -1705,7 +1859,11 @@ static char *getHelpText(int element, int action, int direction) void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) { +#if 1 + int font_nr = FONT_INFO_ELEMENTS; +#else int font_nr = FONT_LEVEL_NUMBER; +#endif int font_width = getFontWidth(font_nr); int sx = mSX + MINI_TILEX + TILEX + MINI_TILEX; int sy = mSY + 65 + 2 * 32 + 1; @@ -1795,6 +1953,8 @@ void HandleInfoScreen_Elements(int button) if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -1803,7 +1963,11 @@ void HandleInfoScreen_Elements(int button) else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE) { if (button != MB_MENU_INITIALIZE) + { + PlaySound(SND_MENU_ITEM_SELECTING); + page++; + } if (page >= num_pages) { @@ -1878,6 +2042,10 @@ void HandleInfoScreen_Music(int button) if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + + FadeSoundsAndMusic(); + info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -1888,8 +2056,12 @@ void HandleInfoScreen_Music(int button) int y = 0; if (button != MB_MENU_INITIALIZE) + { + PlaySound(SND_MENU_ITEM_SELECTING); + if (list != NULL) list = list->next; + } if (list == NULL) { @@ -2177,6 +2349,8 @@ void HandleInfoScreen_Credits(int button) } else if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -2186,6 +2360,8 @@ void HandleInfoScreen_Credits(int button) { boolean show_screen; + PlaySound(SND_MENU_ITEM_SELECTING); + screen_nr++; FadeCrossSaveBackbuffer(); @@ -2262,6 +2438,146 @@ void HandleInfoScreen_Program(int button) { if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + + info_mode = INFO_MODE_MAIN; + DrawInfoScreen(); + + return; + } + else if (button == MB_MENU_CHOICE) + { + PlaySound(SND_MENU_ITEM_SELECTING); + + FadeSoundsAndMusic(); + FadeOut(REDRAW_FIELD); + + info_mode = INFO_MODE_MAIN; + DrawAndFadeInInfoScreen(REDRAW_FIELD); + } + else + { + PlayMenuSoundIfLoop(); + } +} + +void DrawInfoScreen_Version() +{ + int font_header = FONT_TEXT_3; + int font_text = FONT_TEXT_2; + int xstep = getFontWidth(font_text); + int ystep = getFontHeight(font_text); + int xstart1 = SX + 2 * xstep; + int xstart2 = SX + 18 * xstep; + int xstart3 = SX + 28 * xstep; + int ystart = 150; + int ybottom = SYSIZE - 20; +#if defined(TARGET_SDL) + SDL_version sdl_version_compiled; + const SDL_version *sdl_version_linked; +#endif + + SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM); + + FadeOut(REDRAW_FIELD); + + ClearWindow(); + DrawHeadline(); + + DrawTextSCentered(100, FONT_TEXT_1, "Version Information:"); + + DrawTextF(xstart1, ystart, font_header, "Name"); + DrawTextF(xstart2, ystart, font_text, PROGRAM_TITLE_STRING); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_header, "Version"); + DrawTextF(xstart2, ystart, font_text, getProgramFullVersionString()); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_header, "Platform"); + DrawTextF(xstart2, ystart, font_text, PLATFORM_STRING); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_header, "Target"); + DrawTextF(xstart2, ystart, font_text, TARGET_STRING); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_header, "Compile time"); + DrawTextF(xstart2, ystart, font_text, getCompileDateString()); + +#if defined(TARGET_SDL) + ystart += 3 * ystep; + DrawTextF(xstart1, ystart, font_header, "Library"); + DrawTextF(xstart2, ystart, font_header, "compiled"); + DrawTextF(xstart3, ystart, font_header, "linked"); + + SDL_VERSION(&sdl_version_compiled); + sdl_version_linked = SDL_Linked_Version(); + + ystart += 2 * ystep; + DrawTextF(xstart1, ystart, font_text, "SDL"); + DrawTextF(xstart2, ystart, font_text, "%d.%d.%d", + sdl_version_compiled.major, + sdl_version_compiled.minor, + sdl_version_compiled.patch); + DrawTextF(xstart3, ystart, font_text, "%d.%d.%d", + sdl_version_linked->major, + sdl_version_linked->minor, + sdl_version_linked->patch); + + SDL_IMAGE_VERSION(&sdl_version_compiled); +#if 0 + sdl_version_linked = IMG_Linked_Version(); +#else +#endif + + ystart += ystep; + DrawTextF(xstart1, ystart, font_text, "SDL_image"); + DrawTextF(xstart2, ystart, font_text, "%d.%d.%d", + sdl_version_compiled.major, + sdl_version_compiled.minor, + sdl_version_compiled.patch); +#if 0 + DrawTextF(xstart3, ystart, font_text, "%d.%d.%d", + sdl_version_linked->major, + sdl_version_linked->minor, + sdl_version_linked->patch); +#else + DrawTextF(xstart3, ystart, font_text, "?.?.?"); +#endif + + SDL_MIXER_VERSION(&sdl_version_compiled); + sdl_version_linked = Mix_Linked_Version(); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_text, "SDL_mixer"); + DrawTextF(xstart2, ystart, font_text, "%d.%d.%d", + sdl_version_compiled.major, + sdl_version_compiled.minor, + sdl_version_compiled.patch); + DrawTextF(xstart3, ystart, font_text, "%d.%d.%d", + sdl_version_linked->major, + sdl_version_linked->minor, + sdl_version_linked->patch); + + ystart += ystep; + DrawTextF(xstart1, ystart, font_text, "SDL_net"); + DrawTextF(xstart2, ystart, font_text, "?.?.?"); + DrawTextF(xstart3, ystart, font_text, "?.?.?"); +#endif + + DrawTextSCentered(ybottom, FONT_TEXT_4, + "Press any key or button for info menu"); + + FadeIn(REDRAW_FIELD); +} + +void HandleInfoScreen_Version(int button) +{ + if (button == MB_MENU_LEAVE) + { + PlaySound(SND_MENU_ITEM_SELECTING); + info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -2269,6 +2585,8 @@ void HandleInfoScreen_Program(int button) } else if (button == MB_MENU_CHOICE) { + PlaySound(SND_MENU_ITEM_SELECTING); + FadeSoundsAndMusic(); FadeOut(REDRAW_FIELD); @@ -2286,7 +2604,11 @@ void DrawInfoScreen_LevelSet() int ystart = 150; int ybottom = SYSIZE - 20; 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; @@ -2310,7 +2632,7 @@ void DrawInfoScreen_LevelSet() if (filename != NULL) DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line, - max_lines_per_screen); + max_lines_per_screen, TRUE); else DrawTextSCentered(ystart, FONT_TEXT_2, "No information for this level set."); @@ -2322,6 +2644,8 @@ void HandleInfoScreen_LevelSet(int button) { if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -2329,6 +2653,8 @@ void HandleInfoScreen_LevelSet(int button) } else if (button == MB_MENU_CHOICE) { + PlaySound(SND_MENU_ITEM_SELECTING); + FadeSoundsAndMusic(); FadeOut(REDRAW_FIELD); @@ -2355,6 +2681,8 @@ static void DrawInfoScreenExt(int redraw_mask, boolean do_fading) DrawInfoScreen_Credits(); else if (info_mode == INFO_MODE_PROGRAM) DrawInfoScreen_Program(); + else if (info_mode == INFO_MODE_VERSION) + DrawInfoScreen_Version(); else if (info_mode == INFO_MODE_LEVELSET) DrawInfoScreen_LevelSet(); else @@ -2391,6 +2719,8 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button) HandleInfoScreen_Credits(button); else if (info_mode == INFO_MODE_PROGRAM) HandleInfoScreen_Program(button); + else if (info_mode == INFO_MODE_VERSION) + HandleInfoScreen_Version(button); else if (info_mode == INFO_MODE_LEVELSET) HandleInfoScreen_LevelSet(button); else @@ -2406,18 +2736,37 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button) void HandleTypeName(int newxpos, Key key) { + struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME); +#if 1 + struct MenuPosInfo *pos = mci->pos_input; + int startx = mSX + ALIGNED_MENU_XPOS(pos); + int starty = mSY + ALIGNED_MENU_YPOS(pos); +#endif +#if 1 + static int xpos = 0; +#else static int xpos = 0, ypos = 2; - int font_width = getFontWidth(FONT_INPUT_1_ACTIVE); +#endif + int font_nr = mci->font_input; + int font_active_nr = FONT_ACTIVE(font_nr); + int font_width = getFontWidth(font_active_nr); +#if 1 +#if 0 + int startx = mSX + mci->pos_input->x; + int starty = mSY + mci->pos_input->y; +#endif +#else int name_width = getFontWidth(FONT_MENU_1) * strlen("Name:"); int startx = mSX + 32 + name_width; int starty = mSY + ypos * 32; +#endif if (newxpos) { xpos = newxpos; - DrawText(startx, starty, setup.player_name, FONT_INPUT_1_ACTIVE); - DrawText(startx + xpos * font_width, starty, "_", FONT_INPUT_1_ACTIVE); + DrawText(startx, starty, setup.player_name, font_active_nr); + DrawText(startx + xpos * font_width, starty, "_", font_active_nr); return; } @@ -2435,24 +2784,27 @@ void HandleTypeName(int newxpos, Key key) setup.player_name[xpos] = ascii; setup.player_name[xpos + 1] = 0; + xpos++; - DrawText(startx, starty, setup.player_name, FONT_INPUT_1_ACTIVE); - DrawText(startx + xpos * font_width, starty, "_", FONT_INPUT_1_ACTIVE); + DrawText(startx, starty, setup.player_name, font_active_nr); + DrawText(startx + xpos * font_width, starty, "_", font_active_nr); } else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0) { xpos--; + setup.player_name[xpos] = 0; - DrawText(startx + xpos * font_width, starty, "_ ", FONT_INPUT_1_ACTIVE); + DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr); } else if (key == KSYM_Return && xpos > 0) { - DrawText(startx, starty, setup.player_name, FONT_INPUT_1); - DrawText(startx + xpos * font_width, starty, " ", FONT_INPUT_1_ACTIVE); + DrawText(startx, starty, setup.player_name, font_nr); + DrawText(startx + xpos * font_width, starty, " ", font_active_nr); SaveSetup(); + game_status = GAME_MODE_MAIN; } } @@ -2515,10 +2867,17 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, /* force LEVELS font on artwork setup screen */ game_status = GAME_MODE_LEVELS; +#if 1 + /* clear tree list area, but not title or scrollbar */ + DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset, + NUM_MENU_ENTRIES_ON_SCREEN * 32); +#else /* clear tree list area, but not title or scrollbar */ DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32, SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset, MAX_MENU_ENTRIES_ON_SCREEN * 32); +#endif for (i = 0; i < num_page_entries; i++) { @@ -2562,6 +2921,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) TreeInfo *node, *node_first; int x, last_redraw_mask = redraw_mask; int ypos = MENU_TITLE2_YPOS; + int font_nr = FONT_TITLE_2; if (ti->type != TREE_TYPE_LEVEL_DIR) return; @@ -2569,16 +2929,16 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) node_first = getTreeInfoFirstGroupEntry(ti); node = getTreeInfoFromPos(node_first, entry_pos); - DrawBackground(SX, SY + ypos, SXSIZE, getFontHeight(FONT_TITLE_2)); + DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), font_nr); if (node->parent_link) - DrawTextFCentered(ypos, FONT_TITLE_2, "leave group \"%s\"", + DrawTextFCentered(ypos, font_nr, "leave group \"%s\"", node->class_desc); else if (node->level_group) - DrawTextFCentered(ypos, FONT_TITLE_2, "enter group \"%s\"", + DrawTextFCentered(ypos, font_nr, "enter group \"%s\"", node->class_desc); else if (ti->type == TREE_TYPE_LEVEL_DIR) - DrawTextFCentered(ypos, FONT_TITLE_2, "%3d levels (%s)", + DrawTextFCentered(ypos, font_nr, "%3d levels (%s)", node->levels, node->class_desc); /* let BackToFront() redraw only what is needed */ @@ -2643,6 +3003,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + if (ti->node_parent) { *ti_ptr = ti->node_parent; @@ -2743,6 +3105,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (node_cursor->node_group) { + PlaySound(SND_MENU_ITEM_SELECTING); + node_cursor->cl_first = ti->cl_first; node_cursor->cl_cursor = ti->cl_cursor; *ti_ptr = node_cursor->node_group; @@ -2753,6 +3117,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (dx == -1 && ti->node_parent) { + PlaySound(SND_MENU_ITEM_SELECTING); + *ti_ptr = ti->node_parent; DrawChooseTree(ti_ptr); @@ -2768,6 +3134,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, { if (y != ti->cl_cursor) { + PlaySound(SND_MENU_ITEM_ACTIVATING); + drawChooseTreeCursor(ti->cl_cursor, FALSE); drawChooseTreeCursor(y, TRUE); drawChooseTreeInfo(ti->cl_first + y, ti); @@ -2780,6 +3148,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, TreeInfo *node_first, *node_cursor; int entry_pos = ti->cl_first + y; + PlaySound(SND_MENU_ITEM_SELECTING); + node_first = getTreeInfoFirstGroupEntry(ti); node_cursor = getTreeInfoFromPos(node_first, entry_pos); @@ -2848,6 +3218,15 @@ void DrawHallOfFame(int highlight_position) { UnmapAllGadgets(); FadeSoundsAndMusic(); + + /* (this is needed when called from GameEnd() after winning a game) */ + KeyboardAutoRepeatOn(); + ActivateJoystick(); + + /* (this is needed when called from GameEnd() after winning a game) */ + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + CloseDoor(DOOR_CLOSE_2); if (highlight_position < 0) @@ -2944,6 +3323,8 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + FadeSound(SND_BACKGROUND_SCORES); game_status = GAME_MODE_MAIN; @@ -2952,6 +3333,8 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_CHOICE) { + PlaySound(SND_MENU_ITEM_SELECTING); + FadeSound(SND_BACKGROUND_SCORES); FadeOut(REDRAW_FIELD); @@ -3184,6 +3567,7 @@ static struct TokenInfo setup_info_editor[] = { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX-Boulderdash:" }, #endif { TYPE_SWITCH, &setup.editor.el_chars, "Text Characters:" }, + { TYPE_SWITCH, &setup.editor.el_steel_chars, "Text Characters (Steel):" }, { TYPE_SWITCH, &setup.editor.el_custom, "Custom & Group Elements:" }, #if 0 { TYPE_SWITCH, &setup.editor.el_headlines, "Headlines:" }, @@ -3643,6 +4027,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_LEAVE) { + PlaySound(SND_MENU_ITEM_SELECTING); + for (y = 0; y < num_setup_info; y++) { if (setup_info[y].type & TYPE_LEAVE_MENU) @@ -3688,6 +4074,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) { if (y != choice && setup_info[y].type & ~TYPE_SKIP_ENTRY) { + PlaySound(SND_MENU_ITEM_ACTIVATING); + #if 1 DrawCursorAndText_Setup(choice, FALSE); DrawCursorAndText_Setup(y, TRUE); @@ -3701,6 +4089,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) } else if (!(setup_info[y].type & TYPE_GHOSTED)) { + PlaySound(SND_MENU_ITEM_SELECTING); + /* when selecting key headline, execute function for key value change */ if (setup_info[y].type & TYPE_KEYTEXT && setup_info[y + 1].type & TYPE_KEY)