From d0dea33faa654369a440694d295bcdeef6c48c95 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 19 Jul 2017 13:32:16 +0900 Subject: [PATCH] Make Beatmap (bindable) non-nullable. --- .../Tests/TestCasePlayer.cs | 2 +- .../Tests/TestCaseResults.cs | 2 +- osu.Game/Beatmaps/DummyWorkingBeatmap.cs | 4 +- osu.Game/OsuGame.cs | 3 - osu.Game/OsuGameBase.cs | 6 +- osu.Game/Screens/Edit/Editor.cs | 6 +- osu.Game/Screens/Menu/Intro.cs | 4 +- osu.Game/Screens/Menu/MainMenu.cs | 32 +++-- osu.Game/Screens/OsuScreen.cs | 60 +++----- osu.Game/Screens/Play/Player.cs | 22 +-- osu.Game/Screens/Play/PlayerLoader.cs | 4 +- osu.Game/Screens/Ranking/Results.cs | 2 +- osu.Game/Screens/Select/PlaySongSelect.cs | 25 ++-- osu.Game/Screens/Select/SongSelect.cs | 128 +++++++++--------- 14 files changed, 139 insertions(+), 161 deletions(-) diff --git a/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs b/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs index 954d24fcc1..088ccb2aa3 100644 --- a/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs +++ b/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs @@ -81,7 +81,7 @@ namespace osu.Desktop.VisualTests.Tests { return new Player { - Beatmap = beatmap + InitialBeatmap = beatmap }; } } diff --git a/osu.Desktop.VisualTests/Tests/TestCaseResults.cs b/osu.Desktop.VisualTests/Tests/TestCaseResults.cs index 775bfe0f03..4a980068b9 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseResults.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseResults.cs @@ -59,7 +59,7 @@ namespace osu.Desktop.VisualTests.Tests } }) { - Beatmap = beatmap + InitialBeatmap = beatmap }); } } diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs index 9bddc1e82d..0784def5ac 100644 --- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs +++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs @@ -16,9 +16,9 @@ namespace osu.Game.Beatmaps { internal class DummyWorkingBeatmap : WorkingBeatmap { - private readonly OsuGame game; + private readonly OsuGameBase game; - public DummyWorkingBeatmap(OsuGame game) + public DummyWorkingBeatmap(OsuGameBase game) : base(new BeatmapInfo { Metadata = new BeatmapMetadata diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index f63b2eb37a..6bec2cb184 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -21,7 +21,6 @@ using OpenTK; using System.Linq; using System.Threading.Tasks; using osu.Framework.Threading; -using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Graphics; using osu.Game.Rulesets.Scoring; @@ -100,8 +99,6 @@ namespace osu.Game Dependencies.Cache(this); - BeatmapDatabase.DefaultBeatmap = new DummyWorkingBeatmap(this); - configRuleset = LocalConfig.GetBindable(OsuSetting.Ruleset); Ruleset.Value = RulesetDatabase.GetRuleset(configRuleset.Value); Ruleset.ValueChanged += r => configRuleset.Value = r.ID ?? 0; diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 71ac8af08d..939c4a4915 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -43,7 +43,7 @@ namespace osu.Game protected MenuCursor Cursor; - public readonly Bindable Beatmap = new Bindable(); + public Bindable Beatmap { get; private set; } private Bindable fpsDisplayVisible; @@ -121,6 +121,10 @@ namespace osu.Game Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Venera")); Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Venera-Light")); + var defaultBeatmap = new DummyWorkingBeatmap(this); + Beatmap = new NonNullableBindable(defaultBeatmap); + BeatmapDatabase.DefaultBeatmap = defaultBeatmap; + OszArchiveReader.Register(); Dependencies.Cache(API = new APIAccess diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs index 2582c68296..7ec8347a8f 100644 --- a/osu.Game/Screens/Edit/Editor.cs +++ b/osu.Game/Screens/Edit/Editor.cs @@ -18,7 +18,7 @@ namespace osu.Game.Screens.Edit protected override void OnResuming(Screen last) { - Beatmap?.Track?.Stop(); + Beatmap.Value.Track?.Stop(); base.OnResuming(last); } @@ -26,13 +26,13 @@ namespace osu.Game.Screens.Edit { base.OnEntering(last); Background.FadeColour(Color4.DarkGray, 500); - Beatmap?.Track?.Stop(); + Beatmap.Value.Track?.Stop(); } protected override bool OnExiting(Screen next) { Background.FadeColour(Color4.White, 500); - Beatmap?.Track?.Start(); + Beatmap.Value.Track?.Start(); return base.OnExiting(next); } } diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs index 5791b7f196..4ab157db05 100644 --- a/osu.Game/Screens/Menu/Intro.cs +++ b/osu.Game/Screens/Menu/Intro.cs @@ -103,9 +103,9 @@ namespace osu.Game.Screens.Menu } beatmaps.GetChildren(setInfo); - Beatmap = beatmaps.GetWorkingBeatmap(setInfo.Beatmaps[0]); + Beatmap.Value = beatmaps.GetWorkingBeatmap(setInfo.Beatmaps[0]); - track = Beatmap.Track; + track = Beatmap.Value.Track; trackManager.SetExclusive(track); welcome = audio.Sample.Get(@"welcome"); diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs index 5a2e0a7b12..a945dfe3df 100644 --- a/osu.Game/Screens/Menu/MainMenu.cs +++ b/osu.Game/Screens/Menu/MainMenu.cs @@ -67,12 +67,6 @@ namespace osu.Game.Screens.Menu preloadSongSelect(); } - protected override void OnBeatmapChanged(WorkingBeatmap beatmap) - { - base.OnBeatmapChanged(beatmap); - background.Next(); - } - private void preloadSongSelect() { if (songSelect == null) @@ -90,16 +84,30 @@ namespace osu.Game.Screens.Menu { base.OnEntering(last); buttons.FadeInFromZero(500); - if (last is Intro && Beatmap != null) + + var track = Beatmap.Value.Track; + var metadata = Beatmap.Value.Metadata; + + if (last is Intro && track != null) { - if (!Beatmap.Track.IsRunning) + if (!track.IsRunning) { - Beatmap.Track.Seek(Beatmap.Metadata.PreviewTime); - if (Beatmap.Metadata.PreviewTime == -1) - Beatmap.Track.Seek(Beatmap.Track.Length * 0.4f); - Beatmap.Track.Start(); + track.Seek(metadata.PreviewTime); + if (metadata.PreviewTime == -1) + track.Seek(track.Length * 0.4f); + track.Start(); } } + + Beatmap.ValueChanged += beatmap_ValueChanged; + } + + private void beatmap_ValueChanged(WorkingBeatmap newValue) + { + if (!IsCurrentScreen) + return; + + background.Next(); } protected override void OnSuspending(Screen next) diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index 460afb46d1..d916614abd 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Screens; @@ -35,38 +36,31 @@ namespace osu.Game.Screens /// internal virtual bool AllowBeatmapRulesetChange => true; - private readonly Bindable beatmap = new Bindable(); + protected readonly Bindable Beatmap = new Bindable(); + + public WorkingBeatmap InitialBeatmap + { + set + { + if (IsLoaded) throw new InvalidOperationException($"Cannot set {nameof(InitialBeatmap)} post-load."); + Beatmap.Value = value; + } + } private readonly Bindable ruleset = new Bindable(); private SampleChannel sampleExit; - private WorkingBeatmap defaultBeatmap; - - public WorkingBeatmap Beatmap - { - get - { - return beatmap.Value; - } - set - { - beatmap.Value = value ?? defaultBeatmap; - } - } - [BackgroundDependencyLoader(permitNulls: true)] - private void load(OsuGameBase game, OsuGame osuGame, AudioManager audio, BeatmapDatabase beatmaps) + private void load(OsuGameBase game, OsuGame osuGame, AudioManager audio) { - defaultBeatmap = beatmaps.DefaultBeatmap; - if (game != null) { //if we were given a beatmap at ctor time, we want to pass this on to the game-wide beatmap. - var localMap = beatmap.Value; - beatmap.BindTo(game.Beatmap); + var localMap = Beatmap.Value; + Beatmap.BindTo(game.Beatmap); if (localMap != null) - beatmap.Value = localMap; + Beatmap.Value = localMap; } if (osuGame != null) @@ -75,20 +69,6 @@ namespace osu.Game.Screens sampleExit = audio.Sample.Get(@"UI/melodic-1"); } - protected override void LoadComplete() - { - base.LoadComplete(); - - beatmap.ValueChanged += OnBeatmapChanged; - } - - /// - /// The global Beatmap was changed. - /// - protected virtual void OnBeatmapChanged(WorkingBeatmap beatmap) - { - } - protected override void Update() { if (!IsCurrentScreen) return; @@ -98,7 +78,7 @@ namespace osu.Game.Screens // we only want to apply these restrictions when we are inside a screen stack. // the use case for not applying is in visual/unit tests. ruleset.Disabled = !AllowBeatmapRulesetChange; - beatmap.Disabled = !AllowBeatmapRulesetChange; + Beatmap.Disabled = !AllowBeatmapRulesetChange; } } @@ -114,8 +94,6 @@ namespace osu.Game.Screens BackgroundScreen bg = CreateBackground(); - OnBeatmapChanged(Beatmap); - if (lastOsu?.Background != null) { if (bg == null || lastOsu.Background.Equals(bg)) @@ -160,11 +138,7 @@ namespace osu.Game.Screens if (base.OnExiting(next)) return true; - // while this is not necessary as we are constructing our own bindable, there are cases where - // the GC doesn't run as fast as expected and this is triggered post-exit. - // added to resolve https://github.com/ppy/osu/issues/829 - beatmap.ValueChanged -= OnBeatmapChanged; - + Beatmap.UnbindAll(); return false; } } diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index c9ca91faa0..03d02f4deb 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -81,24 +81,24 @@ namespace osu.Game.Screens.Play try { - if (Beatmap == null) - Beatmap = beatmaps.GetWorkingBeatmap(BeatmapInfo, withStoryboard: true); + if (Beatmap.Value == null) + Beatmap.Value = beatmaps.GetWorkingBeatmap(BeatmapInfo, withStoryboard: true); - if (Beatmap?.Beatmap == null) + if (Beatmap.Value?.Beatmap == null) throw new InvalidOperationException("Beatmap was not loaded"); - ruleset = osu?.Ruleset.Value ?? Beatmap.BeatmapInfo.Ruleset; + ruleset = osu?.Ruleset.Value ?? Beatmap.Value.BeatmapInfo.Ruleset; rulesetInstance = ruleset.CreateInstance(); try { - HitRenderer = rulesetInstance.CreateHitRendererWith(Beatmap, ruleset.ID == Beatmap.BeatmapInfo.Ruleset.ID); + HitRenderer = rulesetInstance.CreateHitRendererWith(Beatmap, ruleset.ID == Beatmap.Value.BeatmapInfo.Ruleset.ID); } catch (BeatmapInvalidForRulesetException) { // we may fail to create a HitRenderer if the beatmap cannot be loaded with the user's preferred ruleset // let's try again forcing the beatmap's ruleset. - ruleset = Beatmap.BeatmapInfo.Ruleset; + ruleset = Beatmap.Value.BeatmapInfo.Ruleset; rulesetInstance = ruleset.CreateInstance(); HitRenderer = rulesetInstance.CreateHitRendererWith(Beatmap, true); } @@ -115,7 +115,7 @@ namespace osu.Game.Screens.Play return; } - Track track = Beatmap.Track; + Track track = Beatmap.Value.Track; if (track != null) { @@ -128,7 +128,7 @@ namespace osu.Game.Screens.Play decoupledClock = new DecoupleableInterpolatingFramedClock { IsCoupled = false }; var firstObjectTime = HitRenderer.Objects.First().StartTime; - decoupledClock.Seek(Math.Min(0, firstObjectTime - Math.Max(Beatmap.Beatmap.ControlPointInfo.TimingPointAt(firstObjectTime).BeatLength * 4, Beatmap.BeatmapInfo.AudioLeadIn))); + decoupledClock.Seek(Math.Min(0, firstObjectTime - Math.Max(Beatmap.Value.Beatmap.ControlPointInfo.TimingPointAt(firstObjectTime).BeatLength * 4, Beatmap.Value.BeatmapInfo.AudioLeadIn))); decoupledClock.ProcessFrame(); offsetClock = new FramedOffsetClock(decoupledClock); @@ -141,7 +141,7 @@ namespace osu.Game.Screens.Play { adjustableSourceClock.Reset(); - foreach (var mod in Beatmap.Mods.Value.OfType()) + foreach (var mod in Beatmap.Value.Mods.Value.OfType()) mod.ApplyToClock(adjustableSourceClock); decoupledClock.ChangeSource(adjustableSourceClock); @@ -209,7 +209,7 @@ namespace osu.Game.Screens.Play hudOverlay.Progress.AllowSeeking = HitRenderer.HasReplayLoaded; hudOverlay.Progress.OnSeek = pos => decoupledClock.Seek(pos); - hudOverlay.ModDisplay.Current.BindTo(Beatmap.Mods); + hudOverlay.ModDisplay.Current.BindTo(Beatmap.Value.Mods); //bind HitRenderer to ScoreProcessor and ourselves (for a pass situation) HitRenderer.OnAllJudged += onCompletion; @@ -242,7 +242,7 @@ namespace osu.Game.Screens.Play { var score = new Score { - Beatmap = Beatmap.BeatmapInfo, + Beatmap = Beatmap.Value.BeatmapInfo, Ruleset = ruleset }; scoreProcessor.PopulateScore(score); diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index f2ed378e7c..cdb608e74d 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -35,7 +35,8 @@ namespace osu.Game.Screens.Play { this.player = player; - player.RestartRequested = () => { + player.RestartRequested = () => + { showOverlays = false; ValidForResume = true; }; @@ -74,7 +75,6 @@ namespace osu.Game.Screens.Play { RestartCount = player.RestartCount + 1, RestartRequested = player.RestartRequested, - Beatmap = player.Beatmap, }); Delay(400); diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs index 636851e14d..a15f6461dc 100644 --- a/osu.Game/Screens/Ranking/Results.cs +++ b/osu.Game/Screens/Ranking/Results.cs @@ -165,7 +165,7 @@ namespace osu.Game.Screens.Ranking { RelativeSizeAxes = Axes.Both, Alpha = 0.2f, - Texture = Beatmap?.Background, + Texture = Beatmap.Value?.Background, Anchor = Anchor.Centre, Origin = Anchor.Centre, FillMode = FillMode.Fill diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index f96fbb87cb..4301d80076 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -51,28 +51,30 @@ namespace osu.Game.Screens.Select ValidForResume = false; Push(new Editor()); }, Key.Number3); + + Beatmap.ValueChanged += beatmap_ValueChanged; } - protected override void OnBeatmapChanged(WorkingBeatmap beatmap) + private void beatmap_ValueChanged(WorkingBeatmap beatmap) { + if (!IsCurrentScreen) return; + beatmap?.Mods.BindTo(modSelect.SelectedMods); - if (Beatmap?.Track != null) - Beatmap.Track.Looping = false; + if (Beatmap.Value?.Track != null) + Beatmap.Value.Track.Looping = false; beatmapDetails.Beatmap = beatmap; if (beatmap?.Track != null) beatmap.Track.Looping = true; - - base.OnBeatmapChanged(beatmap); } protected override void OnResuming(Screen last) { player = null; - Beatmap.Track.Looping = true; + Beatmap.Value.Track.Looping = true; base.OnResuming(last); } @@ -95,8 +97,8 @@ namespace osu.Game.Screens.Select if (base.OnExiting(next)) return true; - if (Beatmap?.Track != null) - Beatmap.Track.Looping = false; + if (Beatmap.Value?.Track != null) + Beatmap.Value.Track.Looping = false; return false; } @@ -105,12 +107,9 @@ namespace osu.Game.Screens.Select { if (player != null) return; - Beatmap.Track.Looping = false; + Beatmap.Value.Track.Looping = false; - LoadComponentAsync(player = new PlayerLoader(new Player - { - Beatmap = Beatmap, //eagerly set this so it's present before push. - }), l => Push(player)); + LoadComponentAsync(player = new PlayerLoader(new Player()), l => Push(player)); } } } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 90bbfcc0cb..25469054d4 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using System.Threading; using OpenTK; using OpenTK.Input; @@ -107,8 +108,9 @@ namespace osu.Game.Screens.Select Size = new Vector2(carousel_width, 1), Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - SelectionChanged = selectionChanged, - StartRequested = raiseSelect + SelectionChanged = carouselSelectionChanged, + BeatmapsChanged = carouselBeatmapsLoaded, + StartRequested = carouselRaisedStart }); Add(FilterControl = new FilterControl { @@ -145,7 +147,7 @@ namespace osu.Game.Screens.Select Add(Footer = new Footer { OnBack = Exit, - OnStart = raiseSelect, + OnStart = carouselRaisedStart, }); FooterPanels.Add(BeatmapOptions = new BeatmapOptionsOverlay()); @@ -180,34 +182,70 @@ namespace osu.Game.Screens.Select initialAddSetsTask = new CancellationTokenSource(); - carousel.BeatmapsChanged = beatmapsLoaded; carousel.Beatmaps = database.GetAllWithChildren(b => !b.DeletePending); + + Beatmap.ValueChanged += beatmap_ValueChanged; } - private void beatmapsLoaded() + private void carouselBeatmapsLoaded() { - if (Beatmap != null) - carousel.SelectBeatmap(Beatmap.BeatmapInfo, false); + if (Beatmap.Value != null && !Beatmap.Value.BeatmapSetInfo.DeletePending) + carousel.SelectBeatmap(Beatmap.Value.BeatmapInfo, false); else carousel.SelectNext(); } - private void raiseSelect() + private void carouselRaisedStart() { var pendingSelection = selectionChangedDebounce; selectionChangedDebounce = null; if (pendingSelection?.Completed == false) { - pendingSelection?.RunTask(); - pendingSelection?.Cancel(); // cancel the already scheduled task. + pendingSelection.RunTask(); + pendingSelection.Cancel(); // cancel the already scheduled task. } - if (Beatmap == null) return; - OnSelected(); } + private ScheduledDelegate selectionChangedDebounce; + + // We need to keep track of the last selected beatmap ignoring debounce to play the correct selection sounds. + private BeatmapInfo beatmapNoDebounce; + + /// + /// selection has been changed as the result of interaction with the carousel. + /// + private void carouselSelectionChanged(BeatmapInfo beatmap) + { + selectionChangedDebounce?.Cancel(); + + if (beatmap.Equals(beatmapNoDebounce)) + return; + + bool preview = beatmap.BeatmapSetInfoID != Beatmap.Value?.BeatmapInfo.BeatmapSetInfoID; + + if (beatmap.BeatmapSetInfoID == beatmapNoDebounce?.BeatmapSetInfoID) + sampleChangeDifficulty.Play(); + else + sampleChangeBeatmap.Play(); + + beatmapNoDebounce = beatmap; + + Action performLoad = delegate + { + Beatmap.Value = database.GetWorkingBeatmap(beatmap, Beatmap); + ensurePlayingSelected(preview); + changeBackground(Beatmap.Value); + }; + + if (beatmap == Beatmap.Value.BeatmapInfo) + performLoad(); + else + selectionChangedDebounce = Scheduler.AddDelayed(performLoad, 100); + } + private void triggerRandom(UserInputManager input) { if (input.CurrentState.Keyboard.ShiftPressed) @@ -231,20 +269,21 @@ namespace osu.Game.Screens.Select { base.OnEntering(last); - //if (Beatmap != null && !Beatmap.BeatmapSetInfo.DeletePending) - //{ - // OnBeatmapChanged(Beatmap); - // ensurePlayingSelected(); - //} - Content.FadeInFromZero(250); FilterControl.Activate(); } + private void beatmap_ValueChanged(WorkingBeatmap beatmap) + { + if (!IsCurrentScreen) return; + + carousel.SelectBeatmap(beatmap?.BeatmapInfo); + } + protected override void OnResuming(Screen last) { - if (Beatmap != null && !Beatmap.BeatmapSetInfo.DeletePending) + if (Beatmap != null && !Beatmap.Value.BeatmapSetInfo.DeletePending) { changeBackground(Beatmap); ensurePlayingSelected(); @@ -306,58 +345,15 @@ namespace osu.Game.Screens.Select beatmapInfoWedge.UpdateBeatmap(beatmap); } - /// - /// The global Beatmap was changed. - /// - protected override void OnBeatmapChanged(WorkingBeatmap beatmap) - { - base.OnBeatmapChanged(beatmap); - - //todo: change background in selectionChanged instead; support per-difficulty backgrounds. - changeBackground(beatmap); - carousel.SelectBeatmap(beatmap?.BeatmapInfo); - } - - private ScheduledDelegate selectionChangedDebounce; - - // We need to keep track of the last selected beatmap ignoring debounce to play the correct selection sounds. - private BeatmapInfo selectionChangeNoBounce; - - /// - /// selection has been changed as the result of interaction with the carousel. - /// - private void selectionChanged(BeatmapInfo beatmap) - { - selectionChangedDebounce?.Cancel(); - - if (beatmap.Equals(selectionChangeNoBounce)) - return; - - bool preview = beatmap.BeatmapSetInfoID != Beatmap?.BeatmapInfo.BeatmapSetInfoID; - - if (beatmap.BeatmapSetInfoID == selectionChangeNoBounce?.BeatmapSetInfoID) - sampleChangeDifficulty.Play(); - else - sampleChangeBeatmap.Play(); - - selectionChangeNoBounce = beatmap; - - selectionChangedDebounce = Scheduler.AddDelayed(delegate - { - Beatmap = database.GetWorkingBeatmap(beatmap, Beatmap); - ensurePlayingSelected(preview); - }, 100); - } - private void ensurePlayingSelected(bool preview = false) { - Track track = Beatmap?.Track; + Track track = Beatmap.Value?.Track; trackManager.SetExclusive(track); if (track != null) { - if (preview) track.Seek(Beatmap.Metadata.PreviewTime); + if (preview) track.Seek(Beatmap.Value.Metadata.PreviewTime); track.Start(); } } @@ -366,7 +362,7 @@ namespace osu.Game.Screens.Select { carousel.RemoveBeatmap(beatmapSet); if (carousel.SelectedBeatmap == null) - Beatmap = null; + Beatmap.SetDefault(); } private void promptDelete() @@ -383,7 +379,7 @@ namespace osu.Game.Screens.Select { case Key.KeypadEnter: case Key.Enter: - raiseSelect(); + carouselRaisedStart(); return true; case Key.Delete: if (state.Keyboard.ShiftPressed)