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..cfea42fb --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/Deutsch.xml @@ -0,0 +1,42 @@ + + + + Deutsch + + + + Tic-Tac-Toe + Spiele Tic-Tac-Toe auf eine besondere Weise! + Für eine lustige Runde mit Strategie, Glück und Können! + Weiter + Zurück + Start + Exit + Ja + Nein + Starten + Songs + Team + Playlist + Kategorie + Alle Songs + + Tic-Tac-Toe: Einstellungen + Anzahl der Spieler in Team 1 + Anzahl der Spieler in Team 2 + Anzahl der Felder + Song-Quelle + Spiel-Modus + + Tic-Tac-Toe: Spielerwahl + Team 1 + Team 2 + + Tic-Tac-Toe + Wählt ein Feld aus. + Nächster Spieler + Tic-Tac-Toe wirklich beenden? + Und der Gewinner ist... + In dieser Runde gibt es keinen Gewinner... + + diff --git a/Output/PartyModes/TicTacToe/Languages/English.xml b/Output/PartyModes/TicTacToe/Languages/English.xml new file mode 100644 index 00000000..57c3256f --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/English.xml @@ -0,0 +1,42 @@ + + + + English + + + + Tic-Tac-Toe + Play Tic-Tac-Toe in a special way + Funny rounds with strategy, fortune and skills + Next + Back + Start + Exit + Yes + No + Start + Songs + Team + Playlist + Category + All songs + + Tic-Tac-Toe: Configuration + Number of players in team 1 + Number of players in team 2 + Number of fields + Song-Source + Game-Mode + + Tic-Tac-Toe: Choose Player + Team 1 + Team 2 + + Tic-Tac-Toe + Choose a field. + Next player + Really exit Tic-Tac-Toe? + And the winner is... + There is no winner in this round... + + diff --git a/Output/PartyModes/TicTacToe/Languages/French.xml b/Output/PartyModes/TicTacToe/Languages/French.xml new file mode 100644 index 00000000..3192b444 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/French.xml @@ -0,0 +1,42 @@ + + + + Français + + + + Tic-Tac-Toe + TODO: Play Tic-Tac-Toe in a special way + TODO: Funny rounds with strategy, fortune and skills + TODO: Next + TODO: Back + TODO: Start + TODO: Exit + TODO: Yes + TODO: No + TODO: Start + TODO: Songs + TODO: Team + TODO: Playlist + TODO: Category + TODO: All songs + + TODO: Tic-Tac-Toe: Configuration + TODO: Number of players in team 1 + TODO: Number of players in team 2 + TODO: Number of fields + TODO: Song-Source + TODO: Game-Mode + + TODO: Tic-Tac-Toe: Choose Player + TODO: Team 1 + TODO: Team 2 + + TODO: Tic-Tac-Toe + TODO: Choose a field. + TODO: Next player + TODO: Really exit Tic-Tac-Toe? + TODO: And the winner is... + TODO: There is no winner in this round... + + diff --git a/Output/PartyModes/TicTacToe/Languages/Spanish.xml b/Output/PartyModes/TicTacToe/Languages/Spanish.xml new file mode 100644 index 00000000..95906a8b --- /dev/null +++ b/Output/PartyModes/TicTacToe/Languages/Spanish.xml @@ -0,0 +1,42 @@ + + + + Español + + + + Tic-Tac-Toe + TODO: Play Tic-Tac-Toe in a special way + TODO: Funny rounds with strategy, fortune and skills + TODO: Next + TODO: Back + TODO: Start + TODO: Exit + TODO: Yes + TODO: No + TODO: Start + TODO: Songs + TODO: Team + TODO: Playlist + TODO: Category + TODO: All songs + + TODO: Tic-Tac-Toe: Configuration + TODO: Number of players in team 1 + TODO: Number of players in team 2 + TODO: Number of fields + TODO: Song-Source + TODO: Game-Mode + + TODO: Tic-Tac-Toe: Choose Player + TODO: Team 1 + TODO: Team 2 + + TODO: Tic-Tac-Toe + TODO: Choose a field. + TODO: Next player + TODO: Really exit Tic-Tac-Toe? + TODO: And the winner is... + TODO: There is no winner in this round... + + diff --git a/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml new file mode 100644 index 00000000..d9330b71 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeConfig.xml @@ -0,0 +1,776 @@ + + + + 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_SONGSOURCE + + + + + + + 75 + 405 + + 0,00 + + 32 + + + + StaticColor + + + TextSColor + + Left + + Center + + + + Outline + + TR_SCREENCONFIG_GAMEMODE + + + + + + + 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 + + 3 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 340 + 0,00 + 700 + 50 + + 505 + 345 + 0,00 + 40 + 40 + + 1170 + 345 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 1 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 340 + 0,00 + 700 + 50 + + 505 + 345 + 0,00 + 40 + 40 + + 1170 + 345 + 0,00 + 40 + 40 + + + SelectSlideColor + + + SelectSlideSColor + + + SelectSlideHColor + + + ArrowColor + + + ArrowSColor + + + TextColor + + + TextSColor + + 32,00 + + 205,33 + + Outline + + Bold + + 1 + + + + Invisible + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + SelectSlideArrowLeft + + SelectSlideArrowRight + + SelectSlide + + 500 + 400 + 0,00 + 700 + 50 + + 505 + 405 + 0,00 + 40 + 40 + + 1170 + 405 + 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..6f204b14 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeMain.xml @@ -0,0 +1,844 @@ + + + + 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 + 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 + 625 + 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 + 625 + 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 + 625 + 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..15071a58 --- /dev/null +++ b/Output/PartyModes/TicTacToe/Screens/PartyScreenTicTacToeNames.xml @@ -0,0 +1,332 @@ + + + + 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 + + + + + + + 58 + 375 + + -1,00 + + 22 + + + + Player1 + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENNAMES_TEAM1 + + + + + + + 58 + 500 + + -1,00 + + 22 + + + + Player2 + + + TextSColor + + Center + + Center + + + + Outline + + TR_SCREENNAMES_TEAM2 + + + + + + + Button + + Button + + 985 + 625 + 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 + 625 + 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/Output/Themes/Ambient/Screens/ScreenScore.xml b/Output/Themes/Ambient/Screens/ScreenScore.xml index 814efcfe..1fa35bda 100644 --- a/Output/Themes/Ambient/Screens/ScreenScore.xml +++ b/Output/Themes/Ambient/Screens/ScreenScore.xml @@ -1,7 +1,7 @@  - 2 + 3 Video @@ -3745,5 +3745,21 @@ + + Int + 7 + + + Int + 4 + + + Int + 4 + + + String + Horizontal + - \ No newline at end of file + diff --git a/Output/Themes/Changelog/Changelog_ScreenScore.txt b/Output/Themes/Changelog/Changelog_ScreenScore.txt index d050d838..611a2621 100644 --- a/Output/Themes/Changelog/Changelog_ScreenScore.txt +++ b/Output/Themes/Changelog/Changelog_ScreenScore.txt @@ -1,5 +1,8 @@ ScreenScore - +++++++++++ +Version 3: +Add , , to change text-string with player-num >= +Add , set to "vertical" to draw animation in vertical direction. ++++++++++ Version 2: diff --git a/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj b/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj index 83f7959f..37fb7251 100644 --- a/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj +++ b/PartyModes/PartyModeChallenge/PartyModeChallenge.csproj @@ -5,7 +5,7 @@ x86 8.0.30703 2.0 - {6F3E1874-F28A-40E9-AFBD-31934D593679} + {5A4053F1-5AD5-441F-B254-D97A088127B6} Library Properties PartyModeChallenge diff --git a/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.cs b/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.cs new file mode 100644 index 00000000..22c3b57e --- /dev/null +++ b/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.cs @@ -0,0 +1,706 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using Vocaluxe.Menu; + +namespace Vocaluxe.PartyModes +{ + public enum ESongSource + { + TR_ALLSONGS, + TR_CATEGORY, + TR_PLAYLIST + } + + public enum EPartyGameMode + { + TR_GAMEMODE_NORMAL, + TR_GAMEMODE_SHORTSONG, + TR_GAMEMODE_DUET + } + + 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 ESongSource SongSource; + public int CategoryID; + public int PlaylistID; + public EPartyGameMode GameMode; + } + + 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 ESongSource SongSource; + public int CategoryID; + public int PlaylistID; + public EPartyGameMode GameMode; + } + + 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 ESongSource SongSource; + public int CategoryID; + public int PlaylistID; + + public EPartyGameMode GameMode; + + 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.SearchActive = 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.SongSource = ESongSource.TR_ALLSONGS; + GameData.PlaylistID = 0; + GameData.CategoryID = 0; + GameData.GameMode = EPartyGameMode.TR_GAMEMODE_NORMAL; + 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.SongSource = data.ScreenConfig.SongSource; + GameData.CategoryID = data.ScreenConfig.CategoryID; + GameData.PlaylistID = data.ScreenConfig.PlaylistID; + GameData.GameMode = data.ScreenConfig.GameMode; + + _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.SongSource = GameData.SongSource; + ToScreenConfig.CategoryID = GameData.CategoryID; + ToScreenConfig.PlaylistID = GameData.PlaylistID; + ToScreenConfig.GameMode = GameData.GameMode; + 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; + Screen.DataToScreen(ToScreenMain); + } + break; + case EStage.Main: + //nothing to do + break; + case EStage.Singing: + _Screens.TryGetValue("PartyScreenTicTacToeMain", out Screen); + if (_Screens != null) + { + 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.SearchActive = 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; + + switch (GameData.GameMode) + { + case EPartyGameMode.TR_GAMEMODE_NORMAL: + gm = EGameMode.TR_GAMEMODE_NORMAL; + break; + + case EPartyGameMode.TR_GAMEMODE_DUET: + gm = EGameMode.TR_GAMEMODE_DUET; + break; + + case EPartyGameMode.TR_GAMEMODE_SHORTSONG: + gm = EGameMode.TR_GAMEMODE_SHORTSONG; + break; + } + _Base.Game.AddSong(SongID, gm); + + _Base.Songs.AddPartySongSung(SongID); + _Base.Graphics.FadeTo(EScreens.ScreenSing); + } + + public override void LeavingHighscore() + { + UpdateScores(); + _Base.Graphics.FadeTo(EScreens.ScreenPartyDummy); + } + + private void CreateRounds() + { + GameData.Rounds = new List(); + //Prepare Player-IDs + List Team1 = new List(); + List Team2 = new List(); + List IDs1 = new List(); + List IDs2 = new List(); + int num = 0; + int random = 0; + //Add IDs to team-list + while (Team1.Count < GameData.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 < GameData.NumFields) + { + random = _Base.Game.GetRandom((IDs1.Count - 1) * 10); + num = (int)Math.Round((double)random/10); + if (num >= IDs1.Count) + num = IDs1.Count - 1; + Team1.Add(IDs1[num]); + IDs1.Remove(Team1[Team1.Count - 1]); + } + if (Team2.Count < GameData.NumFields) + { + random = _Base.Game.GetRandom((IDs2.Count - 1) * 20); + num = (int)Math.Round((double)random / 20); + if (num >= IDs2.Count) + num = IDs2.Count - 1; + Team2.Add(IDs2[num]); + IDs2.Remove(Team2[Team2.Count - 1]); + } + } + + for (int i = 0; i < GameData.NumFields; i++) + { + Round r = new Round(); + r.SingerTeam1 = Team1[i]; + r.SingerTeam2 = Team2[i]; + GameData.Rounds.Add(r); + } + } + + private void PrepareSongList() + { + EGameMode gm = EGameMode.TR_GAMEMODE_NORMAL; + + switch (GameData.GameMode) + { + case EPartyGameMode.TR_GAMEMODE_NORMAL: + gm = EGameMode.TR_GAMEMODE_NORMAL; + break; + + case EPartyGameMode.TR_GAMEMODE_DUET: + gm = EGameMode.TR_GAMEMODE_DUET; + break; + + case EPartyGameMode.TR_GAMEMODE_SHORTSONG: + gm = EGameMode.TR_GAMEMODE_SHORTSONG; + break; + } + + while(GameData.Songs.Count < (GameData.NumFields + GameData.NumJokerRandom[0] + GameData.NumJokerRandom[1])){ + List Songs = new List(); + switch (GameData.SongSource) + { + case ESongSource.TR_PLAYLIST: + for (int i = 0; i < _Base.Playlist.GetPlaylistSongCount(GameData.PlaylistID); i++) + { + int id = _Base.Playlist.GetPlaylistSong(GameData.PlaylistID, i).SongID; + foreach (EGameMode mode in _Base.Songs.GetSongByID(id).AvailableGameModes) + if (mode == gm) + Songs.Add(id); + } + break; + + case ESongSource.TR_ALLSONGS: + for (int i = 0; i < _Base.Songs.GetNumSongs(); i++) + { + foreach (EGameMode mode in _Base.Songs.GetSongByID(i).AvailableGameModes) + if (mode == gm) + Songs.Add(i); + } + break; + + case ESongSource.TR_CATEGORY: + _Base.Songs.SetCategory(GameData.CategoryID); + for (int i = 0; i < _Base.Songs.NumSongsInCategory(GameData.CategoryID); i++) + { + foreach(EGameMode mode in _Base.Songs.GetVisibleSong(i).AvailableGameModes) + if(mode == gm) + Songs.Add(_Base.Songs.GetVisibleSong(i).ID); + } + _Base.Songs.SetCategory(-1); + break; + } + 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.GameMode == EPartyGameMode.TR_GAMEMODE_DUET) + player[0].LineNr = 0; + } + 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]; + if (GameData.GameMode == EPartyGameMode.TR_GAMEMODE_DUET) + player[1].LineNr = 1; + } + 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/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj b/PartyModes/PartyModeTicTacToe/PartyModeTicTacToe.csproj new file mode 100644 index 00000000..c5121e47 --- /dev/null +++ b/PartyModes/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 + + + + + + + + + + + + \ No newline at end of file diff --git a/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs b/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs new file mode 100644 index 00000000..3b47296c --- /dev/null +++ b/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeConfig.cs @@ -0,0 +1,345 @@ +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 SelectSlideSongSource = "SelectSlideSongSource"; + const string SelectSlidePlaylist = "SelectSlidePlaylist"; + const string SelectSlideCategory = "SelectSlideCategory"; + const string SelectSlideGameMode = "SelectSlideGameMode"; + 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, SelectSlideSongSource, SelectSlidePlaylist, SelectSlideCategory, SelectSlideGameMode }; + _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; + config.GameMode = EPartyGameMode.TR_GAMEMODE_NORMAL; + config.CategoryID = 0; + config.SongSource = ESongSource.TR_ALLSONGS; + 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; + Data.ScreenConfig.CategoryID = config.CategoryID; + Data.ScreenConfig.SongSource = config.SongSource; + Data.ScreenConfig.GameMode = config.GameMode; + } + 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; + + SelectSlides[htSelectSlides(SelectSlideSongSource)].Clear(); + SelectSlides[htSelectSlides(SelectSlideSongSource)].SetValues((int)Data.ScreenConfig.SongSource); + + 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; + SelectSlides[htSelectSlides(SelectSlidePlaylist)].Visible = Data.ScreenConfig.SongSource == ESongSource.TR_PLAYLIST; + + string[] _Categories = new string[_Base.Songs.GetNumCategories()]; + for (int i = 0; i < _Base.Songs.GetNumCategories(); i++ ) + { + _Categories[i] = _Base.Songs.GetCategory(i).Name; + } + SelectSlides[htSelectSlides(SelectSlideCategory)].Clear(); + for (int i = 0; i < _Categories.Length; i++) + { + string value = _Categories[i] + " (" + _Base.Songs.NumSongsInCategory(i) + " " + _Base.Language.Translate("TR_SONGS", _PartyModeID) + ")"; + SelectSlides[htSelectSlides(SelectSlideCategory)].AddValue(value); + } + SelectSlides[htSelectSlides(SelectSlideCategory)].Selection = Data.ScreenConfig.CategoryID; + SelectSlides[htSelectSlides(SelectSlideCategory)].Visible = Data.ScreenConfig.SongSource == ESongSource.TR_CATEGORY; + + SelectSlides[htSelectSlides(SelectSlideGameMode)].Visible = true; + SelectSlides[htSelectSlides(SelectSlideGameMode)].SetValues((int)Data.ScreenConfig.GameMode); + } + + 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.SongSource = (ESongSource)SelectSlides[htSelectSlides(SelectSlideSongSource)].Selection; + Data.ScreenConfig.PlaylistID = SelectSlides[htSelectSlides(SelectSlidePlaylist)].Selection; + Data.ScreenConfig.CategoryID = SelectSlides[htSelectSlides(SelectSlideCategory)].Selection; + Data.ScreenConfig.GameMode = (EPartyGameMode)SelectSlides[htSelectSlides(SelectSlideGameMode)].Selection; + + EGameMode gm = EGameMode.TR_GAMEMODE_NORMAL; + + switch (Data.ScreenConfig.GameMode) + { + case EPartyGameMode.TR_GAMEMODE_NORMAL: + gm = EGameMode.TR_GAMEMODE_NORMAL; + break; + + case EPartyGameMode.TR_GAMEMODE_DUET: + gm = EGameMode.TR_GAMEMODE_DUET; + break; + + case EPartyGameMode.TR_GAMEMODE_SHORTSONG: + gm = EGameMode.TR_GAMEMODE_SHORTSONG; + break; + } + + if (Data.ScreenConfig.SongSource == ESongSource.TR_PLAYLIST) + { + if (_Base.Playlist.GetNumPlaylists() > 0) + if (_Base.Playlist.GetPlaylistSongCount(Data.ScreenConfig.PlaylistID) > 0) + { + ConfigOk = false; + for (int i = 0; i < _Base.Playlist.GetPlaylistSongCount(Data.ScreenConfig.PlaylistID); i++) + { + int id = _Base.Playlist.GetPlaylistSong(Data.ScreenConfig.PlaylistID, i).SongID; + foreach (EGameMode mode in _Base.Songs.GetSongByID(id).AvailableGameModes) + if (mode == gm) + { + ConfigOk = true; + break; + } + if (ConfigOk) + break; + } + } + else + ConfigOk = false; + else + ConfigOk = false; + } + if (Data.ScreenConfig.SongSource == ESongSource.TR_CATEGORY) + { + if (_Base.Songs.GetNumCategories() > 0) + if (_Base.Songs.NumSongsInCategory(Data.ScreenConfig.CategoryID) > 0) + { + _Base.Songs.SetCategory(Data.ScreenConfig.CategoryID); + ConfigOk = false; + for (int i = 0; i < _Base.Songs.NumSongsInCategory(Data.ScreenConfig.CategoryID); i++) + { + foreach (EGameMode mode in _Base.Songs.GetVisibleSong(i).AvailableGameModes) + if (mode == gm) + { + ConfigOk = true; + break; + } + if (ConfigOk) + break; + } + _Base.Songs.SetCategory(-1); + } + else + ConfigOk = false; + else + ConfigOk = false; + } + if (Data.ScreenConfig.SongSource == ESongSource.TR_ALLSONGS) + { + if (_Base.Songs.GetNumSongs() > 0) + { + for (int i = 0; i < _Base.Songs.GetNumSongs(); i++) + { + foreach (EGameMode mode in _Base.Songs.GetSongByID(i).AvailableGameModes) + if (mode == gm) + { + ConfigOk = true; + break; + } + if (ConfigOk) + break; + } + } + else + ConfigOk = false; + } + SelectSlides[htSelectSlides(SelectSlideCategory)].Visible = Data.ScreenConfig.SongSource == ESongSource.TR_CATEGORY; + SelectSlides[htSelectSlides(SelectSlidePlaylist)].Visible = Data.ScreenConfig.SongSource == ESongSource.TR_PLAYLIST; + } + + private void Back() + { + FadeTo(EScreens.ScreenParty); + } + + private void Next() + { + _PartyMode.DataFromScreen(_ThemeName, Data); + } + } +} diff --git a/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs b/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs new file mode 100644 index 00000000..481196fc --- /dev/null +++ b/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeMain.cs @@ -0,0 +1,680 @@ +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 TextFinishMessage = "TextFinishMessage"; + 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 int OldSelectedField = -1; + + private int[,] Possibilities; + private EStatus Action; + + public PartyScreenTicTacToeMain() + { + } + + protected override void Init() + { + base.Init(); + + _ThemeName = "PartyScreenTicTacToeMain"; + _ThemeTexts = new string[] { TextPopupReallyExit, TextTeamChoosing, TextFinishMessage, 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); + 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; + FieldSelectedAgain(); + } + break; + } + } + if (Action == EStatus.FieldSelected) + { + if (Buttons[htButtons(ButtonJokerRandomT1)].Selected) + UseJoker(0, 0); + if (Buttons[htButtons(ButtonJokerRandomT2)].Selected) + UseJoker(1, 0); + if (Buttons[htButtons(ButtonJokerRetryT1)].Selected) + UseJoker(0, 1); + if (Buttons[htButtons(ButtonJokerRetryT2)].Selected) + UseJoker(1, 1); + } + } + 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; + FieldSelectedAgain(); + } + break; + } + } + if(Action == EStatus.FieldSelected) + { + if (Buttons[htButtons(ButtonJokerRandomT1)].Selected) + UseJoker(0, 0); + if (Buttons[htButtons(ButtonJokerRandomT2)].Selected) + UseJoker(1, 0); + if (Buttons[htButtons(ButtonJokerRetryT1)].Selected) + UseJoker(0, 1); + if (Buttons[htButtons(ButtonJokerRetryT2)].Selected) + UseJoker(1, 1); + + } + } + 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) + { + BuildWinnerPossibilities(); + SelectedField = -1; + Buttons[htButtons(ButtonBack)].Visible = true; + Buttons[htButtons(ButtonExit)].Visible = false; + } + else + { + Buttons[htButtons(ButtonBack)].Visible = false; + Buttons[htButtons(ButtonExit)].Visible = true; + } + int Winner = GetWinner(); + if (GameData.CurrentRoundNr <= GameData.NumFields && Winner == 0) + { + Action = EStatus.FieldChoosing; + UpdateTeamChoosingMessage(); + 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; + SetInteractionToButton(Buttons[htButtons(ButtonNextRound)]); + } + else + { + Action = EStatus.None; + Buttons[htButtons(ButtonNextRound)].Visible = false; + Texts[htTexts(TextFinishMessage)].Visible = true; + if (Winner > 0) + { + Texts[htTexts(TextFinishMessage)].Color = _Base.Theme.GetPlayerColor(Winner); + Texts[htTexts(TextFinishMessage)].Text = _Base.Language.Translate("TR_SCREENMAIN_WINNER", _PartyModeID) + " " + _Base.Language.Translate("TR_TEAM", _PartyModeID) + " " + Winner; + } + else + { + Texts[htTexts(TextFinishMessage)].Color = new SColorF(1, 1, 1, 1); + Texts[htTexts(TextFinishMessage)].Text = _Base.Language.Translate("TR_SCREENMAIN_NOWINNER", _PartyModeID); + } + 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.SColor = _Base.Theme.GetPlayerColor(GameData.Team+1); + 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; + + UpdateJokerButtons(); + + Buttons[htButtons(ButtonNextRound)].Visible = true; + Buttons[htButtons(ButtonExit)].Visible = true; + Buttons[htButtons(ButtonBack)].Visible = false; + } + + private void FieldSelectedAgain() + { + int SongID = Fields[SelectedField].Content.SongID; + 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; + GameData.Rounds[SelectedField].SingerTeam1 = GameData.Rounds[OldSelectedField].SingerTeam1; + GameData.Rounds[SelectedField].SingerTeam2 = GameData.Rounds[OldSelectedField].SingerTeam2; + 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; + + UpdateJokerButtons(); + + Buttons[htButtons(ButtonNextRound)].Visible = true; + Buttons[htButtons(ButtonExit)].Visible = true; + Buttons[htButtons(ButtonBack)].Visible = false; + } + + private void UseJoker(int TeamNr, int JokerNum) + { + switch (JokerNum) + { + //Random-Joker + case 0: + if (GameData.NumJokerRandom[TeamNr] > 0) + { + GameData.NumJokerRandom[TeamNr]--; + if (!_Base.Sound.IsFinished(PreviewStream)) + _Base.Sound.FadeAndStop(PreviewStream, 0, 1); + FieldSelected(); + } + break; + + //Retry-Joker + case 1: + if (GameData.NumJokerRetry[TeamNr] > 0 && GameData.CurrentRoundNr > 1) + { + GameData.NumJokerRetry[TeamNr]--; + GameData.Team = TeamNr; + if (!_Base.Sound.IsFinished(PreviewStream)) + _Base.Sound.FadeAndStop(PreviewStream, 0, 1); + Action = EStatus.JokerRetry; + OldSelectedField = SelectedField; + SelectedField = -1; + UpdateFieldContents(); + } + break; + } + UpdateJokerButtons(); + } + + private void UpdateTeamChoosingMessage() + { + 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); + if (Action == EStatus.JokerRetry || Action == EStatus.FieldChoosing) + Texts[htTexts(TextTeamChoosing)].Visible = true; + else + Texts[htTexts(TextTeamChoosing)].Visible = false; + } + + private void UpdateJokerButtons() + { + 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(); + } + + 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 int BuildWinnerPossibilities() + { + int NumOneRow = (int)Math.Sqrt((double)GameData.NumFields); + Possibilities = new int[(NumOneRow * 2) + 2, NumOneRow]; + for (int i = 0; i < Possibilities.GetLength(0); i++) + { + if (i < NumOneRow) + { + for(int c = 0; c < NumOneRow; c++){ + Possibilities[i, c] = i * NumOneRow + c; + } + } + else if (i < NumOneRow * 2) + { + for (int c = 0; c < NumOneRow; c++) + { + Possibilities[i, c] = (i-NumOneRow) + (c*NumOneRow); + } + } + else if( i == Possibilities.GetLength(0) - 2) + { + for (int c = 0; c < NumOneRow;c++) + { + Possibilities[i, c] = (NumOneRow + 1) * c; + } + } + else if (i == Possibilities.GetLength(0) - 1) + { + for (int c = 0; c < NumOneRow; c++) + { + Possibilities[i, c] = (NumOneRow - 1) * c + (NumOneRow - 1); + } + } + } + return 0; + } + + private int GetWinner() + { + for (int i = 0; i < Possibilities.GetLength(0); i++) + { + List Check = new List(); + for (int j = 0; j < Possibilities.GetLength(1); j++) + { + if (Fields[Possibilities[i, j]].Content.Winner > 0) + Check.Add(Fields[Possibilities[i, j]].Content.Winner); + } + if (Check.Count == Possibilities.GetLength(1)) + { + //Check for winner + if (Check.Contains(1) && !Check.Contains(2)) + return 1; + else if (Check.Contains(2) && !Check.Contains(1)) + return 2; + } + } + return 0; + } + } +} diff --git a/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeNames.cs b/PartyModes/PartyModeTicTacToe/PartyScreenTicTacToeNames.cs new file mode 100644 index 00000000..84e79fb0 --- /dev/null +++ b/PartyModes/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 = 380; + 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 - PlayerDestinationButtonsNumH < 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 - PlayerDestinationButtonsNumH >= 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 = PlayerDestinationButtonsNumH; i < PlayerDestinationButtonsNumH*2; i++) + { + if (PlayerDestinationButtons[i].Selected) + { + if (((i-PlayerDestinationButtonsNumH) + 1) <= Data.ScreenNames.ProfileIDsTeam2.Count) + { + Data.ScreenNames.ProfileIDsTeam2.RemoveAt(i - PlayerDestinationButtonsNumH); + 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 6239f1c5..3714a400 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", "PartyModes\PartyModeChallenge\PartyModeChallenge.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593679}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeTicTacToe", "PartyModes\PartyModeTicTacToe\PartyModeTicTacToe.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593679}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallenge", "PartyModes\PartyModeChallenge\PartyModeChallenge.csproj", "{5A4053F1-5AD5-441F-B254-D97A088127B6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PartyModeChallengeMedley", "PartyModes\PartyModeChallengeMedley\PartyModeChallengeMedley.csproj", "{6F3E1874-F28A-40E9-AFBD-31934D593678}" EndProject @@ -72,7 +74,23 @@ Global {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.Build.0 = DebugLinux|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.ActiveCfg = DebugLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.Build.0 = DebugLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.Build.0 = DebugWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.Build.0 = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.Build.0 = DebugLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.ActiveCfg = DebugLinux|x86 diff --git a/Vocaluxe/Screens/CScreenScore.cs b/Vocaluxe/Screens/CScreenScore.cs index f0e74268..3e8abc60 100644 --- a/Vocaluxe/Screens/CScreenScore.cs +++ b/Vocaluxe/Screens/CScreenScore.cs @@ -15,10 +15,15 @@ namespace Vocaluxe.Screens class CScreenScore : CMenu { // Version number for theme files. Increment it, if you've changed something on the theme files! - const int ScreenVersion = 2; + const int ScreenVersion = 3; private const string TextSong = "TextSong"; + private const string ScreenSettingShortScore = "ScreenSettingShortScore"; + private const string ScreenSettingShortRating = "ScreenSettingShortRating"; + private const string ScreenSettingShortDifficulty = "ScreenSettingShortDifficulty"; + private const string ScreenSettingAnimationDirection = "ScreenSettingAnimationDirection"; + private string[,] TextNames; private string[,] TextScores; private string[,] TextRatings; @@ -54,6 +59,8 @@ namespace Vocaluxe.Screens _ThemeStatics = statics.ToArray(); + _ThemeScreenSettings = new string[] { ScreenSettingShortScore, ScreenSettingShortRating, ScreenSettingShortDifficulty, ScreenSettingAnimationDirection }; + StaticPointsBarDrawnPoints = new double[CSettings.MaxNumPlayer]; } @@ -151,8 +158,16 @@ namespace Vocaluxe.Screens { StaticPointsBarDrawnPoints[p] = player[p].Points; } - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H = ((float)StaticPointsBarDrawnPoints[p]) * (Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H / 10000); - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.Y = Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H + Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.Y - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H; + string direction = (string) ScreenSettings[htScreenSettings(ScreenSettingAnimationDirection)].GetValue(); + if (direction.ToLower() == "vertical") + { + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.W = ((float)StaticPointsBarDrawnPoints[p]) * (Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.W / 10000); + } + else + { + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H = ((float)StaticPointsBarDrawnPoints[p]) * (Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H / 10000); + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.Y = Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H + Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.Y - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H; + } } } } @@ -316,21 +331,31 @@ namespace Vocaluxe.Screens } else Texts[htTexts(TextNames[p, CGame.NumPlayer - 1])].Text = player[p].Name; - - Texts[htTexts(TextScores[p, CGame.NumPlayer - 1])].Text = ((int)Math.Round(player[p].Points)).ToString("0000") + " " + CLanguage.Translate("TR_SCREENSCORE_POINTS"); - if (CGame.NumPlayer <= 3) - { - Texts[htTexts(TextRatings[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate("TR_SCREENSCORE_RATING") + ": " + CLanguage.Translate(GetRating((int)Math.Round(player[p].Points))); + + if (CGame.NumPlayer < (int)ScreenSettings[htScreenSettings(ScreenSettingShortScore)].GetValue()) + Texts[htTexts(TextScores[p, CGame.NumPlayer - 1])].Text = ((int)Math.Round(player[p].Points)).ToString("0000") + " " + CLanguage.Translate("TR_SCREENSCORE_POINTS"); + else + Texts[htTexts(TextScores[p, CGame.NumPlayer - 1])].Text = ((int)Math.Round(player[p].Points)).ToString("0000"); + if (CGame.NumPlayer < (int)ScreenSettings[htScreenSettings(ScreenSettingShortDifficulty)].GetValue()) Texts[htTexts(TextDifficulty[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate("TR_SCREENSCORE_GAMEDIFFICULTY") + ": " + CLanguage.Translate(player[p].Difficulty.ToString()); + else + Texts[htTexts(TextDifficulty[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate(player[p].Difficulty.ToString()); + if (CGame.NumPlayer < (int)ScreenSettings[htScreenSettings(ScreenSettingShortRating)].GetValue()) + Texts[htTexts(TextRatings[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate("TR_SCREENSCORE_RATING") + ": " + CLanguage.Translate(GetRating((int)Math.Round(player[p].Points))); + else + Texts[htTexts(TextRatings[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate(GetRating((int)Math.Round(player[p].Points))); + + StaticPointsBarDrawnPoints[p] = 0.0; + string direction = (string)ScreenSettings[htScreenSettings(ScreenSettingAnimationDirection)].GetValue(); + if (direction.ToLower() == "vertical") + { + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.W = 0; } else { - Texts[htTexts(TextRatings[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate(GetRating((int)Math.Round(player[p].Points))); - Texts[htTexts(TextDifficulty[p, CGame.NumPlayer - 1])].Text = CLanguage.Translate(player[p].Difficulty.ToString()); + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H = 0; + Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.Y = Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H + Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.Y - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H; } - StaticPointsBarDrawnPoints[p] = 0.0; - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H = 0; - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.Y = Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.H + Statics[htStatics(StaticPointsBarBG[p, CGame.NumPlayer - 1])].Rect.Y - Statics[htStatics(StaticPointsBar[p, CGame.NumPlayer - 1])].Rect.H; if (player[p].ProfileID >= 0 && player[p].ProfileID < CProfiles.NumProfiles) Statics[htStatics(StaticAvatar[p, CGame.NumPlayer - 1])].Texture = CProfiles.Profiles[player[p].ProfileID].Avatar.Texture; } diff --git a/VocaluxeLib/Menu/CMenu.cs b/VocaluxeLib/Menu/CMenu.cs index af47ea00..544bb12e 100644 --- a/VocaluxeLib/Menu/CMenu.cs +++ b/VocaluxeLib/Menu/CMenu.cs @@ -39,6 +39,7 @@ namespace Vocaluxe.Menu private List _Equalizers; private List _Playlists; private List _ParticleEffects; + private List _ScreenSettings; private Hashtable _htBackgrounds; private Hashtable _htStatics; @@ -52,6 +53,7 @@ namespace Vocaluxe.Menu private Hashtable _htEqualizers; private Hashtable _htPlaylists; private Hashtable _htParticleEffects; + private Hashtable _htScreenSettings; private int _PrevMouseX; @@ -76,6 +78,7 @@ namespace Vocaluxe.Menu protected string[] _ThemeEqualizers; protected string[] _ThemePlaylists; protected string[] _ThemeParticleEffects; + protected string[] _ThemeScreenSettings; protected SRectF _ScreenArea; protected Basic _Base; @@ -122,6 +125,7 @@ namespace Vocaluxe.Menu _Equalizers = new List(); _Playlists = new List(); _ParticleEffects = new List(); + _ScreenSettings = new List(); _htBackgrounds = new Hashtable(); _htStatics = new Hashtable(); @@ -135,6 +139,7 @@ namespace Vocaluxe.Menu _htEqualizers = new Hashtable(); _htPlaylists = new Hashtable(); _htParticleEffects = new Hashtable(); + _htScreenSettings = new Hashtable(); _PrevMouseX = 0; _PrevMouseY = 0; @@ -158,6 +163,7 @@ namespace Vocaluxe.Menu _ThemeEqualizers = null; _ThemePlaylists = null; _ThemeParticleEffects = null; + _ThemeScreenSettings = null; } protected void FadeTo(EScreens NextScreen) @@ -394,6 +400,22 @@ namespace Vocaluxe.Menu } } } + + if (_ThemeScreenSettings != null) + { + for (int i = 0; i < _ThemeScreenSettings.Length; i++) + { + CScreenSetting se = new CScreenSetting(_Base, _PartyModeID); + if (se.LoadTheme("//root/" + _ThemeName, _ThemeScreenSettings[i], navigator, SkinIndex)) + { + _htScreenSettings.Add(_ThemeScreenSettings[i], AddScreenSetting(se)); + } + else + { + _Base.Log.LogError("Can't load ThemeSetting \"" + _ThemeScreenSettings[i] + "\" in screen " + _ThemeName); + } + } + } } else { @@ -490,6 +512,12 @@ namespace Vocaluxe.Menu _ParticleEffects[i].SaveTheme(writer); } + //ScreenSettings + for (int i = 0; i < _ScreenSettings.Count; i++) + { + _ScreenSettings[i].SaveTheme(writer); + } + writer.WriteEndElement(); // End of File @@ -561,6 +589,11 @@ namespace Vocaluxe.Menu { pe.ReloadTextures(); } + + foreach (CScreenSetting se in _ScreenSettings) + { + se.ReloadTextures(); + } } public virtual void UnloadTextures() @@ -623,6 +656,11 @@ namespace Vocaluxe.Menu { pe.UnloadTextures(); } + + foreach (CScreenSetting se in _ScreenSettings) + { + se.UnloadTextures(); + } } public virtual void ReloadTheme() @@ -696,6 +734,11 @@ namespace Vocaluxe.Menu { return _ParticleEffects; } + + public List GetScreenSettings() + { + return _ScreenSettings; + } #endregion GetLists #region ElementHandler @@ -888,6 +931,14 @@ namespace Vocaluxe.Menu return _ParticleEffects.ToArray(); } } + + public CScreenSetting[] ScreenSettings + { + get + { + return _ScreenSettings.ToArray(); + } + } #endregion Get Arrays #region Hashtables @@ -1046,6 +1097,19 @@ namespace Vocaluxe.Menu throw; } } + + public int htScreenSettings(string key) + { + try + { + return (int)_htScreenSettings[key]; + } + catch (Exception) + { + _Base.Log.LogError("Can't find ScreenSetting Element \"" + key + "\" in Screen " + _ThemeName); + throw; + } + } #endregion Hashtables #endregion ElementHandler @@ -1418,6 +1482,12 @@ namespace Vocaluxe.Menu _AddInteraction(_ParticleEffects.Count - 1, EType.TParticleEffect); return _ParticleEffects.Count - 1; } + + public int AddScreenSetting(CScreenSetting se) + { + _ScreenSettings.Add(se); + return _ScreenSettings.Count - 1; + } #endregion Elements #region InteractionHandling diff --git a/VocaluxeLib/Menu/CScreenSetting.cs b/VocaluxeLib/Menu/CScreenSetting.cs new file mode 100644 index 00000000..cbea37db --- /dev/null +++ b/VocaluxeLib/Menu/CScreenSetting.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Xml; +using System.Xml.XPath; + +namespace Vocaluxe.Menu +{ + enum ESettingType + { + Int, + String, + Color, + Texture + } + + struct SScreenSetting + { + public string Name; + public string Value; + public ESettingType Type; + } + + public class CScreenSetting : IMenuElement + { + private int _PartyModeID; + private Basic _Base; + + private SScreenSetting _Theme; + private bool _ThemeLoaded; + + public string GetThemeName() + { + return _Theme.Name; + } + + public CScreenSetting(Basic Base, int PartyModeID) + { + _PartyModeID = PartyModeID; + _Base = Base; + _Theme = new SScreenSetting(); + _ThemeLoaded = false; + } + + public CScreenSetting(CScreenSetting ts) + { + _PartyModeID = ts._PartyModeID; + _Base = ts._Base; + _Theme = ts._Theme; + _ThemeLoaded = ts._ThemeLoaded; + } + + public bool LoadTheme(string XmlPath, string ElementName, XPathNavigator navigator, int SkinIndex) + { + string item = XmlPath + "/" + ElementName; + _ThemeLoaded = true; + + _ThemeLoaded &= CHelper.GetValueFromXML(item + "/Value", navigator, ref _Theme.Value, String.Empty); + _ThemeLoaded &= CHelper.TryGetEnumValueFromXML(item + "/Type", navigator, ref _Theme.Type); + + if (_ThemeLoaded) + { + _Theme.Name = ElementName; + } + return _ThemeLoaded; + } + + public bool SaveTheme(XmlWriter writer) + { + if (_ThemeLoaded) + { + writer.WriteStartElement(_Theme.Name); + + writer.WriteComment(": Type of theme-setting-value: "+ CHelper.ListStrings(Enum.GetNames(typeof(ESettingType)))); + writer.WriteElementString("Type", Enum.GetName(typeof(ESettingType), _Theme.Type)); + writer.WriteComment(": Value of theme-setting"); + writer.WriteElementString("Value", _Theme.Value); + writer.WriteEndElement(); + return true; + } + return false; + } + + public object GetValue() + { + switch (_Theme.Type) + { + case ESettingType.Int: + return GetIntValue(_Theme.Value); + + case ESettingType.String: + return _Theme.Value; + + case ESettingType.Color: + return GetColorValue(_Theme.Value); + + case ESettingType.Texture: + return GetTextureValue(_Theme.Value); + } + + return null; + } + + public void UnloadTextures() + { + } + + public void LoadTextures() + { + } + + public void ReloadTextures() + { + } + + #region Private + private int GetIntValue(string _string) + { + try + { + return Convert.ToInt32(_string); + } + catch (Exception) + { + return -1; + } + } + + private STexture GetTextureValue(string _string) + { + return _Base.Theme.GetSkinTexture(_string); + } + + private SColorF GetColorValue(string _string) + { + return _Base.Theme.GetColor(_string); + } + #endregion Private + + #region ThemeEdit + public void MoveElement(int stepX, int stepY) + { + } + + public void ResizeElement(int stepW, int stepH) + { + } + #endregion ThemeEdit + } +} diff --git a/VocaluxeLib/Menu/IMenu.cs b/VocaluxeLib/Menu/IMenu.cs index 22e0c126..609a2361 100644 --- a/VocaluxeLib/Menu/IMenu.cs +++ b/VocaluxeLib/Menu/IMenu.cs @@ -316,6 +316,10 @@ namespace Vocaluxe.Menu CPlaylistSong GetPlaylistSong(int PlaylistID, int SongIndex); } + public interface IPlaylists + { + } + [Flags] public enum EModifier { diff --git a/VocaluxeLib/VocaluxeLib.csproj b/VocaluxeLib/VocaluxeLib.csproj index 4867bf3b..2e8963d1 100644 --- a/VocaluxeLib/VocaluxeLib.csproj +++ b/VocaluxeLib/VocaluxeLib.csproj @@ -125,6 +125,7 @@ +