X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=24d440c7bb71e9c724be6a7282c61d8bb2a9711e;hb=7883c95567d936c3c43253a8d8ce7acc8f39ae4f;hp=01b8031bf94a452bfb95135a732dab3d5236609d;hpb=b641818c787e48bbf03ce2a0cd5b542c4c21e523;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 01b8031b..24d440c7 100644 --- a/src/screens.c +++ b/src/screens.c @@ -248,10 +248,12 @@ static void execSetupTouch(void); static void execSetupArtwork(void); static void HandleChooseTree(int, int, int, int, int, TreeInfo **); +static void DrawChoosePlayerName(void); static void DrawChooseLevelSet(void); static void DrawChooseLevelNr(void); static void DrawInfoScreen(void); static void DrawSetupScreen(void); +static void DrawTypeName(void); static void DrawInfoScreen_NotAvailable(char *, char *); static void DrawInfoScreen_HelpAnim(int, int, boolean); @@ -326,6 +328,9 @@ static TreeInfo *transparency_current = NULL; static TreeInfo *grid_sizes[2][2] = { { NULL, NULL }, { NULL, NULL } }; static TreeInfo *grid_size_current[2][2] = { { NULL, NULL }, { NULL, NULL } }; +static TreeInfo *player_name = NULL; +static TreeInfo *player_name_current = NULL; + static TreeInfo *level_number = NULL; static TreeInfo *level_number_current = NULL; @@ -540,7 +545,9 @@ static int align_yoffset = 0; #define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \ (s) <= GAME_MODE_SETUP ? (s) : \ (s) == GAME_MODE_PSEUDO_TYPENAME ? \ - GAME_MODE_MAIN : GAME_MODE_DEFAULT) + GAME_MODE_MAIN : \ + (s) == GAME_MODE_PSEUDO_TYPENAMES ? \ + GAME_MODE_NAMES : GAME_MODE_DEFAULT) // (there are no draw offset definitions needed for INFO_MODE_TITLE) #define DRAW_MODE_INFO(i) ((i) >= INFO_MODE_TITLE && \ @@ -680,6 +687,8 @@ static char *main_text_title_1 = NULL; static char *main_text_title_2 = NULL; static char *main_text_title_3 = NULL; +extern char debug_xsn_mode[]; + struct MainControlInfo { int nr; @@ -928,10 +937,10 @@ static int getTitleSound(struct TitleControlInfo *tci) int sound_local = base + nr; #if 0 - printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n", - nr, initial, is_image, - sound_global, getSoundListEntry(sound_global)->filename, - sound_local, getSoundListEntry(sound_local)->filename); + Debug("screens:getTitleSound", "%d, %d, %d: %d ['%s'], %d ['%s']", + nr, initial, is_image, + sound_global, getSoundListEntry(sound_global)->filename, + sound_local, getSoundListEntry(sound_local)->filename); #endif if (!strEqual(getSoundListEntry(sound_local)->filename, UNDEFINED_FILENAME)) @@ -958,10 +967,10 @@ static int getTitleMusic(struct TitleControlInfo *tci) int music_local = base + nr; #if 0 - printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n", - nr, initial, is_image, - music_global, getMusicListEntry(music_global)->filename, - music_local, getMusicListEntry(music_local)->filename); + Debug("screens:getTitleMusic", "%d, %d, %d: %d ['%s'], %d ['%s']", + nr, initial, is_image, + music_global, getMusicListEntry(music_global)->filename, + music_local, getMusicListEntry(music_local)->filename); #endif if (!strEqual(getMusicListEntry(music_local)->filename, UNDEFINED_FILENAME)) @@ -1326,10 +1335,11 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y) 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)); + Debug("screens:insideTextPosRect", + "(%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d", + 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 && @@ -1580,10 +1590,6 @@ void DrawMainMenu(void) return; } - // needed if last screen was the setup screen and fullscreen state changed - // (moved to "execSetupGraphics()" to change fullscreen state directly) - // ToggleFullscreenOrChangeWindowScalingIfNeeded(); - // leveldir_current may be invalid (level group, parent link) if (!validLevelSeries(leveldir_current)) leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid); @@ -2079,9 +2085,20 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } else { - SetGameStatus(GAME_MODE_PSEUDO_TYPENAME); + if (0 && setup.multiple_users) // (not used yet) + { + CloseDoor(DOOR_CLOSE_2); + + SetGameStatus(GAME_MODE_NAMES); + + DrawChoosePlayerName(); + } + else + { + SetGameStatus(GAME_MODE_PSEUDO_TYPENAME); - HandleTypeName(strlen(setup.player_name), 0); + DrawTypeName(); + } } } else if (pos == MAIN_CONTROL_LEVELS) @@ -3695,6 +3712,10 @@ static void DrawInfoScreen_Version(void) DrawTextF(xstart1, ystart, font_head, "Source date"); DrawTextF(xstart2, ystart, font_text, getSourceDateString()); + ystart += ystep_line; + + DrawTextF(xstart1, ystart, font_head, "Commit hash"); + DrawTextF(xstart2, ystart, font_text, getSourceHashString()); ystart += ystep_para; DrawTextF(xstart1, ystart, font_head, "Library"); @@ -3768,7 +3789,7 @@ static void DrawInfoScreen_Version(void) getStringCopyNStatic(SDLGetRendererName(), driver_name_len); DrawTextF(xstart1, ystart, font_text, "Render Driver"); - DrawTextF(xstart2, ystart, font_text, "%s", ARG_DEFAULT); + DrawTextF(xstart2, ystart, font_text, "%s", setup.system.sdl_renderdriver); DrawTextF(xstart3, ystart, font_text, "%s", driver_name); ystart += ystep_line; @@ -3957,13 +3978,14 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button) // type name functions // ============================================================================ -void HandleTypeName(int newxpos, Key key) +static void HandleTypeNameExt(boolean initialize, Key key) { + static char name[MAX_PLAYER_NAME_LEN + 1]; static char last_player_name[MAX_PLAYER_NAME_LEN + 1]; struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME); struct TextPosInfo *pos = mci->pos_input; - int startx = mSX + ALIGNED_TEXT_XPOS(pos); - int starty = mSY + ALIGNED_TEXT_YPOS(pos); + int sx = mSX + ALIGNED_TEXT_XPOS(pos); + int sy = mSY + ALIGNED_TEXT_YPOS(pos); static int xpos = 0; int font_nr = pos->font; int font_active_nr = FONT_ACTIVE(font_nr); @@ -3972,20 +3994,21 @@ void HandleTypeName(int newxpos, Key key) boolean is_valid_key_char = (key_char != 0 && (key_char != ' ' || xpos > 0)); boolean is_active = TRUE; - DrawBackgroundForFont(startx,starty, pos->width, pos->height, font_active_nr); + DrawBackgroundForFont(sx, sy, pos->width, pos->height, font_active_nr); - if (newxpos) + if (initialize) { - strcpy(last_player_name, setup.player_name); + strcpy(name, setup.player_name); + strcpy(last_player_name, name); - xpos = newxpos; + xpos = strlen(name); - StartTextInput(startx, starty, pos->width, pos->height); + StartTextInput(sx, sy, pos->width, pos->height); } else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN) { - setup.player_name[xpos] = key_char; - setup.player_name[xpos + 1] = 0; + name[xpos] = key_char; + name[xpos + 1] = 0; xpos++; } @@ -3993,44 +4016,54 @@ void HandleTypeName(int newxpos, Key key) { xpos--; - setup.player_name[xpos] = 0; + name[xpos] = 0; } else if (key == KSYM_Return && xpos > 0) { + strcpy(setup.player_name, name); + SaveSetup(); is_active = FALSE; - - SetGameStatus(GAME_MODE_MAIN); } else if (key == KSYM_Escape) { - strcpy(setup.player_name, last_player_name); + strcpy(name, last_player_name); is_active = FALSE; - - SetGameStatus(GAME_MODE_MAIN); } if (is_active) { - pos->width = (strlen(setup.player_name) + 1) * font_width; - startx = mSX + ALIGNED_TEXT_XPOS(pos); + pos->width = (strlen(name) + 1) * font_width; + sx = mSX + ALIGNED_TEXT_XPOS(pos); - DrawText(startx, starty, setup.player_name, font_active_nr); - DrawText(startx + xpos * font_width, starty, "_", font_active_nr); + DrawText(sx, sy, name, font_active_nr); + DrawText(sx + xpos * font_width, sy, "_", font_active_nr); } else { - pos->width = strlen(setup.player_name) * font_width; - startx = mSX + ALIGNED_TEXT_XPOS(pos); + SetGameStatus(GAME_MODE_MAIN); - DrawText(startx, starty, setup.player_name, font_nr); + pos->width = strlen(name) * font_width; + sx = mSX + ALIGNED_TEXT_XPOS(pos); + + DrawText(sx, sy, name, font_nr); StopTextInput(); } } +static void DrawTypeName(void) +{ + HandleTypeNameExt(TRUE, 0); +} + +void HandleTypeName(Key key) +{ + HandleTypeNameExt(FALSE, key); +} + // ============================================================================ // tree menu functions @@ -4107,7 +4140,9 @@ static void DrawChooseTree(TreeInfo **ti_ptr) // needed if different viewport properties defined for choosing level (set) ChangeViewportPropertiesIfNeeded(); - if (game_status == GAME_MODE_LEVELNR) + if (game_status == GAME_MODE_NAMES) + SetMainBackgroundImage(IMG_BACKGROUND_NAMES); + else if (game_status == GAME_MODE_LEVELNR) SetMainBackgroundImage(IMG_BACKGROUND_LEVELNR); else if (game_status == GAME_MODE_LEVELS) SetMainBackgroundImage(IMG_BACKGROUND_LEVELS); @@ -4549,6 +4584,65 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } } +void DrawChoosePlayerName(void) +{ + int i; + + FadeMenuSoundsAndMusic(); + + if (player_name != NULL) + { + freeTreeInfo(player_name); + + player_name = NULL; + } + + for (i = 0; i < MAX_PLAYER_NAMES; i++) + { + boolean team_mode = (!network.enabled && setup.team_mode); + int tree_type = (team_mode ? TREE_TYPE_PLAYER_TEAM : TREE_TYPE_PLAYER_NAME); + TreeInfo *ti = newTreeInfo_setDefaults(tree_type); + char identifier[32], name[MAX_PLAYER_NAME_LEN + 1]; + int value = i; + + ti->node_top = &player_name; + ti->sort_priority = 10000 + value; + ti->color = FC_RED; + + if (strEqual(global.user_names[i], EMPTY_PLAYER_NAME)) + ti->color = FC_BLUE; + + snprintf(identifier, sizeof(identifier), "%d", value); + snprintf(name, sizeof(name), "%s", global.user_names[i]); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + + pushTreeInfo(&player_name, ti); + } + + // sort player entries by player number + sortTreeInfo(&player_name); + + // set current player entry to selected player entry + player_name_current = + getTreeInfoFromIdentifier(player_name, i_to_a(user.nr)); + + // if that fails, set current player name to first available name + if (player_name_current == NULL) + player_name_current = player_name; + + DrawChooseTree(&player_name_current); + + PlayMenuSoundsAndMusic(); +} + +void HandleChoosePlayerName(int mx, int my, int dx, int dy, int button) +{ + HandleChooseTree(mx, my, dx, dy, button, &player_name_current); +} + void DrawChooseLevelSet(void) { FadeMenuSoundsAndMusic(); @@ -5302,13 +5396,21 @@ static void execSetupGraphics(void) if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE) execSetupGraphics_setWindowSizes(FALSE); + // update "setup.vsync_mode" from list selection + // (in this case, vsync mode was changed on setup screen) + if (setup_mode == SETUP_MODE_CHOOSE_VSYNC) + execSetupGraphics_setVsyncModes(FALSE); + // update list selection from "setup.window_scaling_percent" // (window scaling may have changed by resizing the window) execSetupGraphics_setWindowSizes(TRUE); + // update list selection from "setup.vsync_mode" + // (vsync_mode may have changed by re-creating the renderer) + execSetupGraphics_setVsyncModes(TRUE); + execSetupGraphics_setScalingTypes(); execSetupGraphics_setRenderingModes(); - execSetupGraphics_setVsyncModes(FALSE); setup_mode = SETUP_MODE_GRAPHICS; @@ -5319,7 +5421,7 @@ static void execSetupGraphics(void) ModifyGameSpeedIfNeeded(); // window scaling may have changed at this point - ToggleFullscreenOrChangeWindowScalingIfNeeded(); + ChangeWindowScalingIfNeeded(); // window scaling quality may have changed at this point if (!strEqual(setup.window_scaling_quality, video.window_scaling_quality)) @@ -5328,8 +5430,23 @@ static void execSetupGraphics(void) // screen rendering mode may have changed at this point SDLSetScreenRenderingMode(setup.screen_rendering_mode); + int setup_vsync_mode = VSYNC_MODE_STR_TO_INT(setup.vsync_mode); + int video_vsync_mode = video.vsync_mode; + // screen vsync mode may have changed at this point - SDLSetScreenVsyncMode(setup.vsync_mode); + ChangeVsyncModeIfNeeded(); + + // check if setting vsync mode to selected value failed + if (setup_vsync_mode != video_vsync_mode && + setup_vsync_mode != video.vsync_mode) + { + // changing vsync mode to selected value failed -- reset displayed value + execSetupGraphics_setVsyncModes(TRUE); + + Request("Setting VSync failed!", REQ_CONFIRM); + + DrawSetupScreen(); + } } static void execSetupChooseWindowSize(void) @@ -5932,10 +6049,10 @@ static void execSetupTouch(void) static void execSetupArtwork(void) { #if 0 - printf("::: '%s', '%s', '%s'\n", - artwork.gfx_current->subdir, - artwork.gfx_current->fullpath, - artwork.gfx_current->basepath); + Debug("screens:execSetupArtwork", "'%s', '%s', '%s'", + artwork.gfx_current->subdir, + artwork.gfx_current->fullpath, + artwork.gfx_current->basepath); #endif setup.graphics_set = artwork.gfx_current->identifier; @@ -6270,6 +6387,7 @@ static struct TokenInfo setup_info_game[] = { TYPE_PLAYER, &setup.network_player_nr,"Preferred Network Player:" }, { TYPE_TEXT_INPUT, execGadgetNetworkServer, "Network Server Hostname:" }, { TYPE_STRING, &network_server_text, "" }, + { TYPE_SWITCH, &setup.multiple_users, "Multiple Users/Teams:" }, { TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" }, { TYPE_SWITCH, &setup.time_limit, "Time Limit:" }, { TYPE_SWITCH, &setup.handicap, "Handicap:" }, @@ -6367,6 +6485,7 @@ static struct TokenInfo setup_info_graphics[] = { TYPE_SWITCH, &setup.show_titlescreen,"Show Title Screens:" }, { TYPE_SWITCH, &setup.toons, "Show Menu Animations:" }, { TYPE_SWITCH, &setup.small_game_graphics, "Small Game Graphics:" }, + { TYPE_YES_NO_AUTO, &setup.debug.xsn_mode, debug_xsn_mode }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -6737,6 +6856,10 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw) if (startx + font_xoffset < text_startx + text_width + text_font_xoffset) { + // when using narrow font, left-shifting text "auto" not needed + if (type & TYPE_YES_NO_AUTO) + xpos += 1; + xpos += 1; startx = mSX + xpos * 32; @@ -6853,7 +6976,7 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) // fullscreen state may have changed at this point if (si->value == &setup.fullscreen) - ToggleFullscreenOrChangeWindowScalingIfNeeded(); + ToggleFullscreenIfNeeded(); // network mode may have changed at this point if (si->value == &setup.network_mode) @@ -7523,7 +7646,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) Event event; int alpha = 200, alpha_step = -1; int alpha_ticks = 0; - char mapping[4096], temp[4096]; + char mapping[4096], temp[256]; int font_name = MENU_SETUP_FONT_TITLE; int font_info = MENU_SETUP_FONT_TEXT; int spacing_name = menu.line_spacing_setup[SETUP_MODE_INPUT]; @@ -7586,9 +7709,9 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) #if DEBUG_JOYSTICKS // print info about the joystick we are watching - Error(ERR_DEBUG, "watching joystick %d: (%s)\n", + Debug("joystick", "watching joystick %d: (%s)", SDL_JoystickInstanceID(joystick), name); - Error(ERR_DEBUG, "joystick has %d axes, %d hats, %d balls, and %d buttons\n", + Debug("joystick", "joystick has %d axes, %d hats, %d balls, and %d buttons", SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick), SDL_JoystickNumBalls(joystick), SDL_JoystickNumButtons(joystick)); #endif @@ -7845,7 +7968,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) if (success) { #if DEBUG_JOYSTICKS - Error(ERR_DEBUG, "New game controller mapping:\n\n%s\n\n", mapping); + Debug("joystick", "New game controller mapping:\n\n%s\n\n", mapping); #endif // activate mapping for this game @@ -8420,7 +8543,7 @@ void HandleGameActions(void) GameActions(); // main game loop if (tape.auto_play && !tape.playing) - AutoPlayTape(); // continue automatically playing next tape + AutoPlayTapes(); // continue automatically playing next tape } @@ -8694,7 +8817,7 @@ static void CreateScreenMenubuttons(void) GDI_END); if (gi == NULL) - Error(ERR_EXIT, "cannot create gadget"); + Fail("cannot create gadget"); screen_gadget[id] = gi; } @@ -8762,7 +8885,7 @@ static void CreateScreenScrollbuttons(void) GDI_END); if (gi == NULL) - Error(ERR_EXIT, "cannot create gadget"); + Fail("cannot create gadget"); screen_gadget[id] = gi; } @@ -8843,7 +8966,7 @@ static void CreateScreenScrollbars(void) GDI_END); if (gi == NULL) - Error(ERR_EXIT, "cannot create gadget"); + Fail("cannot create gadget"); screen_gadget[id] = gi; } @@ -8889,7 +9012,7 @@ static void CreateScreenTextInputGadgets(void) GDI_END); if (gi == NULL) - Error(ERR_EXIT, "cannot create gadget"); + Fail("cannot create gadget"); screen_gadget[id] = gi; } @@ -9029,7 +9152,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) break; case SCREEN_CTRL_ID_SCROLL_UP: - if (game_status == GAME_MODE_LEVELS) + if (game_status == GAME_MODE_NAMES) + HandleChoosePlayerName(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELS) 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); @@ -9040,7 +9165,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) break; case SCREEN_CTRL_ID_SCROLL_DOWN: - if (game_status == GAME_MODE_LEVELS) + if (game_status == GAME_MODE_NAMES) + HandleChoosePlayerName(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELS) 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); @@ -9051,7 +9178,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi) break; case SCREEN_CTRL_ID_SCROLL_VERTICAL: - if (game_status == GAME_MODE_LEVELS) + if (game_status == GAME_MODE_NAMES) + HandleChoosePlayerName(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE); + else if (game_status == GAME_MODE_LEVELS) 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);