From f21c7f24780da312468412110c77ca00d85dee7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20K=C3=BCpper?= Date: Sun, 30 Dec 2012 18:37:07 +0100 Subject: [PATCH] Added tic-tac-toe-party-mode. Still something to do (joker, lang, winning) --- Output/PartyModes/TicTacToe.xml | 19 + .../TicTacToe/Languages/Deutsch.xml | 35 + .../TicTacToe/Languages/English.xml | 37 + .../PartyModes/TicTacToe/Languages/French.xml | 37 + .../TicTacToe/Languages/Spanish.xml | 36 + .../Screens/PartyScreenTicTacToeConfig.xml | 552 ++++++++++++ .../Screens/PartyScreenTicTacToeMain.xml | 815 ++++++++++++++++++ .../Screens/PartyScreenTicTacToeNames.xml | 274 ++++++ PartyModeTicTacToe/PartyModeTicTacToe.cs | 634 ++++++++++++++ PartyModeTicTacToe/PartyModeTicTacToe.csproj | 145 ++++ .../PartyScreenTicTacToeConfig.cs | 230 +++++ .../PartyScreenTicTacToeMain.cs | 500 +++++++++++ .../PartyScreenTicTacToeNames.cs | 640 ++++++++++++++ Vocaluxe.sln | 24 +- Vocaluxe/Base/CMain.cs | 10 + VocaluxeLib/Menu/IMenu.cs | 6 + 16 files changed, 3991 insertions(+), 3 deletions(-) create mode 100644 Output/PartyModes/TicTacToe.xml create mode 100644 Output/PartyModes/TicTacToe/Languages/Deutsch.xml create mode 100644 Output/PartyModes/TicTacToe/Languages/English.xml create mode 100644 Output/PartyModes/TicTacToe/Languages/French.xml create mode 100644 Output/PartyModes/TicTacToe/Languages/Spanish.xml create mode 100644 Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml create mode 100644 Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeMain.xml create mode 100644 Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeNames.xml create mode 100644 PartyModeTicTacToe/PartyModeTicTacToe.cs create mode 100644 PartyModeTicTacToe/PartyModeTicTacToe.csproj create mode 100644 PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs create mode 100644 PartyModeTicTacToe/PartyScreenTicTacToeMain.cs create mode 100644 PartyModeTicTacToe/PartyScreenTicTacToeNames.cs diff --git a/Output/PartyModes/TicTacToe.xml b/Output/PartyModes/TicTacToe.xml new file mode 100644 index 00000000..5ddf43da --- /dev/null +++ b/Output/PartyModes/TicTacToe.xml @@ -0,0 +1,19 @@ + + + 1 + + TR_PARTYMODE_NAME + flokuep + TR_PARTYMODE_DESCRIPTION + TicTacToe + PartyModeTicTacToe + 0 + 1 + TR_PARTYMODE_AUDIENCE + + + PartyScreenTicTacToeMain + PartyScreenTicTacToeConfig + PartyScreenTicTacToeNames + + diff --git a/Output/PartyModes/TicTacToe/Languages/Deutsch.xml b/Output/PartyModes/TicTacToe/Languages/Deutsch.xml new file mode 100644 index 00000000..8a8c359e --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/Deutsch.xml @@ -0,0 +1,35 @@ + + + + Deutsch + + + + Tic-Tac-Toe + Spiele Tic-Tac-Toe auf eine besondere Weise! + Für alle, die Spaß am Wettkampf haben. + Weiter + Zurück + Start + Exit + Ja + Nein + Nächste Runde + Songs + Team + + Tic-Tac-Toe: Einstellungen + Anzahl der Spieler in Team 1 + Anzahl der Spieler in Team 2 + Anzahl der Felder + Playlist + + Tic-Tac-Toe: Spielerwahl + + Tic-Tac-Toe + Wählt ein Feld aus. + Nächster Spieler + Challenge-Mode wirklich beenden? + Alle Runden wurden gesungen! Und der Gewinner ist... + + diff --git a/Output/PartyModes/TicTacToe/Languages/English.xml b/Output/PartyModes/TicTacToe/Languages/English.xml new file mode 100644 index 00000000..68f705a8 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/English.xml @@ -0,0 +1,37 @@ + + + + English + + + + Challenge Mode + Play some challenge rounds. + For all who are interested in duel fights. + Next + Back + Start + Exit + Yes + No + Next Round + + Challenge Mode: Configuration + Number of players + Number of mics + Number of rounds + + Challenge Mode: Choose Player + + Challenge Mode: Overview + Pos + Name + Rounds + Wins + Sing Points + Score + Do you really want to exit? + Player of next round: + All rounds were sung! And the winner is... + + diff --git a/Output/PartyModes/TicTacToe/Languages/French.xml b/Output/PartyModes/TicTacToe/Languages/French.xml new file mode 100644 index 00000000..2a937376 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/French.xml @@ -0,0 +1,37 @@ + + + + Français + + + + TODO: Challenge Mode + TODO: Play some challenge rounds. + TODO: For all who are interested in duel fights. + TODO: Next + Retour + Démarrer + Quitter + Oui + Non + TODO: Next Round + + TODO: Challenge Mode: Configuration + TODO: Number of players + TODO: Number of mics + TODO: Number of rounds + + TODO: Challenge Mode: Choose Player + + TODO: Challenge Mode: Overview + TODO: Pos + TODO: Name + TODO: Rounds + TODO: Wins + TODO: Sing Points + TODO: Score + TODO: Do you really want to exit? + TODO: Player of next round: + TODO: All rounds were sung! And the winner is... + + diff --git a/Output/PartyModes/TicTacToe/Languages/Spanish.xml b/Output/PartyModes/TicTacToe/Languages/Spanish.xml new file mode 100644 index 00000000..d7ded575 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/Spanish.xml @@ -0,0 +1,36 @@ + + + + Español + + + + TODO: Challenge Mode + TODO: Play some challenge rounds. + TODO: For all who are interested in duel fights. + TODO: Next + Volver + Comenzar + Salir + Sí + No + TODO: Next Round + + TODO: Challenge Mode: Configuration + TODO: Number of players + TODO: Number of mics + TODO: Number of rounds + + TODO: Challenge Mode: Choose Player + + TODO: Challenge Mode: Overview + TODO: Name + TODO: Rounds + TODO: Wins + TODO: Sing Points + TODO: Score + TODO: Do you really want to exit? + TODO: Player of next round: + TODO: All rounds were sung! And the winner is... + + diff --git a/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml new file mode 100644 index 00000000..22fbe30a --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml @@ -0,0 +1,552 @@ + + + + 1 + + + Video + + + + BG_Default + + + BackgroundColor + + + + Menu + + 40 + 40 + 0,00 + 1200 + 50 + + + StaticColor + + + + + + + 640 + 48 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENCONFIG_TITLE + + + + + + + 75 + 105 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + TR_SCREENCONFIG_NUMPLAYERT1 + + + + + + + 75 + 165 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + TR_SCREENCONFIG_NUMPLAYERT2 + + + + + + + 75 + 225 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + TR_SCREENCONFIG_NUMFIELDS + + + + + + + 75 + 285 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + TR_SCREENCONFIG_PLAYLIST + + + + + + + Button + + Button + + 985 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_NEXT + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 145 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_BACK + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 100 + 0,00 + 700 + 50 + + 505 + 105 + 0,00 + 40 + 40 + + 1170 + 105 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 9 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 160 + 0,00 + 700 + 50 + + 505 + 165 + 0,00 + 40 + 40 + + 1170 + 165 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 9 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 220 + 0,00 + 700 + 50 + + 505 + 225 + 0,00 + 40 + 40 + + 1170 + 225 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 3 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 280 + 0,00 + 700 + 50 + + 505 + 285 + 0,00 + 40 + 40 + + 1170 + 285 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 1 + + + diff --git a/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeMain.xml b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeMain.xml new file mode 100644 index 00000000..bd7bfefe --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeMain.xml @@ -0,0 +1,815 @@ + + + + 1 + + + Video + + + + BG_Default + + + BackgroundColor + + + + Menu + + 40 + 40 + 0,00 + 1200 + 50 + + + StaticColor + + + + + + + PopupBG + + 0 + 0 + -2,00 + 1280 + 720 + + + StaticColor + + + + + + + PopupBG + + 10 + 200 + -1,00 + 100 + 100 + + + StaticColor + + + + + + + PopupBG + + 1170 + 200 + -1,00 + 100 + 100 + + + StaticColor + + + + + + + 640 + 48 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENMAIN_TITLE + + + + + + + 160 + 150 + + 0,00 + + 40 + + + + Player1 + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENMAIN_NEXT_PLAYER + + + + + + + 1120 + 150 + + 0,00 + + 40 + + + + Player2 + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENMAIN_NEXT_PLAYER + + + + + + + 120 + 230 + + 0,00 + + 40 + + + + Player1 + + + TextSColor + + Left + + Center + + + + Outline + + + + + + + + + 1160 + 230 + + 0,00 + + 40 + + + + Player2 + + + TextSColor + + Right + + Center + + + + Outline + + + + + + + + + 640 + 90 + + 0,00 + + 40 + + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + + + + + + + + 640 + 265 + + -2,01 + + 32 + + 380 + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENMAIN_POPUP_REALLYEXIT + + + + + + + Random + + Random + + 10 + 320 + 0,00 + 100 + 100 + + + Player1Dim + + + Player1 + + + 50 + 25 + + 50 + + 50 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + + Random + + Random + + 1170 + 320 + 0,00 + 100 + 100 + + + Player2Dim + + + Player2 + + + 50 + 25 + + 50 + + 50 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + + RepeatIcon + + RepeatIcon + + 110 + 320 + 0,00 + 100 + 100 + + + Player1Dim + + + Player1 + + + 48 + 25 + + 50 + + 50 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + + RepeatIcon + + RepeatIcon + + 1070 + 320 + 0,00 + 100 + 100 + + + Player2Dim + + + Player2 + + + 48 + 25 + + 50 + + 50 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + + Button + + Button + + 1030 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_NEXT_ROUND + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 100 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_BACK + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 100 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_EXIT + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 665 + 360 + -2,01 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_YES + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 465 + 360 + -2,01 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_NO + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + CoverTile + + CoverTile + + 0 + 0 + -1,01 + 100 + 100 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + diff --git a/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeNames.xml b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeNames.xml new file mode 100644 index 00000000..0ab2b019 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeNames.xml @@ -0,0 +1,274 @@ + + + + 1 + + + Video + + + + BG_Default + + + BackgroundColor + + + + Menu + + 40 + 40 + 0,00 + 1200 + 50 + + + StaticColor + + + + + + + 640 + 48 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENNAMES_TITLE + + + + + + + Button + + Button + + 985 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_NEXT + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + Button + + Button + + 145 + 600 + 0,00 + 150 + 50 + + + ButtonColor + + + ButtonSColor + + + 75 + 10 + + 32 + + 142 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + TR_BUTTON_BACK + + + + + + 10 + 26 + + + + + + 10 + 26 + + + + + CoverTile + + CoverTile + + 0 + 0 + 0,00 + 100 + 100 + + + ButtonColor + + + ButtonSColor + + + 50 + 102 + + 20 + + 98 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + + CoverTile + + CoverTile + + 0 + 0 + 0,00 + 100 + 100 + + + ButtonColor + + + ButtonSColor + + + 50 + 102 + + 20 + + 98 + + + ButtonTextColor + + + ButtonTextSColor + + Center + + Center + + + + Outline + + + + + + + + + + + + diff --git a/PartyModeTicTacToe/PartyModeTicTacToe.cs b/PartyModeTicTacToe/PartyModeTicTacToe.cs new file mode 100644 index 00000000..5945dafc --- /dev/null +++ b/PartyModeTicTacToe/PartyModeTicTacToe.cs @@ -0,0 +1,634 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using Vocaluxe.Menu; + +namespace Vocaluxe.PartyModes +{ + public class Round + { + public int SongID; + public int SingerTeam1; + public int SingerTeam2; + public int PointsTeam1; + public int PointsTeam2; + public int Winner; + public bool Finished = false; + } + #region Communication + #region ToScreen + public struct DataToScreenConfig + { + public int NumPlayerTeam1; + public int NumPlayerTeam2; + public int NumFields; + public int PlaylistID; + } + + public struct DataToScreenNames + { + public int NumPlayerTeam1; + public int NumPlayerTeam2; + public List ProfileIDsTeam1; + public List ProfileIDsTeam2; + } + + public struct DataToScreenMain + { + public int CurrentRoundNr; + public int Team; + public int NumPlayerTeam1; + public int NumPlayerTeam2; + public int NumFields; + public List Rounds; + public List Songs; + public List ProfileIDsTeam1; + public List ProfileIDsTeam2; + public int[] NumJokerRandom; + public int[] NumJokerRetry; + } + + public struct DataFromScreen + { + public FromScreenConfig ScreenConfig; + public FromScreenNames ScreenNames; + public FromScreenMain ScreenMain; + } + + public struct FromScreenConfig + { + public int NumPlayerTeam1; + public int NumPlayerTeam2; + public int NumFields; + public int PlaylistID; + } + + public struct FromScreenNames + { + public bool FadeToConfig; + public bool FadeToMain; + public List ProfileIDsTeam1; + public List ProfileIDsTeam2; + } + + public struct FromScreenMain + { + public bool FadeToSinging; + public bool FadeToNameSelection; + public List Rounds; + public int SingRoundNr; + public List Songs; + } + #endregion FromScreen + #endregion Communication + + public sealed class PartyModeTicTacToe : CPartyMode + { + private const int MaxPlayer = 20; + private const int MinPlayer = 2; + private const int MaxTeams = 2; + private const int MinTeams = 2; + private const int NumFields = 9; + + enum EStage + { + NotStarted, + Config, + Names, + Main, + Singing + } + + struct Data + { + public int NumPlayerTeam1; + public int NumPlayerTeam2; + public int NumFields; + public int Team; + public List ProfileIDsTeam1; + public List ProfileIDsTeam2; + + public int PlaylistID; + + public List Rounds; + public List Songs; + + public int CurrentRoundNr; + public int SingRoundNr; + + public int[] NumJokerRandom; + public int[] NumJokerRetry; + } + + private DataToScreenConfig ToScreenConfig; + private DataToScreenNames ToScreenNames; + private DataToScreenMain ToScreenMain; + + private Data GameData; + private EStage _Stage; + + public PartyModeTicTacToe() + { + _ScreenSongOptions.Selection.RandomOnly = false; + _ScreenSongOptions.Selection.PartyMode = true; + _ScreenSongOptions.Selection.CategoryChangeAllowed = true; + _ScreenSongOptions.Selection.NumJokers = new int[] { 5, 5 }; + _ScreenSongOptions.Selection.TeamNames = new string[] { "foo", "bar" }; + + _ScreenSongOptions.Sorting.SearchString = String.Empty; + _ScreenSongOptions.Sorting.SearchStringVisible = false; + _ScreenSongOptions.Sorting.ShowDuetSongs = false; + + _Stage = EStage.NotStarted; + + ToScreenConfig = new DataToScreenConfig(); + ToScreenNames = new DataToScreenNames(); + ToScreenMain = new DataToScreenMain(); + + GameData = new Data(); + GameData.NumFields = 9; + GameData.NumPlayerTeam1 = 2; + GameData.NumPlayerTeam2 = 2; + GameData.ProfileIDsTeam1 = new List(); + GameData.ProfileIDsTeam2 = new List(); + GameData.CurrentRoundNr = 0; + GameData.SingRoundNr = 0; + GameData.PlaylistID = 0; + GameData.Rounds = new List(); + GameData.Songs = new List(); + GameData.NumJokerRandom = new int[2]; + GameData.NumJokerRetry = new int[2]; + } + + public override bool Init() + { + _Stage = EStage.NotStarted; + + _ScreenSongOptions.Sorting.IgnoreArticles = _Base.Config.GetIgnoreArticles(); + _ScreenSongOptions.Sorting.SongSorting = _Base.Config.GetSongSorting(); + _ScreenSongOptions.Sorting.Tabs = EOffOn.TR_CONFIG_OFF; + _ScreenSongOptions.Selection.SongIndex = -1; + + if (_Base.Config.GetTabs() == EOffOn.TR_CONFIG_ON && _ScreenSongOptions.Sorting.SongSorting != ESongSorting.TR_CONFIG_NONE) + _ScreenSongOptions.Sorting.Tabs = EOffOn.TR_CONFIG_ON; + + ToScreenMain.Rounds = new List(); + ToScreenMain.Songs = new List(); + GameData.Songs = new List(); + GameData.Rounds = new List(); + return true; + } + + public override void DataFromScreen(string ScreenName, Object Data) + { + DataFromScreen data = new DataFromScreen(); + switch (ScreenName) + { + case "PartyScreenTicTacToeConfig": + + try + { + data = (DataFromScreen)Data; + GameData.NumPlayerTeam1 = data.ScreenConfig.NumPlayerTeam1; + GameData.NumPlayerTeam2 = data.ScreenConfig.NumPlayerTeam2; + GameData.NumFields = data.ScreenConfig.NumFields; + GameData.PlaylistID = data.ScreenConfig.PlaylistID; + + _Stage = EStage.Config; + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode TicTacToe. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenTicTacToeNames": + try + { + data = (DataFromScreen)Data; + if (data.ScreenNames.FadeToConfig) + _Stage = EStage.NotStarted; + else + { + if (_Base.Game.GetRandom(100) < 50) + GameData.Team = 0; + else + GameData.Team = 1; + GameData.ProfileIDsTeam1 = data.ScreenNames.ProfileIDsTeam1; + GameData.ProfileIDsTeam2 = data.ScreenNames.ProfileIDsTeam2; + _Stage = EStage.Names; + } + + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode TicTacToe. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + break; + + case "PartyScreenTicTacToeMain": + try + { + data = (DataFromScreen)Data; + if (data.ScreenMain.FadeToSinging) + { + _Stage = EStage.Singing; + GameData.Rounds = data.ScreenMain.Rounds; + GameData.SingRoundNr = data.ScreenMain.SingRoundNr; + GameData.Songs = data.ScreenMain.Songs; + } + if (data.ScreenMain.FadeToNameSelection) + { + _Stage = EStage.Config; + } + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode TicTacToe. Can't cast received data from screen " + ScreenName + ". " + e.Message); + } + + + if (_Stage == EStage.Singing) + StartRound(data.ScreenMain.SingRoundNr); + if (_Stage == EStage.Config) + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + break; + + default: + _Base.Log.LogError("Error in party mode TicTacToe. Wrong screen is sending: " + ScreenName); + break; + } + } + + public override void UpdateGame() + { + /* + if (_Base.Songs.GetCurrentCategoryIndex() != -1 || _ScreenSongOptions.Sorting.Tabs == EOffOn.TR_CONFIG_OFF) + _ScreenSongOptions.Selection.RandomOnly = true; + else + _ScreenSongOptions.Selection.RandomOnly = false;*/ + } + + public override CMenuParty GetNextPartyScreen(out EScreens AlternativeScreen) + { + CMenuParty Screen = null; + AlternativeScreen = EScreens.ScreenSong; + + switch (_Stage) + { + case EStage.NotStarted: + _Screens.TryGetValue("PartyScreenTicTacToeConfig", out Screen); + if (_Screens != null) + { + ToScreenConfig.NumPlayerTeam1 = GameData.NumPlayerTeam1; + ToScreenConfig.NumPlayerTeam2 = GameData.NumPlayerTeam2; + ToScreenConfig.NumFields = GameData.NumFields; + ToScreenConfig.PlaylistID = GameData.PlaylistID; + Screen.DataToScreen(ToScreenConfig); + } + break; + case EStage.Config: + _Screens.TryGetValue("PartyScreenTicTacToeNames", out Screen); + if (_Screens != null) + { + ToScreenNames.NumPlayerTeam1 = GameData.NumPlayerTeam1; + ToScreenNames.NumPlayerTeam2 = GameData.NumPlayerTeam2; + ToScreenNames.ProfileIDsTeam1 = GameData.ProfileIDsTeam1; + ToScreenNames.ProfileIDsTeam2 = GameData.ProfileIDsTeam2; + Screen.DataToScreen(ToScreenNames); + } + break; + case EStage.Names: + _Screens.TryGetValue("PartyScreenTicTacToeMain", out Screen); + if (_Screens != null) + { + if (GameData.Team == 1) + GameData.Team = 0; + else + GameData.Team = 1; + _Base.Songs.ResetPartySongSung(); + GameData.CurrentRoundNr = 1; + ToScreenMain.CurrentRoundNr = 1; + ToScreenMain.NumPlayerTeam1 = GameData.NumPlayerTeam1; + ToScreenMain.NumPlayerTeam2 = GameData.NumPlayerTeam2; + ToScreenMain.NumFields = GameData.NumFields; + ToScreenMain.ProfileIDsTeam1 = GameData.ProfileIDsTeam1; + ToScreenMain.ProfileIDsTeam2 = GameData.ProfileIDsTeam2; + CreateRounds(); + PrepareSongList(); + SetNumJokers(); + ToScreenMain.Rounds = GameData.Rounds; + ToScreenMain.Songs = GameData.Songs; + ToScreenMain.NumJokerRandom = GameData.NumJokerRandom; + ToScreenMain.NumJokerRetry = GameData.NumJokerRetry; + ToScreenMain.Team = GameData.Team; + UpdateScores(); + Screen.DataToScreen(ToScreenMain); + } + break; + case EStage.Main: + //nothing to do + break; + case EStage.Singing: + _Screens.TryGetValue("PartyScreenTicTacToeMain", out Screen); + if (_Screens != null) + { + UpdateScores(); + if (GameData.Team == 1) + GameData.Team = 0; + else + GameData.Team = 1; + ToScreenMain.CurrentRoundNr = GameData.CurrentRoundNr; + ToScreenMain.NumPlayerTeam1 = GameData.NumPlayerTeam1; + ToScreenMain.NumPlayerTeam2 = GameData.NumPlayerTeam2; + ToScreenMain.NumFields = GameData.NumFields; + ToScreenMain.ProfileIDsTeam1 = GameData.ProfileIDsTeam1; + ToScreenMain.ProfileIDsTeam2 = GameData.ProfileIDsTeam2; + ToScreenMain.Rounds = GameData.Rounds; + ToScreenMain.Songs = GameData.Songs; + ToScreenMain.NumJokerRandom = GameData.NumJokerRandom; + ToScreenMain.NumJokerRetry = GameData.NumJokerRetry; + ToScreenMain.Team = GameData.Team; + Screen.DataToScreen(ToScreenMain); + } + break; + default: + break; + } + + return Screen; + } + + public override EScreens GetStartScreen() + { + return EScreens.ScreenPartyDummy; + } + + public override EScreens GetMainScreen() + { + return EScreens.ScreenPartyDummy; + } + + public override ScreenSongOptions GetScreenSongOptions() + { + _ScreenSongOptions.Sorting.SongSorting = _Base.Config.GetSongSorting(); + _ScreenSongOptions.Sorting.Tabs = _Base.Config.GetTabs(); + _ScreenSongOptions.Sorting.IgnoreArticles = _Base.Config.GetIgnoreArticles(); + + return _ScreenSongOptions; + } + + public override void OnSongChange(int SongIndex, ref ScreenSongOptions ScreenSongOptions) + { + ScreenSongOptions = _ScreenSongOptions; + } + + public override void OnCategoryChange(int CategoryIndex, ref ScreenSongOptions ScreenSongOptions) + { + ScreenSongOptions = _ScreenSongOptions; + } + + public override void SetSearchString(string SearchString, bool Visible) + { + _ScreenSongOptions.Sorting.SearchString = SearchString; + _ScreenSongOptions.Sorting.SearchStringVisible = Visible; + } + + public override int GetMaxPlayer() + { + return MaxPlayer; + } + + public override int GetMinPlayer() + { + return MinPlayer; + } + + public override int GetMaxTeams() + { + return MaxTeams; + } + + public override int GetMinTeams() + { + return MinTeams; + } + + public override int GetMaxNumRounds() + { + return NumFields; + } + + public override void JokerUsed(int TeamNr) + { + } + + public override void SongSelected(int SongID) + { + + EGameMode gm = EGameMode.TR_GAMEMODE_NORMAL; + + + _Base.Game.AddSong(SongID, gm); + + _Base.Songs.AddPartySongSung(SongID); + _Base.Graphics.FadeTo(EScreens.ScreenSing); + } + + public override void LeavingHighscore() + { + UpdateScores(); + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + + public bool UseJoker(int TeamNr, int JokerNum) + { + switch (JokerNum) + { + //Random-Joker + case 0: + if (GameData.NumJokerRandom[TeamNr] > 0) + { + GameData.NumJokerRandom[TeamNr]--; + return true; + } + else + { + return false; + } + + case 1: + if (GameData.NumJokerRetry[TeamNr] > 0) + { + GameData.NumJokerRetry[TeamNr]--; + return true; + } + else + { + return false; + } + } + return false; + } + + private void CreateRounds() + { + //Prepare Player-IDs + List Team1 = new List(); + List Team2 = new List(); + List IDs1 = new List(); + List IDs2 = new List(); + //Add IDs to team-list + while (Team1.Count <= NumFields) + { + if (IDs1.Count == 0) + for (int i = 0; i < GameData.NumPlayerTeam1; i++) + IDs1.Add(i); + if (IDs2.Count == 0) + for (int i = 0; i < GameData.NumPlayerTeam2; i++) + IDs2.Add(i); + if (Team1.Count <= NumFields) + { + Team1.Add(IDs1[_Base.Game.GetRandom(IDs1.Count - 1)]); + IDs1.Remove(Team1[Team1.Count - 1]); + } + if (Team2.Count <= NumFields) + { + Team2.Add(IDs2[_Base.Game.GetRandom(IDs2.Count - 1)]); + IDs2.Remove(Team2[Team2.Count - 1]); + } + } + + for (int i = 0; i < NumFields; i++) + { + Round r = new Round(); + r.SingerTeam1 = Team1[i]; + r.SingerTeam2 = Team2[i]; + GameData.Rounds.Add(r); + } + } + + private void PrepareSongList() + { + while(GameData.Songs.Count < (GameData.NumFields + GameData.NumJokerRandom[0] + GameData.NumJokerRandom[1])){ + List Songs = new List(); + for (int i = 0; i < _Base.Playlist.GetPlaylistSongCount(GameData.PlaylistID); i++) + { + Songs.Add(_Base.Playlist.GetPlaylistSong(GameData.PlaylistID, i).SongID); + } + while(Songs.Count > 0) + { + GameData.Songs.Add(Songs[_Base.Game.GetRandom(Songs.Count - 1)]); + Songs.Remove(GameData.Songs[GameData.Songs.Count - 1]); + } + } + } + + private void StartRound(int RoundNr) + { + _Base.Game.Reset(); + _Base.Game.ClearSongs(); + + _Base.Game.SetNumPlayer(2); + + SPlayer[] player = _Base.Game.GetPlayer(); + if (player == null) + return; + + if (player.Length < 2) + return; + + SProfile[] profiles = _Base.Profiles.GetProfiles(); + Round r = GameData.Rounds[RoundNr]; + + for (int i = 0; i < 2; i++) + { + //default values + player[i].Name = "foobar"; + player[i].Difficulty = EGameDifficulty.TR_CONFIG_EASY; + player[i].ProfileID = -1; + } + + //try to fill with the right data + if (r != null) + { + if (GameData.ProfileIDsTeam1[r.SingerTeam1] < profiles.Length) + { + player[0].Name = profiles[GameData.ProfileIDsTeam1[r.SingerTeam1]].PlayerName; + player[0].Difficulty = profiles[GameData.ProfileIDsTeam1[r.SingerTeam1]].Difficulty; + player[0].ProfileID = GameData.ProfileIDsTeam1[r.SingerTeam1]; + } + if (GameData.ProfileIDsTeam2[r.SingerTeam2] < profiles.Length) + { + player[1].Name = profiles[GameData.ProfileIDsTeam2[r.SingerTeam2]].PlayerName; + player[1].Difficulty = profiles[GameData.ProfileIDsTeam2[r.SingerTeam2]].Difficulty; + player[1].ProfileID = GameData.ProfileIDsTeam2[r.SingerTeam2]; + } + SongSelected(r.SongID); + } + else + return; + } + + private void SetNumJokers() + { + switch (GameData.NumFields) + { + case 9: + GameData.NumJokerRandom[0] = 1; + GameData.NumJokerRandom[1] = 1; + GameData.NumJokerRetry[0] = 0; + GameData.NumJokerRetry[1] = 0; + break; + + case 16: + GameData.NumJokerRandom[0] = 2; + GameData.NumJokerRandom[1] = 2; + GameData.NumJokerRetry[0] = 1; + GameData.NumJokerRetry[1] = 1; + break; + + case 25: + GameData.NumJokerRandom[0] = 3; + GameData.NumJokerRandom[1] = 3; + GameData.NumJokerRetry[0] = 2; + GameData.NumJokerRetry[1] = 2; + break; + } + } + + private void UpdateScores() + { + if (!GameData.Rounds[GameData.SingRoundNr].Finished) + GameData.CurrentRoundNr++; + + SPlayer[] results = _Base.Game.GetPlayer(); + if (results == null) + return; + + if (results.Length < 2) + return; + + GameData.Rounds[GameData.SingRoundNr].PointsTeam1 = (int)Math.Round(results[0].Points); + GameData.Rounds[GameData.SingRoundNr].PointsTeam2 = (int)Math.Round(results[1].Points); + GameData.Rounds[GameData.SingRoundNr].Finished = true; + if (GameData.Rounds[GameData.SingRoundNr].PointsTeam1 < GameData.Rounds[GameData.SingRoundNr].PointsTeam2) + { + GameData.Rounds[GameData.SingRoundNr].Winner = 2; + } + else if (GameData.Rounds[GameData.SingRoundNr].PointsTeam1 > GameData.Rounds[GameData.SingRoundNr].PointsTeam2) + { + GameData.Rounds[GameData.SingRoundNr].Winner = 1; + } + else + { + GameData.Rounds[GameData.SingRoundNr].Finished = false; + GameData.CurrentRoundNr--; + } + + } + } +} \ No newline at end of file diff --git a/PartyModeTicTacToe/PartyModeTicTacToe.csproj b/PartyModeTicTacToe/PartyModeTicTacToe.csproj new file mode 100644 index 00000000..ff09b7c4 --- /dev/null +++ b/PartyModeTicTacToe/PartyModeTicTacToe.csproj @@ -0,0 +1,145 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {6F3E1874-F28A-40E9-AFBD-31934D593679} + Library + Properties + PartyModeTicTacToe + PartyModeTicTacToe + v2.0 + + + 512 + + + AnyCPU + true + full + false + ..\Output\PartyModes\TicTacToe\Code + TRACE;DEBUG;WIN + prompt + 4 + Off + + + AnyCPU + none + true + ..\Output\PartyModes\TicTacToe\Code + prompt + 4 + false + WIN + Off + + + AnyCPU + true + full + false + ..\Output\PartyModes\TicTacToe\Code + TRACE;DEBUG;WIN + prompt + 4 + Off + + + AnyCPU + none + true + ..\Output\PartyModes\TicTacToe\Code + prompt + 4 + false + WIN + Off + + + AnyCPU + true + full + false + ..\Output\PartyModes\TicTacToe\Code + TRACE;DEBUG;LINUX + prompt + 4 + Off + + + AnyCPU + none + true + ..\Output\PartyModes\TicTacToe\Code + prompt + 4 + false + LINUX + Off + + + AnyCPU + true + full + false + ..\Output\PartyModes\TicTacToe\Code + TRACE;DEBUG;LINUX + prompt + 4 + Off + + + AnyCPU + none + true + ..\Output\PartyModes\TicTacToe\Code + prompt + 4 + false + LINUX + Off + + + + + + + Always + + + Always + + + Always + + + Always + + + + + {D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC} + VocaluxeLib + False + + + + + + + + + + + + diff --git a/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs b/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs new file mode 100644 index 00000000..d5b86e20 --- /dev/null +++ b/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +using Vocaluxe.Menu; + +namespace Vocaluxe.PartyModes +{ + public class PartyScreenTicTacToeConfig : CMenuParty + { + // Version number for theme files. Increment it, if you've changed something on the theme files! + const int ScreenVersion = 1; + + const string SelectSlideNumPlayerTeam1 = "SelectSlideNumPlayerTeam1"; + const string SelectSlideNumPlayerTeam2 = "SelectSlideNumPlayerTeam2"; + const string SelectSlideNumFields = "SelectSlideNumFields"; + const string SelectSlidePlaylist = "SelectSlidePlaylist"; + const string ButtonNext = "ButtonNext"; + const string ButtonBack = "ButtonBack"; + + private bool ConfigOk = true; + + DataFromScreen Data; + + public PartyScreenTicTacToeConfig() + { + } + + protected override void Init() + { + base.Init(); + + _ThemeName = "PartyScreenTicTacToeConfig"; + _ThemeSelectSlides = new string[] { SelectSlideNumPlayerTeam1, SelectSlideNumPlayerTeam2, SelectSlideNumFields, SelectSlidePlaylist }; + _ThemeButtons = new string[] { ButtonNext, ButtonBack }; + _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenConfig config = new FromScreenConfig(); + config.PlaylistID = 0; + config.NumFields = 9; + config.NumPlayerTeam1 = 2; + config.NumPlayerTeam2 = 2; + Data.ScreenConfig = config; + } + + public override void LoadTheme(string XmlPath) + { + base.LoadTheme(XmlPath); + } + + public override void DataToScreen(object ReceivedData) + { + DataToScreenConfig config = new DataToScreenConfig(); + + try + { + config = (DataToScreenConfig)ReceivedData; + Data.ScreenConfig.NumFields = config.NumFields; + Data.ScreenConfig.NumPlayerTeam1 = config.NumPlayerTeam1; + Data.ScreenConfig.NumPlayerTeam2 = config.NumPlayerTeam2; + Data.ScreenConfig.PlaylistID = config.PlaylistID; + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode screen TicTacToe config. Can't cast received data from game mode " + _ThemeName + ". " + e.Message);; + } + + } + + public override bool HandleInput(KeyEvent KeyEvent) + { + base.HandleInput(KeyEvent); + + if (KeyEvent.KeyPressed) + { + + } + else + { + switch (KeyEvent.Key) + { + case Keys.Back: + case Keys.Escape: + Back(); + break; + + case Keys.Enter: + UpdateSlides(); + + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + break; + + case Keys.Left: + UpdateSlides(); + break; + + case Keys.Right: + UpdateSlides(); + break; + } + } + return true; + } + + public override bool HandleMouse(MouseEvent MouseEvent) + { + base.HandleMouse(MouseEvent); + + if (MouseEvent.LB && IsMouseOver(MouseEvent)) + { + UpdateSlides(); + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + } + + if (MouseEvent.RB) + { + Back(); + } + + return true; + } + + public override void OnShow() + { + base.OnShow(); + + if (_Base.Config.GetMaxNumMics() >= 2) + ConfigOk = true; + + FillSlides(); + UpdateSlides(); + } + + public override bool UpdateGame() + { + Buttons[htButtons(ButtonNext)].Visible = ConfigOk; + return true; + } + + public override bool Draw() + { + base.Draw(); + return true; + } + + public override void OnClose() + { + base.OnClose(); + } + + private void FillSlides() + { + // build num player slide (min player ... max player); + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam1)].Clear(); + for (int i = _PartyMode.GetMinPlayer()/2; i <= _PartyMode.GetMaxPlayer() / 2; i++) + { + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam1)].AddValue(i.ToString()); + } + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam1)].Selection = Data.ScreenConfig.NumPlayerTeam1 - (_PartyMode.GetMinPlayer()/2); + + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam2)].Clear(); + for (int i = _PartyMode.GetMinPlayer()/2; i <= _PartyMode.GetMaxPlayer() / 2; i++) + { + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam2)].AddValue(i.ToString()); + } + SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam2)].Selection = Data.ScreenConfig.NumPlayerTeam2 -( _PartyMode.GetMinPlayer()/2); + + SelectSlides[htSelectSlides(SelectSlideNumFields)].Clear(); + SelectSlides[htSelectSlides(SelectSlideNumFields)].AddValue("9"); + SelectSlides[htSelectSlides(SelectSlideNumFields)].AddValue("16"); + SelectSlides[htSelectSlides(SelectSlideNumFields)].AddValue("25"); + if (Data.ScreenConfig.NumFields == 9) + SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection = 0; + else if (Data.ScreenConfig.NumFields == 16) + SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection = 1; + else if (Data.ScreenConfig.NumFields == 25) + SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection = 2; + + string[] _Playlists = _Base.Playlist.GetPlaylistNames(); + SelectSlides[htSelectSlides(SelectSlidePlaylist)].Clear(); + for (int i = 0; i < _Playlists.Length; i++) + { + string value = _Playlists[i] + " (" + _Base.Playlist.GetPlaylistSongCount(i) + " " + _Base.Language.Translate("TR_SONGS", _PartyModeID) + ")"; + SelectSlides[htSelectSlides(SelectSlidePlaylist)].AddValue(value); + } + SelectSlides[htSelectSlides(SelectSlidePlaylist)].Selection = Data.ScreenConfig.PlaylistID; + + } + + private void UpdateSlides() + { + Data.ScreenConfig.NumPlayerTeam1 = SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam1)].Selection + (_PartyMode.GetMinPlayer()/2); + Data.ScreenConfig.NumPlayerTeam2 = SelectSlides[htSelectSlides(SelectSlideNumPlayerTeam2)].Selection + (_PartyMode.GetMinPlayer()/2); + + if (SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection == 0) + Data.ScreenConfig.NumFields = 9; + else if (SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection == 1) + Data.ScreenConfig.NumFields = 16; + else if (SelectSlides[htSelectSlides(SelectSlideNumFields)].Selection == 2) + Data.ScreenConfig.NumFields = 25; + + Data.ScreenConfig.PlaylistID = SelectSlides[htSelectSlides(SelectSlidePlaylist)].Selection; + + if (_Base.Playlist.GetPlaylistSongCount(Data.ScreenConfig.PlaylistID) <= 0) + ConfigOk = false; + else + ConfigOk = true; + } + + private void Back() + { + FadeTo(EScreens.ScreenParty); + } + + private void Next() + { + _PartyMode.DataFromScreen(_ThemeName, Data); + } + } +} diff --git a/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs b/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs new file mode 100644 index 00000000..562a2913 --- /dev/null +++ b/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs @@ -0,0 +1,500 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +using Vocaluxe.Menu; + +namespace Vocaluxe.PartyModes +{ + public class Field + { + public Round Content; + public CButton Button; + } + + public enum EStatus + { + FieldChoosing, + JokerRetry, + FieldSelected, + None + } + + public class PartyScreenTicTacToeMain : CMenuParty + { + // Version number for theme files. Increment it, if you've changed something on the theme files! + const int ScreenVersion = 1; + + const string TextPopupReallyExit = "TextPopupReallyExit"; + const string TextTeamChoosing = "TextTeamChoosing"; + const string TextNextPlayerT1 = "TextNextPlayerT1"; + const string TextNextPlayerT2 = "TextNextPlayerT2"; + const string TextNextPlayerNameT1 = "TextNextPlayerNameT1"; + const string TextNextPlayerNameT2 = "TextNextPlayerNameT2"; + + const string ButtonNextRound = "ButtonNextRound"; + const string ButtonBack = "ButtonBack"; + const string ButtonExit = "ButtonExit"; + const string ButtonPopupYes = "ButtonPopupYes"; + const string ButtonPopupNo = "ButtonPopupNo"; + const string ButtonField = "ButtonField"; + + const string ButtonJokerRandomT1 = "ButtonJokerRandomT1"; + const string ButtonJokerRandomT2 = "ButtonJokerRandomT2"; + const string ButtonJokerRetryT1 = "ButtonJokerRetryT1"; + const string ButtonJokerRetryT2 = "ButtonJokerRetryT2"; + + + const string StaticPopupBG = "StaticPopupBG"; + const string StaticAvatarT1 = "StaticAvatarT1"; + const string StaticAvatarT2 = "StaticAvatarT2"; + + private bool ExitPopupVisible = false; + + private DataFromScreen Data; + private DataToScreenMain GameData; + + private List Fields; + private float FieldFirstX = 25; + private float FieldFirstY = 25; + private int FieldSpace = 10; + private float FieldSize = 100; + + private int PreviewStream = -1; + private int SelectedField = -1; + + private EStatus Action; + + public PartyScreenTicTacToeMain() + { + } + + protected override void Init() + { + base.Init(); + + _ThemeName = "PartyScreenTicTacToeMain"; + _ThemeTexts = new string[] { TextPopupReallyExit, TextTeamChoosing, TextNextPlayerT1, TextNextPlayerT2, TextNextPlayerNameT1, TextNextPlayerNameT2 }; + _ThemeButtons = new string[] { ButtonNextRound, ButtonBack, ButtonExit, ButtonPopupYes, ButtonPopupNo, ButtonField, ButtonJokerRandomT1, ButtonJokerRandomT2, ButtonJokerRetryT1, ButtonJokerRetryT2 }; + _ThemeStatics = new string[] { StaticPopupBG, StaticAvatarT1, StaticAvatarT2 }; + _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenMain config = new FromScreenMain(); + GameData = new DataToScreenMain(); + config.SingRoundNr = 1; + config.Rounds = new List(); + config.Songs = new List(); + config.FadeToNameSelection = false; + config.FadeToSinging = false; + Data.ScreenMain = config; + + Fields = new List(); + } + + public override void LoadTheme(string XmlPath) + { + base.LoadTheme(XmlPath); + + CreateFields(); + Buttons[htButtons(ButtonField)].Visible = false; + } + + public override void DataToScreen(object ReceivedData) + { + DataToScreenMain config = new DataToScreenMain(); + + try + { + config = (DataToScreenMain)ReceivedData; + GameData = config; + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode screen TicTacToe main. Can't cast received data from game mode " + _ThemeName + ". " + e.Message); ; + } + + } + + public override bool HandleInput(KeyEvent KeyEvent) + { + base.HandleInput(KeyEvent); + + if (KeyEvent.KeyPressed) + { + + } + else + { + switch (KeyEvent.Key) + { + case Keys.Back: + case Keys.Escape: + if (!ExitPopupVisible) + if (GameData.CurrentRoundNr == 1 && Action != EStatus.FieldSelected) + Back(); + else + ShowPopup(true); + else + ShowPopup(false); + break; + + case Keys.Enter: + if (!ExitPopupVisible) + { + if (Buttons[htButtons(ButtonNextRound)].Selected) + NextRound(); + if (Buttons[htButtons(ButtonBack)].Selected && GameData.CurrentRoundNr == 1 && Action != EStatus.FieldSelected) + Back(); + if (Buttons[htButtons(ButtonExit)].Selected && (GameData.CurrentRoundNr > 1 || Action == EStatus.FieldSelected)) + ShowPopup(true); + } + else + { + if (Buttons[htButtons(ButtonPopupYes)].Selected) + EndParty(); + if (Buttons[htButtons(ButtonPopupNo)].Selected) + ShowPopup(false); + } + break; + } + } + return true; + } + + public override bool HandleMouse(MouseEvent MouseEvent) + { + base.HandleMouse(MouseEvent); + + if (MouseEvent.LB && IsMouseOver(MouseEvent)) + { + if (!ExitPopupVisible) + { + if (Buttons[htButtons(ButtonNextRound)].Selected) + NextRound(); + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + if (Buttons[htButtons(ButtonExit)].Selected) + ShowPopup(true); + for (int i = 0; i < GameData.NumFields; i++) + { + switch (Action) + { + case EStatus.FieldChoosing: + if (Fields[i].Button.Selected) + { + SelectedField = i; + FieldSelected(); + } + break; + + case EStatus.JokerRetry: + if (Fields[i].Button.Selected) + { + SelectedField = i; + FieldSelected(); + } + break; + } + + } + } + else + { + if (Buttons[htButtons(ButtonPopupYes)].Selected) + EndParty(); + if (Buttons[htButtons(ButtonPopupNo)].Selected) + ShowPopup(false); + } + } + + if (MouseEvent.RB) + { + if (!ExitPopupVisible) + if (GameData.CurrentRoundNr == 1 && Action != EStatus.FieldSelected) + Back(); + else + ShowPopup(true); + else + ShowPopup(false); + } + + if (MouseEvent.Wheel != 0) + { + } + + return true; + } + + public override void OnShow() + { + base.OnShow(); + + PreviewStream = -1; + + if (GameData.CurrentRoundNr == 1) + { + SelectedField = -1; + Buttons[htButtons(ButtonBack)].Visible = true; + Buttons[htButtons(ButtonExit)].Visible = false; + } + else + { + Buttons[htButtons(ButtonBack)].Visible = false; + Buttons[htButtons(ButtonExit)].Visible = true; + } + + if (GameData.CurrentRoundNr <= GameData.NumFields) + { + Action = EStatus.FieldChoosing; + Texts[htTexts(TextTeamChoosing)].Color = _Base.Theme.GetPlayerColor(GameData.Team + 1); + Texts[htTexts(TextTeamChoosing)].Text = _Base.Language.Translate("TR_TEAM", _PartyModeID) + " " + (GameData.Team + 1) + "! " + _Base.Language.Translate("TR_SCREENMAIN_TEAM_CHOOSE", _PartyModeID); + Texts[htTexts(TextNextPlayerT1)].Visible = false; + Texts[htTexts(TextNextPlayerT2)].Visible = false; + Texts[htTexts(TextNextPlayerNameT1)].Visible = false; + Texts[htTexts(TextNextPlayerNameT2)].Visible = false; + Statics[htStatics(StaticAvatarT1)].Visible = false; + Statics[htStatics(StaticAvatarT2)].Visible = false; + Buttons[htButtons(ButtonJokerRandomT1)].Visible = false; + Buttons[htButtons(ButtonJokerRandomT2)].Visible = false; + Buttons[htButtons(ButtonJokerRetryT1)].Visible = false; + Buttons[htButtons(ButtonJokerRetryT2)].Visible = false; + Buttons[htButtons(ButtonNextRound)].Visible = false; + //Texts[htTexts(TextFinishMessage)].Visible = false; + //Texts[htTexts(TextFinishPlayerWin)].Visible = false; + SetInteractionToButton(Buttons[htButtons(ButtonNextRound)]); + } + else + { + Action = EStatus.None; + Buttons[htButtons(ButtonNextRound)].Visible = false; + //Texts[htTexts(TextFinishMessage)].Visible = true; + //Texts[htTexts(TextFinishPlayerWin)].Visible = true; + //Texts[htTexts(TextFinishPlayerWin)].Text = GetPlayerWinString(); + SetInteractionToButton(Buttons[htButtons(ButtonExit)]); + } + + UpdateFields(); + UpdateFieldContents(); + + ShowPopup(false); + } + + public override bool UpdateGame() + { + return true; + } + + public override bool Draw() + { + base.Draw(); + return true; + } + + public override void OnClose() + { + base.OnClose(); + _Base.Sound.FadeAndStop(PreviewStream, 0f, 0.5f); + } + + private void CreateFields() + { + for (int i = 0; i < 25; i++) + { + Field f = new Field(); + f.Button = GetNewButton(Buttons[htButtons(ButtonField)]); + f.Button.Visible = false; + f.Content = new Round(); + AddButton(f.Button); + Fields.Add(f); + } + } + + private void UpdateFields() + { + int NumOneRow = (int)Math.Sqrt((double)GameData.NumFields); + float FieldSizeY = (_Base.Settings.GetRenderH() - 150 - NumOneRow * FieldSpace) / NumOneRow; + float FieldSizeX = (_Base.Settings.GetRenderW() - 300 - NumOneRow * FieldSpace) / NumOneRow; + if (FieldSizeX < FieldSizeY) + FieldSize = FieldSizeX; + else + FieldSize = FieldSizeY; + FieldFirstX = _Base.Settings.GetRenderW() / 2 - (NumOneRow * FieldSize + (NumOneRow - 1) * FieldSpace) / 2; + FieldFirstY = 140 + (_Base.Settings.GetRenderH() - 140) / 2 - (NumOneRow * FieldSize + NumOneRow * FieldSpace) / 2; + int row = 0; + int column = 0; + float x = FieldFirstX; + float y = FieldFirstY; + for (int i = 0; i < Fields.Count; i++) + { + if (i < GameData.NumFields) + { + Fields[i].Button.Rect.W = FieldSize; + Fields[i].Button.Rect.H = FieldSize; + Fields[i].Button.Rect.X = x; + Fields[i].Button.Rect.Y = y; + Fields[i].Button.Visible = true; + Fields[i].Button.Enabled = true; + column++; + if ((i+1) >= NumOneRow * (row+1)) + { + column = 0; + row++; + y = FieldFirstY + FieldSize * row + FieldSpace * row; + x = FieldFirstX; + } + else + x = FieldFirstX + FieldSize * column + FieldSpace * column; + } + else + { + Fields[i].Button.Visible = false; + Fields[i].Button.Enabled = false; + } + } + } + + private void UpdateFieldContents() + { + for (int i = 0; i < GameData.Rounds.Count; i++) + { + Fields[i].Button.Enabled = true; + Fields[i].Button.Texture = Buttons[htButtons(ButtonField)].Texture; + Fields[i].Button.Color = Buttons[htButtons(ButtonField)].Color; + Fields[i].Button.SColor = Buttons[htButtons(ButtonField)].SColor; + Fields[i].Content = GameData.Rounds[i]; + if (Fields[i].Content.Finished) + { + Fields[i].Button.Enabled = false; + Fields[i].Button.Texture = _Base.Songs.GetSongByID(Fields[i].Content.SongID).CoverTextureBig; + Fields[i].Button.Color = _Base.Theme.GetPlayerColor(Fields[i].Content.Winner); + Fields[i].Button.SColor = _Base.Theme.GetPlayerColor(Fields[i].Content.Winner); + } + if (Action == EStatus.FieldSelected && SelectedField == i) + { + Fields[i].Button.Texture = _Base.Songs.GetSongByID(Fields[i].Content.SongID).CoverTextureBig; + Fields[i].Button.Color = new SColorF(1, 1, 1, 1); + Fields[i].Button.SColor = new SColorF(1, 1, 1, 1); + Fields[i].Button.Enabled = false; + } + if (Action == EStatus.JokerRetry && Fields[i].Content.Finished) + { + Fields[i].Button.Enabled = true; + } + if (Action == EStatus.JokerRetry && !Fields[i].Content.Finished) + { + Fields[i].Button.Enabled = false; + } + if(Action == EStatus.FieldSelected) + { + Fields[i].Button.Enabled = false; + } + } + } + + private void FieldSelected() + { + int SongID = 0; + if (GameData.Songs.Count > 0) + { + SongID = GameData.Songs[0]; + GameData.Songs.RemoveAt(0); + } + Menu.SongMenu.CSong Song = _Base.Songs.GetSongByID(SongID); + if(_Base.BackgroundMusic.IsPlaying()) + _Base.BackgroundMusic.Pause(); + PreviewStream = _Base.Sound.Load(Song.GetMP3(), false); + _Base.Sound.SetPosition(PreviewStream, Song.PreviewStart); + _Base.Sound.SetStreamVolume(PreviewStream, 0f); + _Base.Sound.Play(PreviewStream); + _Base.Sound.Fade(PreviewStream, _Base.Config.GetBackgroundMusicVolume(), 1f); + Action = EStatus.FieldSelected; + Fields[SelectedField].Content.SongID = SongID; + GameData.Rounds[SelectedField].SongID = SongID; + UpdateFieldContents(); + + Texts[htTexts(TextNextPlayerT1)].Visible = true; + Texts[htTexts(TextNextPlayerT2)].Visible = true; + Texts[htTexts(TextNextPlayerNameT1)].Visible = true; + Texts[htTexts(TextNextPlayerNameT2)].Visible = true; + SProfile[] profiles = _Base.Profiles.GetProfiles(); + Texts[htTexts(TextNextPlayerNameT1)].Text = profiles[GameData.ProfileIDsTeam1[GameData.Rounds[SelectedField].SingerTeam1]].PlayerName; + Texts[htTexts(TextNextPlayerNameT2)].Text = profiles[GameData.ProfileIDsTeam2[GameData.Rounds[SelectedField].SingerTeam2]].PlayerName; + Statics[htStatics(StaticAvatarT1)].Visible = true; + Statics[htStatics(StaticAvatarT2)].Visible = true; + Statics[htStatics(StaticAvatarT1)].Texture = profiles[GameData.ProfileIDsTeam1[GameData.Rounds[SelectedField].SingerTeam1]].Avatar.Texture; + Statics[htStatics(StaticAvatarT2)].Texture = profiles[GameData.ProfileIDsTeam2[GameData.Rounds[SelectedField].SingerTeam2]].Avatar.Texture; + + Buttons[htButtons(ButtonJokerRandomT1)].Visible = true; + Buttons[htButtons(ButtonJokerRandomT2)].Visible = true; + Buttons[htButtons(ButtonJokerRandomT1)].Text.Text = GameData.NumJokerRandom[0].ToString(); + Buttons[htButtons(ButtonJokerRandomT2)].Text.Text = GameData.NumJokerRandom[1].ToString(); + Buttons[htButtons(ButtonJokerRetryT1)].Visible = true; + Buttons[htButtons(ButtonJokerRetryT2)].Visible = true; + Buttons[htButtons(ButtonJokerRetryT1)].Text.Text = GameData.NumJokerRetry[0].ToString(); + Buttons[htButtons(ButtonJokerRetryT2)].Text.Text = GameData.NumJokerRetry[1].ToString(); + + Buttons[htButtons(ButtonNextRound)].Visible = true; + Buttons[htButtons(ButtonExit)].Visible = true; + Buttons[htButtons(ButtonBack)].Visible = false; + } + + private void NextRound() + { + _Base.Sound.FadeAndStop(PreviewStream, 0f, 0.5f); + Data.ScreenMain.Rounds = GameData.Rounds; + Data.ScreenMain.FadeToNameSelection = false; + Data.ScreenMain.FadeToSinging = true; + Data.ScreenMain.Songs = GameData.Songs; + Data.ScreenMain.SingRoundNr = SelectedField; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + + private void EndParty() + { + _Base.Sound.FadeAndStop(PreviewStream, 0f, 0.5f); + FadeTo(EScreens.ScreenParty); + } + + private void ShowPopup(bool Visible) + { + ExitPopupVisible = Visible; + + Statics[htStatics(StaticPopupBG)].Visible = ExitPopupVisible; + Texts[htTexts(TextPopupReallyExit)].Visible = ExitPopupVisible; + Buttons[htButtons(ButtonPopupYes)].Visible = ExitPopupVisible; + Buttons[htButtons(ButtonPopupNo)].Visible = ExitPopupVisible; + + if (ExitPopupVisible) + SetInteractionToButton(Buttons[htButtons(ButtonPopupNo)]); + } + + private void Back() + { + _Base.Sound.FadeAndStop(PreviewStream, 0f, 0.5f); + Data.ScreenMain.FadeToNameSelection = true; + Data.ScreenMain.FadeToSinging = false; + Data.ScreenMain.SingRoundNr = SelectedField; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + + private string GetPlayerWinString() + { + string s = ""; + SProfile[] profiles = _Base.Profiles.GetProfiles(); + /** + for (int i = 0; i < GameState.ResultTable.Count; i++) + { + if (i > 0) + s += ", "; + if (GameState.ResultTable[i].Position == 1) + s += profiles[GameState.ResultTable[i].PlayerID].PlayerName; + else + break; + } + **/ + return s; + } + } +} diff --git a/PartyModeTicTacToe/PartyScreenTicTacToeNames.cs b/PartyModeTicTacToe/PartyScreenTicTacToeNames.cs new file mode 100644 index 00000000..a566b568 --- /dev/null +++ b/PartyModeTicTacToe/PartyScreenTicTacToeNames.cs @@ -0,0 +1,640 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +using Vocaluxe.Menu; + +namespace Vocaluxe.PartyModes +{ + public class PartyScreenTicTacToeNames : CMenuParty + { + // Version number for theme files. Increment it, if you've changed something on the theme files! + const int ScreenVersion = 1; + + const string ButtonNext = "ButtonNext"; + const string ButtonBack = "ButtonBack"; + const string ButtonPlayerDestination = "ButtonPlayerDestination"; + const string ButtonPlayerChoose = "ButtonPlayerChoose"; + + private List PlayerChooseButtons; + private List PlayerDestinationButtons; + //PlayerDestinationButtons-Option + private const int PlayerDestinationButtonsNumH = 10; + private const int PlayerDestinationButtonsNumW = 2; + private const int PlayerDestinationButtonsFirstX = 58; + private const int PlayerDestinationButtonsFirstY = 400; + private const int PlayerDestinationButtonsSpaceH = 15; + private const int PlayerDestinationButtonsSpaceW = 25; + //PlayerChooseButtons-Option + private List PlayerChooseButtonsVisibleProfiles; + private const int PlayerChooseButtonsNumH = 10; + private const int PlayerChooseButtonsNumW = 2; + private const int PlayerChooseButtonsFirstX = 58; + private const int PlayerChooseButtonsFirstY = 105; + private const int PlayerChooseButtonsSpaceH = 15; + private const int PlayerChooseButtonsSpaceW = 25; + private int PlayerChooseButtonsOffset = 0; + + private CStatic chooseAvatarStatic; + private bool SelectingMouseActive = false; + private int OldMouseX = 0; + private int OldMouseY = 0; + private int SelectedPlayerNr = -1; + private bool ButtonsAdded = false; + + private int NumPlayerTeam1 = 2; + private int NumPlayerTeam2 = 2; + + private DataFromScreen Data; + + private class CPlayerChooseButton + { + public CButton Button; + public int ProfileID; + } + + public PartyScreenTicTacToeNames() + { + } + + protected override void Init() + { + base.Init(); + + chooseAvatarStatic = GetNewStatic(); + chooseAvatarStatic.Visible = false; + + PlayerChooseButtonsVisibleProfiles = new List(); + + Data.ScreenNames.ProfileIDsTeam1 = new List(); + Data.ScreenNames.ProfileIDsTeam2 = new List(); + + _ThemeName = "PartyScreenTicTacToeNames"; + List buttons = new List(); + _ThemeButtons = new string[] { ButtonBack, ButtonNext, ButtonPlayerDestination, ButtonPlayerChoose }; + _ScreenVersion = ScreenVersion; + + Data = new DataFromScreen(); + FromScreenNames names = new FromScreenNames(); + names.FadeToConfig = false; + names.FadeToMain = false; + names.ProfileIDsTeam1 = new List(); + names.ProfileIDsTeam2 = new List(); + Data.ScreenNames = names; + } + + public override void LoadTheme(string XmlPath) + { + base.LoadTheme(XmlPath); + } + + public override void DataToScreen(object ReceivedData) + { + DataToScreenNames config = new DataToScreenNames(); + + try + { + config = (DataToScreenNames)ReceivedData; + Data.ScreenNames.ProfileIDsTeam1 = config.ProfileIDsTeam1; + Data.ScreenNames.ProfileIDsTeam2 = config.ProfileIDsTeam2; + if (Data.ScreenNames.ProfileIDsTeam1 == null) + Data.ScreenNames.ProfileIDsTeam1 = new List(); + if (Data.ScreenNames.ProfileIDsTeam2 == null) + Data.ScreenNames.ProfileIDsTeam2 = new List(); + + NumPlayerTeam1 = config.NumPlayerTeam1; + NumPlayerTeam2 = config.NumPlayerTeam2; + + while (Data.ScreenNames.ProfileIDsTeam1.Count > NumPlayerTeam1) + { + Data.ScreenNames.ProfileIDsTeam1.RemoveAt(Data.ScreenNames.ProfileIDsTeam1.Count - 1); + } + while (Data.ScreenNames.ProfileIDsTeam2.Count > NumPlayerTeam2) + { + Data.ScreenNames.ProfileIDsTeam2.RemoveAt(Data.ScreenNames.ProfileIDsTeam2.Count - 1); + } + + + } + catch (Exception e) + { + _Base.Log.LogError("Error in party mode screen TicTacToe names. Can't cast received data from game mode " + _ThemeName + ". " + e.Message); ; + } + + } + + public override bool HandleInput(KeyEvent KeyEvent) + { + base.HandleInput(KeyEvent); + + if (KeyEvent.KeyPressed) + { + + } + else + { + switch (KeyEvent.Key) + { + case Keys.Back: + case Keys.Escape: + Back(); + break; + + case Keys.Enter: + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + + if (!OnAdd()) + OnRemove(); + break; + + case Keys.Delete: + OnRemove(); + break; + } + } + return true; + } + + public override bool HandleMouse(MouseEvent MouseEvent) + { + base.HandleMouse(MouseEvent); + + + //Check if LeftButton is hold and Select-Mode inactive + if (MouseEvent.LBH && !SelectingMouseActive) + { + //Save mouse-coords + OldMouseX = MouseEvent.X; + OldMouseY = MouseEvent.Y; + //Check if mouse if over tile + for (int i = 0; i < PlayerChooseButtons.Count; i++) + { + if (PlayerChooseButtons[i].Button.Selected) + { + SelectedPlayerNr = PlayerChooseButtons[i].ProfileID; + if (SelectedPlayerNr != -1) + { + //Activate mouse-selecting + SelectingMouseActive = true; + //Update of Drag/Drop-Texture + chooseAvatarStatic.Visible = true; + chooseAvatarStatic.Rect = PlayerChooseButtons[i].Button.Rect; + chooseAvatarStatic.Rect.Z = -100; + chooseAvatarStatic.Color = new SColorF(1, 1, 1, 1); + chooseAvatarStatic.Texture = _Base.Profiles.GetProfiles()[SelectedPlayerNr].Avatar.Texture; + } + } + } + } + + //Check if LeftButton is hold and Select-Mode active + if (MouseEvent.LBH && SelectingMouseActive) + { + //Update coords for Drag/Drop-Texture + chooseAvatarStatic.Rect.X += (MouseEvent.X - OldMouseX); + chooseAvatarStatic.Rect.Y += (MouseEvent.Y - OldMouseY); + OldMouseX = MouseEvent.X; + OldMouseY = MouseEvent.Y; + } + // LeftButton isn't hold anymore, but Selec-Mode is still active -> "Drop" of Avatar + else if (SelectingMouseActive) + { + //Check if really a player was selected + if (SelectedPlayerNr != -1) + { + //Foreach Drop-Area + for (int i = 0; i < PlayerDestinationButtons.Count; i++) + { + //Check first, if area is "active" + if (PlayerDestinationButtons[i].Visible == true) + { + //Check if Mouse is in area + if (CHelper.IsInBounds(PlayerDestinationButtons[i].Rect, MouseEvent)) + { + int added = -1; + //Add Player-ID to list. + if (i - PlayerDestinationButtonsNumW < 0) + { + if (Data.ScreenNames.ProfileIDsTeam1.Count < (i + 1)) + { + Data.ScreenNames.ProfileIDsTeam1.Add(SelectedPlayerNr); + added = Data.ScreenNames.ProfileIDsTeam1.Count - 1; + } + else if (Data.ScreenNames.ProfileIDsTeam1.Count >= (i + 1)) + { + Data.ScreenNames.ProfileIDsTeam1[i] = SelectedPlayerNr; + added = i; + } + } + else if (i - PlayerDestinationButtonsNumW >= 0) + { + if (Data.ScreenNames.ProfileIDsTeam2.Count < (i + 1)) + { + Data.ScreenNames.ProfileIDsTeam2.Add(SelectedPlayerNr); + added = Data.ScreenNames.ProfileIDsTeam2.Count - 1; + } + else if (Data.ScreenNames.ProfileIDsTeam2.Count >= (i + 1)) + { + Data.ScreenNames.ProfileIDsTeam2[i] = SelectedPlayerNr; + added = i; + } + } + UpdateButtonNext(); + //Update texture and name + PlayerDestinationButtons[added].Color = new SColorF(1, 1, 1, 0.6f); + PlayerDestinationButtons[added].SColor = new SColorF(1, 1, 1, 1); + PlayerDestinationButtons[added].Texture = chooseAvatarStatic.Texture; + PlayerDestinationButtons[added].STexture = chooseAvatarStatic.Texture; + PlayerDestinationButtons[added].Text.Text = _Base.Profiles.GetProfiles()[SelectedPlayerNr].PlayerName; + //Update Tiles-List + UpdateButtonPlayerChoose(); + } + } + } + SelectedPlayerNr = -1; + } + //Reset variables + SelectingMouseActive = false; + chooseAvatarStatic.Visible = false; + } + + if (MouseEvent.LB && IsMouseOver(MouseEvent)) + { + if (Buttons[htButtons(ButtonBack)].Selected) + Back(); + + if (Buttons[htButtons(ButtonNext)].Selected) + Next(); + + if (!OnAdd()) + OnRemove(); + } + + if (MouseEvent.RB) + { + Back(); + } + + return true; + } + + public override void OnShow() + { + base.OnShow(); + + if (!ButtonsAdded) + { + AddButtonPlayerDestination(); + AddButtonPlayerChoose(); + ButtonsAdded = true; + } + + UpdateButtonPlayerDestination(); + UpdateButtonPlayerChoose(); + + UpdateButtonNext(); + } + + public override bool UpdateGame() + { + return true; + } + + public override bool Draw() + { + base.Draw(); + if (chooseAvatarStatic.Visible) + chooseAvatarStatic.Draw(); + return true; + } + + public override void OnClose() + { + base.OnClose(); + } + + private void AddButtonPlayerDestination() + { + Buttons[htButtons(ButtonPlayerDestination)].Visible = false; + PlayerDestinationButtons = new List(); + int row = 0; + int column = 0; + for (int i = 1; i <= _PartyMode.GetMaxPlayer(); i++) + { + CButton b = GetNewButton(Buttons[htButtons(ButtonPlayerDestination)]); + b.Rect.X = PlayerDestinationButtonsFirstX + column * (b.Rect.W + PlayerDestinationButtonsSpaceH); + b.Rect.Y = PlayerDestinationButtonsFirstY + row * (b.Rect.H + PlayerDestinationButtonsSpaceW); + PlayerDestinationButtons.Add(b); + column++; + if (column >= PlayerDestinationButtonsNumH) + { + row++; + column = 0; + } + b.Visible = true; + b.Enabled = false; + AddButton(b); + } + } + + private void AddButtonPlayerChoose() + { + Buttons[htButtons(ButtonPlayerChoose)].Visible = false; + PlayerChooseButtons = new List(); + int row = 0; + int column = 0; + for (int i = 1; i <= PlayerChooseButtonsNumH * PlayerChooseButtonsNumW; i++) + { + CButton b = GetNewButton(Buttons[htButtons(ButtonPlayerChoose)]); + b.Rect.X = PlayerChooseButtonsFirstX + column * (b.Rect.W + PlayerChooseButtonsSpaceH); + b.Rect.Y = PlayerChooseButtonsFirstY + row * (b.Rect.H + PlayerChooseButtonsSpaceW); + CPlayerChooseButton pcb = new CPlayerChooseButton(); + pcb.Button = b; + pcb.ProfileID = -1; + PlayerChooseButtons.Add(pcb); + column++; + if (column >= PlayerChooseButtonsNumH) + { + row++; + column = 0; + } + b.Visible = true; + b.Enabled = false; + AddButton(b); + } + } + + private void UpdateButtonPlayerChoose() + { + UpdateVisibleProfiles(); + if ((PlayerChooseButtonsNumW * PlayerChooseButtonsNumH) * (PlayerChooseButtonsOffset + 1) - PlayerChooseButtonsVisibleProfiles.Count >= (PlayerChooseButtonsNumW * PlayerChooseButtonsNumH) * PlayerChooseButtonsOffset) + { + UpdateButtonPlayerChoose(PlayerChooseButtonsOffset - 1); + } + else + { + UpdateButtonPlayerChoose(PlayerChooseButtonsOffset); + } + } + + private void UpdateButtonPlayerChoose(int Offset) + { + int NumButtonPlayerChoose = PlayerChooseButtonsNumW * PlayerChooseButtonsNumH; + if (Offset < 0) + Offset = 0; + + if (NumButtonPlayerChoose * (Offset + 1) - PlayerChooseButtonsVisibleProfiles.Count <= NumButtonPlayerChoose) + { + for (int i = 0; i < NumButtonPlayerChoose; i++) + { + if ((i + Offset * NumButtonPlayerChoose) < PlayerChooseButtonsVisibleProfiles.Count) + { + PlayerChooseButtons[i].ProfileID = PlayerChooseButtonsVisibleProfiles[i + Offset * NumButtonPlayerChoose]; + PlayerChooseButtons[i].Button.Text.Text = _Base.Profiles.GetProfiles()[PlayerChooseButtonsVisibleProfiles[i + Offset * NumButtonPlayerChoose]].PlayerName; + PlayerChooseButtons[i].Button.Texture = _Base.Profiles.GetProfiles()[PlayerChooseButtonsVisibleProfiles[i + Offset * NumButtonPlayerChoose]].Avatar.Texture; + PlayerChooseButtons[i].Button.STexture = _Base.Profiles.GetProfiles()[PlayerChooseButtonsVisibleProfiles[i + Offset * NumButtonPlayerChoose]].Avatar.Texture; + PlayerChooseButtons[i].Button.Color = new SColorF(1, 1, 1, 0.6f); + PlayerChooseButtons[i].Button.SColor = new SColorF(1, 1, 1, 1); + PlayerChooseButtons[i].Button.Enabled = true; + } + else + { + PlayerChooseButtons[i].ProfileID = -1; + PlayerChooseButtons[i].Button.Text.Text = String.Empty; + PlayerChooseButtons[i].Button.Texture = Buttons[htButtons(ButtonPlayerChoose)].Texture; + PlayerChooseButtons[i].Button.STexture = Buttons[htButtons(ButtonPlayerChoose)].STexture; + PlayerChooseButtons[i].Button.Color = Buttons[htButtons(ButtonPlayerChoose)].Color; + PlayerChooseButtons[i].Button.SColor = Buttons[htButtons(ButtonPlayerChoose)].SColor; + PlayerChooseButtons[i].Button.Enabled = false; + } + } + } + } + + private void UpdateVisibleProfiles() + { + PlayerChooseButtonsVisibleProfiles.Clear(); + for (int i = 0; i < _Base.Profiles.GetProfiles().Length; i++) + { + bool visible = false; + //Show profile only if active + if (_Base.Profiles.GetProfiles()[i].Active == EOffOn.TR_CONFIG_ON) + { + visible = true; + + for (int p = 0; p < Data.ScreenNames.ProfileIDsTeam1.Count; p++) + { + //Don't show profile if is selected + if (Data.ScreenNames.ProfileIDsTeam1[p] == i) + { + visible = false; + break; + } + } + + for (int p = 0; p < Data.ScreenNames.ProfileIDsTeam2.Count; p++) + { + //Don't show profile if is selected + if (Data.ScreenNames.ProfileIDsTeam2[p] == i) + { + visible = false; + break; + } + } + } + if (visible) + { + PlayerChooseButtonsVisibleProfiles.Add(i); + } + } + } + + private void UpdateButtonPlayerDestination() + { + for (int i = 0; i < PlayerDestinationButtons.Count / 2; i++) + { + if (NumPlayerTeam1 > i) + { + PlayerDestinationButtons[i].Visible = true; + PlayerDestinationButtons[i].Enabled = true; + } + else + { + PlayerDestinationButtons[i].Visible = false; + PlayerDestinationButtons[i].Enabled = false; + } + } + for (int i = 0; i < PlayerDestinationButtons.Count / 2; i++) + { + if (NumPlayerTeam2 > i) + { + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Visible = true; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Enabled = true; + } + else + { + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Visible = false; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Enabled = false; + } + } + for (int i = 0; i < NumPlayerTeam1; i++) + { + if (i < Data.ScreenNames.ProfileIDsTeam1.Count) + { + if (Data.ScreenNames.ProfileIDsTeam1[i] != -1) + { + PlayerDestinationButtons[i].Color = new SColorF(1, 1, 1, 0.6f); + PlayerDestinationButtons[i].SColor = new SColorF(1, 1, 1, 1); + PlayerDestinationButtons[i].Texture = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam1[i]].Avatar.Texture; + PlayerDestinationButtons[i].STexture = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam1[i]].Avatar.Texture; + PlayerDestinationButtons[i].Text.Text = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam1[i]].PlayerName; + PlayerDestinationButtons[i].Enabled = true; + } + } + else + { + PlayerDestinationButtons[i].Color = Buttons[htButtons(ButtonPlayerDestination)].Color; + PlayerDestinationButtons[i].SColor = Buttons[htButtons(ButtonPlayerDestination)].SColor; + PlayerDestinationButtons[i].Texture = Buttons[htButtons(ButtonPlayerDestination)].Texture; + PlayerDestinationButtons[i].STexture = Buttons[htButtons(ButtonPlayerDestination)].STexture; + PlayerDestinationButtons[i].Text.Text = String.Empty; + PlayerDestinationButtons[i].Enabled = false; + } + } + for (int i = 0; i < NumPlayerTeam2; i++) + { + if (i < Data.ScreenNames.ProfileIDsTeam2.Count) + { + if (Data.ScreenNames.ProfileIDsTeam2[i] != -1) + { + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Color = new SColorF(1, 1, 1, 0.6f); + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].SColor = new SColorF(1, 1, 1, 1); + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Texture = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam2[i]].Avatar.Texture; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].STexture = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam2[i]].Avatar.Texture; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Text.Text = _Base.Profiles.GetProfiles()[Data.ScreenNames.ProfileIDsTeam2[i]].PlayerName; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Enabled = true; + } + } + else + { + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Color = Buttons[htButtons(ButtonPlayerDestination)].Color; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].SColor = Buttons[htButtons(ButtonPlayerDestination)].SColor; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Texture = Buttons[htButtons(ButtonPlayerDestination)].Texture; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].STexture = Buttons[htButtons(ButtonPlayerDestination)].STexture; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Text.Text = String.Empty; + PlayerDestinationButtons[i + PlayerDestinationButtonsNumH].Enabled = false; + } + } + } + + private void UpdateButtonNext() + { + if (Data.ScreenNames.ProfileIDsTeam1.Count == NumPlayerTeam1 && Data.ScreenNames.ProfileIDsTeam2.Count == NumPlayerTeam2) + { + Buttons[htButtons(ButtonNext)].Visible = true; + SetInteractionToButton(Buttons[htButtons(ButtonNext)]); + } + else + Buttons[htButtons(ButtonNext)].Visible = false; + } + + private bool OnAdd() + { + for (int i = 0; i < PlayerChooseButtons.Count; i++) + { + if (PlayerChooseButtons[i].Button.Selected && PlayerChooseButtons[i].ProfileID != -1) + { + if (Data.ScreenNames.ProfileIDsTeam1.Count < NumPlayerTeam1) + { + Data.ScreenNames.ProfileIDsTeam1.Add(PlayerChooseButtons[i].ProfileID); + int added = Data.ScreenNames.ProfileIDsTeam1.Count - 1; + UpdateButtonNext(); + //Update texture and name + PlayerDestinationButtons[added].Color = new SColorF(1, 1, 1, 0.6f); + PlayerDestinationButtons[added].SColor = new SColorF(1, 1, 1, 1); + PlayerDestinationButtons[added].Texture = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].Avatar.Texture; + PlayerDestinationButtons[added].STexture = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].Avatar.Texture; + PlayerDestinationButtons[added].Text.Text = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].PlayerName; + PlayerDestinationButtons[added].Enabled = true; + //Update Tiles-List + UpdateButtonPlayerChoose(); + CheckInteraction(); + return true; + } + else if (Data.ScreenNames.ProfileIDsTeam2.Count < NumPlayerTeam2) + { + Data.ScreenNames.ProfileIDsTeam2.Add(PlayerChooseButtons[i].ProfileID); + int added = (Data.ScreenNames.ProfileIDsTeam2.Count - 1) + PlayerDestinationButtonsNumH; + UpdateButtonNext(); + //Update texture and name + PlayerDestinationButtons[added].Color = new SColorF(1, 1, 1, 0.6f); + PlayerDestinationButtons[added].SColor = new SColorF(1, 1, 1, 1); + PlayerDestinationButtons[added].Texture = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].Avatar.Texture; + PlayerDestinationButtons[added].STexture = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].Avatar.Texture; + PlayerDestinationButtons[added].Text.Text = _Base.Profiles.GetProfiles()[PlayerChooseButtons[i].ProfileID].PlayerName; + PlayerDestinationButtons[added].Enabled = true; + //Update Tiles-List + UpdateButtonPlayerChoose(); + CheckInteraction(); + return true; + } + } + } + return false; + } + + private bool OnRemove() + { + for (int i = 0; i < PlayerDestinationButtonsNumH; i++) + { + if (PlayerDestinationButtons[i].Selected) + { + if ((i + 1) <= Data.ScreenNames.ProfileIDsTeam1.Count) + { + Data.ScreenNames.ProfileIDsTeam1.RemoveAt(i); + UpdateButtonNext(); + UpdateButtonPlayerDestination(); + UpdateButtonPlayerChoose(); + CheckInteraction(); + return true; + } + } + } + for (int i = PlayerDestinationButtonsNumW; i < PlayerDestinationButtonsNumH*2; i++) + { + if (PlayerDestinationButtons[i].Selected) + { + if (((i-PlayerDestinationButtonsNumW) + 1) <= Data.ScreenNames.ProfileIDsTeam2.Count) + { + Data.ScreenNames.ProfileIDsTeam2.RemoveAt(i); + UpdateButtonNext(); + UpdateButtonPlayerDestination(); + UpdateButtonPlayerChoose(); + CheckInteraction(); + return true; + } + } + } + return false; + } + + private void Back() + { + Data.ScreenNames.FadeToConfig = true; + Data.ScreenNames.FadeToMain = false; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + + private void Next() + { + Data.ScreenNames.FadeToConfig = false; + Data.ScreenNames.FadeToMain = true; + _PartyMode.DataFromScreen(_ThemeName, Data); + } + } +} diff --git a/Vocaluxe.sln b/Vocaluxe.sln index 3f653674..3c53f336 100644 --- a/Vocaluxe.sln +++ b/Vocaluxe.sln @@ -1,6 +1,6 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vocaluxe", "Vocaluxe\Vocaluxe.csproj", "{2A1E0F2D-5392-4BB7-B0A1-A9DFA13E79FF}" ProjectSection(ProjectDependencies) = postProject {6F3E1874-F28A-40E9-AFBD-31934D593679} = {6F3E1874-F28A-40E9-AFBD-31934D593679} @@ -9,7 +9,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vocaluxe", "Vocaluxe\Vocalu EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VocaluxeLib", "VocaluxeLib\VocaluxeLib.csproj", "{D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallenge", "PartyModeChallenge\PartyModeChallenge.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593679}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeTicTacToe", "PartyModeTicTacToe\PartyModeTicTacToe.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593679}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallenge", "PartyModeChallenge\PartyModeChallenge.csproj", "{162341B8-965F-46BC-9826-86B9A1E7F984}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -57,6 +59,22 @@ Global {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugLinux|x64.Build.0 = DebugLinux|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugLinux|x86.ActiveCfg = DebugLinux|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugLinux|x86.Build.0 = DebugLinux|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugWin|x64.Build.0 = DebugWin|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.DebugWin|x86.Build.0 = DebugWin|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {162341B8-965F-46BC-9826-86B9A1E7F984}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Vocaluxe/Base/CMain.cs b/Vocaluxe/Base/CMain.cs index e4bcb757..fd63e4d3 100644 --- a/Vocaluxe/Base/CMain.cs +++ b/Vocaluxe/Base/CMain.cs @@ -746,6 +746,16 @@ namespace Vocaluxe.Base class BPlaylist : IPlaylist { + public string[] GetPlaylistNames() + { + List Names = new List(); + for (int i = 0; i < CPlaylists.Playlists.Length; i++) + { + Names.Add(CPlaylists.Playlists[i].PlaylistName); + } + return Names.ToArray(); + } + public void SetPlaylistName(int PlaylistID, string Name) { CPlaylists.SetPlaylistName(PlaylistID, Name); diff --git a/VocaluxeLib/Menu/IMenu.cs b/VocaluxeLib/Menu/IMenu.cs index f92c2008..1336872f 100644 --- a/VocaluxeLib/Menu/IMenu.cs +++ b/VocaluxeLib/Menu/IMenu.cs @@ -289,6 +289,8 @@ namespace Vocaluxe.Menu public interface IPlaylist { + string[] GetPlaylistNames(); + string GetPlaylistName(int PlaylistID); void SetPlaylistName(int PlaylistID, string Name); void DeletePlaylist(int PlaylistID); @@ -308,6 +310,10 @@ namespace Vocaluxe.Menu CPlaylistSong GetPlaylistSong(int PlaylistID, int SongIndex); } + public interface IPlaylists + { + } + [Flags] public enum EModifier {