コード例 #1
0
ファイル: LegacyHitObjectParser.cs プロジェクト: Dormanil/osu
        public override HitObject Parse(string text)
        {
            string[] split = text.Split(',');
            var      type  = (LegacyHitObjectType)int.Parse(split[3]) & ~LegacyHitObjectType.ColourHax;
            bool     combo = type.HasFlag(LegacyHitObjectType.NewCombo);

            type &= ~LegacyHitObjectType.NewCombo;

            int    sampleVolume     = 0;
            string normalSampleBank = null;
            string addSampleBank    = null;

            HitObject result;

            if ((type & LegacyHitObjectType.Circle) > 0)
            {
                result = new LegacyHit
                {
                    Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo = combo
                };

                if (split.Length > 5)
                {
                    readCustomSampleBanks(split[5], ref normalSampleBank, ref addSampleBank, ref sampleVolume);
                }
            }
            else if ((type & LegacyHitObjectType.Slider) > 0)
            {
                CurveType      curveType = CurveType.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 = CurveType.Catmull;
                            break;

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

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

                        case @"P":
                            curveType = CurveType.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 LegacySlider
                {
                    ControlPoints = points,
                    Distance      = length,
                    CurveType     = curveType,
                    RepeatCount   = repeatCount,
                    Position      = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo      = combo
                };

                if (split.Length > 10)
                {
                    readCustomSampleBanks(split[10], ref normalSampleBank, ref addSampleBank, ref sampleVolume);
                }
            }
            else if ((type & LegacyHitObjectType.Spinner) > 0)
            {
                result = new LegacySpinner
                {
                    EndTime = Convert.ToDouble(split[5], CultureInfo.InvariantCulture)
                };

                if (split.Length > 6)
                {
                    readCustomSampleBanks(split[6], ref normalSampleBank, ref addSampleBank, ref sampleVolume);
                }
            }
            else if ((type & LegacyHitObjectType.Hold) > 0)
            {
                // Note: Hold is generated by BMS converts

                // Todo: Apparently end time is determined by samples??
                // Shouldn't need implementation until mania

                result = new LegacyHold
                {
                    Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo = combo
                };
            }
            else
            {
                throw new InvalidOperationException($@"Unknown hit object type {type}");
            }

            result.StartTime = Convert.ToDouble(split[2], CultureInfo.InvariantCulture);

            var soundType = (LegacySoundType)int.Parse(split[4]);

            result.Samples.Add(new SampleInfo
            {
                Bank   = normalSampleBank,
                Name   = SampleInfo.HIT_NORMAL,
                Volume = sampleVolume
            });

            if ((soundType & LegacySoundType.Finish) > 0)
            {
                result.Samples.Add(new SampleInfo
                {
                    Bank   = addSampleBank,
                    Name   = SampleInfo.HIT_FINISH,
                    Volume = sampleVolume
                });
            }

            if ((soundType & LegacySoundType.Whistle) > 0)
            {
                result.Samples.Add(new SampleInfo
                {
                    Bank   = addSampleBank,
                    Name   = SampleInfo.HIT_WHISTLE,
                    Volume = sampleVolume
                });
            }

            if ((soundType & LegacySoundType.Clap) > 0)
            {
                result.Samples.Add(new SampleInfo
                {
                    Bank   = addSampleBank,
                    Name   = SampleInfo.HIT_CLAP,
                    Volume = sampleVolume
                });
            }

            return(result);
        }
コード例 #2
0
        public override HitObject Parse(string text)
        {
            string[] split = text.Split(',');
            var      type  = (LegacyHitObjectType)int.Parse(split[3]) & ~LegacyHitObjectType.ColourHax;
            bool     combo = type.HasFlag(LegacyHitObjectType.NewCombo);

            type &= ~LegacyHitObjectType.NewCombo;

            HitObject result;

            if ((type & LegacyHitObjectType.Circle) > 0)
            {
                result = new LegacyHit
                {
                    Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo = combo
                };
            }
            else if ((type & LegacyHitObjectType.Slider) > 0)
            {
                CurveType      curveType = CurveType.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 = CurveType.Catmull;
                            break;

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

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

                        case @"P":
                            curveType = CurveType.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 LegacySlider
                {
                    ControlPoints = points,
                    Distance      = length,
                    CurveType     = curveType,
                    RepeatCount   = repeatCount,
                    Position      = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo      = combo
                };
            }
            else if ((type & LegacyHitObjectType.Spinner) > 0)
            {
                result = new LegacySpinner
                {
                    EndTime = Convert.ToDouble(split[5], CultureInfo.InvariantCulture)
                };
            }
            else if ((type & LegacyHitObjectType.Hold) > 0)
            {
                // Note: Hold is generated by BMS converts
                result = new LegacyHold
                {
                    Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
                    NewCombo = combo
                };
            }
            else
            {
                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,
            };

            // TODO: "addition" field

            return(result);
        }