X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=5fde5b2c4b87b2029190f21baa32e1f8defad184;hb=61c3da024802ecc0268bab42d7499fc0346e4fd3;hp=34eec7468caa7ca501ff2a903757a82f8aa1a1b7;hpb=a312d80612bb9a448cdc1abbde690b296fa92b17;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 34eec746..5fde5b2c 100644 --- a/src/screens.c +++ b/src/screens.c @@ -45,22 +45,26 @@ #define SETUP_MODE_SOUND 4 #define SETUP_MODE_ARTWORK 5 #define SETUP_MODE_INPUT 6 -#define SETUP_MODE_SHORTCUTS_1 7 -#define SETUP_MODE_SHORTCUTS_2 8 +#define SETUP_MODE_SHORTCUTS 7 +#define SETUP_MODE_SHORTCUTS_1 8 +#define SETUP_MODE_SHORTCUTS_2 9 +#define SETUP_MODE_SHORTCUTS_3 10 +#define SETUP_MODE_SHORTCUTS_4 11 +#define SETUP_MODE_SHORTCUTS_5 12 /* sub-screens on the setup screen (generic) */ -#define SETUP_MODE_CHOOSE_ARTWORK 9 -#define SETUP_MODE_CHOOSE_OTHER 10 +#define SETUP_MODE_CHOOSE_ARTWORK 13 +#define SETUP_MODE_CHOOSE_OTHER 14 /* sub-screens on the setup screen (specific) */ -#define SETUP_MODE_CHOOSE_GAME_SPEED 11 -#define SETUP_MODE_CHOOSE_SCREEN_MODE 12 -#define SETUP_MODE_CHOOSE_SCROLL_DELAY 13 -#define SETUP_MODE_CHOOSE_GRAPHICS 14 -#define SETUP_MODE_CHOOSE_SOUNDS 15 -#define SETUP_MODE_CHOOSE_MUSIC 16 +#define SETUP_MODE_CHOOSE_GAME_SPEED 15 +#define SETUP_MODE_CHOOSE_SCREEN_MODE 16 +#define SETUP_MODE_CHOOSE_SCROLL_DELAY 17 +#define SETUP_MODE_CHOOSE_GRAPHICS 18 +#define SETUP_MODE_CHOOSE_SOUNDS 19 +#define SETUP_MODE_CHOOSE_MUSIC 20 -#define MAX_SETUP_MODES 17 +#define MAX_SETUP_MODES 21 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -137,7 +141,8 @@ static void execSetupGraphics(void); static void execSetupArtwork(void); static void HandleChooseTree(int, int, int, int, int, TreeInfo **); -static void DrawChooseLevel(void); +static void DrawChooseLevelSet(void); +static void DrawChooseLevelNr(void); static void DrawInfoScreen(void); static void DrawAndFadeInInfoScreen(int); static void DrawSetupScreen(void); @@ -171,6 +176,9 @@ static TreeInfo *scroll_delay_current = NULL; static TreeInfo *game_speeds = NULL; static TreeInfo *game_speed_current = NULL; +static TreeInfo *level_number = NULL; +static TreeInfo *level_number_current = NULL; + static struct { int value; @@ -232,7 +240,7 @@ static struct INFO_MODE_MAIN) #define DRAW_MODE_SETUP(i) ((i) >= SETUP_MODE_MAIN && \ - (i) <= SETUP_MODE_SHORTCUTS_2 ? (i) : \ + (i) <= SETUP_MODE_SHORTCUTS_5 ? (i) : \ (i) >= SETUP_MODE_CHOOSE_GRAPHICS && \ (i) <= SETUP_MODE_CHOOSE_MUSIC ? \ SETUP_MODE_CHOOSE_ARTWORK : \ @@ -863,8 +871,13 @@ static void InitializeMainControls() if (pos_text != NULL) /* (x/y may be -1/-1 here) */ { +#if 1 + /* calculate size for non-clickable text -- needed for text alignment */ + boolean calculate_text_size = (pos_button == NULL && text != NULL); +#else /* calculate width for non-clickable text -- needed for text alignment */ boolean calculate_text_width = (pos_button == NULL && text != NULL); +#endif if (visibleMenuPos(pos_button)) { @@ -874,10 +887,17 @@ static void InitializeMainControls() pos_text->y = pos_button->y; } +#if 1 + if (pos_text->width == -1 || calculate_text_size) + pos_text->width = text_width; + if (pos_text->height == -1 || calculate_text_size) + pos_text->height = text_height; +#else if (pos_text->width == -1 || calculate_text_width) pos_text->width = text_width; if (pos_text->height == -1) pos_text->height = text_height; +#endif } if (pos_input != NULL) /* (x/y may be -1/-1 here) */ @@ -941,7 +961,7 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, int y = mSY + pos->y; DrawBackgroundForGraphic(x, y, pos->width, pos->height, button_graphic); - DrawGraphicThruMaskExt(drawto, x, y, button_graphic, 0); + DrawFixedGraphicThruMaskExt(drawto, x, y, button_graphic, 0); } if (visibleTextPos(pos_text) && text != NULL) @@ -1016,13 +1036,24 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y) int rect_x = ALIGNED_TEXT_XPOS(rect); int rect_y = ALIGNED_TEXT_YPOS(rect); +#if 0 + printf("::: insideTextPosRect: (%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d\n", + x, y, rect_x, rect_y, rect->x, rect->y, rect->width, rect->height, + (x >= rect_x && x < rect_x + rect->width && + y >= rect_y && y < rect_y + rect->height)); +#endif + return (x >= rect_x && x < rect_x + rect->width && y >= rect_y && y < rect_y + rect->height); } static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) { +#if 1 + static int cursor_array[MAX_LEV_FIELDY]; +#else static int cursor_array[SCR_FIELDY]; +#endif int x = mSX + TILEX * xpos; int y = mSY + TILEY * (MENU_SCREEN_START_YPOS + ypos); @@ -1038,7 +1069,7 @@ static void drawCursorExt(int xpos, int ypos, boolean active, int graphic) graphic = BUTTON_ACTIVE(graphic); DrawBackgroundForGraphic(x, y, TILEX, TILEY, graphic); - DrawGraphicThruMaskExt(drawto, x, y, graphic, 0); + DrawFixedGraphicThruMaskExt(drawto, x, y, graphic, 0); } static void initCursor(int ypos, int graphic) @@ -1183,7 +1214,7 @@ void DrawTitleScreenMessage(int nr, boolean initial) ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi), - filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1, tmi->autowrap, tmi->centered, tmi->parse_comments); game_status = last_game_status; /* restore current game status */ @@ -1263,6 +1294,8 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) /* store valid level series information */ leveldir_last_valid = leveldir_current; + init_last = init; /* switch to new busy animation */ + /* needed if last screen (level choice) changed graphics, sounds or music */ ReloadCustomArtwork(0); @@ -1280,6 +1313,11 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) #endif #endif +#if 1 + /* needed if different viewport properties defined for menues */ + ChangeViewportPropertiesIfNeeded(); +#endif + #if defined(TARGET_SDL) SetDrawtoField(DRAW_BACKBUFFER); #endif @@ -1377,7 +1415,7 @@ void DrawMainMenu() DrawMainMenuExt(REDRAW_ALL, FALSE); } -#if 0 +#if defined(CREATE_SPECIAL_EDITION_RND_JUE) static void gotoTopLevelDir() { /* move upwards to top level directory */ @@ -1410,7 +1448,7 @@ static void gotoTopLevelDir() void HandleTitleScreen(int mx, int my, int dx, int dy, int button) { - static unsigned long title_delay = 0; + static unsigned int title_delay = 0; static int title_screen_nr = 0; static int last_sound = -1, last_music = -1; boolean return_to_main_menu = FALSE; @@ -1688,10 +1726,19 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) for (i = 0; main_controls[i].nr != -1; i++) { +#if 0 + printf("::: check click (%d, %d) for %d [%d] ...\n", + mx - mSX, my - mSY, i, main_controls[i].nr); +#endif + if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) || insideTextPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) || insideTextPosRect(main_controls[i].pos_input, mx - mSX, my - mSY)) { +#if 0 + printf("::: inside %d\n", i); +#endif + pos = main_controls[i].nr; break; @@ -1711,6 +1758,20 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) { HandleMainMenu_SelectLevel(1, dx < 0 ? -1 : +1); } + else if (pos == MAIN_CONTROL_FIRST_LEVEL && !button) + { + HandleMainMenu_SelectLevel(MAX_LEVELS, -1); + } + else if (pos == MAIN_CONTROL_LAST_LEVEL && !button) + { + HandleMainMenu_SelectLevel(MAX_LEVELS, +1); + } + else if (pos == MAIN_CONTROL_LEVEL_NUMBER && !button) + { + game_status = GAME_MODE_LEVELNR; + + DrawChooseLevelNr(); + } else if (pos >= MAIN_CONTROL_NAME && pos <= MAIN_CONTROL_QUIT) { if (button) @@ -1744,11 +1805,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SaveLevelSetup_LastSeries(); SaveLevelSetup_SeriesInfo(); -#if 0 +#if defined(CREATE_SPECIAL_EDITION_RND_JUE) gotoTopLevelDir(); #endif - DrawChooseLevel(); + DrawChooseLevelSet(); } } else if (pos == MAIN_CONTROL_SCORES) @@ -1767,6 +1828,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) FadeSetEnterScreen(); +#if 0 + /* needed if different viewport properties defined for editor */ + ChangeViewportPropertiesIfNeeded(); +#endif + DrawLevelEd(); } else if (pos == MAIN_CONTROL_INFO) @@ -2177,8 +2243,8 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init) ClearRectangleOnBackground(drawto, xstart, ystart2 + (i - start) * ystep, TILEX, TILEY); - DrawGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep, - graphic, sync_frame, USE_MASKING); + DrawFixedGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep, + graphic, sync_frame, USE_MASKING); if (init) DrawInfoScreen_HelpText(element, action, direction, i - start); @@ -2237,7 +2303,7 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) sy += getFontHeight(font_nr) / 2; DrawTextBuffer(sx, sy + ypos * ystep, text, font_nr, - max_chars_per_line, -1, max_lines_per_text, -1, + max_chars_per_line, -1, max_lines_per_text, 0, -1, TRUE, FALSE, FALSE); } @@ -2269,7 +2335,7 @@ void DrawInfoScreen_Elements() void HandleInfoScreen_Elements(int button) { - static unsigned long info_delay = 0; + static unsigned int info_delay = 0; static int num_anims; static int num_pages; static int page; @@ -3041,7 +3107,7 @@ void DrawInfoScreen_LevelSet() if (filename != NULL) DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi), - filename, tmi->font, tmi->chars, -1, tmi->lines, -1, + filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1, tmi->autowrap, tmi->centered, tmi->parse_comments); else DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2, @@ -3276,8 +3342,8 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, char *title_string = NULL; int yoffset_sets = MENU_TITLE1_YPOS; int yoffset_setup = 16; - int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? yoffset_sets : - yoffset_setup); + int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR || + ti->type == TREE_TYPE_LEVEL_NR ? yoffset_sets : yoffset_setup); int last_game_status = game_status; /* save current game status */ title_string = ti->infotext; @@ -3345,6 +3411,9 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) int ypos = MENU_TITLE2_YPOS; int font_nr = FONT_TITLE_2; + if (ti->type == TREE_TYPE_LEVEL_NR) + DrawTextFCentered(ypos, font_nr, leveldir_current->name); + if (ti->type != TREE_TYPE_LEVEL_DIR) return; @@ -3353,6 +3422,18 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), font_nr); +#if 1 + if (node->parent_link) + DrawTextFCentered(ypos, font_nr, "leave \"%s\"", + node->node_parent->name); + else if (node->level_group) + DrawTextFCentered(ypos, font_nr, "enter \"%s\"", + node->name); + else if (ti->type == TREE_TYPE_LEVEL_DIR) + DrawTextFCentered(ypos, font_nr, "%3d %s (%s)", + node->levels, (node->levels > 1 ? "levels" : "level"), + node->class_desc); +#else if (node->parent_link) DrawTextFCentered(ypos, font_nr, "leave group \"%s\"", node->class_desc); @@ -3362,6 +3443,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) else if (ti->type == TREE_TYPE_LEVEL_DIR) DrawTextFCentered(ypos, font_nr, "%3d levels (%s)", node->levels, node->class_desc); +#endif /* let BackToFront() redraw only what is needed */ redraw_mask = last_redraw_mask | REDRAW_TILES; @@ -3448,6 +3530,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else { + if (game_status == GAME_MODE_LEVELNR) + level_nr = atoi(level_number_current->identifier); + game_status = GAME_MODE_MAIN; DrawMainMenuExt(REDRAW_FIELD, FALSE); @@ -3631,7 +3716,11 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else { + if (game_status == GAME_MODE_LEVELNR) + level_nr = atoi(level_number_current->identifier); + game_status = GAME_MODE_MAIN; + DrawMainMenu(); } } @@ -3639,7 +3728,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } } -void DrawChooseLevel() +void DrawChooseLevelSet() { SetMainBackgroundImage(IMG_BACKGROUND_LEVELS); @@ -3649,9 +3738,80 @@ void DrawChooseLevel() PlayMenuMusic(); } -void HandleChooseLevel(int mx, int my, int dx, int dy, int button) +void HandleChooseLevelSet(int mx, int my, int dx, int dy, int button) +{ + HandleChooseTree(mx, my, dx, dy, button, &leveldir_current); + + DoAnimation(); +} + +void DrawChooseLevelNr() +{ + int i; + + if (level_number != NULL) + { + freeTreeInfo(level_number); + + level_number = NULL; + } + + for (i = leveldir_current->first_level; i <= leveldir_current->last_level;i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_LEVEL_NR); + char identifier[32], name[32]; + int value = i; + + /* temporarily load level info to get level name */ + LoadLevelInfoOnly(i); + + ti->node_top = &level_number; + ti->sort_priority = 10000 + value; + ti->color = (level.no_valid_file ? FC_BLUE : + LevelStats_getSolved(i) ? FC_GREEN : + LevelStats_getPlayed(i) ? FC_YELLOW : FC_RED); + + sprintf(identifier, "%d", value); + sprintf(name, "%03d: %s", value, + (level.no_valid_file ? "(no file)" : level.name)); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + + pushTreeInfo(&level_number, ti); + } + + /* sort level number values to start with lowest level number */ + sortTreeInfo(&level_number); + + /* set current level number to current level number */ + level_number_current = + getTreeInfoFromIdentifier(level_number, i_to_a(level_nr)); + + /* if that also fails, set current level number to first available level */ + if (level_number_current == NULL) + level_number_current = level_number; + + SetMainBackgroundImage(IMG_BACKGROUND_LEVELNR); + +#if 1 + DrawChooseTree(&level_number_current); +#else + DrawChooseTree(&leveldir_current); +#endif + + PlayMenuSound(); + PlayMenuMusic(); +} + +void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) { +#if 1 + HandleChooseTree(mx, my, dx, dy, button, &level_number_current); +#else HandleChooseTree(mx, my, dx, dy, button, &leveldir_current); +#endif DoAnimation(); } @@ -4081,6 +4241,13 @@ static void execSetupInput() DrawSetupScreen(); } +static void execSetupShortcuts() +{ + setup_mode = SETUP_MODE_SHORTCUTS; + + DrawSetupScreen(); +} + static void execSetupShortcuts1() { setup_mode = SETUP_MODE_SHORTCUTS_1; @@ -4095,6 +4262,27 @@ static void execSetupShortcuts2() DrawSetupScreen(); } +static void execSetupShortcuts3() +{ + setup_mode = SETUP_MODE_SHORTCUTS_3; + + DrawSetupScreen(); +} + +static void execSetupShortcuts4() +{ + setup_mode = SETUP_MODE_SHORTCUTS_4; + + DrawSetupScreen(); +} + +static void execSetupShortcuts5() +{ + setup_mode = SETUP_MODE_SHORTCUTS_5; + + DrawSetupScreen(); +} + static void execExitSetup() { game_status = GAME_MODE_MAIN; @@ -4116,8 +4304,7 @@ static struct TokenInfo setup_info_main[] = { TYPE_ENTER_MENU, execSetupSound, "Sound & Music" }, { TYPE_ENTER_MENU, execSetupArtwork, "Custom Artwork" }, { TYPE_ENTER_MENU, execSetupInput, "Input Devices" }, - { TYPE_ENTER_MENU, execSetupShortcuts1, "Key Shortcuts 1" }, - { TYPE_ENTER_MENU, execSetupShortcuts2, "Key Shortcuts 2" }, + { TYPE_ENTER_MENU, execSetupShortcuts, "Key Shortcuts" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execExitSetup, "Exit" }, { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and Exit" }, @@ -4194,6 +4381,7 @@ static struct TokenInfo setup_info_graphics[] = { TYPE_SWITCH, &setup.toons, "Show Toons:" }, { TYPE_ECS_AGA, &setup.prefer_aga_graphics,"EMC graphics preference:" }, { TYPE_SWITCH, &setup.sp_show_border_elements,"Supaplex Border Elements:" }, + { TYPE_SWITCH, &setup.small_game_graphics, "Small Game Graphics:" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -4263,6 +4451,19 @@ static struct TokenInfo setup_info_input[] = { 0, NULL, NULL } }; +static struct TokenInfo setup_info_shortcuts[] = +{ + { TYPE_ENTER_MENU, execSetupShortcuts1, "Various Keys" }, + { TYPE_ENTER_MENU, execSetupShortcuts2, "Player Focus" }, + { TYPE_ENTER_MENU, execSetupShortcuts3, "Tape Buttons" }, + { TYPE_ENTER_MENU, execSetupShortcuts4, "Sound & Music" }, + { TYPE_ENTER_MENU, execSetupShortcuts5, "TAS Snap Keys" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + + { 0, NULL, NULL } +}; + static struct TokenInfo setup_info_shortcuts_1[] = { { TYPE_KEYTEXT, NULL, "Quick Save Game to Tape:", }, @@ -4275,7 +4476,7 @@ static struct TokenInfo setup_info_shortcuts_1[] = { TYPE_YES_NO, &setup.ask_on_escape, "Ask on 'Esc' Key:" }, { TYPE_YES_NO, &setup.ask_on_escape_editor, "Ask on 'Esc' Key (Editor):" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, { 0, NULL, NULL } }; @@ -4293,7 +4494,57 @@ static struct TokenInfo setup_info_shortcuts_2[] = { TYPE_KEYTEXT, NULL, "Set Focus to All Players:", }, { TYPE_KEY, &setup.shortcut.focus_player_all, "" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, + + { 0, NULL, NULL } +}; + +static struct TokenInfo setup_info_shortcuts_3[] = +{ + { TYPE_KEYTEXT, NULL, "Eject Tape:", }, + { TYPE_KEY, &setup.shortcut.tape_eject, "" }, + { TYPE_KEYTEXT, NULL, "Warp / Single Step:", }, + { TYPE_KEY, &setup.shortcut.tape_extra, "" }, + { TYPE_KEYTEXT, NULL, "Stop Tape:", }, + { TYPE_KEY, &setup.shortcut.tape_stop, "" }, + { TYPE_KEYTEXT, NULL, "Pause / Unpause Tape:",}, + { TYPE_KEY, &setup.shortcut.tape_pause, "" }, + { TYPE_KEYTEXT, NULL, "Record Tape:", }, + { TYPE_KEY, &setup.shortcut.tape_record, "" }, + { TYPE_KEYTEXT, NULL, "Play Tape:", }, + { TYPE_KEY, &setup.shortcut.tape_play, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, + + { 0, NULL, NULL } +}; + +static struct TokenInfo setup_info_shortcuts_4[] = +{ + { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Normal):", }, + { TYPE_KEY, &setup.shortcut.sound_simple, "" }, + { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Looping):", }, + { TYPE_KEY, &setup.shortcut.sound_loops, "" }, + { TYPE_KEYTEXT, NULL, "Toggle Music:", }, + { TYPE_KEY, &setup.shortcut.sound_music, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, + + { 0, NULL, NULL } +}; + +static struct TokenInfo setup_info_shortcuts_5[] = +{ + { TYPE_KEYTEXT, NULL, "Snap Left:", }, + { TYPE_KEY, &setup.shortcut.snap_left, "" }, + { TYPE_KEYTEXT, NULL, "Snap Right:", }, + { TYPE_KEY, &setup.shortcut.snap_right, "" }, + { TYPE_KEYTEXT, NULL, "Snap Up:", }, + { TYPE_KEY, &setup.shortcut.snap_up, "" }, + { TYPE_KEYTEXT, NULL, "Snap Down:", }, + { TYPE_KEY, &setup.shortcut.snap_down, "" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" }, { 0, NULL, NULL } }; @@ -4576,6 +4827,11 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_artwork; title_string = "Custom Artwork"; } + else if (setup_mode == SETUP_MODE_SHORTCUTS) + { + setup_info = setup_info_shortcuts; + title_string = "Setup Shortcuts"; + } else if (setup_mode == SETUP_MODE_SHORTCUTS_1) { setup_info = setup_info_shortcuts_1; @@ -4586,6 +4842,21 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_shortcuts_2; title_string = "Setup Shortcuts"; } + else if (setup_mode == SETUP_MODE_SHORTCUTS_3) + { + setup_info = setup_info_shortcuts_3; + title_string = "Setup Shortcuts"; + } + else if (setup_mode == SETUP_MODE_SHORTCUTS_4) + { + setup_info = setup_info_shortcuts_4; + title_string = "Setup Shortcuts"; + } + else if (setup_mode == SETUP_MODE_SHORTCUTS_5) + { + setup_info = setup_info_shortcuts_5; + title_string = "Setup Shortcuts"; + } DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, title_string); @@ -4883,8 +5154,8 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) ClearRectangleOnBackground(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, TILEX, TILEY); - DrawGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, - PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0); + DrawFixedGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY, + PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0); if (setup.input[player_nr].use_joystick) { @@ -5240,7 +5511,7 @@ static boolean CalibrateJoystickMain(int player_nr) { for (x = 0; x < 3; x++) { - DrawGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0); + DrawFixedGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0); check[x][y] = FALSE; } } @@ -5264,7 +5535,7 @@ static boolean CalibrateJoystickMain(int player_nr) new_joystick_xmiddle = joy_x; new_joystick_ymiddle = joy_y; - DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0); + DrawFixedGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0); FadeIn(REDRAW_FIELD); @@ -5336,8 +5607,10 @@ static boolean CalibrateJoystickMain(int player_nr) if (x != last_x || y != last_y) { - DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_YELLOW, 0); - DrawGraphic(xpos + x, ypos + y, IMG_MENU_CALIBRATE_RED, 0); + DrawFixedGraphic(xpos + last_x, ypos + last_y, + IMG_MENU_CALIBRATE_YELLOW, 0); + DrawFixedGraphic(xpos + x, ypos + y, + IMG_MENU_CALIBRATE_RED, 0); last_x = x; last_y = y; @@ -5584,13 +5857,21 @@ static struct { { IMG_MENU_BUTTON_UP, IMG_MENU_BUTTON_UP_ACTIVE, +#if 1 + -1, -1, /* these values are not constant, but can change at runtime */ +#else SC_SCROLL_UP_XPOS, SC_SCROLL_UP_YPOS, +#endif SCREEN_CTRL_ID_SCROLL_UP, "scroll up" }, { IMG_MENU_BUTTON_DOWN, IMG_MENU_BUTTON_DOWN_ACTIVE, +#if 1 + -1, -1, /* these values are not constant, but can change at runtime */ +#else SC_SCROLL_DOWN_XPOS, SC_SCROLL_DOWN_YPOS, +#endif SCREEN_CTRL_ID_SCROLL_DOWN, "scroll down" } @@ -5616,8 +5897,13 @@ static struct #else IMG_MENU_SCROLLBAR, IMG_MENU_SCROLLBAR_ACTIVE, #endif +#if 1 + -1, -1, /* these values are not constant, but can change at runtime */ + -1, -1, /* these values are not constant, but can change at runtime */ +#else SC_SCROLL_VERTICAL_XPOS, SC_SCROLL_VERTICAL_YPOS, SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE, +#endif GD_TYPE_SCROLLBAR_VERTICAL, SCREEN_CTRL_ID_SCROLL_VERTICAL, "scroll level series vertically" @@ -5627,7 +5913,7 @@ static struct static void CreateScreenMenubuttons() { struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++) @@ -5680,9 +5966,15 @@ static void CreateScreenMenubuttons() static void CreateScreenScrollbuttons() { struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int i; + /* these values are not constant, but can change at runtime */ + scrollbutton_info[0].x = SC_SCROLL_UP_XPOS; + scrollbutton_info[0].y = SC_SCROLL_UP_YPOS; + scrollbutton_info[1].x = SC_SCROLL_DOWN_XPOS; + scrollbutton_info[1].y = SC_SCROLL_DOWN_YPOS; + for (i = 0; i < NUM_SCREEN_SCROLLBUTTONS; i++) { Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed; @@ -5738,6 +6030,12 @@ static void CreateScreenScrollbars() { int i; + /* these values are not constant, but can change at runtime */ + scrollbar_info[0].x = SC_SCROLL_VERTICAL_XPOS; + scrollbar_info[0].y = SC_SCROLL_VERTICAL_YPOS; + scrollbar_info[0].width = SC_SCROLL_VERTICAL_XSIZE; + scrollbar_info[0].height = SC_SCROLL_VERTICAL_YSIZE; + for (i = 0; i < NUM_SCREEN_SCROLLBARS; i++) { Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed; @@ -5748,7 +6046,7 @@ static void CreateScreenScrollbars() int gd_x1, gd_x2, gd_y1, gd_y2; struct GadgetInfo *gi; int items_max, items_visible, item_position; - unsigned long event_mask; + unsigned int event_mask; int num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN; int id = scrollbar_info[i].gadget_id; @@ -5929,21 +6227,27 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) case SCREEN_CTRL_ID_SCROLL_UP: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_DOWN: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + HandleChooseLevelSet(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); break; case SCREEN_CTRL_ID_SCROLL_VERTICAL: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); + HandleChooseLevelSet(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE); break;