Пример #1
0
        public override HitObject Parse(string text)
        {
            string[] split = text.Split(',');
            var      type  = (HitObjectType)int.Parse(split[3]);
            bool     combo = type.HasFlag(HitObjectType.NewCombo);

            type &= (HitObjectType)0xF;
            type &= ~HitObjectType.NewCombo;
            OsuHitObject result;

            switch (type)
            {
            case HitObjectType.Circle:
                result = new HitCircle
                {
                    Position = new Vector2(int.Parse(split[0]), int.Parse(split[1]))
                };
                break;

            case HitObjectType.Slider:
                CurveTypes     curveType = CurveTypes.Catmull;
                double         length    = 0;
                List <Vector2> points    = new List <Vector2> {
                    new Vector2(int.Parse(split[0]), int.Parse(split[1]))
                };

                string[] pointsplit = split[5].Split('|');
                foreach (string t in pointsplit)
                {
                    if (t.Length == 1)
                    {
                        switch (t)
                        {
                        case @"C":
                            curveType = CurveTypes.Catmull;
                            break;

                        case @"B":
                            curveType = CurveTypes.Bezier;
                            break;

                        case @"L":
                            curveType = CurveTypes.Linear;
                            break;

                        case @"P":
                            curveType = CurveTypes.PerfectCurve;
                            break;
                        }
                        continue;
                    }

                    string[] temp = t.Split(':');
                    Vector2  v    = new Vector2(
                        (int)Convert.ToDouble(temp[0], CultureInfo.InvariantCulture),
                        (int)Convert.ToDouble(temp[1], CultureInfo.InvariantCulture)
                        );
                    points.Add(v);
                }

                int repeatCount = Convert.ToInt32(split[6], CultureInfo.InvariantCulture);

                if (repeatCount > 9000)
                {
                    throw new ArgumentOutOfRangeException(nameof(repeatCount), @"Repeat count is way too high");
                }

                if (split.Length > 7)
                {
                    length = Convert.ToDouble(split[7], CultureInfo.InvariantCulture);
                }

                result = new Slider
                {
                    ControlPoints = points,
                    Length        = length,
                    CurveType     = curveType,
                    RepeatCount   = repeatCount,
                    Position      = new Vector2(int.Parse(split[0]), int.Parse(split[1]))
                };
                break;

            case HitObjectType.Spinner:
                result = new Spinner
                {
                    Length   = Convert.ToDouble(split[5], CultureInfo.InvariantCulture) - Convert.ToDouble(split[2], CultureInfo.InvariantCulture),
                    Position = new Vector2(512, 384) / 2,
                };
                break;

            default:
                throw new InvalidOperationException($@"Unknown hit object type {type}");
            }
            result.StartTime = Convert.ToDouble(split[2], CultureInfo.InvariantCulture);
            result.Sample    = new HitSampleInfo
            {
                Type = (SampleType)int.Parse(split[4]),
                Set  = SampleSet.Soft,
            };
            result.NewCombo = combo;
            // TODO: "addition" field
            return(result);
        }
Пример #2
0
        public override HitObject Parse(string text)
        {
            string[] split = text.Split(',');
            var      type  = (OsuHitObject.HitObjectType) int.Parse(split[3]);
            bool     combo = type.HasFlag(OsuHitObject.HitObjectType.NewCombo);

            type &= (OsuHitObject.HitObjectType) 0xF;
            type &= ~OsuHitObject.HitObjectType.NewCombo;
            OsuHitObject result;

            switch (type)
            {
            case OsuHitObject.HitObjectType.Circle:
                result = new HitCircle();
                break;

            case OsuHitObject.HitObjectType.Slider:
                Slider s = new Slider();

                CurveTypes     curveType   = CurveTypes.Catmull;
                int            repeatCount = 0;
                double         length      = 0;
                List <Vector2> points      = new List <Vector2>();

                points.Add(new Vector2(int.Parse(split[0]), int.Parse(split[1])));

                string[] pointsplit = split[5].Split('|');
                for (int i = 0; i < pointsplit.Length; i++)
                {
                    if (pointsplit[i].Length == 1)
                    {
                        switch (pointsplit[i])
                        {
                        case @"C":
                            curveType = CurveTypes.Catmull;
                            break;

                        case @"B":
                            curveType = CurveTypes.Bezier;
                            break;

                        case @"L":
                            curveType = CurveTypes.Linear;
                            break;

                        case @"P":
                            curveType = CurveTypes.PerfectCurve;
                            break;
                        }
                        continue;
                    }

                    string[] temp = pointsplit[i].Split(':');
                    Vector2  v    = new Vector2(
                        (int)Convert.ToDouble(temp[0], CultureInfo.InvariantCulture),
                        (int)Convert.ToDouble(temp[1], CultureInfo.InvariantCulture)
                        );
                    points.Add(v);
                }

                repeatCount = Convert.ToInt32(split[6], CultureInfo.InvariantCulture);

                if (repeatCount > 9000)
                {
                    throw new ArgumentOutOfRangeException("wacky man");
                }

                if (split.Length > 7)
                {
                    length = Convert.ToDouble(split[7], CultureInfo.InvariantCulture);
                }

                s.RepeatCount = repeatCount;

                s.Curve = new SliderCurve
                {
                    Path      = points,
                    Length    = length,
                    CurveType = curveType
                };

                s.Curve.Calculate();

                result = s;
                break;

            case OsuHitObject.HitObjectType.Spinner:
                result = new Spinner();
                break;

            default:
                //throw new InvalidOperationException($@"Unknown hit object type {type}");
                return(null);
            }
            result.Position  = new Vector2(int.Parse(split[0]), int.Parse(split[1]));
            result.StartTime = double.Parse(split[2]);
            result.Sample    = new HitSampleInfo {
                Type = (SampleType)int.Parse(split[4])
            };
            result.NewCombo = combo;
            // TODO: "addition" field
            return(result);
        }