From 4c1eaa407e7d18ecab485b8049beed73617cf5c3 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 21 Jan 2020 07:12:48 +0100 Subject: [PATCH 1/8] Keyboard shortcut to show the highscores of the selected song CTRL+H will show the highscores of the selected song. --- Vocaluxe/Screens/CScreenSong.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index cf0e1183..8fc5e986 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -99,6 +99,18 @@ namespace Vocaluxe.Screens private ISongMenu _SongMenu; private CPlaylist _Playlist; + private static int _StaticSelectedSongID; + + private static void setStaticSelectedSongID(int songID) + { + _StaticSelectedSongID = songID; + } + + public static int getSelectedSongID() + { + return _StaticSelectedSongID; + } + public override EMusicType CurrentMusicType { get { return CSongs.IsInCategory ? EMusicType.Preview : EMusicType.Background; } @@ -303,6 +315,14 @@ namespace Vocaluxe.Screens if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode) _StartMedleySong(_SongMenu.GetPreviewSongNr()); break; + + case Keys.H: + if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode) + { + CScreenSong.setStaticSelectedSongID(_SongMenu.GetPreviewSongNr()); + CBase.Graphics.FadeTo(EScreen.Highscore); + } + break; } if (!_SearchActive) { From 72d279e5257f35b48c36641382fba50bf82800a3 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 21 Jan 2020 07:16:30 +0100 Subject: [PATCH 2/8] Added possibility to open highscores from song screen If opened from song screen, you can use the Arrow Left/Right keys to switch between the game modes Normal, Short, Medley and Duet. --- Vocaluxe/Screens/CScreenHighscore.cs | 66 ++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs index 0e6a746f..5e39e45d 100644 --- a/Vocaluxe/Screens/CScreenHighscore.cs +++ b/Vocaluxe/Screens/CScreenHighscore.cs @@ -49,6 +49,7 @@ namespace Vocaluxe.Screens private int _Round; private int _Pos; private bool _IsDuet; + private bool _FromScreenSong = false; public override EMusicType CurrentMusicType { @@ -113,11 +114,13 @@ namespace Vocaluxe.Screens break; case Keys.Down: - _ChangePos(1); + if (!_FromScreenSong) + _ChangePos(1); break; case Keys.Up: - _ChangePos(-1); + if (!_FromScreenSong) + _ChangePos(-1); break; case Keys.Left: @@ -234,13 +237,31 @@ namespace Vocaluxe.Screens { _Pos = 0; int rounds = CGame.NumRounds; - _Scores = new List[rounds]; - for (int round = 0; round < rounds; round++) + + if (rounds == 0) { - int songID = CGame.GetSong(round).ID; - EGameMode gameMode = CGame.GetGameMode(round); + _FromScreenSong = true; + _Round = (int)EGameMode.TR_GAMEMODE_NORMAL; + _Scores = new List[4]; + int songID = CSongs.VisibleSongs[CScreenSong.getSelectedSongID()].ID; EHighscoreStyle style = CBase.Config.GetHighscoreStyle(); - _Scores[round] = CDataBase.LoadScore(songID, gameMode, style); + + for (int gameModeNum = 0; gameModeNum < 4; gameModeNum++) + { + _Scores[gameModeNum] = CDataBase.LoadScore(songID, (EGameMode)gameModeNum, style); + } + } + else + { + _FromScreenSong = false; + _Scores = new List[rounds]; + for (int round = 0; round < rounds; round++) + { + int songID = CGame.GetSong(round).ID; + EGameMode gameMode = CGame.GetGameMode(round); + EHighscoreStyle style = CBase.Config.GetHighscoreStyle(); + _Scores[round] = CDataBase.LoadScore(songID, gameMode, style); + } } } @@ -248,15 +269,21 @@ namespace Vocaluxe.Screens { _IsDuet = false; CPoints points = CGame.GetPoints(); - CSong song = CGame.GetSong(_Round); + + CSong song; + if (_FromScreenSong) + song = CSongs.GetSong(CSongs.VisibleSongs[CScreenSong.getSelectedSongID()].ID); + else + song = CGame.GetSong(_Round); + if (song == null) return; _Texts[_TextSongName].Text = song.Artist + " - " + song.Title; - if (points.NumRounds > 1) + if (points != null && points.NumRounds > 1) _Texts[_TextSongName].Text += " (" + (_Round + 1) + "/" + points.NumRounds + ")"; - switch (CGame.GetGameMode(_Round)) + switch ((_FromScreenSong ? (EGameMode)_Round : CGame.GetGameMode(_Round))) { case EGameMode.TR_GAMEMODE_NORMAL: _Texts[_TextSongMode].Text = "TR_GAMEMODE_NORMAL"; @@ -296,9 +323,20 @@ namespace Vocaluxe.Screens private void _ChangeRound(int num) { - CPoints points = CGame.GetPoints(); - _Round += num; - _Round = _Round.Clamp(0, points.NumRounds - 1); + if (_FromScreenSong) + { + if (_Round == (int)EGameMode.TR_GAMEMODE_SHORTSONG) + _Round = (int)EGameMode.TR_GAMEMODE_NORMAL; + else + ++_Round; + } + else + { + CPoints points = CGame.GetPoints(); + _Round += num; + _Round = _Round.Clamp(0, points.NumRounds - 1); + } + _UpdateRound(); } @@ -307,4 +345,4 @@ namespace Vocaluxe.Screens CParty.LeavingHighscore(); } } -} \ No newline at end of file +} From 761d25d68209cfe1e6522765ea32b31cfaa59ee2 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 08:22:32 +0100 Subject: [PATCH 3/8] Fixed song name / updates to changes in CScreenSong.cs Fixed song name if Highscore was opened from song screen, but multiple rounds was played before. Two further updates to the changes made to CScreenSong.cs. --- Vocaluxe/Screens/CScreenHighscore.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs index 5e39e45d..2b838de9 100644 --- a/Vocaluxe/Screens/CScreenHighscore.cs +++ b/Vocaluxe/Screens/CScreenHighscore.cs @@ -243,7 +243,7 @@ namespace Vocaluxe.Screens _FromScreenSong = true; _Round = (int)EGameMode.TR_GAMEMODE_NORMAL; _Scores = new List[4]; - int songID = CSongs.VisibleSongs[CScreenSong.getSelectedSongID()].ID; + int songID = CScreenSong.getSelectedSongID(); EHighscoreStyle style = CBase.Config.GetHighscoreStyle(); for (int gameModeNum = 0; gameModeNum < 4; gameModeNum++) @@ -272,7 +272,7 @@ namespace Vocaluxe.Screens CSong song; if (_FromScreenSong) - song = CSongs.GetSong(CSongs.VisibleSongs[CScreenSong.getSelectedSongID()].ID); + song = CSongs.GetSong(CScreenSong.getSelectedSongID()); else song = CGame.GetSong(_Round); @@ -280,7 +280,7 @@ namespace Vocaluxe.Screens return; _Texts[_TextSongName].Text = song.Artist + " - " + song.Title; - if (points != null && points.NumRounds > 1) + if (points != null && !_FromScreenSong && points.NumRounds > 1) _Texts[_TextSongName].Text += " (" + (_Round + 1) + "/" + points.NumRounds + ")"; switch ((_FromScreenSong ? (EGameMode)_Round : CGame.GetGameMode(_Round))) From 46351eb2078588e99b3d6c6a63b4ae6e602c1ba8 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 08:27:44 +0100 Subject: [PATCH 4/8] Added Highscore button / fixed Highscore if come back from names screen --- Vocaluxe/Screens/CScreenSong.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index 8fc5e986..0982a958 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -42,7 +42,7 @@ namespace Vocaluxe.Screens // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 7; } + get { return 8; } } private const string _TextCategory = "TextCategory"; @@ -66,6 +66,7 @@ namespace Vocaluxe.Screens private const string _ButtonOptionsRandomMedley = "ButtonOptionsRandomMedley"; private const string _ButtonOptionsStartMedley = "ButtonOptionsStartMedley"; private const string _ButtonStart = "ButtonStart"; + private const string _ButtonOptionsHighscore = "ButtonOptionsHighscore"; private const string _SelectSlideOptionsMode = "SelectSlideOptionsMode"; private const string _SelectSlideOptionsPlaylistAdd = "SelectSlideOptionsPlaylistAdd"; @@ -142,6 +143,7 @@ namespace Vocaluxe.Screens blist.Add(_ButtonStart); blist.Add(_ButtonOptionsRandomMedley); blist.Add(_ButtonOptionsStartMedley); + blist.Add(_ButtonOptionsHighscore); _TextsPlayer.Clear(); for (int i = 0; i < CSettings.MaxNumPlayer; i++) @@ -319,8 +321,7 @@ namespace Vocaluxe.Screens case Keys.H: if (keyEvent.Mod == EModifier.Ctrl && CSongs.NumSongsVisible > 0 && !_Sso.Selection.PartyMode) { - CScreenSong.setStaticSelectedSongID(_SongMenu.GetPreviewSongNr()); - CBase.Graphics.FadeTo(EScreen.Highscore); + _ShowHighscore(); } break; } @@ -420,6 +421,10 @@ namespace Vocaluxe.Screens _ToggleSongOptions(ESongOptionsView.None); _StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory); } + else if (_Buttons[_ButtonOptionsHighscore].Selected) + { + _ShowHighscore(); + } break; case Keys.Escape: @@ -595,6 +600,10 @@ namespace Vocaluxe.Screens _StartRandomMedley(_SelectSlides[_SelectSlideOptionsNumMedleySongs].Selection + 1, !CSongs.IsInCategory); return true; } + else if (_Buttons[_ButtonOptionsHighscore].Selected) + { + _ShowHighscore(); + } else if (_Sso.Selection.RandomOnly && _Sso.Selection.NumJokers != null) { if (_Buttons[_ButtonStart].Selected) @@ -884,6 +893,13 @@ namespace Vocaluxe.Screens } } + private void _ShowHighscore() + { + CGame.ClearSongs(); + CScreenSong.setStaticSelectedSongID(CSongs.VisibleSongs[_SongMenu.GetPreviewSongNr()].ID); + CBase.Graphics.FadeTo(EScreen.Highscore); + } + private void _StartSong(int songNr) { if (CSongs.IsInCategory && (songNr >= 0)) @@ -1205,6 +1221,7 @@ namespace Vocaluxe.Screens _Buttons[_ButtonOptionsOpenSelectedItem].Visible = false; _Buttons[_ButtonOptionsRandomMedley].Visible = false; _Buttons[_ButtonOptionsStartMedley].Visible = false; + _Buttons[_ButtonOptionsHighscore].Visible = false; _Texts[_TextOptionsTitle].Visible = false; _Statics[_StaticOptionsBG].Visible = false; _Buttons[_ButtonOpenOptions].Visible = true; @@ -1261,6 +1278,7 @@ namespace Vocaluxe.Screens _SelectSlides[_SelectSlideOptionsPlaylistAdd].Visible = true; _Buttons[_ButtonOptionsSing].Visible = true; _Buttons[_ButtonOptionsPlaylist].Visible = true; + _Buttons[_ButtonOptionsHighscore].Visible = true; _SelectElement(_Buttons[_ButtonOptionsSing]); _SetSelectSlidePlaylistToCurrentPlaylist(); } From 1ddcf765f335ab713643f45a12d67a2117e2daf4 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 08:33:11 +0100 Subject: [PATCH 5/8] Change: Only touch the preview player if necessary Complete change of LoadPreview() to prevent touching the preview player, if we don't want to change anything. Maybe this change break something, but after 2 hours of testing with different settings, everything seems to work here. --- Vocaluxe/Base/CBackgroundMusic.cs | 61 ++++++++++--------------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/Vocaluxe/Base/CBackgroundMusic.cs b/Vocaluxe/Base/CBackgroundMusic.cs index 5050b408..44295ce2 100644 --- a/Vocaluxe/Base/CBackgroundMusic.cs +++ b/Vocaluxe/Base/CBackgroundMusic.cs @@ -316,56 +316,33 @@ namespace Vocaluxe.Base CSound.SetGlobalVolume(CConfig.PreviewMusicVolume); } + //Change song position only if song is changed or near to end bool songChanged = _CurPlayer.SongID != song.ID; + if (!songChanged && _CurPlayer.Position + 30 < _CurPlayer.Length) + return; _PreviewPlayer.Load(song); - - //Change song position only if song is changed or near to end - if (songChanged || _CurPlayer.Position + 30 < _CurPlayer.Length || _PreviewStartHelperTask == null) + lock (_PreviewStartHelperTaskLock) { - lock (_PreviewStartHelperTaskLock) + _PreviewStartHelperTask = new Task(() => { - _PreviewStartHelperTask = new Task(() => - { - float length = _PreviewPlayer.Length; - if (length < 1) - length = 30; // If length is unknow or invalid assume a length of 30s + float length = _PreviewPlayer.Length; + if (length < 1) + length = 30; // If length is unknow or invalid assume a length of 30s - if (start < 0) - start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime; - if (start > length - 5f) - start = Math.Max(0f, Math.Min(length / 4f, length - 5f)); - if (start >= 0.5f) - start -= 0.5f; + if (start < 0) + start = (song.Preview.Source == EDataSource.None) ? length / 4f : song.Preview.StartTime; + if (start > length - 5f) + start = Math.Max(0f, Math.Min(length / 4f, length - 5f)); + if (start >= 0.5f) + start -= 0.5f; - _PreviewPlayer.Position = start; - Play(); - }); - } - _CurPlayer = _PreviewPlayer; + _PreviewPlayer.Position = start; + Play(); + }); } - else - { - if (_PreviewStartHelperTask != null) - { - lock (_PreviewStartHelperTaskLock) - { - // Recheck the condition as it cloud have change before we got the lock - if (_PreviewStartHelperTask != null) - { - _PreviewStartHelperTask = null; - } - } - } - _PreviewPlayer.Position = _CurPlayer.Position; - _CurPlayer = _PreviewPlayer; - Play(); - } - - - - + _CurPlayer = _PreviewPlayer; } public static void StopPreview() @@ -460,4 +437,4 @@ namespace Vocaluxe.Base return _BGMusicFiles.Contains(element); } } -} \ No newline at end of file +} From b4d2176600c78a528ca44f207c3117cb6f37dc03 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 08:35:04 +0100 Subject: [PATCH 6/8] Prevent short music break while loading the Highscore --- VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs index 1a173393..f02a7e44 100644 --- a/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs +++ b/VocaluxeLib/Menu/SongMenu/CSongMenuFramework.cs @@ -220,7 +220,7 @@ namespace VocaluxeLib.Menu.SongMenu EScreen check = CBase.Graphics.GetNextScreenType(); if (CBase.Graphics.GetNextScreenType() == EScreen.Sing) _ResetPreview(false); - else if (CBase.Graphics.GetNextScreenType() != EScreen.Names || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF) + else if ((CBase.Graphics.GetNextScreenType() != EScreen.Names && CBase.Graphics.GetNextScreenType() != EScreen.Highscore) || CBase.Config.GetBackgroundMusicStatus() == EBackgroundMusicOffOn.TR_CONFIG_OFF) _ResetPreview(); } From 6dae65daad40c4590546365089dfd7a18da84cf1 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 08:38:40 +0100 Subject: [PATCH 7/8] Added Highscore button --- Output/Themes/Genius/Screens/ScreenSong.xml | 29 ++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/Output/Themes/Genius/Screens/ScreenSong.xml b/Output/Themes/Genius/Screens/ScreenSong.xml index f7d55aaf..cda40b36 100644 --- a/Output/Themes/Genius/Screens/ScreenSong.xml +++ b/Output/Themes/Genius/Screens/ScreenSong.xml @@ -2,7 +2,7 @@ ScreenSong - 7 + 8 @@ -788,6 +788,33 @@ TR_SCREENSONG_BUTTON_STARTMEDLEY + From 15afc5e07bc9538e281fd305d3d4eb1af53d99e5 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 25 Jan 2020 09:11:33 +0100 Subject: [PATCH 8/8] Switch to game mode with highscore entries If Highscores will be opened from song screen, switch to the first game mode with highscore entries. --- Vocaluxe/Screens/CScreenHighscore.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs index 2b838de9..19769991 100644 --- a/Vocaluxe/Screens/CScreenHighscore.cs +++ b/Vocaluxe/Screens/CScreenHighscore.cs @@ -245,10 +245,16 @@ namespace Vocaluxe.Screens _Scores = new List[4]; int songID = CScreenSong.getSelectedSongID(); EHighscoreStyle style = CBase.Config.GetHighscoreStyle(); + bool foundHighscoreEntries = false; for (int gameModeNum = 0; gameModeNum < 4; gameModeNum++) { _Scores[gameModeNum] = CDataBase.LoadScore(songID, (EGameMode)gameModeNum, style); + if (!foundHighscoreEntries && _Scores[gameModeNum].Count > 0) + { + _Round = gameModeNum; + foundHighscoreEntries = true; + } } } else