diff --git a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs index 13c881d1f8..b4aaa2fa03 100644 --- a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs +++ b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs @@ -31,7 +31,8 @@ public LegacyFilesystemReader(string path) using (var stream = new StreamReader(ReadFile(beatmaps[0]))) { var decoder = BeatmapDecoder.GetDecoder(stream); - firstMap = decoder.Decode(stream); + firstMap = new Beatmap(); + decoder.Decode(stream, firstMap); } } diff --git a/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs index 7eddb2a7dc..adc78a55bf 100644 --- a/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs +++ b/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs @@ -3,6 +3,7 @@ using NUnit.Framework; using OpenTK; using OpenTK.Graphics; +using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; using osu.Game.Beatmaps.Objects.Osu; using osu.Game.Beatmaps.Samples; @@ -25,7 +26,8 @@ public void TestDecodeMetadata() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); var meta = beatmap.Metadata; Assert.AreEqual(241526, meta.BeatmapSetID); Assert.AreEqual("Soleily", meta.Artist); @@ -47,7 +49,8 @@ public void TestDecodeGeneral() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); Assert.AreEqual(0, beatmap.AudioLeadIn); Assert.AreEqual(false, beatmap.Countdown); Assert.AreEqual(SampleSet.Soft, beatmap.SampleSet); @@ -65,7 +68,8 @@ public void TestDecodeEditor() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); int[] expectedBookmarks = { 11505, 22054, 32604, 43153, 53703, 64252, 74802, 85351, @@ -88,7 +92,8 @@ public void TestDecodeDifficulty() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); var difficulty = beatmap.BaseDifficulty; Assert.AreEqual(6.5f, difficulty.DrainRate); Assert.AreEqual(4, difficulty.CircleSize); @@ -105,7 +110,8 @@ public void TestDecodeColors() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); Color4[] expected = { new Color4(142, 199, 255, 255), @@ -126,7 +132,8 @@ public void TestDecodeColors() var decoder = new OsuLegacyDecoder(); using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu")) { - var beatmap = decoder.Decode(new StreamReader(stream)); + Beatmap beatmap = new Beatmap(); + decoder.Decode(new StreamReader(stream), beatmap); var slider = beatmap.HitObjects[0] as Slider; Assert.IsNotNull(slider); Assert.AreEqual(new Vector2(192, 168), slider.Position); diff --git a/osu.Game/Beatmaps/BeatmapSet.cs b/osu.Game/Beatmaps/BeatmapSet.cs index 8ba8ef0d53..11f82329f9 100644 --- a/osu.Game/Beatmaps/BeatmapSet.cs +++ b/osu.Game/Beatmaps/BeatmapSet.cs @@ -17,7 +17,7 @@ public class BeatmapSet [NotNull, Indexed] public int BeatmapMetadataID { get; set; } [Ignore] - public List Beatmaps { get; protected set; } + public List Beatmaps { get; protected set; } = new List(); [Ignore] public BeatmapMetadata Metadata { get; set; } [Ignore] diff --git a/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs index 7302e2a4c5..d643433b3c 100644 --- a/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs +++ b/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs @@ -20,6 +20,6 @@ public static BeatmapDecoder GetDecoder(TextReader stream) decoders[magic] = typeof(T); } - public abstract Beatmap Decode(TextReader stream); + public abstract void Decode(TextReader stream, Beatmap beatmap); } } \ No newline at end of file diff --git a/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs b/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs index 89451c1233..4250e9a7c2 100644 --- a/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs +++ b/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs @@ -202,16 +202,16 @@ private void handleColours(Beatmap beatmap, string key, string val) }); } - public override Beatmap Decode(TextReader stream) + public override void Decode(TextReader stream, Beatmap beatmap) { - var beatmap = new Beatmap - { - Metadata = new BeatmapMetadata(), - BaseDifficulty = new BaseDifficulty(), - HitObjects = new List(), - ControlPoints = new List(), - ComboColors = new List(), - }; + // We don't overwrite these two because they're DB bound + if (beatmap.Metadata == null) beatmap.Metadata = new BeatmapMetadata(); + if (beatmap.BaseDifficulty == null) beatmap.BaseDifficulty = new BaseDifficulty(); + // These are fine though + beatmap.HitObjects = new List(); + beatmap.ControlPoints = new List(); + beatmap.ComboColors = new List(); + var section = Section.None; string line; while (true) @@ -266,7 +266,6 @@ public override Beatmap Decode(TextReader stream) break; } } - return beatmap; } } } \ No newline at end of file diff --git a/osu.Game/Beatmaps/IO/OszArchiveReader.cs b/osu.Game/Beatmaps/IO/OszArchiveReader.cs index b83cf8ad04..0aa706933e 100644 --- a/osu.Game/Beatmaps/IO/OszArchiveReader.cs +++ b/osu.Game/Beatmaps/IO/OszArchiveReader.cs @@ -33,7 +33,8 @@ public OszArchiveReader(Stream archiveStream) using (var stream = new StreamReader(ReadFile(beatmaps[0]))) { var decoder = BeatmapDecoder.GetDecoder(stream); - firstMap = decoder.Decode(stream); + firstMap = new Beatmap(); + decoder.Decode(stream, firstMap); } } diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs index dcfc6c91df..4913a51af3 100644 --- a/osu.Game/Database/BeatmapDatabase.cs +++ b/osu.Game/Database/BeatmapDatabase.cs @@ -48,7 +48,7 @@ public BeatmapDatabase(BasicStorage storage) reader = ArchiveReader.GetReader(storage, path); var metadata = reader.ReadMetadata(); if (connection.Table().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0) - return; + return; // TODO: Update this beatmap instead string[] mapNames = reader.ReadBeatmaps(); var beatmapSet = new BeatmapSet { @@ -62,7 +62,8 @@ public BeatmapDatabase(BasicStorage storage) using (var stream = new StreamReader(reader.ReadFile(name))) { var decoder = BeatmapDecoder.GetDecoder(stream); - var beatmap = decoder.Decode(stream); + Beatmap beatmap = new Beatmap(); + decoder.Decode(stream, beatmap); maps.Add(beatmap); beatmap.BaseDifficultyID = connection.Insert(beatmap.BaseDifficulty); } @@ -71,12 +72,29 @@ public BeatmapDatabase(BasicStorage storage) connection.Insert(beatmapSet); connection.InsertAll(maps); } + public ArchiveReader GetReader(BeatmapSet beatmapSet) + { + return ArchiveReader.GetReader(storage, beatmapSet.Path); + } /// /// Given a BeatmapSet pulled from the database, loads the rest of its data from disk. - /// public void PopulateBeatmap(BeatmapSet beatmap) + /// public void PopulateBeatmap(BeatmapSet beatmapSet) { - // TODO + using (var reader = GetReader(beatmapSet)) + { + string[] mapNames = reader.ReadBeatmaps(); + foreach (var name in mapNames) + { + using (var stream = new StreamReader(reader.ReadFile(name))) + { + var decoder = BeatmapDecoder.GetDecoder(stream); + Beatmap beatmap = new Beatmap(); + decoder.Decode(stream, beatmap); + beatmapSet.Beatmaps.Add(beatmap); + } + } + } } } } \ No newline at end of file