Reconstruct resource structure.

This commit is contained in:
2022-11-18 00:11:49 +08:00
parent 79240fdfe8
commit 15e9217f93
3 changed files with 77 additions and 25 deletions

View File

@@ -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<ChartMeta>(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<ChartMeta>(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<ChartMeta>(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);
}

View File

@@ -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<ChartMeta>(reader.ReadToEnd());
var result = new List<FileInfo> {
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<Ruleset>(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<Skin>(reader.ReadToEnd());
var result = new List<FileInfo> {
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();
}
}
}
}

View File

@@ -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));