diff --git a/Output/Playlists/Test.xml b/Output/Playlists/Test.xml
new file mode 100644
index 00000000..8e5b1b98
--- /dev/null
+++ b/Output/Playlists/Test.xml
@@ -0,0 +1,23 @@
+
+
+
+ Test
+
+
+
+ 2raumwohnung
+ 36 grad
+ TR_GAMEMODE_NORMAL
+
+
+ Aura Dione
+ Geronimo
+ TR_GAMEMODE_SHORTSONG
+
+
+ Die Toten Hosen
+ Tage wie diese
+ TR_GAMEMODE_MEDLEY
+
+
+
\ No newline at end of file
diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs
index f73ad6a8..d07275a7 100644
--- a/Vocaluxe/Base/CGame.cs
+++ b/Vocaluxe/Base/CGame.cs
@@ -27,6 +27,7 @@ namespace Vocaluxe.Base
public int SongID;
public bool Medley;
public bool Duet;
+ public bool ShortSong;
public long DateTicks;
public bool SongFinished;
}
@@ -214,6 +215,7 @@ namespace Vocaluxe.Base
_Player[i].SongID = -1;
_Player[i].Medley = false;
_Player[i].Duet = false;
+ _Player[i].ShortSong = false;
_Player[i].DateTicks = DateTime.Now.Ticks;
_Player[i].SongFinished = false;
}
diff --git a/Vocaluxe/Base/CPlaylists.cs b/Vocaluxe/Base/CPlaylists.cs
new file mode 100644
index 00000000..563bcc2b
--- /dev/null
+++ b/Vocaluxe/Base/CPlaylists.cs
@@ -0,0 +1,261 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Xml.XPath;
+
+using Vocaluxe.Lib.Song;
+
+namespace Vocaluxe.Base
+{
+ class CPlaylistSong
+ {
+ public int SongID;
+ public GameModes.EGameMode gm;
+
+ public CPlaylistSong(int SongID, GameModes.EGameMode gm)
+ {
+ this.SongID = SongID;
+ this.gm = gm;
+ }
+
+ public CPlaylistSong()
+ {
+ gm = GameModes.EGameMode.TR_GAMEMODE_NORMAL;
+ }
+ }
+
+ struct SPlaylist
+ {
+ public string PlaylistName;
+ public string PlaylistFile;
+ public List Songs;
+ }
+
+ static class CPlaylists
+ {
+ private static XmlWriterSettings _settings = new XmlWriterSettings();
+ private static CHelper Helper = new CHelper();
+ private static List _Playlists;
+
+ public static SPlaylist[] Playlists
+ {
+ get { return _Playlists.ToArray(); }
+ }
+
+ public static int NumPlaylists
+ {
+ get { return _Playlists.Count; }
+ }
+
+ public static void Init()
+ {
+ _settings.Indent = true;
+ _settings.Encoding = System.Text.Encoding.UTF8;
+ _settings.ConformanceLevel = ConformanceLevel.Document;
+
+ LoadPlaylists();
+ }
+
+ public static void LoadPlaylists()
+ {
+ _Playlists = new List();
+ List files = new List();
+ files.AddRange(Helper.ListFiles(CSettings.sFolderPlaylists, "*.xml", true, true));
+
+ foreach (string file in files)
+ {
+ LoadPlaylist(file);
+ }
+
+ SortPlaylistsByName();
+ }
+
+ public static void DeletePlaylist(int PlaylistID)
+ {
+ if (PlaylistID < 0 || PlaylistID >= _Playlists.Count)
+ return;
+ if (_Playlists[PlaylistID].PlaylistFile != String.Empty)
+ {
+ try
+ {
+ File.Delete(_Playlists[PlaylistID].PlaylistFile);
+ _Playlists.RemoveAt(PlaylistID);
+ }
+ catch (Exception)
+ {
+ CLog.LogError("Can't delete Profile File " + _Playlists[PlaylistID].PlaylistFile + ".xml");
+ }
+ }
+ }
+
+ #region private methods
+
+ private static void SortPlaylistsByName()
+ {
+ _Playlists.Sort(CompareByPlaylistName);
+ }
+
+ private static int CompareByPlaylistName(SPlaylist a, SPlaylist b)
+ {
+ return String.Compare(a.PlaylistName, b.PlaylistName);
+ }
+
+ private static void SavePlaylist(int PlaylistID)
+ {
+ if (PlaylistID < 0 || PlaylistID >= _Playlists.Count)
+ return;
+
+ string filename = string.Empty;
+ foreach (char chr in _Playlists[PlaylistID].PlaylistName)
+ {
+ if (char.IsLetter(chr))
+ filename += chr.ToString();
+ }
+
+ if (filename == String.Empty)
+ filename = "1";
+
+ int i = 0;
+ while (File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + ".xml")))
+ {
+ i++;
+ if (!File.Exists(Path.Combine(CSettings.sFolderPlaylists, filename + i + ".xml")))
+ {
+ filename += i;
+ }
+ }
+
+ SPlaylist playlist = _Playlists[PlaylistID];
+ playlist.PlaylistFile = Path.Combine(CSettings.sFolderPlaylists, filename + ".xml");
+ _Playlists[PlaylistID] = playlist;
+
+ XmlWriter writer;
+ try
+ {
+ writer = XmlWriter.Create(_Playlists[PlaylistID].PlaylistFile, _settings);
+ }
+ catch (Exception e)
+ {
+ CLog.LogError("Error creating/opening Playlist File " + _Playlists[PlaylistID].PlaylistFile + ": " + e.Message);
+ return;
+ }
+
+ if (writer == null)
+ {
+ CLog.LogError("Error creating/opening Playlist File " + _Playlists[PlaylistID].PlaylistFile);
+ return;
+ }
+
+ writer.WriteStartDocument();
+ writer.WriteStartElement("root");
+
+ writer.WriteStartElement("Info");
+ writer.WriteElementString("PlaylistName", _Playlists[PlaylistID].PlaylistName);
+ writer.WriteEndElement();
+
+ writer.WriteStartElement("Songs");
+ for (i = 0; i < playlist.Songs.Count; i++)
+ {
+ CSong[] songs = CSongs.AllSongs;
+ CSong song = new CSong();
+ for (int s = 0; i <= songs.Length; s++)
+ {
+ if (songs[s].ID == playlist.Songs[i].SongID)
+ {
+ song = songs[s];
+ break;
+ }
+ }
+ writer.WriteStartElement("Song" + (i+1).ToString());
+ writer.WriteElementString("Artist", song.Artist);
+ writer.WriteElementString("Title", song.Title);
+ writer.WriteElementString("GameMode", Enum.GetName(typeof(GameModes.EGameMode), playlist.Songs[i].gm));
+ writer.WriteEndElement();
+ }
+ writer.WriteEndElement();
+
+ writer.WriteEndElement(); //end of root
+ writer.WriteEndDocument();
+
+ writer.Flush();
+ writer.Close();
+ }
+
+ private static void LoadPlaylist(string FileName)
+ {
+ bool loaded = false;
+ XPathDocument xPathDoc = null;
+ XPathNavigator navigator = null;
+
+ SPlaylist playlist = new SPlaylist();
+ playlist.PlaylistFile = Path.Combine(CSettings.sFolderPlaylists, FileName);
+
+ try
+ {
+ xPathDoc = new XPathDocument(playlist.PlaylistFile);
+ navigator = xPathDoc.CreateNavigator();
+ loaded = true;
+ }
+ catch (Exception e)
+ {
+ loaded = false;
+ if (navigator != null)
+ navigator = null;
+
+ if (xPathDoc != null)
+ xPathDoc = null;
+
+ CLog.LogError("Error opening Playlist File " + FileName + ": " + e.Message);
+ }
+
+ if (loaded)
+ {
+ string value = String.Empty;
+ if (CHelper.GetValueFromXML("//root/Info/PlaylistName", navigator, ref value, value))
+ {
+ playlist.PlaylistName = value;
+
+ playlist.Songs = new List();
+
+ List songs = CHelper.GetValuesFromXML("Songs", navigator);
+ string artist = String.Empty;
+ string title = String.Empty;
+ GameModes.EGameMode gm = GameModes.EGameMode.TR_GAMEMODE_NORMAL;
+
+ for (int i = 0; i < songs.Count; i++)
+ {
+ CHelper.GetValueFromXML("//root/Songs/" + songs[i] + "/Artist", navigator, ref artist, String.Empty);
+ CHelper.GetValueFromXML("//root/Songs/" + songs[i] + "/Title", navigator, ref title, String.Empty);
+ CHelper.TryGetEnumValueFromXML("//root/Songs/" + songs[i] + "/GameMode", navigator, ref gm);
+
+ CPlaylistSong song = new CPlaylistSong();
+ CSong[] AllSongs = CSongs.AllSongs;
+
+ for (int s = 0; s < AllSongs.Length; s++)
+ {
+ if (AllSongs[s].Artist == artist && AllSongs[s].Title == title)
+ {
+ song.SongID = AllSongs[s].ID;
+ break;
+ }
+ }
+
+ song.gm = gm;
+
+ playlist.Songs.Add(song);
+ }
+
+ _Playlists.Add(playlist);
+ }
+ else
+ {
+ CLog.LogError("Can't find PlaylistName in Playlist File: " + FileName);
+ }
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs
index 4183d586..7a382cf7 100644
--- a/Vocaluxe/Base/CSettings.cs
+++ b/Vocaluxe/Base/CSettings.cs
@@ -94,6 +94,7 @@ namespace Vocaluxe.Base
public const string sFolderLanguages = "Languages";
public const string sFolderScreenshots = "Screenshots";
public const string sFolderBackgroundMusic = "BackgroundMusic";
+ public const string sFolderPlaylists = "Playlists";
//public const String[] ToneStrings = new String[]{ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
public const int ToneMin = -36;
diff --git a/Vocaluxe/GameModes/CGameMode.cs b/Vocaluxe/GameModes/CGameMode.cs
index 3c45aabf..6dfe5ca5 100644
--- a/Vocaluxe/GameModes/CGameMode.cs
+++ b/Vocaluxe/GameModes/CGameMode.cs
@@ -39,12 +39,13 @@ namespace Vocaluxe.GameModes
_Rounds[round, player].PointsLineBonus = 0f;
_Rounds[round, player].Medley = false;
_Rounds[round, player].Duet = false;
+ _Rounds[round, player].ShortSong = false;
_Rounds[round, player].SongFinished = false;
}
}
}
- public void SetPoints(int Round, int SongID, SPlayer[] Player, bool Medley, bool Duet)
+ public void SetPoints(int Round, int SongID, SPlayer[] Player, bool Medley, bool Duet, bool ShortSong)
{
long DateTicks = DateTime.Now.Ticks;
for (int player = 0; player < Player.Length; player++)
@@ -56,6 +57,7 @@ namespace Vocaluxe.GameModes
_Rounds[Round, player].PointsLineBonus = Player[player].PointsLineBonus;
_Rounds[Round, player].Medley = Medley;
_Rounds[Round, player].Duet = Duet;
+ _Rounds[Round, player].ShortSong = ShortSong;
_Rounds[Round, player].DateTicks = DateTicks;
_Rounds[Round, player].SongFinished = Player[player].SongFinished;
}
@@ -91,6 +93,7 @@ namespace Vocaluxe.GameModes
player[p].Difficulty = _Rounds[Round, p].Difficulty;
player[p].Medley = _Rounds[Round, p].Medley;
player[p].Duet = _Rounds[Round, p].Duet;
+ player[p].ShortSong = _Rounds[Round, p].ShortSong;
player[p].DateTicks = _Rounds[Round, p].DateTicks;
player[p].SongFinished = _Rounds[Round, p].SongFinished;
player[p].ProfileID = _Rounds[Round, p].ProfileID;
@@ -223,7 +226,8 @@ namespace Vocaluxe.GameModes
_SongQueque[_CurrentSong].SongID,
Player,
_SongQueque[_CurrentSong].GameMode == EGameMode.TR_GAMEMODE_MEDLEY,
- _SongQueque[_CurrentSong].GameMode == EGameMode.TR_GAMEMODE_DUET);
+ _SongQueque[_CurrentSong].GameMode == EGameMode.TR_GAMEMODE_DUET,
+ _SongQueque[_CurrentSong].GameMode == EGameMode.TR_GAMEMODE_SHORTSONG);
}
_CurrentSong++;
}
diff --git a/Vocaluxe/Screens/CScreenLoad.cs b/Vocaluxe/Screens/CScreenLoad.cs
index d20c7490..41f373b2 100644
--- a/Vocaluxe/Screens/CScreenLoad.cs
+++ b/Vocaluxe/Screens/CScreenLoad.cs
@@ -223,6 +223,11 @@ namespace Vocaluxe.Screens
CBackgroundMusic.CanSing = true;
CLog.StopBenchmark(3, "Load Cover");
+
+ //Init Playlists
+ CLog.StartBenchmark(0, "Init Playlists");
+ CPlaylists.Init();
+ CLog.StopBenchmark(0, "Init Playlists");
}
private void CheckStartIntroVideos()
diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj
index b75ed99f..ca240ee2 100644
--- a/Vocaluxe/Vocaluxe.csproj
+++ b/Vocaluxe/Vocaluxe.csproj
@@ -125,6 +125,7 @@
+
@@ -132,12 +133,9 @@
-
-
- Code
-
-
+ Code
+
Form
@@ -247,4 +245,4 @@
-->
-
+
\ No newline at end of file