Beispiel #1
0
        public ArcChart(ArcaeaAffReader reader)
        {
            Raw         = reader;
            AudioOffset = reader.AudioOffset;
            foreach (ArcaeaAffEvent e in reader.Events)
            {
                switch (e.Type)
                {
                case Aff.EventType.Timing:
                    var timing = e as ArcaeaAffTiming;
                    Timings.Add(new ArcTiming()
                    {
                        Timing = timing.Timing, BeatsPerLine = timing.BeatsPerLine, Bpm = timing.Bpm
                    });
                    break;

                case Aff.EventType.Tap:
                    var tap = e as ArcaeaAffTap;
                    Taps.Add(new ArcTap()
                    {
                        Timing = tap.Timing, Track = tap.Track
                    });
                    break;

                case Aff.EventType.Hold:
                    var hold = e as ArcaeaAffHold;
                    Holds.Add(new ArcHold()
                    {
                        EndTiming = hold.EndTiming, Timing = hold.Timing, Track = hold.Track
                    });
                    break;

                case Aff.EventType.Arc:
                    var    arc    = e as ArcaeaAffArc;
                    ArcArc arcArc = new ArcArc()
                    {
                        Color     = arc.Color,
                        EndTiming = arc.EndTiming,
                        IsVoid    = arc.IsVoid,
                        LineType  = ToArcLineType(arc.LineType),
                        Timing    = arc.Timing,
                        XEnd      = arc.XEnd,
                        XStart    = arc.XStart,
                        YEnd      = arc.YEnd,
                        YStart    = arc.YStart
                    };
                    if (arc.ArcTaps != null)
                    {
                        arcArc.IsVoid = true;
                        foreach (int t in arc.ArcTaps)
                        {
                            arcArc.ArcTaps.Add(new ArcArcTap()
                            {
                                Timing = t
                            });
                        }
                    }
                    Arcs.Add(arcArc);
                    break;

                case Aff.EventType.Camera:
                    var camera = e as ArcaeaAffCamera;
                    Cameras.Add(new ArcCamera()
                    {
                        Timing = camera.Timing, Move = camera.Move, Rotate = camera.Rotate, CameraType = ToCameraType(camera.CameraType), Duration = camera.Duration
                    });
                    break;

                case Aff.EventType.SceneControl:
                    var sceneControl = e as ArcaeaAffSceneControl;
                    SceneControl.Add(new ArcSceneControl {
                        Timing = sceneControl.Timing, Type = sceneControl.SceneControlType
                    });
                    break;
                }
            }
            if (reader.Events.Count != 0)
            {
                LastEventTiming = reader.Events.Last().Timing;
            }
        }
Beispiel #2
0
        public static void ArcaeaToLanota(string affPath)
        {
            ArcaeaAffReader reader = new ArcaeaAffReader(affPath);

            LanotaChartManaged la = new LanotaChartManaged();
            float baseBpm         = (reader.Events[0] as ArcaeaAffTiming).Bpm;

            la.LanotaChangeBpm.Add(new Lanota.Managed.LanotaChangeBpm
            {
                Time = -3,
                Bpm  = baseBpm
            });
            la.LanotaScroll.Add(new Lanota.Managed.LanotaScroll
            {
                Speed = 1,
                Time  = -10
            });

            foreach (ArcaeaAffEvent e in reader.Events)
            {
                switch (e.Type)
                {
                case Arcaea.EventType.Timing:
                    ArcaeaAffTiming timing = e as ArcaeaAffTiming;
                    la.LanotaChangeBpm.Add(new Lanota.Managed.LanotaChangeBpm()
                    {
                        Bpm  = timing.Bpm,
                        Time = (timing.Timing + reader.AudioOffset) / 1000f
                    });
                    la.LanotaScroll.Add(new Lanota.Managed.LanotaScroll()
                    {
                        Speed = timing.Bpm / baseBpm,
                        Time  = (timing.Timing + reader.AudioOffset) / 1000f
                    });
                    break;

                case Arcaea.EventType.Tap:
                    ArcaeaAffTap tap = e as ArcaeaAffTap;
                    la.LanotaTapNote.Add(new Lanota.Managed.LanotaTapNote()
                    {
                        Type   = 0,
                        Time   = (tap.Timing + reader.AudioOffset) / 1000f,
                        Size   = 1,
                        Degree = tap.Track * 30 - 70
                    });
                    break;

                case Arcaea.EventType.Hold:
                    ArcaeaAffHold hold = e as ArcaeaAffHold;
                    la.LanotaHoldNote.Add(new Lanota.Managed.LanotaHoldNote()
                    {
                        Type     = 5,
                        Time     = (hold.Timing + reader.AudioOffset) / 1000f,
                        Degree   = hold.Track * 30 - 70,
                        Duration = (hold.EndTiming - hold.Timing) / 1000f,
                        Size     = 1
                    });
                    break;

                case Arcaea.EventType.Arc:
                    ArcaeaAffArc arc = e as ArcaeaAffArc;
                    if (!arc.IsVoid)
                    {
                        la.LanotaHoldNote.Add(new Lanota.Managed.LanotaHoldNote()
                        {
                            Type     = 5,
                            Time     = (arc.Timing + reader.AudioOffset) / 1000f,
                            Duration = (arc.EndTiming - arc.Timing) / 1000f,
                            Degree   = ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color),
                            Jcount   = 1,
                            Size     = 1,
                            Joints   = new List <Lanota.Managed.LanotaJoints>()
                            {
                                new Lanota.Managed.LanotaJoints()
                                {
                                    dDegree = ArcaeaUtility.ConvertDegree(arc.XEnd, arc.YEnd, arc.Color) - ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color),
                                    dTime   = (arc.EndTiming - arc.Timing) / 1000f,
                                    Cfmi    = ArcaeaUtility.DetermineEase(arc.LineType)
                                }
                            }
                        });
                    }
                    if (arc.ArcTaps != null)
                    {
                        float startDegree = ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color);
                        float deltaDegree = ArcaeaUtility.ConvertDegree(arc.XEnd, arc.YEnd, arc.Color) - ArcaeaUtility.ConvertDegree(arc.XStart, arc.YStart, arc.Color);
                        float duration    = (arc.EndTiming - arc.Timing) / 1000f;
                        float startTiming = (arc.Timing + reader.AudioOffset) / 1000f;
                        int   ease        = ArcaeaUtility.DetermineEase(arc.LineType);
                        foreach (int i in arc.ArcTaps)
                        {
                            float t       = (i + reader.AudioOffset) / 1000f;
                            float percent = (t - startTiming) / duration;
                            float degree  = startDegree + deltaDegree * ArcaeaUtility.CalculateEasedCurve(percent, ease);
                            la.LanotaTapNote.Add(new Lanota.Managed.LanotaTapNote()
                            {
                                Type   = 0,
                                Time   = t,
                                Size   = 2,
                                Degree = degree
                            });
                        }
                    }
                    break;
                }
            }

            File.WriteAllText(affPath.Replace(".aff", "_convert.txt"), la.ToString());
        }