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