mirror of
https://github.com/ppy/osu.git
synced 2026-05-17 13:23:00 +08:00
91f3be5fea
Closes https://github.com/ppy/osu/issues/32420. The failure cause here is that in editor the beatmap version for the beatmap affected (or... any beatmap, really), is 0 (ZERO). That is probably a regression from https://github.com/ppy/osu/pull/32315, but like... can we universally agree that calling that change "a regression" in any capacity is dumb? Like what was that code *doing* playing dumb reference games and copying stuff into an arbitrary instance that could get or not get used later on? And now you have a 50/50 chance of accessing the *correct* model's field, depending on whether you go via `BeatmapInfo` or `Beatmap.BeatmapInfo`? Moving the field to `IBeatmap`, i.e. what is by now - by consensus, since https://github.com/ppy/osu/pull/28473 - supposed to be the "decoded and materialised" beatmap, fixes this issue. I probably should have done this as part of https://github.com/ppy/osu/pull/28473 but it slipped my mind. Probably for the better too because this change has rather large chances of breaking stuff so maybe better to examine it in isolation (via diffcalc runs or whatever). For added humour points, you'd say that the field on `BeatmapInfo` was not `[Ignore]`d, so this is a realm schema change, right? No. As far as I can tell, it's not. I opened realm studio and `BeatmapVersion` *is not a listed column` on `Beatmap` models. I'm also not gonna get into the fact that I think `EditorBeatmap` doing dumb games with juggling two `BeatmapInfo` references since https://github.com/ppy/osu/pull/15075 is bad, because I don't think I have the mental capacity to hotfix this by going down that train of thought.
78 lines
3.4 KiB
C#
78 lines
3.4 KiB
C#
// 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.
|
|
|
|
using osu.Game.Beatmaps;
|
|
using osu.Game.Rulesets.Catch.Objects;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using osu.Game.Rulesets.Objects.Types;
|
|
using osu.Game.Rulesets.Objects;
|
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
|
using osu.Game.Beatmaps.Legacy;
|
|
|
|
namespace osu.Game.Rulesets.Catch.Beatmaps
|
|
{
|
|
public class CatchBeatmapConverter : BeatmapConverter<CatchHitObject>
|
|
{
|
|
public CatchBeatmapConverter(IBeatmap beatmap, Ruleset ruleset)
|
|
: base(beatmap, ruleset)
|
|
{
|
|
}
|
|
|
|
public override bool CanConvert() => Beatmap.HitObjects.All(h => h is IHasXPosition);
|
|
|
|
protected override IEnumerable<CatchHitObject> ConvertHitObject(HitObject obj, IBeatmap beatmap, CancellationToken cancellationToken)
|
|
{
|
|
var xPositionData = obj as IHasXPosition;
|
|
var yPositionData = obj as IHasYPosition;
|
|
var comboData = obj as IHasCombo;
|
|
var sliderVelocityData = obj as IHasSliderVelocity;
|
|
|
|
switch (obj)
|
|
{
|
|
case IHasPathWithRepeats curveData:
|
|
return new JuiceStream
|
|
{
|
|
StartTime = obj.StartTime,
|
|
Samples = obj.Samples,
|
|
Path = curveData.Path,
|
|
NodeSamples = curveData.NodeSamples,
|
|
RepeatCount = curveData.RepeatCount,
|
|
X = xPositionData?.X ?? 0,
|
|
NewCombo = comboData?.NewCombo ?? false,
|
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
|
LegacyConvertedY = yPositionData?.Y ?? CatchHitObject.DEFAULT_LEGACY_CONVERT_Y,
|
|
// prior to v8, speed multipliers don't adjust for how many ticks are generated over the same distance.
|
|
// this results in more (or less) ticks being generated in <v8 maps for the same time duration.
|
|
TickDistanceMultiplier = beatmap.BeatmapVersion < 8 ? 1f / ((LegacyControlPointInfo)beatmap.ControlPointInfo).DifficultyPointAt(obj.StartTime).SliderVelocity : 1,
|
|
SliderVelocityMultiplier = sliderVelocityData?.SliderVelocityMultiplier ?? 1
|
|
}.Yield();
|
|
|
|
case IHasDuration endTime:
|
|
return new BananaShower
|
|
{
|
|
StartTime = obj.StartTime,
|
|
Samples = obj.Samples,
|
|
Duration = endTime.Duration,
|
|
NewCombo = comboData?.NewCombo ?? false,
|
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
|
}.Yield();
|
|
|
|
default:
|
|
return new Fruit
|
|
{
|
|
StartTime = obj.StartTime,
|
|
Samples = obj.Samples,
|
|
NewCombo = comboData?.NewCombo ?? false,
|
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
|
X = xPositionData?.X ?? 0,
|
|
LegacyConvertedY = yPositionData?.Y ?? CatchHitObject.DEFAULT_LEGACY_CONVERT_Y
|
|
}.Yield();
|
|
}
|
|
}
|
|
|
|
protected override Beatmap<CatchHitObject> CreateBeatmap() => new CatchBeatmap();
|
|
}
|
|
}
|