From 15e9217f93ac4c7072c7df97be524b9be0e13a43 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 18 Nov 2022 00:11:49 +0800 Subject: [PATCH] Reconstruct resource structure. --- .../Crtr/Browsing/LegacyResourceManager.cs | 41 +++++++++---- .../Crtr/Browsing/ResourceConverter.cs | 60 +++++++++++++++---- .../Extensions/Malody/MalodyChartConverter.cs | 1 - 3 files changed, 77 insertions(+), 25 deletions(-) diff --git a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs index ef682c0..0d8907d 100644 --- a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs +++ b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs @@ -62,7 +62,7 @@ namespace Cryville.Crtr.Browsing { var meta = new ChartMeta(); string name = item.Name; string desc = "(Unknown)"; - var metaFile = new FileInfo(item.FullName + "/meta.json"); + var metaFile = new FileInfo(item.FullName + "/.umgc"); if (metaFile.Exists) { using (var reader = new StreamReader(metaFile.FullName)) { meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); @@ -91,7 +91,7 @@ namespace Cryville.Crtr.Browsing { public ChartDetail GetItemDetail(int id) { var item = items[id]; var meta = new ChartMeta(); - var metaFile = new FileInfo(item.FullName + "/meta.json"); + var metaFile = new FileInfo(item.FullName + "/.umgc"); if (metaFile.Exists) { using (var reader = new StreamReader(metaFile.FullName)) { meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); @@ -114,7 +114,13 @@ namespace Cryville.Crtr.Browsing { } public string GetItemPath(int id) { - return items[id].Name + "/.umgc"; + var item = items[id]; + var meta = new ChartMeta(); + var metaFile = new FileInfo(item.FullName + "/.umgc"); + using (var reader = new StreamReader(metaFile.FullName)) { + meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); + } + return string.Format("{0}/{1}.json", items[id].Name, meta.data); } public bool ImportItemFrom(string path) { @@ -137,29 +143,38 @@ namespace Cryville.Crtr.Browsing { var tres = (RawChartResource)res; var dir = new DirectoryInfo(_rootPath + "/charts/" + res.Name); if (!dir.Exists) dir.Create(); - using (var writer = new StreamWriter(dir.FullName + "/.umgc")) { + using (var writer = new StreamWriter(dir.FullName + "/.json")) { writer.Write(JsonConvert.SerializeObject(tres.Main, Game.GlobalJsonSerializerSettings)); } - using (var writer = new StreamWriter(dir.FullName + "/meta.json")) { + using (var writer = new StreamWriter(dir.FullName + "/.umgc")) { + tres.Meta.data = ""; writer.Write(JsonConvert.SerializeObject(tres.Meta, Game.GlobalJsonSerializerSettings)); } + if (tres.Meta.cover != null) + new FileInfo(Path.Combine(file.Directory.FullName, tres.Meta.cover)) + .CopyTo(Path.Combine(dir.FullName, tres.Meta.cover), true); } else if (res is FileResource) { var tres = (FileResource)res; - FileInfo dest; - // TODO chart, ruleset, skin - if (res is CoverResource) - dest = new FileInfo(_rootPath + "/charts/" + res.Name + "/" + tres.Source.Name); + DirectoryInfo dest; + if (res is ChartResource) + dest = new DirectoryInfo(_rootPath + "/charts/" + res.Name); + else if (res is RulesetResource) + dest = new DirectoryInfo(_rootPath + "/rulesets/" + res.Name); + else if (res is SkinResource) + dest = new DirectoryInfo(_rootPath + "/skins/" + res.Name); else if (res is SongResource) - dest = new FileInfo(_rootPath + "/songs/" + res.Name + "/" + tres.Source.Extension); + dest = new DirectoryInfo(_rootPath + "/songs/" + res.Name); else { LogAndPopup(3, "Attempt to import unsupported file resource: {0}", res); continue; } - var dir = dest.Directory; if (!dest.Exists) { - if (!dir.Exists) dir.Create(); - tres.Source.CopyTo(dest.FullName); + dest.Create(); + tres.Master.CopyTo(Path.Combine(dest.FullName, tres.Master.Extension)); + foreach (var attachment in tres.Attachments) { + attachment.CopyTo(Path.Combine(dest.FullName, attachment.Name)); + } } else LogAndPopup(1, "Resource already exists: {0}", res); } diff --git a/Assets/Cryville/Crtr/Browsing/ResourceConverter.cs b/Assets/Cryville/Crtr/Browsing/ResourceConverter.cs index 55e8d31..6280dd4 100644 --- a/Assets/Cryville/Crtr/Browsing/ResourceConverter.cs +++ b/Assets/Cryville/Crtr/Browsing/ResourceConverter.cs @@ -1,4 +1,5 @@ using Cryville.Common; +using Newtonsoft.Json; using System.Collections.Generic; using System.IO; @@ -26,25 +27,62 @@ namespace Cryville.Crtr.Browsing { public override bool Valid { get { return true; } } } public abstract class FileResource : Resource { - public FileResource(string name, FileInfo src) : base(name) { - Source = src; + 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 FileInfo Source { get; private set; } - public override bool Valid { get { return Source.Exists; } } } public class ChartResource : FileResource { - public ChartResource(string name, FileInfo src) : base(name, src) { } - } - public class CoverResource : FileResource { - public CoverResource(string name, FileInfo src) : base(name, src) { } + 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 src) : base(name, src) { } + public SongResource(string name, FileInfo master) : base(name, master, new FileInfo[0]) { } } public class RulesetResource : FileResource { - public RulesetResource(string name, FileInfo src) : base(name, src) { } + 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 src) : base(name, src) { } + 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(); + } + } } } \ No newline at end of file diff --git a/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs b/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs index 7364de4..21be3ae 100644 --- a/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs +++ b/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs @@ -148,7 +148,6 @@ namespace Cryville.Crtr.Extensions.Malody { meta.note_count = group.notes.Count; string chartName = string.Format("{0} - {1}", meta.song.name, meta.name); if (src.meta.background != null) { - result.Add(new CoverResource(chartName, new FileInfo(file.DirectoryName + "/" + src.meta.background))); meta.cover = src.meta.background; } result.Add(new RawChartResource(chartName, chart, meta));