1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-21 14:52:55 +08:00
osu-lazer/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

102 lines
3.3 KiB
C#
Raw Normal View History

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
2017-12-25 14:35:28 +08:00
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using System.Linq;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Utils;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
internal class EndTimeObjectPatternGenerator : PatternGenerator
{
private readonly int endTime;
private readonly PatternType convertType;
2018-04-13 17:19:50 +08:00
public EndTimeObjectPatternGenerator(LegacyRandom random, HitObject hitObject, IBeatmap beatmap, int totalColumns, Pattern previousPattern)
: base(random, hitObject, beatmap, previousPattern, totalColumns)
{
endTime = (int)((HitObject as IHasDuration)?.EndTime ?? 0);
convertType = PreviousPattern.ColumnWithObjects == TotalColumns
? PatternType.None
: PatternType.ForceNotStack;
}
2018-04-13 17:19:50 +08:00
public override IEnumerable<Pattern> Generate()
{
yield return generate();
}
private Pattern generate()
{
var pattern = new Pattern();
2018-04-13 17:19:50 +08:00
bool generateHold = endTime - HitObject.StartTime >= 100;
2018-04-13 17:19:50 +08:00
switch (TotalColumns)
{
2019-06-30 20:58:30 +08:00
case 8 when HitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_FINISH) && endTime - HitObject.StartTime < 1000:
addToPattern(pattern, 0, generateHold);
break;
2019-04-01 11:44:46 +08:00
case 8:
addToPattern(pattern, getRandomColumn(), generateHold);
break;
2019-04-01 11:44:46 +08:00
default:
addToPattern(pattern, getRandomColumn(0), generateHold);
break;
}
2018-04-13 17:19:50 +08:00
return pattern;
}
2018-04-13 17:19:50 +08:00
private int getRandomColumn(int? lowerBound = null)
{
if ((convertType & PatternType.ForceNotStack) > 0)
return FindAvailableColumn(GetRandomColumn(lowerBound), lowerBound, patterns: PreviousPattern);
return FindAvailableColumn(GetRandomColumn(lowerBound), lowerBound);
}
/// <summary>
/// Constructs and adds a note to a pattern.
/// </summary>
/// <param name="pattern">The pattern to add to.</param>
/// <param name="column">The column to add the note to.</param>
/// <param name="holdNote">Whether to add a hold note.</param>
private void addToPattern(Pattern pattern, int column, bool holdNote)
{
ManiaHitObject newObject;
2018-04-13 17:19:50 +08:00
if (holdNote)
{
2020-04-21 15:33:19 +08:00
newObject = new HoldNote
{
StartTime = HitObject.StartTime,
2020-04-21 15:33:19 +08:00
Duration = endTime - HitObject.StartTime,
Column = column,
2020-04-21 15:33:19 +08:00
Samples = HitObject.Samples,
NodeSamples = (HitObject as IHasRepeats)?.NodeSamples
};
}
else
{
newObject = new Note
{
StartTime = HitObject.StartTime,
Samples = HitObject.Samples,
2017-05-22 08:57:03 +08:00
Column = column
};
}
2018-04-13 17:19:50 +08:00
pattern.Add(newObject);
}
}
}