diff --git a/Assets/Cryville/Crtr/Extensions/Bestdori.meta b/Assets/Cryville/Crtr/Extensions/Bestdori.meta deleted file mode 100644 index ae4a8db..0000000 --- a/Assets/Cryville/Crtr/Extensions/Bestdori.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b9bd9e24d7c553341a2a12391843542f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs b/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs deleted file mode 100644 index e83700c..0000000 --- a/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs +++ /dev/null @@ -1,189 +0,0 @@ -using Cryville.Common; -using Cryville.Common.Math; -using Cryville.Crtr.Browsing; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; - -namespace Cryville.Crtr.Extensions.Bestdori { - public class BestdoriChartConverter : ResourceConverter { - static readonly string[] SUPPORTED_FORMATS = { ".bestdori" }; - public override string[] GetSupportedFormats() { - return SUPPORTED_FORMATS; - } - - public override IEnumerable ConvertFrom(FileInfo file) { - List result = new List(); - List src; - using (var reader = new StreamReader(file.FullName)) { - src = JsonConvert.DeserializeObject>(reader.ReadToEnd()); - } - var group = new Chart.Group() { - tracks = new List(), - notes = new List(), - motions = new List(), - }; - Chart chart = new Chart { - format = 2, - time = new BeatTime(0, 0, 1), - ruleset = "bang_dream_girls_band_party", - sigs = new List(), - sounds = new List(), - motions = new List(), - groups = new List { group }, - }; - var tm = new BeatTimeTimingModel(); - string bgm = null; - double endbeat = 0; - foreach (var ev in src) { - tm.ForwardTo(ev.StartBeat); - if (ev.StartBeat > endbeat) endbeat = ev.StartBeat; - if (ev is BestdoriChartEvent.System) { - if (bgm != null) continue; - var tev = (BestdoriChartEvent.System)ev; - bgm = StringUtils.TrimExt(tev.data); - var name = "bang_dream_girls_band_party__" + bgm; - result.Add(new SongResource(name, new FileInfo(Path.Combine(file.Directory.FullName, tev.data)))); - chart.sounds.Add(new Chart.Sound { time = ToBeatTime(tev.beat), id = name }); - } - else if (ev is BestdoriChartEvent.BPM) { - var tev = (BestdoriChartEvent.BPM)ev; - tm.BPM = tev.bpm; - chart.sigs.Add(new Chart.Signature { time = ToBeatTime(tev.beat), tempo = (float)tev.bpm }); - } - else if (ev is BestdoriChartEvent.Single) { - var tev = (BestdoriChartEvent.Single)ev; - group.notes.Add(new Chart.Note { - time = ToBeatTime(tev.beat), - judges = new List { new Chart.Judge { name = tev.flick ? "single_flick" : "single" } }, - motions = new List { new Chart.Motion { motion = "track:" + tev.lane.ToString(CultureInfo.InvariantCulture) } }, - }); - } - else if (ev is BestdoriChartEvent.Long) { - var tev = (BestdoriChartEvent.Long)ev; - var c1 = tev.connections[tev.connections.Count - 1]; - var note = new Chart.Note { - time = ToBeatTime(tev.connections[0].beat), - endtime = ToBeatTime(c1.beat), - judges = new List(), - }; - for (int i = 0; i < tev.connections.Count; i++) { - BestdoriChartEvent.Connection c = tev.connections[i]; - var motion = new Chart.Motion { motion = "track:" + c.lane.ToString(CultureInfo.InvariantCulture) }; - if (i == 0) { - note.judges.Add(new Chart.Judge { name = "single" }); - note.motions.Add(motion); - } - else { - var cbeat = motion.endtime = ToBeatTime(c.beat); - if (i > 1) motion.time = ToBeatTime(tev.connections[i - 1].beat); - note.motions.Add(motion); - if (i == tev.connections.Count - 1) - note.judges.Add(new Chart.Judge { time = cbeat, name = c.flick ? "longend_flick" : "longend" }); - else if (!c.hidden) - note.judges.Add(new Chart.Judge { time = cbeat, name = "longnode" }); - } - } - if (c1.beat > endbeat) endbeat = c1.beat; - group.notes.Add(note); - } - else throw new NotImplementedException("Unsupported event: " + ev.type); - } - if (bgm == null) throw new FormatException("Chart contains no song"); - chart.endtime = ToBeatTime(endbeat + 4); - if (endbeat > tm.BeatTime) tm.ForwardTo(endbeat); - result.Add(new RawChartResource(string.Format("bang_dream_girls_band_party__{0}__{1}", bgm, StringUtils.TrimExt(file.Name)), chart, new ChartMeta { - name = string.Format("Bandori {0} {1}", bgm, StringUtils.TrimExt(file.Name)), - author = "©BanG Dream! Project ©Craft Egg Inc. ©bushiroad", - ruleset = "bang_dream_girls_band_party", - note_count = group.notes.Count, - length = (float)tm.Time, - song = new SongMetaInfo { - name = bgm, - author = "©BanG Dream! Project ©Craft Egg Inc. ©bushiroad", - } - })); - return result; - } - - BeatTime ToBeatTime(double beat, double error = 1e-4) { - int i, n, d; - FractionUtils.ToFraction(beat, error, out n, out d); - i = n / d; n %= d; - return new BeatTime(i, n, d); - } - -#pragma warning disable IDE1006 - [JsonConverter(typeof(BestdoriChartEventCreator))] - abstract class BestdoriChartEvent { - public abstract string type { get; } - public abstract double StartBeat { get; } - public abstract class InstantEvent : BestdoriChartEvent { - public double beat; - public override double StartBeat { get { return beat; } } - } - public class BPM : InstantEvent { - public override string type { get { return "BPM"; } } - public double bpm; - } - public class System : InstantEvent { - public override string type { get { return "System"; } } - public string data; - } - public abstract class SingleBase : InstantEvent { - public double lane; - public bool skill; - public bool flick; - } - public class Single : SingleBase { - public override string type { get { return "Single"; } } - } - public class Directional : SingleBase { - public override string type { get { return "Directional"; } } - public string direction; - public int width; - } - public class Connection : SingleBase { - public override string type { get { return null; } } - public bool hidden; - } - public class Long : BestdoriChartEvent { - public override string type { get { return "Long"; } } - public List connections; - public override double StartBeat { get { return connections[0].beat; } } - } - public class Slide : Long { - public override string type { get { return "Slide"; } } - } - } -#pragma warning restore IDE1006 - class BestdoriChartEventCreator : CustomCreationConverter { - string _currentType; - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { - var obj = JObject.ReadFrom(reader); - var type = obj["type"]; - if (type == null) _currentType = null; - else _currentType = obj["type"].ToObject(); - return base.ReadJson(obj.CreateReader(), objectType, existingValue, serializer); - } - - public override BestdoriChartEvent Create(Type objectType) { - switch (_currentType) { - case "BPM": return new BestdoriChartEvent.BPM(); - case "System": return new BestdoriChartEvent.System(); - case "Single": return new BestdoriChartEvent.Single(); - case "Directional": return new BestdoriChartEvent.Directional(); - case null: return new BestdoriChartEvent.Connection(); - case "Long": return new BestdoriChartEvent.Long(); - case "Slide": return new BestdoriChartEvent.Slide(); - default: throw new ArgumentException("Unknown event type: " + _currentType); - } - } - } - } -} diff --git a/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs.meta b/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs.meta deleted file mode 100644 index 4ce9e63..0000000 --- a/Assets/Cryville/Crtr/Extensions/Bestdori/BestdoriChartConverter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e3c5a8bf05d5e284ba498e91cb0dd35e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Extensions/Extensions.cs b/Assets/Cryville/Crtr/Extensions/Extensions.cs deleted file mode 100644 index 69145e9..0000000 --- a/Assets/Cryville/Crtr/Extensions/Extensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Cryville.Crtr.Browsing; -using Cryville.Crtr.Extensions.Bestdori; -using Cryville.Crtr.Extensions.Malody; -using Cryville.Crtr.Extensions.osu; -using Cryville.Crtr.Extensions.Quaver; -using System.Collections.Generic; - -namespace Cryville.Crtr.Extensions { - public class Extensions : ExtensionInterface { - public override IEnumerable GetResourceConverters() { - return new ResourceConverter[] { - new BestdoriChartConverter(), - new MalodyChartConverter(), - new osuChartConverter(), - new QuaverChartConverter(), - }; - } - - public override IEnumerable GetResourceFinders() { - return new LocalResourceFinder[] { - new MalodyChartFinder(), - new osuChartFinder(), - new QuaverChartFinder(), - }; - } - } -} diff --git a/Assets/Cryville/Crtr/Extensions/Extensions.cs.meta b/Assets/Cryville/Crtr/Extensions/Extensions.cs.meta deleted file mode 100644 index 555da9b..0000000 --- a/Assets/Cryville/Crtr/Extensions/Extensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 23377bf2926d93a4b8e3f3ab6040c7f2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Extensions/Malody.meta b/Assets/Cryville/Crtr/Extensions/Malody.meta deleted file mode 100644 index 6dd884d..0000000 --- a/Assets/Cryville/Crtr/Extensions/Malody.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: dfd44d1c0681e4842a1f031556519042 -folderAsset: yes -timeCreated: 1637936550 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs b/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs deleted file mode 100644 index d0aa86c..0000000 --- a/Assets/Cryville/Crtr/Extensions/Malody/MalodyChartConverter.cs +++ /dev/null @@ -1,225 +0,0 @@ -using Cryville.Crtr.Browsing; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace Cryville.Crtr.Extensions.Malody { - public class MalodyChartConverter : ResourceConverter { - static readonly string[] SUPPORTED_FORMATS = { ".mc", ".mcz" }; - static readonly string[] MODES = { "key", "step", "dj", "catch", "pad", "taiko", "ring", "slide", "live" }; - - public override string[] GetSupportedFormats() { - return SUPPORTED_FORMATS; - } - - public override IEnumerable ConvertFrom(FileInfo file) { - List result = new List(); - MalodyChart src; - if (file.Extension != ".mc") throw new NotImplementedException("mcz file is not supported yet"); - using (var reader = new StreamReader(file.FullName)) { - src = JsonConvert.DeserializeObject(reader.ReadToEnd()); - } - if (src.meta.mode != 0) throw new NotImplementedException(string.Format("{0} mode is not supported yet", MODES[src.meta.mode])); - - var ruleset = "malody!" + MODES[src.meta.mode]; - if (src.meta.mode == 0) { - ruleset += "." + src.meta.mode_ext.column.ToString(CultureInfo.InvariantCulture) + "k"; - } - - ChartMeta meta = new ChartMeta() { - name = src.meta.version, - author = src.meta.creator, - song = new SongMetaInfo() { - name = src.meta.song.titleorg != null ? src.meta.song.titleorg : src.meta.song.title, - author = src.meta.song.artistorg != null ? src.meta.song.artistorg : src.meta.song.artist, - }, - ruleset = ruleset, - }; - - Chart chart = new Chart { - format = 2, - time = new BeatTime(-4, 0, 1), - ruleset = ruleset, - sigs = new List(), - sounds = new List(), - motions = new List(), - groups = new List(), - }; - var group = new Chart.Group() { - tracks = new List(), - notes = new List(), - motions = new List(), - }; - chart.groups.Add(group); - int col = src.meta.mode_ext.column; - - IEnumerable events = src.time.Cast(); - if (src.effect != null) events = events.Concat(src.effect.Cast()); - events = events.Concat(src.note.Cast()); - List endEvents = new List(); - foreach (var ev in events) - if (ev.endbeat != null) - endEvents.Add(new MalodyChart.EndEvent { - beat = ev.endbeat, - StartEvent = ev, - }); - events = events.Concat(endEvents) - .OrderBy(e => e.beat[0] + (float)e.beat[1] / e.beat[2]) - .ThenBy(e => e.Priority); - - Dictionary longEvents - = new Dictionary(); - - float? baseBpm = null; - var tm = new FractionalBeatTimeTimingModel(); - foreach (var ev in events) { - var beat = new BeatTime(ev.beat[0], ev.beat[1], ev.beat[2]); - tm.ForwardTo(beat); - if (ev is MalodyChart.Time) { - var tev = (MalodyChart.Time)ev; - if (baseBpm == null) baseBpm = tev.bpm; - tm.BPM = tev.bpm; - chart.sigs.Add(new Chart.Signature { - time = beat, - tempo = tev.bpm, - }); - chart.motions.Add(new Chart.Motion { - time = beat, - motion = "svm:" + (tev.bpm / baseBpm.Value).ToString(CultureInfo.InvariantCulture) - }); - } - else if (ev is MalodyChart.Effect) { - var tev = (MalodyChart.Effect)ev; - if (tev.scroll != null) group.motions.Add(new Chart.Motion { - time = beat, - motion = "svm:" + tev.scroll.Value.ToString(CultureInfo.InvariantCulture) - }); - } - else if (ev is MalodyChart.Note) { - var tev = (MalodyChart.Note)ev; - if (tev.type == 1) { - if (tev.beat[0] == 0 && tev.beat[1] == 0) { - var res = new SongResource(meta.song.name, new FileInfo(file.DirectoryName + "/" + tev.sound)); - result.Add(res); - chart.sounds.Add(new Chart.Sound { - time = new BeatTime(0, 0, 1), - id = res.Name, - offset = -tev.offset / 1000f, - }); - } - else throw new NotImplementedException("Key sounds are not supported yet"); - } - else { - var rn = new Chart.Note() { - time = beat, - motions = new List { - new Chart.Motion() { motion = "track:" + tev.column.ToString(CultureInfo.InvariantCulture) } - }, - }; - if (tev.endbeat != null) { - rn.endtime = new BeatTime(tev.endbeat[0], tev.endbeat[1], tev.endbeat[2]); - longEvents.Add(ev, new StartEventState { - Destination = rn, - Time = tm.Time, - }); - } - group.notes.Add(rn); - } - } - else if (ev is MalodyChart.EndEvent) { - var tev = (MalodyChart.EndEvent)ev; - if (tev.StartEvent is MalodyChart.Note) { - var sev = tev.StartEvent; - longEvents.Remove(sev); - } - else throw new NotSupportedException("Unrecognized long event"); - } - else throw new NotSupportedException("Unrecognized event"); - } - var endbeat = tm.FractionalBeatTime; - endbeat.b += 4; - chart.endtime = endbeat; - meta.length = (float)tm.Time; - meta.note_count = group.notes.Count; - string chartName = string.Format("{0} - {1}", meta.song.name, meta.name); - if (src.meta.background != null) { - meta.cover = src.meta.background; - } - result.Add(new RawChartResource(chartName, chart, meta)); - return result; - } - - struct StartEventState { - public double Time { get; set; } - public ChartEvent Destination { get; set; } - } - -#pragma warning disable IDE1006 - struct MalodyChart { - public interface IEvent { - int[] beat { get; set; } - int[] endbeat { get; set; } - int Priority { get; } - } - public struct EndEvent : IEvent { - public int[] beat { get; set; } - public int[] endbeat { get; set; } - public IEvent StartEvent { get; set; } - public int Priority { get { return StartEvent.Priority - 1; } } - } - - public Meta meta; - public struct Meta { - public SongInfo song; - public struct SongInfo { - public string title; - public string artist; - public string titleorg; - public string artistorg; - } - - public string background; - - public string creator; - public string version; - - public int mode; - public ModeExt mode_ext; - public struct ModeExt { - public int column; - } - } - - public List