X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fscreens.c;h=5e0740b6366566b53340f5d1971412ee717941bf;hp=9562c08cf5c58f9ae14eeb993615fe2442f693d3;hb=39fb4fecfb8d4647d3563bdb18ce0065f6129522;hpb=457abe4e8de9b10096af75c026409ab068570b7f diff --git a/src/screens.c b/src/screens.c index 9562c08c..5e0740b6 100644 --- a/src/screens.c +++ b/src/screens.c @@ -172,18 +172,21 @@ #define SCREEN_CTRL_ID_NEXT_LEVEL 1 #define SCREEN_CTRL_ID_PREV_PLAYER 2 #define SCREEN_CTRL_ID_NEXT_PLAYER 3 -#define SCREEN_CTRL_ID_SCROLL_UP 4 -#define SCREEN_CTRL_ID_SCROLL_DOWN 5 -#define SCREEN_CTRL_ID_SCROLL_VERTICAL 6 +#define SCREEN_CTRL_ID_INSERT_SOLUTION 4 +#define SCREEN_CTRL_ID_PLAY_SOLUTION 5 +#define SCREEN_CTRL_ID_SCROLL_UP 6 +#define SCREEN_CTRL_ID_SCROLL_DOWN 7 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 8 -#define NUM_SCREEN_GADGETS 7 +#define NUM_SCREEN_GADGETS 9 -#define NUM_SCREEN_MENUBUTTONS 4 +#define NUM_SCREEN_MENUBUTTONS 6 #define NUM_SCREEN_SCROLLBUTTONS 2 #define NUM_SCREEN_SCROLLBARS 1 #define SCREEN_MASK_MAIN (1 << 0) -#define SCREEN_MASK_INPUT (1 << 1) +#define SCREEN_MASK_MAIN_HAS_SOLUTION (1 << 1) +#define SCREEN_MASK_INPUT (1 << 2) /* graphic position and size values for buttons and scrollbars */ #define SC_MENUBUTTON_XSIZE TILEX @@ -246,6 +249,8 @@ static void MapScreenMenuGadgets(int); static void MapScreenGadgets(int); static void MapScreenTreeGadgets(TreeInfo *); +static void UpdateScreenMenuGadgets(int, boolean); + static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; static int info_mode = INFO_MODE_MAIN; @@ -749,19 +754,19 @@ static struct MainControlInfo main_controls[] = #endif { MAIN_CONTROL_FIRST_LEVEL, - NULL, -1, + &menu.main.button.first_level, IMG_MENU_BUTTON_FIRST_LEVEL, &menu.main.text.first_level, &main_text_first_level, NULL, NULL, }, { MAIN_CONTROL_LAST_LEVEL, - NULL, -1, + &menu.main.button.last_level, IMG_MENU_BUTTON_LAST_LEVEL, &menu.main.text.last_level, &main_text_last_level, NULL, NULL, }, { MAIN_CONTROL_LEVEL_NUMBER, - NULL, -1, + &menu.main.button.level_number, IMG_MENU_BUTTON_LEVEL_NUMBER, &menu.main.text.level_number, &main_text_level_number, NULL, NULL, }, @@ -1082,7 +1087,7 @@ static boolean visibleTextPos(struct TextPosInfo *pos) static void InitializeMainControls() { - boolean local_team_mode = (!options.network && setup.team_mode); + boolean local_team_mode = (!network.enabled && setup.team_mode); int i; /* set main control text values to dynamically determined values */ @@ -1148,8 +1153,8 @@ static void InitializeMainControls() if (pos_text != NULL) /* (x/y may be -1/-1 here) */ { - /* calculate size for non-clickable text -- needed for text alignment */ - boolean calculate_text_size = (pos_button == NULL && text != NULL); + /* calculate text size -- needed for text alignment */ + boolean calculate_text_size = (text != NULL); if (pos_text->width == -1 || calculate_text_size) pos_text->width = text_width; @@ -1637,6 +1642,7 @@ void DrawMainMenu() DrawCursorAndText_Main(-1, FALSE, FALSE); DrawPreviewLevelInitial(); + DrawNetworkPlayers(); HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE); @@ -1651,9 +1657,14 @@ void DrawMainMenu() FreeScreenGadgets(); CreateScreenGadgets(); + /* may be required if audio buttons shown on tape and changed in setup menu */ + FreeGameButtons(); + CreateGameButtons(); + /* map gadgets for main menu screen */ MapTapeButtons(); MapScreenMenuGadgets(SCREEN_MASK_MAIN); + UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SOLUTION, hasSolutionTape()); /* copy actual game door content to door double buffer for OpenDoor() */ BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); @@ -1925,6 +1936,8 @@ void HandleMainMenu_SelectLevel(int step, int direction, int selected_level_nr) SaveLevelSetup_SeriesInfo(); + UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SOLUTION, hasSolutionTape()); + /* needed because DrawPreviewLevelInitial() takes some time */ BackToFront(); /* SyncDisplay(); */ @@ -2061,7 +2074,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) SetGameStatus(GAME_MODE_SCORES); - DrawHallOfFame(-1); + DrawHallOfFame(level_nr, -1); } else if (pos == MAIN_CONTROL_EDITOR) { @@ -2089,7 +2102,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else if (pos == MAIN_CONTROL_GAME) { - StartGameActions(options.network, setup.autorecord, level.random_seed); + StartGameActions(network.enabled, setup.autorecord, level.random_seed); } else if (pos == MAIN_CONTROL_SETUP) { @@ -2201,6 +2214,7 @@ static int getMenuTextFont(int type) TYPE_YES_NO | TYPE_YES_NO_AUTO | TYPE_STRING | + TYPE_PLAYER | TYPE_ECS_AGA | TYPE_KEYTEXT | TYPE_ENTER_LIST)) @@ -2532,7 +2546,8 @@ void HandleMenuScreen(int mx, int my, int dx, int dy, int button, if (menu_info[choice].type & menu_navigation_type || menu_info[choice].type & TYPE_BOOLEAN_STYLE || - menu_info[choice].type & TYPE_YES_NO_AUTO) + menu_info[choice].type & TYPE_YES_NO_AUTO || + menu_info[choice].type & TYPE_PLAYER) button = MB_MENU_CHOICE; } else if (dy) @@ -3081,7 +3096,12 @@ void HandleInfoScreen_Music(int button) } else { - PlayMusic(list->music); + int music = list->music; + + if (music_info[music].loop) + PlayMusicLoop(music); + else + PlayMusic(music); DrawTextSCentered(ystart, font_title, "The Game Background Music:"); } @@ -4484,7 +4504,7 @@ void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &level_number_current); } -void DrawHallOfFame(int highlight_position) +void DrawHallOfFame(int level_nr, int highlight_position) { int fade_mask = REDRAW_FIELD; @@ -4517,14 +4537,15 @@ void DrawHallOfFame(int highlight_position) OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW); - HandleHallOfFame(highlight_position, 0, 0, 0, MB_MENU_INITIALIZE); + HandleHallOfFame(level_nr, highlight_position, 0, 0, MB_MENU_INITIALIZE); DrawMaskedBorder(fade_mask); FadeIn(fade_mask); } -static void drawHallOfFameList(int first_entry, int highlight_position) +static void drawHallOfFameList(int level_nr, int first_entry, + int highlight_position) { int i, j; @@ -4567,15 +4588,18 @@ static void drawHallOfFameList(int first_entry, int highlight_position) void HandleHallOfFame(int mx, int my, int dx, int dy, int button) { + static int level_nr = 0; static int first_entry = 0; static int highlight_position = 0; int step = (button == 1 ? 1 : button == 2 ? 5 : 10); if (button == MB_MENU_INITIALIZE) { + level_nr = mx; first_entry = 0; - highlight_position = mx; - drawHallOfFameList(first_entry, highlight_position); + highlight_position = my; + + drawHallOfFameList(level_nr, first_entry, highlight_position); return; } @@ -4591,7 +4615,7 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) if (first_entry < 0) first_entry = 0; - drawHallOfFameList(first_entry, highlight_position); + drawHallOfFameList(level_nr, first_entry, highlight_position); } } else if (dy > 0) @@ -4602,28 +4626,27 @@ void HandleHallOfFame(int mx, int my, int dx, int dy, int button) if (first_entry + NUM_MENU_ENTRIES_ON_SCREEN > MAX_SCORE_ENTRIES) first_entry = MAX(0, MAX_SCORE_ENTRIES - NUM_MENU_ENTRIES_ON_SCREEN); - drawHallOfFameList(first_entry, highlight_position); + drawHallOfFameList(level_nr, first_entry, highlight_position); } } - else if (button == MB_MENU_LEAVE) + else if (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE) { PlaySound(SND_MENU_ITEM_SELECTING); FadeSound(SND_BACKGROUND_SCORES); - SetGameStatus(GAME_MODE_MAIN); - - DrawMainMenu(); - } - else if (button == MB_MENU_CHOICE) - { - PlaySound(SND_MENU_ITEM_SELECTING); - - FadeSound(SND_BACKGROUND_SCORES); - - SetGameStatus(GAME_MODE_MAIN); + if (game_status_last_screen == GAME_MODE_PLAYING && + setup.auto_play_next_level && setup.increment_levels && + !network_playing) + { + StartGameActions(network.enabled, setup.autorecord, level.random_seed); + } + else + { + SetGameStatus(GAME_MODE_MAIN); - DrawMainMenu(); + DrawMainMenu(); + } } if (game_status == GAME_MODE_SCORES) @@ -5867,11 +5890,15 @@ static struct TokenInfo setup_info_main[] = static struct TokenInfo setup_info_game[] = { { TYPE_SWITCH, &setup.team_mode, "Team-Mode (Multi-Player):" }, + { TYPE_SWITCH, &setup.network_mode, "Network Multi-Player Mode:" }, + { TYPE_PLAYER, &setup.network_player_nr,"Preferred Network Player:" }, { TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" }, { TYPE_SWITCH, &setup.time_limit, "Time Limit:" }, { TYPE_SWITCH, &setup.handicap, "Handicap:" }, { TYPE_SWITCH, &setup.skip_levels, "Skip Unsolved Levels:" }, { TYPE_SWITCH, &setup.increment_levels,"Increment Solved Levels:" }, + { TYPE_SWITCH, &setup.auto_play_next_level,"Auto-play Next Level:" }, + { TYPE_SWITCH, &setup.skip_scores_after_game,"Skip Scores After Game:" }, { TYPE_SWITCH, &setup.autorecord, "Auto-Record Tapes:" }, { TYPE_ENTER_LIST, execSetupChooseGameSpeed, "Game Speed:" }, { TYPE_STRING, &game_speed_text, "" }, @@ -6234,6 +6261,8 @@ static int getSetupValueFont(int type, void *value) else if (type & TYPE_YES_NO_AUTO) return (*(int *)value == AUTO ? FONT_OPTION_ON : *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON); + else if (type & TYPE_PLAYER) + return FONT_VALUE_1; else return FONT_VALUE_1; } @@ -6289,6 +6318,12 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw) { xpos = menu_screen_value_xpos - 1; } + else if (type & TYPE_PLAYER) + { + int displayed_player_nr = *(int *)value + 1; + + value_string = getSetupValue(TYPE_INTEGER, (void *)&displayed_player_nr); + } startx = mSX + xpos * 32; starty = mSY + ypos * 32; @@ -6359,6 +6394,15 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw) DrawText(startx, starty, value_string, font_nr); + if (type & TYPE_PLAYER) + { + int player_nr = *(int *)value; + int xoff = getFontWidth(font_nr); + + DrawFixedGraphicThruMaskExt(drawto, startx + xoff, starty, + PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0); + } + if (font_draw_xoffset_modified) getFontBitmapInfo(font_nr)->draw_xoffset = font_draw_xoffset_old; } @@ -6393,12 +6437,42 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) if (key != KSYM_UNDEFINED) *(Key *)si->value = key; } + else if (si->type & TYPE_PLAYER) + { + int player_nr = *(int *)si->value; + + if (dx) + player_nr += dx; + else + player_nr = Request("Choose player", REQ_PLAYER) - 1; + + *(int *)si->value = MIN(MAX(0, player_nr), MAX_PLAYERS - 1); + } drawSetupValue(screen_pos, setup_info_pos_raw); // fullscreen state may have changed at this point if (si->value == &setup.fullscreen) ToggleFullscreenOrChangeWindowScalingIfNeeded(); + + if (si->value == &setup.network_mode && + setup.network_mode != network.enabled) + { + network.enabled = setup.network_mode; + + FadeOut(REDRAW_ALL); + + ClearField(); + + FadeIn(REDRAW_ALL); + + if (network.enabled) + InitNetworkServer(); + else + DisconnectFromNetworkServer(); + + DrawSetupScreen(); + } } static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig) @@ -7558,13 +7632,19 @@ boolean ConfigureVirtualButtonsMain() /* press 'Enter' to keep the existing key binding */ if (key == KSYM_Return || +#if defined(TARGET_SDL2) key == KSYM_Menu || +#endif key == KSYM_space) { step_nr++; } - else if (key == KSYM_BackSpace || - key == KSYM_Back) + else if (key == KSYM_BackSpace +#if defined(TARGET_SDL2) + || + key == KSYM_Back +#endif + ) { if (step_nr == 0) { @@ -7904,6 +7984,16 @@ static void getScreenMenuButtonPos(int *x, int *y, int gadget_id) *y = mSY + TILEY * MENU_SCREEN_START_YPOS; break; + case SCREEN_CTRL_ID_INSERT_SOLUTION: + *x = mSX + GDI_ACTIVE_POS(menu.main.button.insert_solution.x); + *y = mSY + GDI_ACTIVE_POS(menu.main.button.insert_solution.y); + break; + + case SCREEN_CTRL_ID_PLAY_SOLUTION: + *x = mSX + GDI_ACTIVE_POS(menu.main.button.play_solution.x); + *y = mSY + GDI_ACTIVE_POS(menu.main.button.play_solution.y); + break; + default: Error(ERR_EXIT, "unknown gadget ID %d", gadget_id); } @@ -7946,6 +8036,20 @@ static struct SCREEN_MASK_INPUT, "next player" }, + { + IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE, + getScreenMenuButtonPos, + SCREEN_CTRL_ID_INSERT_SOLUTION, + SCREEN_MASK_MAIN_HAS_SOLUTION, + "insert solution tape" + }, + { + IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE, + getScreenMenuButtonPos, + SCREEN_CTRL_ID_PLAY_SOLUTION, + SCREEN_MASK_MAIN_HAS_SOLUTION, + "play solution tape" + }, }; static struct @@ -8004,12 +8108,23 @@ static void CreateScreenMenubuttons() int gd_x1, gd_x2, gd_y1, gd_y2; int id = menubutton_info[i].gadget_id; - event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; + if (menubutton_info[i].screen_mask == SCREEN_MASK_MAIN_HAS_SOLUTION) + event_mask = GD_EVENT_RELEASED; + else + event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED; menubutton_info[i].get_gadget_position(&x, &y, id); - width = SC_MENUBUTTON_XSIZE; - height = SC_MENUBUTTON_YSIZE; + if (menubutton_info[i].screen_mask == SCREEN_MASK_MAIN_HAS_SOLUTION) + { + width = graphic_info[menubutton_info[i].gfx_pressed].width; + height = graphic_info[menubutton_info[i].gfx_pressed].height; + } + else + { + width = SC_MENUBUTTON_XSIZE; + height = SC_MENUBUTTON_YSIZE; + } gfx_unpressed = menubutton_info[i].gfx_unpressed; gfx_pressed = menubutton_info[i].gfx_pressed; @@ -8022,6 +8137,7 @@ static void CreateScreenMenubuttons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, + GDI_IMAGE_ID, gfx_unpressed, GDI_INFO_TEXT, menubutton_info[i].infotext, GDI_X, x, GDI_Y, y, @@ -8089,6 +8205,7 @@ static void CreateScreenScrollbuttons() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, + GDI_IMAGE_ID, gfx_unpressed, GDI_INFO_TEXT, scrollbutton_info[i].infotext, GDI_X, x, GDI_Y, y, @@ -8161,6 +8278,7 @@ static void CreateScreenScrollbars() gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_CUSTOM_TYPE_ID, i, + GDI_IMAGE_ID, gfx_unpressed, GDI_INFO_TEXT, scrollbar_info[i].infotext, GDI_X, x, GDI_Y, y, @@ -8215,6 +8333,33 @@ void MapScreenMenuGadgets(int screen_mask) MapGadget(screen_gadget[menubutton_info[i].gadget_id]); } +void UnmapScreenMenuGadgets(int screen_mask) +{ + int i; + + for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++) + { + if (screen_mask & menubutton_info[i].screen_mask) + { + UnmapGadget(screen_gadget[menubutton_info[i].gadget_id]); + + if (screen_mask & SCREEN_MASK_MAIN_HAS_SOLUTION) + DrawBackground(screen_gadget[menubutton_info[i].gadget_id]->x, + screen_gadget[menubutton_info[i].gadget_id]->y, + screen_gadget[menubutton_info[i].gadget_id]->width, + screen_gadget[menubutton_info[i].gadget_id]->height); + } + } +} + +void UpdateScreenMenuGadgets(int screen_mask, boolean map_gadgets) +{ + if (map_gadgets) + MapScreenMenuGadgets(screen_mask); + else + UnmapScreenMenuGadgets(screen_mask); +} + void MapScreenGadgets(int num_entries) { int i; @@ -8238,7 +8383,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) { int id = gi->custom_id; int button = gi->event.button; - int step = (button == 1 ? 1 : button == 2 ? 5 : 10); + int step = (button == MB_LEFTBUTTON ? 1 : + button == MB_MIDDLEBUTTON ? 5 : + button == MB_RIGHTBUTTON ? 10 : 1); switch (id) { @@ -8258,6 +8405,14 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) HandleSetupScreen_Input_Player(step, +1); break; + case SCREEN_CTRL_ID_INSERT_SOLUTION: + InsertSolutionTape(); + break; + + case SCREEN_CTRL_ID_PLAY_SOLUTION: + PlaySolutionTape(); + break; + case SCREEN_CTRL_ID_SCROLL_UP: if (game_status == GAME_MODE_LEVELS) HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); @@ -8295,3 +8450,50 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) break; } } + +void DumpScreenIdentifiers() +{ + int i; + + Print("Active screen elements on current screen:\n"); + + for (i = 0; main_controls[i].nr != -1; i++) + { + struct MainControlInfo *mci = &main_controls[i]; + + if (mci->button_graphic != -1) + { + char *token = getTokenFromImageID(mci->button_graphic); + + Print("- '%s'\n", token); + } + } + + Print("Done.\n"); +} + +boolean DoScreenAction(int image_id) +{ + int i; + + if (game_status != GAME_MODE_MAIN) + return FALSE; + + for (i = 0; main_controls[i].nr != -1; i++) + { + struct MainControlInfo *mci = &main_controls[i]; + struct MenuPosInfo *pos = mci->pos_button; + + if (mci->button_graphic == image_id) + { + int x = mSX + pos->x; + int y = mSY + pos->y; + + HandleMainMenu(x, y, 0, 0, MB_MENU_CHOICE); + + return TRUE; + } + } + + return FALSE; +}