コード例 #1
0
        public void ApplyPositionOffsets(IBeatmap beatmap)
        {
            var rng = new LegacyRandom(RNG_SEED);

            float? lastPosition  = null;
            double lastStartTime = 0;

            foreach (var obj in beatmap.HitObjects.OfType <CatchHitObject>())
            {
                obj.XOffset = 0;

                switch (obj)
                {
                case Fruit fruit:
                    if (HardRockOffsets)
                    {
                        applyHardRockOffset(fruit, ref lastPosition, ref lastStartTime, rng);
                    }
                    break;

                case BananaShower bananaShower:
                    foreach (var banana in bananaShower.NestedHitObjects.OfType <Banana>())
                    {
                        banana.XOffset = (float)(rng.NextDouble() * CatchPlayfield.WIDTH);
                        rng.Next();     // osu!stable retrieved a random banana type
                        rng.Next();     // osu!stable retrieved a random banana rotation
                        rng.Next();     // osu!stable retrieved a random banana colour
                    }

                    break;

                case JuiceStream juiceStream:
                    // Todo: BUG!! Stable used the last control point as the final position of the path, but it should use the computed path instead.
                    lastPosition = juiceStream.OriginalX + juiceStream.Path.ControlPoints[^ 1].Position.X;
コード例 #2
0
        public EndTimeObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
            : base(random, hitObject, beatmap, previousPattern, originalBeatmap)
        {
            endTime = (int)((HitObject as IHasDuration)?.EndTime ?? 0);

            convertType = PreviousPattern.ColumnWithObjects == TotalColumns
                ? PatternType.None
                : PatternType.ForceNotStack;
        }
コード例 #3
0
ファイル: ManiaBeatmapConverter.cs プロジェクト: Wieku/osu
        protected override Beatmap <ManiaHitObject> ConvertBeatmap(IBeatmap original, CancellationToken cancellationToken)
        {
            IBeatmapDifficultyInfo difficulty = original.Difficulty;

            int seed = (int)MathF.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)MathF.Round(difficulty.ApproachRate);

            Random = new LegacyRandom(seed);

            return(base.ConvertBeatmap(original, cancellationToken));
        }
コード例 #4
0
        private void queueDownloads(string[] sourceFilenames, int?limit = null)
        {
            try
            {
                // Matches osu-stable, in order to provide new users with roughly the same randomised selection of bundled beatmaps.
                var random = new LegacyRandom(DateTime.UtcNow.Year * 1000 + (DateTime.UtcNow.DayOfYear / 7));

                downloadableFilenames.AddRange(sourceFilenames.OrderBy(x => random.NextDouble()).Take(limit ?? int.MaxValue));
            }
            catch { }
        }
コード例 #5
0
ファイル: PatternGenerator.cs プロジェクト: omkelderman/osu
        protected PatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
            : base(hitObject, beatmap, previousPattern)
        {
            if (random == null)
            {
                throw new ArgumentNullException(nameof(random));
            }
            if (originalBeatmap == null)
            {
                throw new ArgumentNullException(nameof(originalBeatmap));
            }

            Random          = random;
            OriginalBeatmap = originalBeatmap;

            RandomStart = TotalColumns == 8 ? 1 : 0;
        }
コード例 #6
0
        public DistanceObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
            : base(random, hitObject, beatmap, previousPattern, originalBeatmap)
        {
            convertType = PatternType.None;
            if (!Beatmap.ControlPointInfo.EffectPointAt(hitObject.StartTime).KiaiMode)
            {
                convertType = PatternType.LowProbability;
            }

            var distanceData = hitObject as IHasDistance;
            var repeatsData  = hitObject as IHasRepeats;

            Debug.Assert(distanceData != null);

            TimingControlPoint     timingPoint     = beatmap.ControlPointInfo.TimingPointAt(hitObject.StartTime);
            DifficultyControlPoint difficultyPoint = hitObject.DifficultyControlPoint;

            double beatLength;

#pragma warning disable 618
            if (difficultyPoint is LegacyBeatmapDecoder.LegacyDifficultyControlPoint legacyDifficultyPoint)
#pragma warning restore 618
            {
                beatLength = timingPoint.BeatLength * legacyDifficultyPoint.BpmMultiplier;
            }
            else
            {
                beatLength = timingPoint.BeatLength / difficultyPoint.SliderVelocity;
            }

            SpanCount = repeatsData?.SpanCount() ?? 1;
            StartTime = (int)Math.Round(hitObject.StartTime);

            // This matches stable's calculation.
            EndTime = (int)Math.Floor(StartTime + distanceData.Distance * beatLength * SpanCount * 0.01 / beatmap.Difficulty.SliderMultiplier);

            SegmentDuration = (EndTime - StartTime) / SpanCount;
        }
コード例 #7
0
        public HitObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, double previousTime, Vector2 previousPosition, double density,
                                         PatternType lastStair, IBeatmap originalBeatmap)
            : base(random, hitObject, beatmap, previousPattern, originalBeatmap)
        {
            StairType = lastStair;

            TimingControlPoint timingPoint = beatmap.ControlPointInfo.TimingPointAt(hitObject.StartTime);
            EffectControlPoint effectPoint = beatmap.ControlPointInfo.EffectPointAt(hitObject.StartTime);

            var positionData = hitObject as IHasPosition;

            float  positionSeparation = ((positionData?.Position ?? Vector2.Zero) - previousPosition).Length;
            double timeSeparation     = hitObject.StartTime - previousTime;

            if (timeSeparation <= 80)
            {
                // More than 187 BPM
                convertType |= PatternType.ForceNotStack | PatternType.KeepSingle;
            }
            else if (timeSeparation <= 95)
            {
                // More than 157 BPM
                convertType |= PatternType.ForceNotStack | PatternType.KeepSingle | lastStair;
            }
            else if (timeSeparation <= 105)
            {
                // More than 140 BPM
                convertType |= PatternType.ForceNotStack | PatternType.LowProbability;
            }
            else if (timeSeparation <= 125)
            {
                // More than 120 BPM
                convertType |= PatternType.ForceNotStack;
            }
            else if (timeSeparation <= 135 && positionSeparation < 20)
            {
                // More than 111 BPM stream
                convertType |= PatternType.Cycle | PatternType.KeepSingle;
            }
            else if (timeSeparation <= 150 && positionSeparation < 20)
            {
                // More than 100 BPM stream
                convertType |= PatternType.ForceStack | PatternType.LowProbability;
            }
            else if (positionSeparation < 20 && density >= timingPoint.BeatLength / 2.5)
            {
                // Low density stream
                convertType |= PatternType.Reverse | PatternType.LowProbability;
            }
            else if (density < timingPoint.BeatLength / 2.5 || effectPoint.KiaiMode)
            {
                // High density
            }
            else
            {
                convertType |= PatternType.LowProbability;
            }

            if (!convertType.HasFlagFast(PatternType.KeepSingle))
            {
                if (HitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_FINISH) && TotalColumns != 8)
                {
                    convertType |= PatternType.Mirror;
                }
                else if (HitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP))
                {
                    convertType |= PatternType.Gathered;
                }
            }
        }
コード例 #8
0
ファイル: ManiaBeatmapConverter.cs プロジェクト: Wieku/osu
 public SpecificBeatmapPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
     : base(random, hitObject, beatmap, previousPattern, originalBeatmap)
 {
 }