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(); var meta = new ChartMeta();
string name = item.Name; string name = item.Name;
string desc = "(Unknown)"; string desc = "(Unknown)";
var metaFile = new FileInfo(item.FullName + "/meta.json"); var metaFile = new FileInfo(item.FullName + "/.umgc");
if (metaFile.Exists) { if (metaFile.Exists) {
using (var reader = new StreamReader(metaFile.FullName)) { using (var reader = new StreamReader(metaFile.FullName)) {
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd()); meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
@@ -91,7 +91,7 @@ namespace Cryville.Crtr.Browsing {
public ChartDetail GetItemDetail(int id) { public ChartDetail GetItemDetail(int id) {
var item = items[id]; var item = items[id];
var meta = new ChartMeta(); var meta = new ChartMeta();
var metaFile = new FileInfo(item.FullName + "/meta.json"); var metaFile = new FileInfo(item.FullName + "/.umgc");
if (metaFile.Exists) { if (metaFile.Exists) {
using (var reader = new StreamReader(metaFile.FullName)) { using (var reader = new StreamReader(metaFile.FullName)) {
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd()); meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd());
@@ -114,7 +114,13 @@ namespace Cryville.Crtr.Browsing {
} }
public string GetItemPath(int id) { 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) { public bool ImportItemFrom(string path) {
@@ -137,29 +143,38 @@ namespace Cryville.Crtr.Browsing {
var tres = (RawChartResource)res; var tres = (RawChartResource)res;
var dir = new DirectoryInfo(_rootPath + "/charts/" + res.Name); var dir = new DirectoryInfo(_rootPath + "/charts/" + res.Name);
if (!dir.Exists) dir.Create(); 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)); 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)); 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) { else if (res is FileResource) {
var tres = (FileResource)res; var tres = (FileResource)res;
FileInfo dest; DirectoryInfo dest;
// TODO chart, ruleset, skin if (res is ChartResource)
if (res is CoverResource) dest = new DirectoryInfo(_rootPath + "/charts/" + res.Name);
dest = new FileInfo(_rootPath + "/charts/" + res.Name + "/" + tres.Source.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) else if (res is SongResource)
dest = new FileInfo(_rootPath + "/songs/" + res.Name + "/" + tres.Source.Extension); dest = new DirectoryInfo(_rootPath + "/songs/" + res.Name);
else { else {
LogAndPopup(3, "Attempt to import unsupported file resource: {0}", res); LogAndPopup(3, "Attempt to import unsupported file resource: {0}", res);
continue; continue;
} }
var dir = dest.Directory;
if (!dest.Exists) { if (!dest.Exists) {
if (!dir.Exists) dir.Create(); dest.Create();
tres.Source.CopyTo(dest.FullName); 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); else LogAndPopup(1, "Resource already exists: {0}", res);
} }

View File

@@ -1,4 +1,5 @@
using Cryville.Common; using Cryville.Common;
using Newtonsoft.Json;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@@ -26,25 +27,62 @@ namespace Cryville.Crtr.Browsing {
public override bool Valid { get { return true; } } public override bool Valid { get { return true; } }
} }
public abstract class FileResource : Resource { public abstract class FileResource : Resource {
public FileResource(string name, FileInfo src) : base(name) { public FileResource(string name, FileInfo master, FileInfo[] attachments) : base(name) {
Source = src; 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 class ChartResource : FileResource {
public ChartResource(string name, FileInfo src) : base(name, src) { } public ChartResource(string name, FileInfo master) : base(name, master, GetAttachments(master)) { }
} static FileInfo[] GetAttachments(FileInfo master) {
public class CoverResource : FileResource { using (var reader = new StreamReader(master.FullName)) {
public CoverResource(string name, FileInfo src) : base(name, src) { } 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 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 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 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; meta.note_count = group.notes.Count;
string chartName = string.Format("{0} - {1}", meta.song.name, meta.name); string chartName = string.Format("{0} - {1}", meta.song.name, meta.name);
if (src.meta.background != null) { if (src.meta.background != null) {
result.Add(new CoverResource(chartName, new FileInfo(file.DirectoryName + "/" + src.meta.background)));
meta.cover = src.meta.background; meta.cover = src.meta.background;
} }
result.Add(new RawChartResource(chartName, chart, meta)); result.Add(new RawChartResource(chartName, chart, meta));