public override void Check(ArcChart chart) { // foreach (var h in chart.Holds) // { // foreach (var t in chart.Timings) // { // if (t.Timing > h.Timing && t.Timing < h.EndTiming) // { // Faults.Add(h); // } // } // } foreach (var a in chart.Arcs) { foreach (var t in chart.Timings) { if (t.Timing > a.Timing && t.Timing < a.EndTiming) { if (Mathf.Approximately(a.XStart, a.XEnd) && Mathf.Approximately(a.YStart, a.YEnd)) { continue; } Faults.Add(a); } } } Faults = Faults.Distinct().ToList(); }
public override void Check(ArcChart chart) { List <(ArcArcTap, float, float)> ats = new List <(ArcArcTap, float, float)>(); foreach (var arc in chart.Arcs) { foreach (var at in arc.ArcTaps) { float t = 1f * (at.Timing - arc.Timing) / (arc.EndTiming - arc.Timing); float x = ArcAlgorithm.X(arc.XStart, arc.XEnd, t, arc.LineType); float y = ArcAlgorithm.Y(arc.YStart, arc.YEnd, t, arc.LineType); ats.Add((at, x, y)); } } for (int i = 0; i < ats.Count - 1; ++i) { for (int k = i + 1; k < ats.Count; ++k) { if (ats[i].Item2 == ats[k].Item2 && ats[i].Item3 == ats[k].Item3 && ats[i].Item1.Timing == ats[k].Item1.Timing) { Faults.Add(ats[i].Item1); } } } Faults = Faults.Distinct().ToList(); }
static void writeItem(TextWriter writer, IRawAffItem item) { if (item is RawAffTiming) { var timing = item as RawAffTiming; writer.WriteLine($"timing({timing.Timing},{timing.Bpm.ToString("f2")},{timing.BeatsPerLine.ToString("f2")});"); } else if (item is RawAffTap) { var tap = item as RawAffTap; writer.WriteLine($"({tap.Timing},{tap.Track});"); } else if (item is RawAffHold) { var hold = item as RawAffHold; writer.WriteLine($"hold({hold.Timing},{hold.EndTiming},{hold.Track});"); } else if (item is RawAffArc) { var arc = item as RawAffArc; if (arc.ArcTaps.Count > 0) { arc.IsVoid = true; } writer.WriteLine($"arc({arc.Timing},{arc.EndTiming},{arc.XStart.ToString("f2")},{arc.XEnd.ToString("f2")}" + $",{ArcChart.ToLineTypeString(arc.LineType)},{arc.YStart.ToString("f2")},{arc.YEnd.ToString("f2")},{arc.Color},none,{arc.IsVoid.ToString().ToLower()})" + (arc.ArcTaps.Count > 0?$"[{string.Join(",",arc.ArcTaps.Select(e=>$"arctap({e.Timing})"))}]":"") + ";"); } else if (item is RawAffCamera) { var cam = item as RawAffCamera; writer.WriteLine($"camera({cam.Timing},{cam.MoveX.ToString("f2")},{cam.MoveY.ToString("f2")},{cam.MoveZ.ToString("f2")}," + $"{cam.RotateX.ToString("f2")},{cam.RotateY.ToString("f2")},{cam.RotateZ.ToString("f2")},{ArcChart.ToCameraTypeString(cam.CameraType)},{cam.Duration});"); } else if (item is RawAffSceneControl) { var scenecontrol = item as RawAffSceneControl; List <string> values = new List <string>(); values.Add(scenecontrol.Timing.ToString()); values.Add(scenecontrol.Type); foreach (var @param in scenecontrol.Params) { if (@param is RawAffInt) { values.Add((@param as RawAffInt).data.ToString()); } else if (@param is RawAffFloat) { values.Add((@param as RawAffFloat).data.ToString("f2")); } else if (@param is RawAffWord) { values.Add((@param as RawAffWord).data); } } writer.WriteLine($"scenecontrol({string.Join(",",values)});"); } }
public override void Check(ArcChart chart) { foreach (var h in chart.Holds) { if (h.EndTiming <= h.Timing) { Faults.Add(h); } } Faults = Faults.Distinct().ToList(); }
public void Clean() { Timing = 0; ArcTimingManager.Instance.Clean(); ArcTapNoteManager.Instance.Clean(); ArcHoldNoteManager.Instance.Clean(); ArcArcManager.Instance.Clean(); ArcCameraManager.Instance.Clean(); ArcSceneControlManager.Instance.Clean(); Chart = null; Length = 0; }
public override void Check(ArcChart chart) { for (int i = 0; i < chart.Taps.Count - 1; ++i) { for (int k = i + 1; k < chart.Taps.Count; ++k) { if (chart.Taps[i].Timing == chart.Taps[k].Timing && chart.Taps[i].Track == chart.Taps[k].Track) { Faults.Add(chart.Taps[i]); } } } Faults = Faults.Distinct().ToList(); }
public override void Check(ArcChart chart) { foreach (var h in chart.Holds) { foreach (var t in chart.Taps) { if (t.Timing >= h.Timing && t.Timing <= h.EndTiming && t.Track == h.Track) { Faults.Add(t); } } } Faults = Faults.Distinct().ToList(); }
public override void Check(ArcChart chart) { foreach (var a in chart.Arcs) { if (a.EndTiming <= a.Timing) { if (a.XEnd == a.XStart) { if (a.YEnd == a.YStart) { Faults.Add(a); } } } } Faults = Faults.Distinct().ToList(); }
public void OnInvoke() { if (!ArcGameplayManager.Instance.IsLoaded) { AdeToast.Instance.Show("未加载工程"); return; } Status.text = "请点击检查"; ArcChart chart = ArcGameplayManager.Instance.Chart; Fault[] checks = new Fault[] { new ShortHoldFault(), new ShortArcFault(), new TileTapFault(), new TileArcTapFault(), new TileTapHoldFault(), new TileHoldFault(), new CrossTimingFault() }; string path = AdeProjectManager.Instance.CurrentProjectFolder + "/Arcade/ChartFault.txt"; FileStream fs = new FileStream(path, FileMode.Create); StreamWriter sw = new StreamWriter(fs); int count = 0; sw.WriteLine("错误报告"); sw.WriteLine("\t时间(原始)为aff中定义的Timing,便于在aff中搜索"); sw.WriteLine("\t时间(偏移)为偏移后时间,便于在Arcade的时间框中直接跳转定位"); sw.WriteLine(); foreach (var c in checks) { c.Check(chart); if (c.Faults.Count > 0) { sw.WriteLine(c.Reason); foreach (var f in c.Faults) { sw.WriteLine($"\t时间(原始):{f.Timing}\t时间(偏移):{f.Timing + ArcAudioManager.Instance.AudioOffset}"); } count += c.Faults.Count; } } sw.Close(); Status.text = $"检查完成,共 {count} 个错误"; Arcade.Util.Shell.FileBrowser.OpenExplorer(path); }
public bool Load(ArcChart chart, AudioClip audio) { if (audio == null || chart == null) { return(false); } Clean(); Chart = chart; Length = (int)(audio.length * 1000); ArcCameraManager.Instance.ResetCamera(); ArcAudioManager.Instance.Load(audio, chart.AudioOffset); ArcTimingManager.Instance.Load(chart.Timings); ArcTapNoteManager.Instance.Load(chart.Taps); ArcHoldNoteManager.Instance.Load(chart.Holds); ArcArcManager.Instance.Load(chart.Arcs); ArcCameraManager.Instance.Load(chart.Cameras); ArcSceneControlManager.Instance.Load(chart.SceneControl); OnChartLoad.Invoke(); return(true); }
public override void Check(ArcChart chart) { foreach (var h in chart.Holds) { foreach (var t in chart.Timings) { if (t.Timing > h.Timing && t.Timing < h.EndTiming) { Faults.Add(h); } } } foreach (var a in chart.Arcs) { foreach (var t in chart.Timings) { if (t.Timing > a.Timing && t.Timing < a.EndTiming) { Faults.Add(a); } } } Faults = Faults.Distinct().ToList(); }
public abstract void Check(ArcChart chart);