diff --git a/Vocaluxe/Base/CParty.cs b/Vocaluxe/Base/CParty.cs index 5b478f0d..bcda5fa8 100644 --- a/Vocaluxe/Base/CParty.cs +++ b/Vocaluxe/Base/CParty.cs @@ -51,5 +51,10 @@ namespace Vocaluxe.Base { _PartyModes[_CurrentModeNr].SetSearchString(SearchString, Visible); } + + public static void JokerUsed(int TeamNr) + { + _PartyModes[_CurrentModeNr].JokerUsed(TeamNr); + } } } diff --git a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs index 69d6f642..ad0c44b6 100644 --- a/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs +++ b/Vocaluxe/Menu/SongMenu/CSongMenuTileBoard.cs @@ -200,7 +200,7 @@ namespace Vocaluxe.Menu.SongMenu case Keys.Escape: case Keys.Back: - if (CSongs.Category > -1 && CSongs.Tabs == EOffOn.TR_CONFIG_ON) + if (CSongs.Category > -1 && CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { ShowCategories(); KeyEvent.Handled = true; @@ -212,21 +212,21 @@ namespace Vocaluxe.Menu.SongMenu break; case Keys.PageUp: - if (CSongs.Tabs == EOffOn.TR_CONFIG_ON) + if (CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { PrevCategory(); } break; case Keys.PageDown: - if (CSongs.Tabs == EOffOn.TR_CONFIG_ON) + if (CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { NextCategory(); } break; case Keys.Left: - if (_Locked > 0 && !SongOptions.Selection.RandomOnly && !SongOptions.Selection.RandomOnly) + if (_Locked > 0 && (!SongOptions.Selection.RandomOnly || SongOptions.Selection.CategoryChangeAllowed && CSongs.Category < 0)) { _Locked--; if (CSongs.Category < 0 && _Locked < CSongs.NumCategories - _NumW || @@ -236,7 +236,7 @@ namespace Vocaluxe.Menu.SongMenu break; case Keys.Right: - if (CSongs.Category < 0) + if (CSongs.Category < 0 && SongOptions.Selection.CategoryChangeAllowed) { if (_Locked < CSongs.NumCategories - 1) { @@ -248,7 +248,7 @@ namespace Vocaluxe.Menu.SongMenu } else { - if (_Locked < CSongs.NumVisibleSongs - 1 && !SongOptions.Selection.RandomOnly) + if (CSongs.Category != -1 && _Locked < CSongs.NumVisibleSongs - 1 && !SongOptions.Selection.RandomOnly) { _Locked++; if (_Locked < CSongs.NumVisibleSongs - _NumW) @@ -258,13 +258,13 @@ namespace Vocaluxe.Menu.SongMenu break; case Keys.Up: - if (KeyEvent.ModSHIFT && CSongs.Tabs == EOffOn.TR_CONFIG_ON && !SongOptions.Selection.RandomOnly) + if (KeyEvent.ModSHIFT && CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { PrevCategory(); break; } - if (_Locked > _NumW - 1 && (!SongOptions.Selection.RandomOnly || CSongs.Category < 0)) + if (_Locked > _NumW - 1 && (!SongOptions.Selection.RandomOnly || SongOptions.Selection.CategoryChangeAllowed && CSongs.Category < 0)) { _Locked -= _NumW; UpdateList((_Locked / _NumW) * _NumW - (_NumW * (_NumH - 2))); @@ -272,13 +272,13 @@ namespace Vocaluxe.Menu.SongMenu break; case Keys.Down: - if (KeyEvent.ModSHIFT && CSongs.Tabs == EOffOn.TR_CONFIG_ON && !SongOptions.Selection.RandomOnly) + if (KeyEvent.ModSHIFT && CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { NextCategory(); break; } - if (CSongs.Category < 0) + if (CSongs.Category < 0 && SongOptions.Selection.CategoryChangeAllowed) { if (_Locked < CSongs.NumCategories - _NumW) { @@ -323,7 +323,7 @@ namespace Vocaluxe.Menu.SongMenu bool sel = false; int lastselection = _actualSelection; - if (!SongOptions.Selection.RandomOnly) + if (!SongOptions.Selection.RandomOnly || CSongs.Category < 0 && SongOptions.Selection.CategoryChangeAllowed) { foreach (CStatic tile in _Tiles) { @@ -359,7 +359,7 @@ namespace Vocaluxe.Menu.SongMenu if (!sel) _actualSelection = -1; - if ((MouseEvent.RB) && (CSongs.NumCategories > 0) && CSongs.Category >= 0 && CSongs.Tabs == EOffOn.TR_CONFIG_ON) + if ((MouseEvent.RB) && (CSongs.NumCategories > 0) && CSongs.Category >= 0 && CSongs.Tabs == EOffOn.TR_CONFIG_ON && SongOptions.Selection.CategoryChangeAllowed) { ShowCategories(); return; @@ -389,7 +389,7 @@ namespace Vocaluxe.Menu.SongMenu if (MouseEvent.Wheel > 0) { - if (CHelper.IsInBounds(_ScrollRect, MouseEvent) && !SongOptions.Selection.PartyMode) + if (CHelper.IsInBounds(_ScrollRect, MouseEvent) && (!SongOptions.Selection.RandomOnly || CSongs.Category < 0 && SongOptions.Selection.CategoryChangeAllowed)) { if (CSongs.Category >= 0 && CSongs.NumVisibleSongs > _Offset + _NumW * MouseEvent.Wheel + _NumW * (_NumH - 1) || CSongs.Category < 0 && CSongs.NumCategories > _Offset + _NumW * MouseEvent.Wheel + _NumW * (_NumH - 1)) @@ -402,7 +402,7 @@ namespace Vocaluxe.Menu.SongMenu if (MouseEvent.Wheel < 0) { - if (CHelper.IsInBounds(_ScrollRect, MouseEvent) && !SongOptions.Selection.PartyMode) + if (CHelper.IsInBounds(_ScrollRect, MouseEvent) && (!SongOptions.Selection.RandomOnly || CSongs.Category < 0 && SongOptions.Selection.CategoryChangeAllowed)) { _Offset += _NumW * MouseEvent.Wheel; if (_Offset < 0) diff --git a/Vocaluxe/PartyModes/CPartyMode.cs b/Vocaluxe/PartyModes/CPartyMode.cs index 0c64369f..8ba4ee1d 100644 --- a/Vocaluxe/PartyModes/CPartyMode.cs +++ b/Vocaluxe/PartyModes/CPartyMode.cs @@ -8,6 +8,15 @@ namespace Vocaluxe.PartyModes { abstract class CPartyMode : IPartyMode { + protected ScreenSongOptions _ScreenSongOptions; + + public CPartyMode() + { + _ScreenSongOptions = new ScreenSongOptions(); + _ScreenSongOptions.Selection = new SelectionOptions(); + _ScreenSongOptions.Sorting = new SortingOptions(); + } + #region Implementation public virtual void Init() { @@ -31,6 +40,18 @@ namespace Vocaluxe.PartyModes public virtual void SetSearchString(string SearchString, bool Visible) { } + + public virtual void JokerUsed(int TeamNr) + { + if (_ScreenSongOptions.Selection.NumJokers == null) + return; + + if (_ScreenSongOptions.Selection.NumJokers.Length < TeamNr) + return; + + if (_ScreenSongOptions.Selection.NumJokers[TeamNr] > 0) + _ScreenSongOptions.Selection.NumJokers[TeamNr]--; + } #endregion Implementation } } diff --git a/Vocaluxe/PartyModes/CPartyModeNone.cs b/Vocaluxe/PartyModes/CPartyModeNone.cs index 77e0fd09..84b13581 100644 --- a/Vocaluxe/PartyModes/CPartyModeNone.cs +++ b/Vocaluxe/PartyModes/CPartyModeNone.cs @@ -9,18 +9,12 @@ namespace Vocaluxe.PartyModes class CPartyModeNone : CPartyMode { //just a dummy for normal game mode - private ScreenSongOptions _ScreenSongOptions; - public CPartyModeNone() { - _ScreenSongOptions = new ScreenSongOptions(); - _ScreenSongOptions.Selection = new SelectionOptions(); - _ScreenSongOptions.Sorting = new SortingOptions(); - _ScreenSongOptions.Selection.RandomOnly = false; _ScreenSongOptions.Selection.PartyMode = false; - _ScreenSongOptions.Selection.NumJokers = 0; - _ScreenSongOptions.Selection.NumTeams = 0; + _ScreenSongOptions.Selection.CategoryChangeAllowed = true; + _ScreenSongOptions.Selection.NumJokers = null; _ScreenSongOptions.Sorting.SearchString = String.Empty; _ScreenSongOptions.Sorting.SearchStringVisible = false; @@ -40,5 +34,6 @@ namespace Vocaluxe.PartyModes _ScreenSongOptions.Sorting.SearchString = SearchString; _ScreenSongOptions.Sorting.SearchStringVisible = Visible; } + } } diff --git a/Vocaluxe/PartyModes/IPartyMode.cs b/Vocaluxe/PartyModes/IPartyMode.cs index 5426a8bf..99179fb0 100644 --- a/Vocaluxe/PartyModes/IPartyMode.cs +++ b/Vocaluxe/PartyModes/IPartyMode.cs @@ -23,12 +23,30 @@ namespace Vocaluxe.PartyModes public bool SearchStringVisible; } + /// + /// Configuration of song selection options + /// public struct SelectionOptions { + /// + /// Choosing song only by random + /// public bool RandomOnly; + + /// + /// If true, it is not allowed to go to MainScreen nor open the playlist nor open the song menu + /// public bool PartyMode; - public int NumJokers; - public int NumTeams; + + /// + /// If true, it is not alled to change or leave the category. It's only valid if Tabs=On. + /// + public bool CategoryChangeAllowed; + + /// + /// The number of jokers left for each team + /// + public int[] NumJokers; } #endregion Structs @@ -41,5 +59,7 @@ namespace Vocaluxe.PartyModes ScreenSongOptions GetScreenSongOptions(); void SetSearchString(string SearchString, bool Visible); + + void JokerUsed(int TeamNr); } } diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index b018626c..11e84a48 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -140,7 +140,7 @@ namespace Vocaluxe.Screens if (!_SongOptionsActive) { - if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode)) + if (KeyEvent.KeyPressed && !Char.IsControl(KeyEvent.Unicode) && KeyEvent.Mod != EModifier.Ctrl) { if (_SearchActive) ApplyNewSearchFilter(_SearchText + KeyEvent.Unicode); @@ -248,14 +248,8 @@ namespace Vocaluxe.Screens //TODO: We need another key for random! case Keys.R: - if (!_SearchActive && CSongs.Category != -1 && KeyEvent.Mod == EModifier.Ctrl) - { - SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong()); - } - else if (CSongs.Category == -1 && KeyEvent.Mod == EModifier.Ctrl) - { - SongMenus[htSongMenus(SongMenu)].SetSelectedCategory(CSongs.GetRandomCategory()); - } + if (KeyEvent.Mod == EModifier.Ctrl && !_sso.Selection.RandomOnly) + SelectNextRandom(-1); break; //TODO: Delete that! @@ -266,6 +260,30 @@ namespace Vocaluxe.Screens } break; + case Keys.D1: + SelectNextRandom(0); + break; + + case Keys.D2: + SelectNextRandom(1); + break; + + case Keys.D3: + SelectNextRandom(2); + break; + + case Keys.D4: + SelectNextRandom(3); + break; + + case Keys.D5: + SelectNextRandom(4); + break; + + case Keys.D6: + SelectNextRandom(5); + break; + } } } @@ -399,21 +417,9 @@ namespace Vocaluxe.Screens } } - if (MouseEvent.MB) + if (MouseEvent.MB && !_sso.Selection.PartyMode) { - if (CSongs.Category != -1) - { - ToggleSongOptions(ESongOptionsView.None); - SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong()); - return true; - } - - if (CSongs.Category == -1) - { - ToggleSongOptions(ESongOptionsView.None); - SongMenus[htSongMenus(SongMenu)].SetSelectedCategory(CSongs.GetRandomCategory()); - return true; - } + return SelectNextRandom(-1); } if (MouseEvent.LD && !_sso.Selection.PartyMode) @@ -759,6 +765,48 @@ namespace Vocaluxe.Screens CGraphics.FadeTo(EScreens.ScreenNames); } + private bool SelectNextRandom(int TeamNr) + { + if (TeamNr != -1 && _sso.Selection.RandomOnly && _sso.Selection.NumJokers != null) + { + bool result = false; + if (_sso.Selection.NumJokers.Length > TeamNr) + { + if (_sso.Selection.NumJokers[TeamNr] > 0) + { + result = SelectNextRandomSong(TeamNr) || SelectNextRandomCategory(); + CParty.JokerUsed(TeamNr); + _sso = CParty.GetSongSelectionOptions(); + } + } + return result; + } + + return SelectNextRandomSong(TeamNr) || SelectNextRandomCategory(); + } + + private bool SelectNextRandomSong(int TeamNr) + { + if (CSongs.Category != -1) + { + ToggleSongOptions(ESongOptionsView.None); + SongMenus[htSongMenus(SongMenu)].SetSelectedSong(CSongs.GetRandomSong()); + return true; + } + return false; + } + + private bool SelectNextRandomCategory() + { + if (CSongs.Category == -1) + { + ToggleSongOptions(ESongOptionsView.None); + SongMenus[htSongMenus(SongMenu)].SetSelectedCategory(CSongs.GetRandomCategory()); + return true; + } + return false; + } + private void JumpTo(char Letter) { int song = SongMenus[htSongMenus(SongMenu)].GetSelectedSong();