using Cryville.Common; using Newtonsoft.Json; using System.Collections.Generic; using System.IO; namespace Cryville.Crtr.Browsing { public abstract class ResourceConverter { public abstract string[] GetSupportedFormats(); public abstract IEnumerable ConvertFrom(FileInfo file); } public abstract class Resource { protected Resource(string name) { Name = StringUtils.EscapeFileName(name); } public string Name { get; private set; } public abstract bool Valid { get; } public override string ToString() { return string.Format("{0} ({1})", Name, ReflectionHelper.GetSimpleName(GetType())); } } public class RawChartResource : Resource { public RawChartResource(string name, Chart main, ChartMeta meta) : base(name) { Main = main; Meta = meta; } public Chart Main { get; private set; } public ChartMeta Meta { get; private set; } public override bool Valid { get { return true; } } } public abstract class FileResource : Resource { public FileResource(string name, FileInfo master, FileInfo[] attachments) : base(name) { Master = master; Attachments = attachments; } public FileInfo Master { get; private set; } public FileInfo[] Attachments { get; private set; } public override bool Valid { get { if (!Master.Exists) return false; foreach (var file in Attachments) { if (!file.Exists) return false; } return true; } } } public class ChartResource : FileResource { public ChartResource(string name, FileInfo master) : base(name, master, GetAttachments(master)) { } static FileInfo[] GetAttachments(FileInfo master) { using (var reader = new StreamReader(master.FullName)) { var meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); var result = new List { new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".json")), }; if (meta.cover != null) result.Add(new FileInfo(Path.Combine(master.Directory.FullName, meta.cover))); return result.ToArray(); } } } public class SongResource : FileResource { public SongResource(string name, FileInfo master) : base(name, master, new FileInfo[0]) { } } public class RulesetResource : FileResource { public RulesetResource(string name, FileInfo master) : base(name, master, GetAttachments(master)) { } static FileInfo[] GetAttachments(FileInfo master) { using (var reader = new StreamReader(master.FullName)) { var meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); return new FileInfo[] { new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".pdt")), }; } } } public class SkinResource : FileResource { public SkinResource(string name, FileInfo master) : base(name, master, GetAttachments(master)) { } static FileInfo[] GetAttachments(FileInfo master) { using (var reader = new StreamReader(master.FullName)) { var meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); var result = new List { new FileInfo(Path.Combine(master.Directory.FullName, meta.data + ".pdt")), }; foreach (var frame in meta.frames) { result.Add(new FileInfo(Path.Combine(master.Directory.FullName, frame))); } return result.ToArray(); } } } }