X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=0d297f6cecff9908e02f6c95047ab8b3d71bd76a;hb=1264abe158bef8419451c95e6db9a738eeec76f8;hp=9c2ed1b1c8292d440503181694fdaec10701d9b3;hpb=ca40038f7fbffd28bd6a106715a573d2029b5a04;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 9c2ed1b1..0d297f6c 100644 --- a/src/screens.c +++ b/src/screens.c @@ -228,7 +228,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 +242,9 @@ static struct struct MenuPosInfo *pos_input; char *input; int font_input; -} -main_controls[] = +}; + +static struct MainControlInfo main_controls[] = { { MAIN_CONTROL_NAME, @@ -294,6 +295,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 +382,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,22 +461,24 @@ static void InitializeMainControls() } } -static void DrawCursorAndText_Main(int pos, boolean active) +static void DrawCursorAndText_Main(int nr, boolean active) { 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; + 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) { @@ -483,36 +488,48 @@ static void DrawCursorAndText_Main(int pos, boolean active) 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_XPOS(pos->x, pos->width, pos->align); + int y = mSY + pos->y; - 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_XPOS(pos->x, pos->width, pos->align); + int y = mSY + pos->y; - 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 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) @@ -542,7 +559,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); } @@ -611,9 +628,16 @@ 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) @@ -644,6 +668,19 @@ void DrawTitleScreenImage(int nr) BlitBitmap(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y); redraw_mask = REDRAW_ALL; + + /* reset fading control values to default config settings */ + 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].fade_delay > -1) + title.fade_delay_final = graphic_info[graphic].fade_delay; + if (graphic_info[graphic].post_delay > -1) + title.post_delay_final = graphic_info[graphic].post_delay; + if (graphic_info[graphic].auto_delay > -1) + title.auto_delay_final = graphic_info[graphic].auto_delay; } void DrawTitleScreen() @@ -888,7 +925,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) boolean return_to_main_menu = FALSE; boolean use_fading_main_menu = TRUE; boolean use_cross_fading = !show_titlescreen_initial; /* default */ - int auto_delay = menu.auto_delay; if (button == MB_MENU_INITIALIZE) { @@ -897,6 +933,10 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_delay = 0; title_nr = 0; + if (show_titlescreen_initial && + graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL) + show_titlescreen_initial = FALSE; + if (game_status == GAME_MODE_INFO) { if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) @@ -929,11 +969,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) return; } - int anim_delay = graphic_info[getTitleScreenGraphic() + title_nr].anim_delay; - if (anim_delay > 1) - auto_delay = anim_delay; - - if (auto_delay > 0 && DelayReached(&title_delay, auto_delay)) + if (title.auto_delay_final > -1 && + DelayReached(&title_delay, title.auto_delay_final)) button = MB_MENU_CHOICE; if (button == MB_MENU_LEAVE) @@ -943,6 +980,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) } else if (button == MB_MENU_CHOICE) { + int anim_mode; + if (game_status == GAME_MODE_INFO && graphic_info[IMG_TITLESCREEN_1].bitmap == NULL) { @@ -963,7 +1002,7 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) title_nr = 0; /* restart with title screens for current level set */ } - int anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode; + anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode; use_cross_fading = (anim_mode == ANIM_FADE ? FALSE : anim_mode == ANIM_CROSSFADE ? TRUE : @@ -999,6 +1038,8 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button) if (return_to_main_menu) { + show_titlescreen_initial = FALSE; + RedrawBackground(); if (game_status == GAME_MODE_INFO) @@ -1044,9 +1085,16 @@ void HandleMainMenu_SelectLevel(int step, int direction) if (new_level_nr != old_level_nr) { + struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL); + 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); @@ -1753,7 +1801,6 @@ void HandleInfoScreen_Elements(int button) static int num_pages; static int page; int anims_per_page = MAX_INFO_ELEMENTS_ON_SCREEN; - int button_released = !button; int i; if (button == MB_MENU_INITIALIZE) @@ -1761,6 +1808,7 @@ void HandleInfoScreen_Elements(int button) boolean new_element = TRUE; num_anims = 0; + for (i = 0; helpanim_info[i].element != HELPANIM_LIST_END; i++) { if (helpanim_info[i].element == HELPANIM_LIST_NEXT) @@ -1775,15 +1823,15 @@ void HandleInfoScreen_Elements(int button) num_pages = (num_anims + anims_per_page - 1) / anims_per_page; page = 0; } - else if (button == MB_MENU_LEAVE) + + if (button == MB_MENU_LEAVE) { info_mode = INFO_MODE_MAIN; DrawInfoScreen(); return; } - - if (button_released || button == MB_MENU_INITIALIZE) + else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE) { if (button != MB_MENU_INITIALIZE) page++; @@ -1838,7 +1886,6 @@ void HandleInfoScreen_Music(int button) static struct MusicFileInfo *list = NULL; int ystart = 150, dy = 30; int ybottom = SYSIZE - 20; - int button_released = !button; if (button == MB_MENU_INITIALIZE) { @@ -1859,15 +1906,15 @@ void HandleInfoScreen_Music(int button) return; } } - else if (button == MB_MENU_LEAVE) + + if (button == MB_MENU_LEAVE) { info_mode = INFO_MODE_MAIN; DrawInfoScreen(); return; } - - if (button_released || button == MB_MENU_INITIALIZE) + else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE) { int y = 0; @@ -2244,8 +2291,6 @@ void DrawInfoScreen_Program() void HandleInfoScreen_Program(int button) { - int button_released = !button; - if (button == MB_MENU_LEAVE) { info_mode = INFO_MODE_MAIN; @@ -2253,8 +2298,7 @@ void HandleInfoScreen_Program(int button) return; } - - if (button_released) + else if (button == MB_MENU_CHOICE) { FadeSoundsAndMusic(); FadeOut(REDRAW_FIELD); @@ -2307,8 +2351,6 @@ void DrawInfoScreen_LevelSet() void HandleInfoScreen_LevelSet(int button) { - int button_released = !button; - if (button == MB_MENU_LEAVE) { info_mode = INFO_MODE_MAIN; @@ -2316,8 +2358,7 @@ void HandleInfoScreen_LevelSet(int button) return; } - - if (button_released) + else if (button == MB_MENU_CHOICE) { FadeSoundsAndMusic(); FadeOut(REDRAW_FIELD); @@ -2396,18 +2437,30 @@ 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 + 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 + int startx = mSX + mci->pos_input->x; + int starty = mSY + mci->pos_input->y; +#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; } @@ -2425,24 +2478,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; } } @@ -2552,6 +2608,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; @@ -2559,16 +2616,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 */ @@ -2838,6 +2895,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)