diff --git a/Output/Languages/de.xml b/Output/Languages/de.xml index 0952ff90..380b82c3 100644 --- a/Output/Languages/de.xml +++ b/Output/Languages/de.xml @@ -162,6 +162,7 @@ Keine Teams Anzahl der Teams Anzahl der Spieler + Mikrofone Spielerauswahl Spieler 1 Spieler diff --git a/Output/Languages/en.xml b/Output/Languages/en.xml index 7f599720..4f77e60c 100644 --- a/Output/Languages/en.xml +++ b/Output/Languages/en.xml @@ -162,6 +162,7 @@ No teams Number of teams Number of players + Microphones Player Selection Player 1 player diff --git a/Output/PartyModes/Challenge/Themes/Default/Default.xml b/Output/PartyModes/Challenge/Themes/Default/Default.xml index 52a8859e..f666504f 100644 --- a/Output/PartyModes/Challenge/Themes/Default/Default.xml +++ b/Output/PartyModes/Challenge/Themes/Default/Default.xml @@ -8,6 +8,8 @@ 1 - + + PartyModeIcon.png + diff --git a/Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png b/Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png new file mode 100644 index 00000000..3c62441a Binary files /dev/null and b/Output/PartyModes/Challenge/Themes/Default/PartyModeIcon.png differ diff --git a/Output/PartyModes/TicTacToe/Themes/Default/Default.xml b/Output/PartyModes/TicTacToe/Themes/Default/Default.xml index 52a8859e..f666504f 100644 --- a/Output/PartyModes/TicTacToe/Themes/Default/Default.xml +++ b/Output/PartyModes/TicTacToe/Themes/Default/Default.xml @@ -8,6 +8,8 @@ 1 - + + PartyModeIcon.png + diff --git a/Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png b/Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png new file mode 100644 index 00000000..17d94179 Binary files /dev/null and b/Output/PartyModes/TicTacToe/Themes/Default/PartyModeIcon.png differ diff --git a/Output/Themes/Changelog/Changelog_ScreenMain.txt b/Output/Themes/Changelog/Changelog_ScreenMain.txt index 23fb6a71..2aa4d369 100644 --- a/Output/Themes/Changelog/Changelog_ScreenMain.txt +++ b/Output/Themes/Changelog/Changelog_ScreenMain.txt @@ -1,5 +1,14 @@ ScreenMain +++++++++++ +Version 5: +(2026 Oct 17) + +Change: +ButtonSing and ButtonParty are larger, without reflection and placed side by side above the row of the other buttons +Positions of ButtonStatistics, ButtonProfiles, ButtonOptions and ButtonExit +StaticWarningProfiles and TextWarningProfiles look like the other warnings and take the place of ButtonSing and ButtonParty, because they are locked without a profile + ++++++++++ Version 4: (2026 Oct 16) diff --git a/Output/Themes/Changelog/Changelog_ScreenParty.txt b/Output/Themes/Changelog/Changelog_ScreenParty.txt index 99a008af..456c427f 100644 --- a/Output/Themes/Changelog/Changelog_ScreenParty.txt +++ b/Output/Themes/Changelog/Changelog_ScreenParty.txt @@ -1,2 +1,30 @@ ScreenParty +++++++++ +Version 2: +(2026 Oct 17) + +Add: + + + + + + + + + + + + + + +Remove: + + + + + + + +Change: +All party modes are shown as tiles with an icon, the details of the selected mode are shown below diff --git a/Output/Themes/Vocaluxe 2024/01_Standard.xml b/Output/Themes/Vocaluxe 2024/01_Standard.xml index 1abecbef..b87dce56 100644 --- a/Output/Themes/Vocaluxe 2024/01_Standard.xml +++ b/Output/Themes/Vocaluxe 2024/01_Standard.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/02.xml b/Output/Themes/Vocaluxe 2024/02.xml index 9074d9b9..be678c65 100644 --- a/Output/Themes/Vocaluxe 2024/02.xml +++ b/Output/Themes/Vocaluxe 2024/02.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/03.xml b/Output/Themes/Vocaluxe 2024/03.xml index 66252f9f..2dc9f158 100644 --- a/Output/Themes/Vocaluxe 2024/03.xml +++ b/Output/Themes/Vocaluxe 2024/03.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/04.xml b/Output/Themes/Vocaluxe 2024/04.xml index 702b15cd..0cc61b58 100644 --- a/Output/Themes/Vocaluxe 2024/04.xml +++ b/Output/Themes/Vocaluxe 2024/04.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/05.xml b/Output/Themes/Vocaluxe 2024/05.xml index 3eb48539..715c3b0f 100644 --- a/Output/Themes/Vocaluxe 2024/05.xml +++ b/Output/Themes/Vocaluxe 2024/05.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/06.xml b/Output/Themes/Vocaluxe 2024/06.xml index 8a170637..aba50e6b 100644 --- a/Output/Themes/Vocaluxe 2024/06.xml +++ b/Output/Themes/Vocaluxe 2024/06.xml @@ -335,6 +335,7 @@ LogoMain.png SongMenu.png + ButtonTile.png CoverTile.png PlayerTile.png CoverTextBackground.png @@ -370,6 +371,7 @@ ToneHelper.png Score.png Star.png + PartyModeIcon.png CountdownDot.png NoAvatar.png SongMenu.png diff --git a/Output/Themes/Vocaluxe 2024/ButtonTile.png b/Output/Themes/Vocaluxe 2024/ButtonTile.png new file mode 100644 index 00000000..135fcbf6 Binary files /dev/null and b/Output/Themes/Vocaluxe 2024/ButtonTile.png differ diff --git a/Output/Themes/Vocaluxe 2024/PartyModeIcon.png b/Output/Themes/Vocaluxe 2024/PartyModeIcon.png new file mode 100644 index 00000000..b74297af Binary files /dev/null and b/Output/Themes/Vocaluxe 2024/PartyModeIcon.png differ diff --git a/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml b/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml index 850e7ad6..f9852a1b 100644 --- a/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml +++ b/Output/Themes/Vocaluxe 2024/Screens/ScreenMain.xml @@ -2,7 +2,7 @@ ScreenMain - 4 + 5 @@ -37,13 +37,13 @@ - TextBG + Warning - 135 - 915 - 510 - 45 + 390 + 767.5 + 1140 + 75 -1.9 @@ -64,11 +64,11 @@ Vocaluxe "Shining Heaven" v0.3 (x64) Beta (0083) - 390 - 918 + 960 + 787.5 -2 - 40.5 - 500 + 37.5 + 960 Center @@ -83,20 +83,20 @@ Button Button - 135 - 900 - 225 - 75 + 420 + 750 + 510 + 110 0 - 112.5 - 18 + 255 + 26 0 - 40.5 - 213 + 58 + 490 Center @@ -105,33 +105,25 @@ Outline TR_SCREENMAIN_BUTTON_SING - - 39 - 15 - - - 39 - 15 - + + - - - - SelectSlideArrowLeft - SelectSlideArrowRight - SelectSlide - SelectSlideArrowLeft - SelectSlideArrowRight - - 450 - 300 - 1072.5 - 75 - 0 - - - 457.5 - 307.5 - 60 - 60 - 0 - - - 1455 - 307.5 - 60 - 60 - 0 - - - - - - - - 81 - 75 - 0 - 900 - Outline - Bold - 1 - - + diff --git a/Vocaluxe/Screens/CScreenMain.cs b/Vocaluxe/Screens/CScreenMain.cs index 65554ac5..c84c46c7 100644 --- a/Vocaluxe/Screens/CScreenMain.cs +++ b/Vocaluxe/Screens/CScreenMain.cs @@ -27,7 +27,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 4; } + get { return 5; } } private const string _ButtonSing = "ButtonSing"; @@ -206,6 +206,8 @@ namespace Vocaluxe.Screens _Texts[_TextWarningProfiles].Visible = !profileOK; _Buttons[_ButtonSing].Selectable = profileOK; _Buttons[_ButtonParty].Selectable = profileOK; + _Buttons[_ButtonSing].Visible = profileOK; + _Buttons[_ButtonParty].Visible = profileOK; if (_Texts[_TextWarningProfiles].Visible && !_HasPlayedWarningSound) { diff --git a/Vocaluxe/Screens/CScreenParty.cs b/Vocaluxe/Screens/CScreenParty.cs index 8026beae..dc65715d 100644 --- a/Vocaluxe/Screens/CScreenParty.cs +++ b/Vocaluxe/Screens/CScreenParty.cs @@ -15,9 +15,11 @@ // along with Vocaluxe. If not, see . #endregion +using System; using System.Collections.Generic; using System.Windows.Forms; using Vocaluxe.Base; +using Vocaluxe.Base.ThemeSystem; using VocaluxeLib; using VocaluxeLib.Menu; @@ -25,70 +27,182 @@ namespace Vocaluxe.Screens { public class CScreenParty : CMenu { + private class CModeTile + { + public CStatic Box; + public CStatic Icon; + public CText Name; + } + // Version number for theme files. Increment it, if you've changed something on the theme files! protected override int _ScreenVersion { - get { return 1; } + get { return 2; } } + private const string _TextDetailName = "TextDetailName"; private const string _TextDescription = "TextDescription"; private const string _TextTargetAudience = "TextTargetAudience"; private const string _TextNumTeams = "TextNumTeams"; private const string _TextNumPlayers = "TextNumPlayers"; + private const string _TextNumMics = "TextNumMics"; private const string _TextAuthor = "TextAuthor"; - private const string _TextVersion = "TextVersion"; private const string _TextError = "TextError"; + private const string _TextTileName = "TextTileName"; + private const string _TextTileNameSelected = "TextTileNameSelected"; + private const string _TextPage = "TextPage"; + private const string _StaticTile = "StaticTile"; + private const string _StaticTileSelected = "StaticTileSelected"; + private const string _StaticTileIcon = "StaticTileIcon"; + private const string _StaticTileIconSelected = "StaticTileIconSelected"; private const string _ButtonStart = "ButtonStart"; private const string _ButtonExit = "ButtonExit"; - private const string _SelectSlideModes = "SelectSlideModes"; + private const string _ButtonPageUp = "ButtonPageUp"; + private const string _ButtonPageDown = "ButtonPageDown"; + + private const string _SkinPartyModeIcon = "PartyModeIcon"; + private const int _NumColumns = 3; + private const int _NumRows = 2; + private const int _TilesPerPage = _NumColumns * _NumRows; + private const float _TileSpaceX = 40f; + private const float _TileSpaceY = 30f; + private const float _UnavailableAlpha = 0.4f; private List _PartyModeInfos; + private readonly List _Tiles = new List(); + private int _Selected; + private bool _OnButtons; public override void Init() { base.Init(); - _ThemeTexts = new string[] { _TextDescription, _TextTargetAudience, _TextNumTeams, _TextNumPlayers, _TextAuthor, _TextVersion, _TextError }; - _ThemeButtons = new string[] { _ButtonStart, _ButtonExit }; - _ThemeSelectSlides = new string[] { _SelectSlideModes }; + _ThemeTexts = new string[] + { + _TextDetailName, _TextDescription, _TextTargetAudience, _TextNumTeams, _TextNumPlayers, _TextNumMics, _TextAuthor, _TextError, _TextTileName, + _TextTileNameSelected, _TextPage + }; + _ThemeStatics = new string[] { _StaticTile, _StaticTileSelected, _StaticTileIcon, _StaticTileIconSelected }; + _ThemeButtons = new string[] { _ButtonStart, _ButtonExit, _ButtonPageUp, _ButtonPageDown }; + } + + public override void LoadTheme(string xmlPath) + { + base.LoadTheme(xmlPath); + + _Tiles.Clear(); + var box = _Statics[_StaticTile].Rect; + var icon = _Statics[_StaticTileIcon].Rect; + for (var i = 0; i < _TilesPerPage; i++) + { + var x = box.X + (i % _NumColumns) * (box.W + _TileSpaceX); + var y = box.Y + (i / _NumColumns) * (box.H + _TileSpaceY); + var tile = new CModeTile + { + Box = GetNewStatic(_Statics[_StaticTile]), + Icon = GetNewStatic(_Statics[_StaticTileIcon]), + Name = GetNewText(_Texts[_TextTileName]) + }; + tile.Box.MaxRect = new SRectF(x, y, box.W, box.H, box.Z); + tile.Icon.MaxRect = new SRectF(x + icon.X - box.X, y + icon.Y - box.Y, icon.W, icon.H, icon.Z); + tile.Name.X = x + _Texts[_TextTileName].X - box.X; + tile.Name.Y = y + _Texts[_TextTileName].Y - box.Y; + _AddStatic(tile.Box); + _AddStatic(tile.Icon); + _AddText(tile.Name); + _Tiles.Add(tile); + } + + _Statics[_StaticTile].Visible = false; + _Statics[_StaticTileSelected].Visible = false; + _Statics[_StaticTileIcon].Visible = false; + _Statics[_StaticTileIconSelected].Visible = false; + _Texts[_TextTileName].Visible = false; + _Texts[_TextTileNameSelected].Visible = false; } public override bool HandleInput(SKeyEvent keyEvent) { - base.HandleInput(keyEvent); - - if (keyEvent.KeyPressed) { } - else + if (keyEvent.Key != Keys.Left && keyEvent.Key != Keys.Right && keyEvent.Key != Keys.Up && keyEvent.Key != Keys.Down && keyEvent.Key != Keys.Tab) { - switch (keyEvent.Key) - { - case Keys.Back: - case Keys.Escape: + base.HandleInput(keyEvent); + } + + if (keyEvent.KeyPressed) + { + return true; + } + + switch (keyEvent.Key) + { + case Keys.Back: + case Keys.Escape: + CGraphics.FadeTo(EScreen.Main); + break; + + case Keys.Enter: + if (_OnButtons && _Buttons[_ButtonExit].Selected) + { CGraphics.FadeTo(EScreen.Main); - break; + } + else + { + _StartPartyMode(); + } - case Keys.Enter: - if (_Buttons[_ButtonStart].Selected) + break; + + case Keys.Left: + case Keys.Right: + if (_OnButtons) + { + _SwitchButton(); + } + else + { + _Select(_Selected + (keyEvent.Key == Keys.Left ? -1 : 1)); + } + + break; + + case Keys.Up: + if (_OnButtons) + { + _FocusTiles(); + } + else + { + _Select(_Selected - _NumColumns); + } + + break; + + case Keys.Down: + if (!_OnButtons) + { + if (_Selected + _NumColumns < _PartyModeInfos.Count) { - _StartPartyMode(); + _Select(_Selected + _NumColumns); } - - if (_Buttons[_ButtonExit].Selected) + else { - CGraphics.FadeTo(EScreen.Main); + _FocusButtons(); } + } - break; + break; - case Keys.Left: - case Keys.Right: - if (_SelectSlides[_SelectSlideModes].Selected) - { - _UpdateSelection(); - } + case Keys.Tab: + if (_OnButtons) + { + _SwitchButton(); + } + else + { + _FocusButtons(); + } - break; - } + break; } return true; @@ -97,22 +211,57 @@ namespace Vocaluxe.Screens public override bool HandleMouse(SMouseEvent mouseEvent) { base.HandleMouse(mouseEvent); - - if (mouseEvent.LB && _IsMouseOverCurSelection(mouseEvent)) + if (!_OnButtons && (_Buttons[_ButtonStart].Selected || _Buttons[_ButtonExit].Selected)) { - if (_Buttons[_ButtonStart].Selected) + _OnButtons = true; + _UpdateTiles(); + } + + var first = _GetPage() * _TilesPerPage; + for (var i = 0; i < _Tiles.Count && first + i < _PartyModeInfos.Count; i++) + { + if (!CHelper.IsInBounds(_Tiles[i].Box.Rect, mouseEvent)) + { + continue; + } + + if (_OnButtons || first + i != _Selected) + { + _FocusTiles(); + _Select(first + i); + } + + if (mouseEvent.LB) { _StartPartyMode(); } - if (_Buttons[_ButtonExit].Selected) - { - CGraphics.FadeTo(EScreen.Main); - } + return true; + } - if (_SelectSlides[_SelectSlideModes].Selected) + if (mouseEvent.LB) + { + if (_IsMouseOverCurSelection(mouseEvent)) { - _UpdateSelection(); + if (_Buttons[_ButtonStart].Selected) + { + _StartPartyMode(); + } + + if (_Buttons[_ButtonExit].Selected) + { + CGraphics.FadeTo(EScreen.Main); + } + + if (_Buttons[_ButtonPageUp].Selected) + { + _Select((_GetPage() - 1) * _TilesPerPage); + } + + if (_Buttons[_ButtonPageDown].Selected) + { + _Select((_GetPage() + 1) * _TilesPerPage); + } } } @@ -127,19 +276,10 @@ namespace Vocaluxe.Screens public override void OnShow() { base.OnShow(); - _PartyModeInfos = CParty.GetPartyModeInfos(); - - _SelectSlides[_SelectSlideModes].Clear(); - foreach (var info in _PartyModeInfos) - { - _SelectSlides[_SelectSlideModes].AddValue(info.Name, info.ExtInfo.Id); - } - - _SelectSlides[_SelectSlideModes].Selection = 0; - _UpdateSelection(); - - _SelectElement(_SelectSlides[_SelectSlideModes]); + _PartyModeInfos.Sort((a, b) => string.Compare(CLanguage.Translate(a.Name, a.ExtInfo.Id), CLanguage.Translate(b.Name, b.ExtInfo.Id), StringComparison.CurrentCultureIgnoreCase)); + _Select(Math.Min(_Selected, Math.Max(0, _PartyModeInfos.Count - 1))); + _FocusTiles(); } public override bool UpdateGame() @@ -147,25 +287,114 @@ namespace Vocaluxe.Screens return true; } - private void _UpdateSelection() + private void _FocusTiles() { - if (_PartyModeInfos.Count == 0) + _OnButtons = false; + _Buttons[_ButtonStart].Selected = false; + _Buttons[_ButtonExit].Selected = false; + _UpdateTiles(); + } + + private void _FocusButtons() + { + _OnButtons = true; + _SelectElement(_Buttons[_ButtonStart].Visible ? _Buttons[_ButtonStart] : _Buttons[_ButtonExit]); + _UpdateTiles(); + } + + private void _SwitchButton() + { + if (_Buttons[_ButtonStart].Selected || !_Buttons[_ButtonStart].Visible) { + _SelectElement(_Buttons[_ButtonExit]); + } + else + { + _SelectElement(_Buttons[_ButtonStart]); + } + } + + private int _GetPage() + { + return _Selected / _TilesPerPage; + } + + private int _GetNumPages() + { + return Math.Max(1, (_PartyModeInfos.Count + _TilesPerPage - 1) / _TilesPerPage); + } + + private static bool _IsPlayable(SPartyModeInfos info) + { + return CConfig.GetMaxNumMics() >= info.ExtInfo.MinMics; + } + + private void _Select(int index) + { + if (_PartyModeInfos == null || _PartyModeInfos.Count == 0) + { + _Selected = 0; return; } - var index = _SelectSlides[_SelectSlideModes].Selection; - if (index >= _PartyModeInfos.Count) + _Selected = Math.Max(0, Math.Min(_PartyModeInfos.Count - 1, index)); + _UpdateTiles(); + _UpdateSelection(); + } + + private void _UpdateTiles() + { + var page = _GetPage(); + var first = page * _TilesPerPage; + for (var i = 0; i < _Tiles.Count; i++) { - index = 0; - _SelectSlides[_SelectSlideModes].Selection = 0; + var tile = _Tiles[i]; + var index = first + i; + var visible = index < _PartyModeInfos.Count; + tile.Box.Visible = visible; + tile.Icon.Visible = visible; + tile.Name.Visible = visible; + if (!visible) + { + continue; + } + + var info = _PartyModeInfos[index]; + var selected = index == _Selected && !_OnButtons; + var alpha = _IsPlayable(info) ? 1f : _UnavailableAlpha; + + tile.Icon.Texture = CThemes.GetSkinTexture(_SkinPartyModeIcon, info.ExtInfo.Id); + tile.Name.TranslationId = info.ExtInfo.Id; + tile.Name.Text = info.Name; + + var iconColor = selected ? _Statics[_StaticTileIconSelected].Color : _Statics[_StaticTileIcon].Color; + var nameColor = selected ? _Texts[_TextTileNameSelected].Color : _Texts[_TextTileName].Color; + var boxTheme = selected ? _Statics[_StaticTileSelected] : _Statics[_StaticTile]; + var boxColor = boxTheme.Color; + tile.Box.Texture = boxTheme.Texture; + tile.Icon.Color = new SColorF(iconColor.R, iconColor.G, iconColor.B, iconColor.A * alpha); + tile.Name.Color = new SColorF(nameColor.R, nameColor.G, nameColor.B, nameColor.A * alpha); + tile.Box.Color = new SColorF(boxColor.R, boxColor.G, boxColor.B, boxColor.A * alpha); } - //Description - var infos = _PartyModeInfos[index]; + var numPages = _GetNumPages(); + _Buttons[_ButtonPageUp].Visible = page > 0; + _Buttons[_ButtonPageDown].Visible = page < numPages - 1; + _Texts[_TextPage].Visible = numPages > 1; + _Texts[_TextPage].Text = (page + 1) + " / " + numPages; + } + + private void _UpdateSelection() + { + var infos = _PartyModeInfos[_Selected]; var extInfo = infos.ExtInfo; - _Texts[_TextDescription].Text = infos.Description; + + _Texts[_TextDetailName].TranslationId = extInfo.Id; + _Texts[_TextDetailName].Text = infos.Name; + + //Description _Texts[_TextDescription].TranslationId = extInfo.Id; + _Texts[_TextDescription].Text = infos.Description; //TargetAudience _Texts[_TextTargetAudience].TranslationId = extInfo.Id; @@ -188,22 +417,19 @@ namespace Vocaluxe.Screens //NumPlayers if (extInfo.MaxPlayers == extInfo.MinPlayers) { - _Texts[_TextNumPlayers].Text = extInfo.MaxTeams.ToString(); + _Texts[_TextNumPlayers].Text = extInfo.MaxPlayers.ToString(); } else { _Texts[_TextNumPlayers].Text = extInfo.MinPlayers + " - " + extInfo.MaxPlayers; } + _Texts[_TextNumMics].Text = extInfo.MinMics.ToString(); + //Author - _Texts[_TextAuthor].Text = infos.Author; - _Texts[_TextAuthor].TranslationId = extInfo.Id; + _Texts[_TextAuthor].Text = CLanguage.Translate(infos.Author, extInfo.Id) + " ยท " + infos.VersionMajor + "." + infos.VersionMinor; - //Version - _Texts[_TextVersion].Text = infos.VersionMajor + "." + infos.VersionMinor; - _Texts[_TextVersion].TranslationId = extInfo.Id; - - if (CConfig.GetMaxNumMics() < extInfo.MinMics) + if (!_IsPlayable(infos)) { _Buttons[_ButtonStart].Visible = false; _Texts[_TextError].Text = CConfig.GetMaxNumMics() == 0 @@ -219,22 +445,13 @@ namespace Vocaluxe.Screens private void _StartPartyMode() { - if (_PartyModeInfos.Count == 0) + if (_PartyModeInfos.Count == 0 || _Selected >= _PartyModeInfos.Count || !_IsPlayable(_PartyModeInfos[_Selected])) { return; } - var index = _SelectSlides[_SelectSlideModes].Selection; - if (index >= _PartyModeInfos.Count) - { - _Buttons[_ButtonStart].Visible = false; - _Texts[_TextError].Text = "TR_SCREENPARTY_ERROR"; - _Texts[_TextError].Visible = true; - return; - } - - CParty.SetPartyMode(_PartyModeInfos[index].ExtInfo.Id); + CParty.SetPartyMode(_PartyModeInfos[_Selected].ExtInfo.Id); CGraphics.FadeTo(CParty.GetStartScreen()); } } -} \ No newline at end of file +}