Example #1
0
        /// <summary>
        ///     将字符串解析成Fruit
        /// </summary>
        /// <param name="data"></param>
        public void Parse(string data)
        {
            var info = data.Split(',');

            Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1]));
            var val = double.Parse(info[2]);

            Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val;
            type   = int.Parse(info[3]);
            var types = new HitObjectTypesConverter().Convert(type, out var maybeBestVal);

            if (maybeBestVal != HitObjectTypes.HitCircle)
            {
                throw new ArgumentException("该行的数据不适用。");
            }

            if (types.Contains(HitObjectTypes.NewCombo))
            {
                IsNewGroup = true;
            }
            HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0];
            if (info.Length > 5)
            {
                HitSample = new HitSample(info[5]);
            }
        }
Example #2
0
        public override IEnumerable <Issue> GetIssues(BeatmapSet beatmapSet)
        {
            foreach (string hsFile in beatmapSet.hitSoundFiles)
            {
                HitSample sample = new HitSample(hsFile);
                if (sample.sampleset == Beatmap.Sampleset.Drum ||
                    sample.hitSound != HitObject.HitSound.Finish ||
                    sample.hitSource != HitSample.HitSource.Edge)
                {
                    continue;
                }

                Common.CollectHitSoundFrequency(beatmapSet, hsFile, scoreThreshold: 6,
                                                out string mostFrequentTimestamp, out Dictionary <Beatmap, int> uses);

                if (mostFrequentTimestamp != null)
                {
                    yield return(new Issue(GetTemplate("Warning Timestamp"), null,
                                           hsFile, mostFrequentTimestamp));
                }
                else
                {
                    Beatmap mapCommonlyUsedIn =
                        Common.GetBeatmapCommonlyUsedIn(beatmapSet, uses, commonUsageThreshold: 2000);

                    if (mapCommonlyUsedIn != null)
                    {
                        yield return(new Issue(GetTemplate("Warning Common"), null,
                                               hsFile, mapCommonlyUsedIn));
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        ///     使用字符串构造一个Spinner对象
        /// </summary>
        /// <param name="data"></param>
        public void Parse(string data)
        {
            var info = data.Split(',');
            var val  = double.Parse(info[2]);

            Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val;
            var innerType = int.Parse(info[3]);
            var types     = new HitObjectTypesConverter().Convert(innerType, out var maybeBestVal);

            if (maybeBestVal != HitObjectTypes.Spinner)
            {
                throw new ArgumentException("该行的数据不适用。");
            }

            if (types.Contains(HitObjectTypes.NewCombo))
            {
                IsNewGroup = true;
            }
            HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0];
            var eval = double.Parse(info[5]);

            EndTime = double.IsNaN(eval) || double.IsInfinity(eval) ? 0 : (int)eval;
            if (info.Length > 6)
            {
                HitSample = new HitSample(info[6]);
            }
        }
Example #4
0
        /// <summary>
        ///     使用字符串构建一个ManiaHit对象
        /// </summary>
        /// <param name="data"></param>
        public void Parse(string data)
        {
            var info = data.Split(',');

            if (BeatmapColumn == 0)
            {
                throw new ArgumentException();
            }
            Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1]));
            var val = double.Parse(info[2]);

            Offset  = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val;
            IntType = int.Parse(info[3]);
            var types = new HitObjectTypesConverter().Convert(IntType, out var maybeBestVal);

            if (maybeBestVal != HitObjectTypes.HitCircle)
            {
                throw new ArgumentException("该行的数据不适用。");
            }

            Column   = (int)Math.Floor(Position.x * BeatmapColumn / 512d);
            HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0];
            if (info.Length > 5)
            {
                HitSample = new HitSample(info[5]);
            }
        }
Example #5
0
        /// <summary>
        ///     返回一个以osu文件格式为标准的字符串
        /// </summary>
        /// <returns></returns>
        public string ToOsuFormat()
        {
            if (DrumRollType == DrumRollTypes.Slider)
            {
                var b = new StringBuilder($"{Position.x},{Position.y},{Offset},{2},{_curvetype}");
                for (var i = 0; i < curvePoints.Count; i++)
                {
                    if (curvePoints.Count == 1)
                    {
                        b.Append("|" + curvePoints[i].GetData() + ",");
                        break;
                    }

                    if (i == curvePoints.Count - 1)
                    {
                        b.Append("|" + curvePoints[i].GetData() + ",");
                    }
                    else
                    {
                        b.Append($"|{curvePoints[i].GetData()}");
                    }
                }

                b.Append(
                    $"{RepeatTime},{Length},{1 << (int) StartingHitSound.HitSound}|{1 << (int) DuringHitSound.HitSound}|{1 << (int) EndingHitSound.HitSound},");
                b.Append(
                    $"{StartingHitSound.Sound.GetData()}|{DuringHitSound.Sound.GetData()}|{EndingHitSound.Sound.GetData()},");
                b.Append($"{HitSample.GetData()}");
                return(b.ToString());
            }

            return($"256,192,{Offset},{1 << (int) HitObjectType},{1 << (int) HitSound},{EndTime},{HitSample.GetData()}");
        }
Example #6
0
        /// <summary>
        ///     使用字符串构建一个LargeTaikoRedHit
        /// </summary>
        /// <param name="data"></param>
        public void Parse(string data)
        {
            var info = data.Split(',');

            Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1]));
            var val = double.Parse(info[2]);

            Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val;
            _type  = int.Parse(info[3]);
            var types = new HitObjectTypesConverter().Convert(_type, out var maybeBestVal);

            if (maybeBestVal != HitObjectTypes.HitCircle)
            {
                return;
            }
            if (info.Length > 5)
            {
                HitSample = new HitSample(info[5]);
            }
        }
Example #7
0
 /// <summary>
 ///     获取以osu文件的格式为标准的字符串
 /// </summary>
 /// <returns></returns>
 public string ToOsuFormat()
 {
     return($"{Position.x},{Position.y},{Offset},{1 << (int) HitObjectType},{0},{HitSample.GetData()}");
 }
Example #8
0
 /// <summary>
 ///     获取以osu文件中的描述为格式的字符串
 /// </summary>
 /// <returns></returns>
 public string ToOsuFormat()
 {
     return($"256,192,{Offset},{1 << (int) HitObjectType},{1 << (int) HitSound},{EndTime},{HitSample.GetData()}");
 }
Example #9
0
        /// <summary>
        ///     将字符串解析为Drumroll
        /// </summary>
        /// <param name="data"></param>
        public void Parse(string data) //(x,y)_,time,type,hitSound,endTime,hitSample
        {
            var info = data.Split(',');

            Position = new OsuPixel(int.Parse(info[0]), int.Parse(info[1]));
            var val = double.Parse(info[2]);

            Offset = double.IsNaN(val) || double.IsInfinity(val) ? 0 : (int)val;
            _type  = int.Parse(info[3]);
            var types = new HitObjectTypesConverter().Convert(_type, out var maybeBestVal);

            if (maybeBestVal != HitObjectTypes.Slider && maybeBestVal != HitObjectTypes.Spinner)
            {
                throw new ArgumentException("该行的数据不适用。");
            }

            if (maybeBestVal == HitObjectTypes.Spinner)
            {
                DrumRollType = DrumRollTypes.Spinner;
                if (!types.Contains(HitObjectTypes.Spinner))
                {
                    throw new ArgumentException("该行的数据不适用。");
                }

                HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0];
                var eval = double.Parse(info[5]);
                EndTime = double.IsNaN(eval) || double.IsInfinity(eval) ? 0 : (int)eval;
                if (info.Length > 6)
                {
                    HitSample = new HitSample(info[6]);
                }
            }

            if (maybeBestVal == HitObjectTypes.Slider)
            {
                DrumRollType = DrumRollTypes.Slider;
                if (!types.Contains(HitObjectTypes.Slider))
                {
                    throw new ArgumentException("该行的数据不适用。");
                }

                HitSound = new HitSoundsConverter().Convert(int.Parse(info[4]), out _)[0];
                var sliderinfo   = info[5];
                var typeAndPoint = sliderinfo.Split('|');
                _curvetype = typeAndPoint[0];
                CurveType  = Slider.GetCurveTypeByString(_curvetype);
                for (var i = 1; i < typeAndPoint.Length; i++)
                {
                    var point = typeAndPoint[i].Split(':');
                    if (point.Length == 2)
                    {
                        var x = int.Parse(point[0]);
                        var y = int.Parse(point[1]);
                        curvePoints.Add(new OsuPixel(x, y));
                    }
                }

                RepeatTime = int.Parse(info[6]);
                Length     = double.Parse(info[7]);
                if (info.Length > 8)
                {
                    var sampleSets         = new List <SampleSets>();
                    var additionSampleSets = new List <SampleSets>();
                    var hitSounds          = new List <HitSounds>();
                    var hitSoundstrs       = info[8].Split('|');
                    foreach (var str in hitSoundstrs)
                    {
                        hitSounds.Add(new HitSoundsConverter().Convert(int.Parse(str), out _)[0]);
                    }
                    if (hitSoundstrs.Length > 0)
                    {
                        StartingHitSound = new SliderHitSound(hitSounds[0]);
                    }
                    if (hitSoundstrs.Length > 1)
                    {
                        DuringHitSound = new SliderHitSound(hitSounds[1]);
                    }
                    if (hitSoundstrs.Length > 2)
                    {
                        EndingHitSound = new SliderHitSound(hitSounds[2]);
                    }
                    if (info.Length > 9)
                    {
                        var sampleSetstrs = info[9].Split('|');
                        foreach (var sampleSetstr in sampleSetstrs)
                        {
                            var samples         = sampleSetstr.Split(':');
                            var sampleSet       = int.Parse(samples[0]);
                            var addionSampleSet = int.Parse(samples[1]);
                            sampleSets.Add((SampleSets)sampleSet);
                            additionSampleSets.Add((SampleSets)addionSampleSet);
                        }

                        if (sampleSets.Count > 1)
                        {
                            StartingHitSound = new SliderHitSound(hitSounds[0],
                                                                  new EdgeSound(sampleSets[0], additionSampleSets[0]));
                        }
                        if (sampleSets.Count > 2)
                        {
                            DuringHitSound = new SliderHitSound(hitSounds[1],
                                                                new EdgeSound(sampleSets[1], additionSampleSets[1]));
                        }
                        if (sampleSets.Count > 3)
                        {
                            EndingHitSound = new SliderHitSound(hitSounds[2],
                                                                new EdgeSound(sampleSets[2], additionSampleSets[2]));
                        }
                    }
                }
            }
        }