From 3a8934841357f3e3b9fb990ad4b531f720101e32 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 24 Feb 2017 13:43:21 +0900 Subject: [PATCH] Centralise access to WorkingBeatmaps. They can now only be instantiated from BeatmapDatabase and are abstract (to avoid misuse). --- .../Tests/TestCasePlayer.cs | 14 +++++++- .../Beatmaps/IO/ImportBeatmapTest.cs | 2 +- osu.Game/Beatmaps/WorkingBeatmap.cs | 33 +++++++------------ osu.Game/Database/BeatmapDatabase.cs | 23 +++++++++---- osu.Game/Database/BeatmapInfo.cs | 3 +- osu.Game/Screens/Select/PlaySongSelect.cs | 4 +-- 6 files changed, 44 insertions(+), 35 deletions(-) diff --git a/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs b/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs index a9b9f796f1..7533a1a1e6 100644 --- a/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs +++ b/osu.Desktop.VisualTests/Tests/TestCasePlayer.cs @@ -8,6 +8,7 @@ using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; using OpenTK; using osu.Framework.Graphics.Sprites; +using osu.Game.Beatmaps.IO; using osu.Game.Database; using osu.Game.Modes; using osu.Game.Modes.Objects; @@ -72,7 +73,7 @@ namespace osu.Desktop.VisualTests.Tests decoder.Process(b); - beatmap = new WorkingBeatmap(b); + beatmap = new TestWorkingBeatmap(b); } Add(new Box @@ -90,5 +91,16 @@ namespace osu.Desktop.VisualTests.Tests Beatmap = beatmap }); } + + class TestWorkingBeatmap : WorkingBeatmap + { + public TestWorkingBeatmap(Beatmap beatmap) + : base(beatmap.BeatmapInfo, beatmap.BeatmapInfo.BeatmapSet) + { + Beatmap = beatmap; + } + + protected override ArchiveReader GetReader() => null; + } } } diff --git a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs index ce702e5679..fe0abd6d87 100644 --- a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs +++ b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs @@ -118,7 +118,7 @@ namespace osu.Game.Tests.Beatmaps.IO Assert.IsTrue(set.Beatmaps.Count > 0); - var beatmap = osu.Dependencies.Get().GetBeatmap(set.Beatmaps.First(b => b.Mode == PlayMode.Osu)); + var beatmap = osu.Dependencies.Get().GetWorkingBeatmap(set.Beatmaps.First(b => b.Mode == PlayMode.Osu))?.Beatmap; Assert.IsTrue(beatmap.HitObjects.Count > 0); } diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs index c6bc4eeeb8..9393c2b0e9 100644 --- a/osu.Game/Beatmaps/WorkingBeatmap.cs +++ b/osu.Game/Beatmaps/WorkingBeatmap.cs @@ -11,16 +11,22 @@ using osu.Game.Database; namespace osu.Game.Beatmaps { - public class WorkingBeatmap : IDisposable + public abstract class WorkingBeatmap : IDisposable { public readonly BeatmapInfo BeatmapInfo; public readonly BeatmapSetInfo BeatmapSetInfo; - private readonly BeatmapDatabase database; public readonly bool WithStoryboard; - private ArchiveReader getReader() => database?.GetReader(BeatmapSetInfo); + protected abstract ArchiveReader GetReader(); + + protected WorkingBeatmap(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, bool withStoryboard = false) + { + BeatmapInfo = beatmapInfo; + BeatmapSetInfo = beatmapSetInfo; + WithStoryboard = withStoryboard; + } private Texture background; private object backgroundLock = new object(); @@ -36,7 +42,7 @@ namespace osu.Game.Beatmaps try { - using (var reader = getReader()) + using (var reader = GetReader()) background = new TextureStore(new RawTextureLoaderStore(reader), false).Get(BeatmapInfo.Metadata.BackgroundFile); } catch { } @@ -59,7 +65,7 @@ namespace osu.Game.Beatmaps try { - using (var reader = getReader()) + using (var reader = GetReader()) { BeatmapDecoder decoder; using (var stream = new StreamReader(reader.GetStream(BeatmapInfo.Path))) @@ -95,7 +101,7 @@ namespace osu.Game.Beatmaps try { //store a reference to the reader as we may continue accessing the stream in the background. - trackReader = getReader(); + trackReader = GetReader(); var trackData = trackReader?.GetStream(BeatmapInfo.Metadata.AudioFile); if (trackData != null) track = new TrackBass(trackData); @@ -110,21 +116,6 @@ namespace osu.Game.Beatmaps public bool TrackLoaded => track != null; - public WorkingBeatmap(Beatmap beatmap) - { - this.beatmap = beatmap; - BeatmapInfo = beatmap.BeatmapInfo; - BeatmapSetInfo = beatmap.BeatmapInfo.BeatmapSet; - } - - public WorkingBeatmap(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, BeatmapDatabase database, bool withStoryboard = false) - { - BeatmapInfo = beatmapInfo; - BeatmapSetInfo = beatmapSetInfo; - this.database = database; - this.WithStoryboard = withStoryboard; - } - private bool isDisposed; protected virtual void Dispose(bool disposing) diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs index 253b83aa38..31877ff866 100644 --- a/osu.Game/Database/BeatmapDatabase.cs +++ b/osu.Game/Database/BeatmapDatabase.cs @@ -183,19 +183,13 @@ namespace osu.Game.Database if (beatmapInfo.Metadata == null) beatmapInfo.Metadata = beatmapSetInfo.Metadata; - var working = new WorkingBeatmap(beatmapInfo, beatmapSetInfo, this, withStoryboard); + WorkingBeatmap working = new DatabaseWorkingBeatmap(this, beatmapInfo, beatmapSetInfo, withStoryboard); previous?.TransferTo(working); return working; } - public Beatmap GetBeatmap(BeatmapInfo beatmapInfo) - { - using (WorkingBeatmap data = GetWorkingBeatmap(beatmapInfo)) - return data.Beatmap; - } - public TableQuery Query() where T : class { return connection.Table(); @@ -237,5 +231,20 @@ namespace osu.Game.Database else connection.Update(record); } + + public bool Exists(BeatmapSetInfo beatmapSet) => storage.Exists(beatmapSet.Path); + + private class DatabaseWorkingBeatmap : WorkingBeatmap + { + private readonly BeatmapDatabase database; + + public DatabaseWorkingBeatmap(BeatmapDatabase database, BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, bool withStoryboard = false) + : base(beatmapInfo, beatmapSetInfo, withStoryboard) + { + this.database = database; + } + + protected override ArchiveReader GetReader() => database?.GetReader(BeatmapSetInfo); + } } } diff --git a/osu.Game/Database/BeatmapInfo.cs b/osu.Game/Database/BeatmapInfo.cs index dd0fffe855..9622b73108 100644 --- a/osu.Game/Database/BeatmapInfo.cs +++ b/osu.Game/Database/BeatmapInfo.cs @@ -87,8 +87,7 @@ namespace osu.Game.Database internal void ComputeDifficulty(BeatmapDatabase database) { - WorkingBeatmap wb = new WorkingBeatmap(this, BeatmapSet, database); - StarDifficulty = (float)Ruleset.GetRuleset(Mode).CreateDifficultyCalculator(wb.Beatmap).GetDifficulty(); + StarDifficulty = (float)Ruleset.GetRuleset(Mode).CreateDifficultyCalculator(database.GetWorkingBeatmap(this).Beatmap).GetDifficulty(); } public bool Equals(BeatmapInfo other) diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index bfa5697047..863ed8b388 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -328,9 +328,7 @@ namespace osu.Game.Screens.Select b.ComputeDifficulty(database); beatmapSet.Beatmaps = beatmapSet.Beatmaps.OrderBy(b => b.StarDifficulty).ToList(); - var beatmap = new WorkingBeatmap(beatmapSet.Beatmaps.FirstOrDefault(), beatmapSet, database); - - var group = new BeatmapGroup(beatmap) + var group = new BeatmapGroup(database.GetWorkingBeatmap(beatmapSet.Beatmaps.FirstOrDefault())) { SelectionChanged = selectionChanged, StartRequested = b => footer.StartButton.TriggerClick()