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