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 @@
+