diff --git a/osu-framework b/osu-framework
index d4a40115e7..a1a62c14a5 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit d4a40115e704656191ae875ec742db6427767329
+Subproject commit a1a62c14a51654c933c5b077c725d566f167145b
diff --git a/osu.Desktop.VisualTests/Beatmaps/TestWorkingBeatmap.cs b/osu.Desktop.VisualTests/Beatmaps/TestWorkingBeatmap.cs
index 5e3f5b5133..b45574b761 100644
--- a/osu.Desktop.VisualTests/Beatmaps/TestWorkingBeatmap.cs
+++ b/osu.Desktop.VisualTests/Beatmaps/TestWorkingBeatmap.cs
@@ -10,7 +10,7 @@ namespace osu.Desktop.VisualTests.Beatmaps
public class TestWorkingBeatmap : WorkingBeatmap
{
public TestWorkingBeatmap(Beatmap beatmap)
- : base(beatmap.BeatmapInfo, beatmap.BeatmapInfo.BeatmapSet)
+ : base(beatmap.BeatmapInfo)
{
this.beatmap = beatmap;
}
diff --git a/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs b/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs
index 4368e8488c..3ad83beb73 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseManiaHitObjects.cs
@@ -73,8 +73,7 @@ namespace osu.Desktop.VisualTests.Tests
new DrawableHoldNote(new HoldNote
{
StartTime = 5000,
- Duration = 1000,
-
+ Duration = 1000
})
{
AccentColour = Color4.Red
diff --git a/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs b/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs
index 7428f34882..2a0ce88506 100644
--- a/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs
+++ b/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs
@@ -119,10 +119,17 @@ namespace osu.Game.Rulesets.Mania.Judgements
///
public double Miss = miss_mid;
+ ///
+ /// Constructs default hit windows.
+ ///
public HitWindows()
{
}
+ ///
+ /// Constructs hit windows by fitting a parameter to a 2-part piecewise linear function for each hit window.
+ ///
+ /// The parameter.
public HitWindows(double difficulty)
{
Perfect = BeatmapDifficulty.DifficultyRange(difficulty, perfect_max, perfect_mid, perfect_min);
@@ -133,6 +140,11 @@ namespace osu.Game.Rulesets.Mania.Judgements
Miss = BeatmapDifficulty.DifficultyRange(difficulty, miss_max, miss_mid, miss_min);
}
+ ///
+ /// Constructs new hit windows which have been multiplied by a value.
+ ///
+ /// The original hit windows.
+ /// The value to multiply each hit window by.
public static HitWindows operator *(HitWindows windows, double value)
{
return new HitWindows
@@ -146,6 +158,11 @@ namespace osu.Game.Rulesets.Mania.Judgements
};
}
+ ///
+ /// Constructs new hit windows which have been divided by a value.
+ ///
+ /// The original hit windows.
+ /// The value to divide each hit window by.
public static HitWindows operator /(HitWindows windows, double value)
{
return new HitWindows
diff --git a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
index b39db30fe8..e259f700b1 100644
--- a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
+++ b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
@@ -135,15 +135,14 @@ namespace osu.Game.Tests.Beatmaps.IO
waitAction = () =>
{
while ((resultBeatmaps = host.Dependencies.Get()
- .Query().Where(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
+ .GetAllWithChildren(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
Thread.Sleep(50);
};
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
@"Beatmaps did not import to the database in allocated time");
- //fetch children and check we can load from the post-storage path...
- var set = host.Dependencies.Get().GetChildren(resultSets.First());
+ var set = host.Dependencies.Get().GetChildren(resultSets.First(), true);
Assert.IsTrue(set.Beatmaps.Count == resultBeatmaps.Count(),
$@"Incorrect database beatmap count post-import ({resultBeatmaps.Count()} but should be {set.Beatmaps.Count}).");
diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
index db14a48af1..8431e5f812 100644
--- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
+++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
@@ -51,14 +51,12 @@ namespace osu.Game.Beatmaps.Drawables
title = new OsuSpriteText
{
Font = @"Exo2.0-BoldItalic",
- Text = beatmap.BeatmapSetInfo.Metadata.Title,
TextSize = 22,
Shadow = true,
},
artist = new OsuSpriteText
{
Font = @"Exo2.0-SemiBoldItalic",
- Text = beatmap.BeatmapSetInfo.Metadata.Artist,
TextSize = 17,
Shadow = true,
},
@@ -81,8 +79,8 @@ namespace osu.Game.Beatmaps.Drawables
[BackgroundDependencyLoader]
private void load(LocalisationEngine localisation)
{
- title.Current = localisation.GetUnicodePreference(beatmap.BeatmapSetInfo.Metadata.TitleUnicode, beatmap.BeatmapSetInfo.Metadata.Title);
- artist.Current = localisation.GetUnicodePreference(beatmap.BeatmapSetInfo.Metadata.ArtistUnicode, beatmap.BeatmapSetInfo.Metadata.Artist);
+ title.Current = localisation.GetUnicodePreference(beatmap.Metadata.TitleUnicode, beatmap.Metadata.Title);
+ artist.Current = localisation.GetUnicodePreference(beatmap.Metadata.ArtistUnicode, beatmap.Metadata.Artist);
}
private class PanelBackground : BufferedContainer
diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index 589557b088..0e8d8a9546 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -18,14 +18,17 @@ namespace osu.Game.Beatmaps
public readonly BeatmapSetInfo BeatmapSetInfo;
+ public readonly BeatmapMetadata Metadata;
+
public readonly Bindable> Mods = new Bindable>(new Mod[] { });
public readonly bool WithStoryboard;
- protected WorkingBeatmap(BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, bool withStoryboard = false)
+ protected WorkingBeatmap(BeatmapInfo beatmapInfo, bool withStoryboard = false)
{
BeatmapInfo = beatmapInfo;
- BeatmapSetInfo = beatmapSetInfo;
+ BeatmapSetInfo = beatmapInfo.BeatmapSet;
+ Metadata = beatmapInfo.Metadata ?? BeatmapSetInfo.Metadata;
WithStoryboard = withStoryboard;
Mods.ValueChanged += mods => applyRateAdjustments();
diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs
index 0e814dea82..760b7ae353 100644
--- a/osu.Game/Database/BeatmapDatabase.cs
+++ b/osu.Game/Database/BeatmapDatabase.cs
@@ -36,14 +36,12 @@ namespace osu.Game.Database
private void deletePending()
{
- foreach (var b in Query().Where(b => b.DeletePending))
+ foreach (var b in GetAllWithChildren(b => b.DeletePending))
{
try
{
Storage.Delete(b.Path);
- GetChildren(b, true);
-
foreach (var i in b.Beatmaps)
{
if (i.Metadata != null) Connection.Delete(i.Metadata);
@@ -269,20 +267,13 @@ namespace osu.Game.Database
public WorkingBeatmap GetWorkingBeatmap(BeatmapInfo beatmapInfo, WorkingBeatmap previous = null, bool withStoryboard = false)
{
- var beatmapSetInfo = Query().FirstOrDefault(s => s.ID == beatmapInfo.BeatmapSetInfoID);
-
- if (beatmapSetInfo == null)
+ if (beatmapInfo.BeatmapSet == null)
throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetInfoID} is not in the local database.");
- //we need metadata
- GetChildren(beatmapSetInfo);
- //we also need a ruleset
- GetChildren(beatmapInfo);
-
if (beatmapInfo.Metadata == null)
- beatmapInfo.Metadata = beatmapSetInfo.Metadata;
+ beatmapInfo.Metadata = beatmapInfo.BeatmapSet.Metadata;
- WorkingBeatmap working = new DatabaseWorkingBeatmap(this, beatmapInfo, beatmapSetInfo, withStoryboard);
+ WorkingBeatmap working = new DatabaseWorkingBeatmap(this, beatmapInfo, withStoryboard);
previous?.TransferTo(working);
diff --git a/osu.Game/Database/Database.cs b/osu.Game/Database/Database.cs
index 23851b3b2e..9b49583875 100644
--- a/osu.Game/Database/Database.cs
+++ b/osu.Game/Database/Database.cs
@@ -48,9 +48,9 @@ namespace osu.Game.Database
return Connection.Table();
}
- public T GetWithChildren(object id) where T : class
+ public T GetWithChildren(object id, bool recursive = false) where T : class
{
- return Connection.GetWithChildren(id);
+ return Connection.GetWithChildren(id, recursive);
}
public List GetAllWithChildren(Expression> filter = null, bool recursive = true)
diff --git a/osu.Game/Database/DatabaseWorkingBeatmap.cs b/osu.Game/Database/DatabaseWorkingBeatmap.cs
index 9fb3bed1e7..c56d6cea51 100644
--- a/osu.Game/Database/DatabaseWorkingBeatmap.cs
+++ b/osu.Game/Database/DatabaseWorkingBeatmap.cs
@@ -14,8 +14,8 @@ namespace osu.Game.Database
{
private readonly BeatmapDatabase database;
- public DatabaseWorkingBeatmap(BeatmapDatabase database, BeatmapInfo beatmapInfo, BeatmapSetInfo beatmapSetInfo, bool withStoryboard = false)
- : base(beatmapInfo, beatmapSetInfo, withStoryboard)
+ public DatabaseWorkingBeatmap(BeatmapDatabase database, BeatmapInfo beatmapInfo, bool withStoryboard = false)
+ : base(beatmapInfo, withStoryboard)
{
this.database = database;
}
@@ -51,13 +51,13 @@ namespace osu.Game.Database
protected override Texture GetBackground()
{
- if (BeatmapInfo?.Metadata?.BackgroundFile == null)
+ if (Metadata?.BackgroundFile == null)
return null;
try
{
using (var reader = getReader())
- return new TextureStore(new RawTextureLoaderStore(reader), false).Get(BeatmapInfo.Metadata.BackgroundFile);
+ return new TextureStore(new RawTextureLoaderStore(reader), false).Get(Metadata.BackgroundFile);
}
catch { return null; }
}
@@ -66,7 +66,7 @@ namespace osu.Game.Database
{
try
{
- var trackData = getReader()?.GetStream(BeatmapInfo.Metadata.AudioFile);
+ var trackData = getReader()?.GetStream(Metadata.AudioFile);
return trackData == null ? null : new TrackBass(trackData);
}
catch { return null; }
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 91d35db3bb..e3edaa0ca7 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -315,7 +315,7 @@ namespace osu.Game.Overlays
}
else
{
- BeatmapMetadata metadata = beatmap.Beatmap.BeatmapInfo.Metadata;
+ BeatmapMetadata metadata = beatmap.Metadata;
title.Current = localisation.GetUnicodePreference(metadata.TitleUnicode, metadata.Title);
artist.Current = localisation.GetUnicodePreference(metadata.ArtistUnicode, metadata.Artist);
}
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index a23efcd9d4..f8b8882d3d 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -1,13 +1,16 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+using System.Threading.Tasks;
+using OpenTK;
+using OpenTK.Input;
using osu.Framework.Allocation;
using osu.Framework.Audio.Track;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
+using osu.Framework.Input;
using osu.Framework.MathUtils;
using osu.Framework.Screens;
-using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Database;
using osu.Game.Graphics.Containers;
@@ -16,14 +19,8 @@ using osu.Game.Screens.Charts;
using osu.Game.Screens.Direct;
using osu.Game.Screens.Edit;
using osu.Game.Screens.Multiplayer;
-using OpenTK;
using osu.Game.Screens.Select;
using osu.Game.Screens.Tournament;
-using osu.Framework.Input;
-using OpenTK.Input;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-using System.Linq;
namespace osu.Game.Screens.Menu
{
@@ -65,7 +62,6 @@ namespace osu.Game.Screens.Menu
private Bindable menuMusic;
private TrackManager trackManager;
- private WorkingBeatmap song;
[BackgroundDependencyLoader]
private void load(OsuGame game, OsuConfigManager config, BeatmapDatabase beatmaps)
@@ -76,11 +72,15 @@ namespace osu.Game.Screens.Menu
if (!menuMusic)
{
trackManager = game.Audio.Track;
- List choosableBeatmapSets = beatmaps.Query().ToList();
- if (choosableBeatmapSets.Count > 0)
+
+ var query = beatmaps.Query().Where(b => !b.DeletePending);
+ int count = query.Count();
+
+ if (count > 0)
{
- song = beatmaps.GetWorkingBeatmap(beatmaps.GetWithChildren(choosableBeatmapSets[RNG.Next(0, choosableBeatmapSets.Count - 1)].ID).Beatmaps[0]);
- Beatmap = song;
+ var beatmap = query.ElementAt(RNG.Next(0, count - 1));
+ beatmaps.GetChildren(beatmap, true);
+ Beatmap = beatmaps.GetWorkingBeatmap(beatmap.Beatmaps[0]);
}
}
@@ -106,15 +106,15 @@ namespace osu.Game.Screens.Menu
{
base.OnEntering(last);
buttons.FadeInFromZero(500);
- if (last is Intro && song != null)
+ if (last is Intro && Beatmap != null)
{
Task.Run(() =>
{
- trackManager.SetExclusive(song.Track);
- song.Track.Seek(song.Beatmap.Metadata.PreviewTime);
- if (song.Beatmap.Metadata.PreviewTime == -1)
- song.Track.Seek(song.Track.Length * 0.4f);
- song.Track.Start();
+ trackManager.SetExclusive(Beatmap.Track);
+ Beatmap.Track.Seek(Beatmap.Metadata.PreviewTime);
+ if (Beatmap.Metadata.PreviewTime == -1)
+ Beatmap.Track.Seek(Beatmap.Track.Length * 0.4f);
+ Beatmap.Track.Start();
});
}
}
diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index d05dd43b63..fbdaa948cc 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -220,13 +220,11 @@ namespace osu.Game.Screens.Select
private BeatmapGroup createGroup(BeatmapSetInfo beatmapSet)
{
- database.GetChildren(beatmapSet);
- beatmapSet.Beatmaps.ForEach(b =>
+ foreach(var b in beatmapSet.Beatmaps)
{
- database.GetChildren(b);
if (b.Metadata == null)
b.Metadata = beatmapSet.Metadata;
- });
+ }
return new BeatmapGroup(beatmapSet, database)
{
diff --git a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs
index e6e9a86124..0890625eb9 100644
--- a/osu.Game/Screens/Select/BeatmapDeleteDialog.cs
+++ b/osu.Game/Screens/Select/BeatmapDeleteDialog.cs
@@ -26,7 +26,7 @@ namespace osu.Game.Screens.Select
Icon = FontAwesome.fa_trash_o;
HeaderText = @"Confirm deletion of";
- BodyText = $@"{beatmap.Beatmap?.Metadata?.Artist} - {beatmap.Beatmap?.Metadata?.Title}";
+ BodyText = $@"{beatmap.Metadata?.Artist} - {beatmap.Metadata?.Title}";
Buttons = new PopupDialogButton[]
{
new PopupDialogOkButton
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 7d0648ac11..51b67bdbef 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -183,7 +183,7 @@ namespace osu.Game.Screens.Select
initialAddSetsTask = new CancellationTokenSource();
carousel.BeatmapsChanged = beatmapsLoaded;
- carousel.Beatmaps = database.Query().Where(b => !b.DeletePending);
+ carousel.Beatmaps = database.GetAllWithChildren(b => !b.DeletePending);
}
private void beatmapsLoaded()
@@ -343,7 +343,7 @@ namespace osu.Game.Screens.Select
{
trackManager.SetExclusive(track);
if (preview)
- track.Seek(Beatmap.Beatmap.Metadata.PreviewTime);
+ track.Seek(Beatmap.Metadata.PreviewTime);
track.Start();
}
}