diff --git a/osu-framework b/osu-framework
index 30ff0e1a99..3629521379 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 30ff0e1a99a10e735611bb3ffa35352061f52d8a
+Subproject commit 3629521379bea5d79cd41e35ad6c6dfe21b4f9e7
diff --git a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
index a6367ebfab..8282d8556a 100644
--- a/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
+++ b/osu.Desktop/Beatmaps/IO/LegacyFilesystemReader.cs
@@ -1,38 +1,39 @@
-using System;
-using System.IO;
+using System;
+using System.IO;
using System.Collections.Generic;
using System.Linq;
using osu.Game.Beatmaps.Formats;
using osu.Game.Beatmaps.IO;
using osu.Game.Beatmaps;
-namespace osu.Desktop.Beatmaps.IO
-{
- ///
- /// Reads an extracted legacy beatmap from disk.
- ///
- public class LegacyFilesystemReader : ArchiveReader
- {
- static LegacyFilesystemReader()
- {
- AddReader((storage, path) => Directory.Exists(path));
- }
-
- private string basePath { get; set; }
- private string[] beatmaps { get; set; }
- private Beatmap firstMap { get; set; }
-
- public LegacyFilesystemReader(string path)
- {
- basePath = path;
- beatmaps = Directory.GetFiles(basePath, @"*.osu").Select(f => Path.GetFileName(f)).ToArray();
- if (beatmaps.Length == 0)
- throw new FileNotFoundException(@"This directory contains no beatmaps");
- using (var stream = new StreamReader(ReadFile(beatmaps[0])))
- {
- var decoder = BeatmapDecoder.GetDecoder(stream);
- firstMap = decoder.Decode(stream);
- }
+namespace osu.Desktop.Beatmaps.IO
+{
+ ///
+ /// Reads an extracted legacy beatmap from disk.
+ ///
+ public class LegacyFilesystemReader : ArchiveReader
+ {
+ static LegacyFilesystemReader()
+ {
+ AddReader((storage, path) => Directory.Exists(path));
+ }
+
+ private string basePath { get; set; }
+ private string[] beatmaps { get; set; }
+ private Beatmap firstMap { get; set; }
+
+ public LegacyFilesystemReader(string path)
+ {
+ basePath = path;
+ beatmaps = Directory.GetFiles(basePath, @"*.osu").Select(f => Path.GetFileName(f)).ToArray();
+ if (beatmaps.Length == 0)
+ throw new FileNotFoundException(@"This directory contains no beatmaps");
+ using (var stream = new StreamReader(ReadFile(beatmaps[0])))
+ {
+ var decoder = BeatmapDecoder.GetDecoder(stream);
+ firstMap = new Beatmap();
+ decoder.Decode(stream, firstMap);
+ }
}
public override string[] ReadBeatmaps()
@@ -48,10 +49,10 @@ namespace osu.Desktop.Beatmaps.IO
public override BeatmapMetadata ReadMetadata()
{
return firstMap.Metadata;
- }
-
+ }
+
public override void Dispose()
- {
+ {
// no-op
- }
}
+ }
}
}
\ No newline at end of file
diff --git a/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs b/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs
index 7eddb2a7dc..adb203b483 100644
--- a/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs
+++ b/osu.Game.Tests/Beatmaps/Formats/OsuLegacyDecoderTest.cs
@@ -1,143 +1,150 @@
-using System;
+using System;
using System.IO;
-using NUnit.Framework;
+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;
using osu.Game.GameModes.Play;
using osu.Game.Tests.Resources;
-namespace osu.Game.Tests.Beatmaps.Formats
-{
- [TestFixture]
- public class OsuLegacyDecoderTest
- {
- [TestFixtureSetUp]
- public void SetUp()
- {
- OsuLegacyDecoder.Register();
+namespace osu.Game.Tests.Beatmaps.Formats
+{
+ [TestFixture]
+ public class OsuLegacyDecoderTest
+ {
+ [TestFixtureSetUp]
+ public void SetUp()
+ {
+ OsuLegacyDecoder.Register();
}
-
[Test]
- public void TestDecodeMetadata()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
- var meta = beatmap.Metadata;
- Assert.AreEqual(241526, meta.BeatmapSetID);
- Assert.AreEqual("Soleily", meta.Artist);
- Assert.AreEqual("Soleily", meta.ArtistUnicode);
- Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
- Assert.AreEqual("Gamu", meta.Author);
- Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
- Assert.AreEqual(164471, meta.PreviewTime);
- Assert.AreEqual(string.Empty, meta.Source);
- Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
- Assert.AreEqual("Renatus", meta.Title);
- Assert.AreEqual("Renatus", meta.TitleUnicode);
- }
+
[Test]
+ public void TestDecodeMetadata()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ Beatmap beatmap = new Beatmap();
+ decoder.Decode(new StreamReader(stream), beatmap);
+ var meta = beatmap.Metadata;
+ Assert.AreEqual(241526, meta.BeatmapSetID);
+ Assert.AreEqual("Soleily", meta.Artist);
+ Assert.AreEqual("Soleily", meta.ArtistUnicode);
+ Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
+ Assert.AreEqual("Gamu", meta.Author);
+ Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
+ Assert.AreEqual(164471, meta.PreviewTime);
+ Assert.AreEqual(string.Empty, meta.Source);
+ Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
+ Assert.AreEqual("Renatus", meta.Title);
+ Assert.AreEqual("Renatus", meta.TitleUnicode);
+ }
}
- [Test]
- public void TestDecodeGeneral()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
- Assert.AreEqual(0, beatmap.AudioLeadIn);
- Assert.AreEqual(false, beatmap.Countdown);
- Assert.AreEqual(SampleSet.Soft, beatmap.SampleSet);
- Assert.AreEqual(0.7f, beatmap.StackLeniency);
- Assert.AreEqual(false, beatmap.SpecialStyle);
- Assert.AreEqual(PlayMode.Osu, beatmap.Mode);
- Assert.AreEqual(false, beatmap.LetterboxInBreaks);
- Assert.AreEqual(false, beatmap.WidescreenStoryboard);
- }
+ [Test]
+ public void TestDecodeGeneral()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ 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);
+ Assert.AreEqual(0.7f, beatmap.StackLeniency);
+ Assert.AreEqual(false, beatmap.SpecialStyle);
+ Assert.AreEqual(PlayMode.Osu, beatmap.Mode);
+ Assert.AreEqual(false, beatmap.LetterboxInBreaks);
+ Assert.AreEqual(false, beatmap.WidescreenStoryboard);
+ }
}
- [Test]
- public void TestDecodeEditor()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
- int[] expectedBookmarks =
- {
- 11505, 22054, 32604, 43153, 53703, 64252, 74802, 85351,
- 95901, 106450, 116999, 119637, 130186, 140735, 151285,
- 161834, 164471, 175020, 185570, 196119, 206669, 209306
- };
- Assert.AreEqual(expectedBookmarks.Length, beatmap.Bookmarks.Length);
- for (int i = 0; i < expectedBookmarks.Length; i++)
- Assert.AreEqual(expectedBookmarks[i], beatmap.Bookmarks[i]);
- Assert.AreEqual(1.8, beatmap.DistanceSpacing);
- Assert.AreEqual(4, beatmap.BeatDivisor);
- Assert.AreEqual(4, beatmap.GridSize);
- Assert.AreEqual(2, beatmap.TimelineZoom);
- }
+ [Test]
+ public void TestDecodeEditor()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ Beatmap beatmap = new Beatmap();
+ decoder.Decode(new StreamReader(stream), beatmap);
+ int[] expectedBookmarks =
+ {
+ 11505, 22054, 32604, 43153, 53703, 64252, 74802, 85351,
+ 95901, 106450, 116999, 119637, 130186, 140735, 151285,
+ 161834, 164471, 175020, 185570, 196119, 206669, 209306
+ };
+ Assert.AreEqual(expectedBookmarks.Length, beatmap.Bookmarks.Length);
+ for (int i = 0; i < expectedBookmarks.Length; i++)
+ Assert.AreEqual(expectedBookmarks[i], beatmap.Bookmarks[i]);
+ Assert.AreEqual(1.8, beatmap.DistanceSpacing);
+ Assert.AreEqual(4, beatmap.BeatDivisor);
+ Assert.AreEqual(4, beatmap.GridSize);
+ Assert.AreEqual(2, beatmap.TimelineZoom);
+ }
}
- [Test]
- public void TestDecodeDifficulty()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
- var difficulty = beatmap.BaseDifficulty;
- Assert.AreEqual(6.5f, difficulty.DrainRate);
- Assert.AreEqual(4, difficulty.CircleSize);
- Assert.AreEqual(8, difficulty.OverallDifficulty);
- Assert.AreEqual(9, difficulty.ApproachRate);
- Assert.AreEqual(1.8f, difficulty.SliderMultiplier);
- Assert.AreEqual(2, difficulty.SliderTickRate);
- }
+ [Test]
+ public void TestDecodeDifficulty()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ 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);
+ Assert.AreEqual(8, difficulty.OverallDifficulty);
+ Assert.AreEqual(9, difficulty.ApproachRate);
+ Assert.AreEqual(1.8f, difficulty.SliderMultiplier);
+ Assert.AreEqual(2, difficulty.SliderTickRate);
+ }
}
- [Test]
- public void TestDecodeColors()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
+ [Test]
+ public void TestDecodeColors()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ Beatmap beatmap = new Beatmap();
+ decoder.Decode(new StreamReader(stream), beatmap);
Color4[] expected =
- {
- new Color4(142, 199, 255, 255),
- new Color4(255, 128, 128, 255),
- new Color4(128, 255, 255, 255),
- new Color4(128, 255, 128, 255),
- new Color4(255, 187, 255, 255),
- new Color4(255, 177, 140, 255),
- };
- Assert.AreEqual(expected.Length, beatmap.ComboColors.Count);
- for (int i = 0; i < expected.Length; i++)
- Assert.AreEqual(expected[i], beatmap.ComboColors[i]);
- }
+ {
+ new Color4(142, 199, 255, 255),
+ new Color4(255, 128, 128, 255),
+ new Color4(128, 255, 255, 255),
+ new Color4(128, 255, 128, 255),
+ new Color4(255, 187, 255, 255),
+ new Color4(255, 177, 140, 255),
+ };
+ Assert.AreEqual(expected.Length, beatmap.ComboColors.Count);
+ for (int i = 0; i < expected.Length; i++)
+ Assert.AreEqual(expected[i], beatmap.ComboColors[i]);
+ }
}
-
- [Test]
public void TestDecodeHitObjects()
- {
- var decoder = new OsuLegacyDecoder();
- using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
- {
- var beatmap = decoder.Decode(new StreamReader(stream));
- var slider = beatmap.HitObjects[0] as Slider;
- Assert.IsNotNull(slider);
- Assert.AreEqual(new Vector2(192, 168), slider.Position);
- Assert.AreEqual(956, slider.StartTime);
- Assert.AreEqual(SampleType.None, slider.Sample.Type);
- var circle = beatmap.HitObjects[1] as Circle;
- Assert.IsNotNull(circle);
- Assert.AreEqual(new Vector2(304, 56), circle.Position);
- Assert.AreEqual(1285, circle.StartTime);
+
+ [Test]
public void TestDecodeHitObjects()
+ {
+ var decoder = new OsuLegacyDecoder();
+ using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
+ {
+ 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);
+ Assert.AreEqual(956, slider.StartTime);
+ Assert.AreEqual(SampleType.None, slider.Sample.Type);
+ var circle = beatmap.HitObjects[1] as Circle;
+ Assert.IsNotNull(circle);
+ Assert.AreEqual(new Vector2(304, 56), circle.Position);
+ Assert.AreEqual(1285, circle.StartTime);
Assert.AreEqual(SampleType.Clap, circle.Sample.Type);
- }
- }
- }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/osu.Game.Tests/Beatmaps/IO/OszArchiveReaderTest.cs b/osu.Game.Tests/Beatmaps/IO/OszArchiveReaderTest.cs
index e224bf3db4..caa56c26c2 100644
--- a/osu.Game.Tests/Beatmaps/IO/OszArchiveReaderTest.cs
+++ b/osu.Game.Tests/Beatmaps/IO/OszArchiveReaderTest.cs
@@ -1,81 +1,81 @@
-using System;
+using System;
using System.IO;
using NUnit.Framework;
using osu.Game.Beatmaps.IO;
using osu.Game.GameModes.Play;
using osu.Game.Tests.Resources;
-namespace osu.Game.Tests.Beatmaps.IO
-{
- [TestFixture]
- public class OszArchiveReaderTest
- {
- [TestFixtureSetUp]
- public void SetUp()
- {
- OszArchiveReader.Register();
- }
-
- [Test]
- public void TestReadBeatmaps()
- {
- using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
- {
- var reader = new OszArchiveReader(osz);
- string[] expected =
- {
- "Soleily - Renatus (Deif) [Platter].osu",
- "Soleily - Renatus (Deif) [Rain].osu",
- "Soleily - Renatus (Deif) [Salad].osu",
- "Soleily - Renatus (ExPew) [Another].osu",
- "Soleily - Renatus (ExPew) [Hyper].osu",
- "Soleily - Renatus (ExPew) [Normal].osu",
- "Soleily - Renatus (Gamu) [Hard].osu",
- "Soleily - Renatus (Gamu) [Insane].osu",
- "Soleily - Renatus (Gamu) [Normal].osu",
- "Soleily - Renatus (MMzz) [Futsuu].osu",
- "Soleily - Renatus (MMzz) [Muzukashii].osu",
- "Soleily - Renatus (MMzz) [Oni].osu"
- };
- var maps = reader.ReadBeatmaps();
- foreach (var map in expected)
- Assert.Contains(map, maps);
- }
+namespace osu.Game.Tests.Beatmaps.IO
+{
+ [TestFixture]
+ public class OszArchiveReaderTest
+ {
+ [TestFixtureSetUp]
+ public void SetUp()
+ {
+ OszArchiveReader.Register();
+ }
+
+ [Test]
+ public void TestReadBeatmaps()
+ {
+ using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
+ {
+ var reader = new OszArchiveReader(osz);
+ string[] expected =
+ {
+ "Soleily - Renatus (Deif) [Platter].osu",
+ "Soleily - Renatus (Deif) [Rain].osu",
+ "Soleily - Renatus (Deif) [Salad].osu",
+ "Soleily - Renatus (ExPew) [Another].osu",
+ "Soleily - Renatus (ExPew) [Hyper].osu",
+ "Soleily - Renatus (ExPew) [Normal].osu",
+ "Soleily - Renatus (Gamu) [Hard].osu",
+ "Soleily - Renatus (Gamu) [Insane].osu",
+ "Soleily - Renatus (Gamu) [Normal].osu",
+ "Soleily - Renatus (MMzz) [Futsuu].osu",
+ "Soleily - Renatus (MMzz) [Muzukashii].osu",
+ "Soleily - Renatus (MMzz) [Oni].osu"
+ };
+ var maps = reader.ReadBeatmaps();
+ foreach (var map in expected)
+ Assert.Contains(map, maps);
+ }
}
- [Test]
- public void TestReadMetadata()
- {
- using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
- {
- var reader = new OszArchiveReader(osz);
- var meta = reader.ReadMetadata();
- Assert.AreEqual(241526, meta.BeatmapSetID);
- Assert.AreEqual("Soleily", meta.Artist);
- Assert.AreEqual("Soleily", meta.ArtistUnicode);
- Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
- Assert.AreEqual("Deif", meta.Author);
- Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
- Assert.AreEqual(164471, meta.PreviewTime);
- Assert.AreEqual(string.Empty, meta.Source);
- Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
- Assert.AreEqual("Renatus", meta.Title);
- Assert.AreEqual("Renatus", meta.TitleUnicode);
- }
+ [Test]
+ public void TestReadMetadata()
+ {
+ using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
+ {
+ var reader = new OszArchiveReader(osz);
+ var meta = reader.ReadMetadata();
+ Assert.AreEqual(241526, meta.BeatmapSetID);
+ Assert.AreEqual("Soleily", meta.Artist);
+ Assert.AreEqual("Soleily", meta.ArtistUnicode);
+ Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
+ Assert.AreEqual("Deif", meta.Author);
+ Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
+ Assert.AreEqual(164471, meta.PreviewTime);
+ Assert.AreEqual(string.Empty, meta.Source);
+ Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
+ Assert.AreEqual("Renatus", meta.Title);
+ Assert.AreEqual("Renatus", meta.TitleUnicode);
+ }
}
-
[Test]
- public void TestReadFile()
- {
- using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
- {
- var reader = new OszArchiveReader(osz);
- using (var stream = new StreamReader(
- reader.ReadFile("Soleily - Renatus (Deif) [Platter].osu")))
- {
- Assert.AreEqual("osu file format v13", stream.ReadLine().Trim());
- }
- }
- }
- }
-}
-
+
[Test]
+ public void TestReadFile()
+ {
+ using (var osz = Resource.OpenResource("Beatmaps.241526 Soleily - Renatus.osz"))
+ {
+ var reader = new OszArchiveReader(osz);
+ using (var stream = new StreamReader(
+ reader.ReadFile("Soleily - Renatus (Deif) [Platter].osu")))
+ {
+ Assert.AreEqual("osu file format v13", stream.ReadLine().Trim());
+ }
+ }
+ }
+ }
+}
+
diff --git a/osu.Game.Tests/Resources/Resource.cs b/osu.Game.Tests/Resources/Resource.cs
index 46c51da5ef..910268adbf 100644
--- a/osu.Game.Tests/Resources/Resource.cs
+++ b/osu.Game.Tests/Resources/Resource.cs
@@ -1,17 +1,17 @@
-using System;
+using System;
using System.IO;
using System.Reflection;
-namespace osu.Game.Tests.Resources
-{
- public static class Resource
- {
- public static Stream OpenResource(string name)
- {
- return Assembly.GetExecutingAssembly().GetManifestResourceStream(
- $@"osu.Game.Tests.Resources.{name}") ??
- Assembly.LoadFrom("osu.Game.Resources.dll").GetManifestResourceStream(
- $@"osu.Game.Resources.{name}");
- }
- }
+namespace osu.Game.Tests.Resources
+{
+ public static class Resource
+ {
+ public static Stream OpenResource(string name)
+ {
+ return Assembly.GetExecutingAssembly().GetManifestResourceStream(
+ $@"osu.Game.Tests.Resources.{name}") ??
+ Assembly.LoadFrom("osu.Game.Resources.dll").GetManifestResourceStream(
+ $@"osu.Game.Resources.{name}");
+ }
+ }
}
\ No newline at end of file
diff --git a/osu.Game/Beatmaps/BaseDifficulty.cs b/osu.Game/Beatmaps/BaseDifficulty.cs
index 62acf07695..ce9e3bc624 100644
--- a/osu.Game/Beatmaps/BaseDifficulty.cs
+++ b/osu.Game/Beatmaps/BaseDifficulty.cs
@@ -1,18 +1,18 @@
-using System;
+using System;
using SQLite;
-namespace osu.Game.Beatmaps
-{
- public class BaseDifficulty
- {
- [PrimaryKey, AutoIncrement]
- public int ID { get; set; }
- public float DrainRate { get; set; }
- public float CircleSize { get; set; }
- public float OverallDifficulty { get; set; }
- public float ApproachRate { get; set; }
- public float SliderMultiplier { get; set; }
- public float SliderTickRate { get; set; }
- }
-}
-
+namespace osu.Game.Beatmaps
+{
+ public class BaseDifficulty
+ {
+ [PrimaryKey, AutoIncrement]
+ public int ID { get; set; }
+ public float DrainRate { get; set; }
+ public float CircleSize { get; set; }
+ public float OverallDifficulty { get; set; }
+ public float ApproachRate { get; set; }
+ public float SliderMultiplier { get; set; }
+ public float SliderTickRate { get; set; }
+ }
+}
+
diff --git a/osu.Game/Beatmaps/BeatmapSet.cs b/osu.Game/Beatmaps/BeatmapSet.cs
index 5f1be7f9b0..11f82329f9 100644
--- a/osu.Game/Beatmaps/BeatmapSet.cs
+++ b/osu.Game/Beatmaps/BeatmapSet.cs
@@ -17,10 +17,12 @@ namespace osu.Game.Beatmaps
[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]
public User Creator { get; set; }
+ public string Hash { get; set; }
+ public string Path { get; set; }
}
}
diff --git a/osu.Game/Beatmaps/Events/EventType.cs b/osu.Game/Beatmaps/Events/EventType.cs
index cb66a42f2d..1f7e8d2aa5 100644
--- a/osu.Game/Beatmaps/Events/EventType.cs
+++ b/osu.Game/Beatmaps/Events/EventType.cs
@@ -1,14 +1,14 @@
-using System;
-namespace osu.Game.Beatmaps.Events
-{
- public enum EventType
- {
- Background = 0,
- Video = 1,
- Break = 2,
- Colour = 3,
- Sprite = 4,
- Sample = 5,
- Animation = 6
- }
+using System;
+namespace osu.Game.Beatmaps.Events
+{
+ public enum EventType
+ {
+ Background = 0,
+ Video = 1,
+ Break = 2,
+ Colour = 3,
+ Sprite = 4,
+ Sample = 5,
+ Animation = 6
+ }
}
\ No newline at end of file
diff --git a/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs b/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs
index 7302e2a4c5..0c6bbb02e1 100644
--- a/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/BeatmapDecoder.cs
@@ -1,25 +1,25 @@
-using System;
+using System;
using System.Collections.Generic;
-using System.IO;
-
-namespace osu.Game.Beatmaps.Formats
-{
- public abstract class BeatmapDecoder
- {
- private static Dictionary decoders { get; } = new Dictionary();
-
- public static BeatmapDecoder GetDecoder(TextReader stream)
- {
- var line = stream.ReadLine().Trim();
- if (!decoders.ContainsKey(line))
- throw new IOException(@"Unknown file format");
- return (BeatmapDecoder)Activator.CreateInstance(decoders[line]);
+using System.IO;
+
+namespace osu.Game.Beatmaps.Formats
+{
+ public abstract class BeatmapDecoder
+ {
+ private static Dictionary decoders { get; } = new Dictionary();
+
+ public static BeatmapDecoder GetDecoder(TextReader stream)
+ {
+ var line = stream.ReadLine().Trim();
+ if (!decoders.ContainsKey(line))
+ throw new IOException(@"Unknown file format");
+ return (BeatmapDecoder)Activator.CreateInstance(decoders[line]);
}
-
protected static void AddDecoder(string magic) where T : BeatmapDecoder
- {
- decoders[magic] = typeof(T);
- }
-
- public abstract Beatmap Decode(TextReader stream);
- }
+
protected static void AddDecoder(string magic) where T : BeatmapDecoder
+ {
+ decoders[magic] = typeof(T);
+ }
+
+ 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 @@ namespace osu.Game.Beatmaps.Formats
});
}
- 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 @@ namespace osu.Game.Beatmaps.Formats
break;
}
}
- return beatmap;
}
}
}
\ No newline at end of file
diff --git a/osu.Game/Beatmaps/IO/ArchiveReader.cs b/osu.Game/Beatmaps/IO/ArchiveReader.cs
index 77315d4a21..89adf26989 100644
--- a/osu.Game/Beatmaps/IO/ArchiveReader.cs
+++ b/osu.Game/Beatmaps/IO/ArchiveReader.cs
@@ -1,48 +1,48 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using osu.Framework.Platform;
-namespace osu.Game.Beatmaps.IO
-{
- public abstract class ArchiveReader : IDisposable
- {
- private class Reader
- {
- public Func Test { get; set; }
- public Type Type { get; set; }
- }
-
- private static List readers { get; } = new List();
-
- public static ArchiveReader GetReader(BasicStorage storage, string path)
- {
- foreach (var reader in readers)
- {
- if (reader.Test(storage, path))
- return (ArchiveReader)Activator.CreateInstance(reader.Type, storage.GetStream(path));
- }
- throw new IOException(@"Unknown file format");
- }
-
- protected static void AddReader(Func test) where T : ArchiveReader
- {
- readers.Add(new Reader { Test = test, Type = typeof(T) });
- }
-
- ///
- /// Reads the beatmap metadata from this archive.
- ///
- public abstract BeatmapMetadata ReadMetadata();
- ///
- /// Gets a list of beatmap file names.
- ///
- public abstract string[] ReadBeatmaps();
- ///
- /// Opens a stream for reading a specific file from this archive.
- ///
+namespace osu.Game.Beatmaps.IO
+{
+ public abstract class ArchiveReader : IDisposable
+ {
+ private class Reader
+ {
+ public Func Test { get; set; }
+ public Type Type { get; set; }
+ }
+
+ private static List readers { get; } = new List();
+
+ public static ArchiveReader GetReader(BasicStorage storage, string path)
+ {
+ foreach (var reader in readers)
+ {
+ if (reader.Test(storage, path))
+ return (ArchiveReader)Activator.CreateInstance(reader.Type, storage.GetStream(path));
+ }
+ throw new IOException(@"Unknown file format");
+ }
+
+ protected static void AddReader(Func test) where T : ArchiveReader
+ {
+ readers.Add(new Reader { Test = test, Type = typeof(T) });
+ }
+
+ ///
+ /// Reads the beatmap metadata from this archive.
+ ///
+ public abstract BeatmapMetadata ReadMetadata();
+ ///
+ /// Gets a list of beatmap file names.
+ ///
+ public abstract string[] ReadBeatmaps();
+ ///
+ /// Opens a stream for reading a specific file from this archive.
+ ///
public abstract Stream ReadFile(string name);
- public abstract void Dispose();
- }
+ public abstract void Dispose();
+ }
}
\ No newline at end of file
diff --git a/osu.Game/Beatmaps/IO/OszArchiveReader.cs b/osu.Game/Beatmaps/IO/OszArchiveReader.cs
index b70bee076c..69776d0095 100644
--- a/osu.Game/Beatmaps/IO/OszArchiveReader.cs
+++ b/osu.Game/Beatmaps/IO/OszArchiveReader.cs
@@ -1,39 +1,41 @@
-using System;
+using System;
using System.IO;
using System.Linq;
+using System.Security.Cryptography;
using Ionic.Zip;
using osu.Game.Beatmaps.Formats;
-namespace osu.Game.Beatmaps.IO
-{
- public sealed class OszArchiveReader : ArchiveReader
- {
- public static void Register()
- {
+namespace osu.Game.Beatmaps.IO
+{
+ public sealed class OszArchiveReader : ArchiveReader
+ {
+ public static void Register()
+ {
AddReader((storage, path) =>
- {
- using (var stream = storage.GetStream(path))
+ {
+ using (var stream = storage.GetStream(path))
return ZipFile.IsZipFile(stream, false);
- });
- OsuLegacyDecoder.Register();
- }
-
- private ZipFile archive { get; set; }
- private string[] beatmaps { get; set; }
- private Beatmap firstMap { get; set; }
-
- public OszArchiveReader(Stream archiveStream)
- {
- archive = ZipFile.Read(archiveStream);
- beatmaps = archive.Entries.Where(e => e.FileName.EndsWith(@".osu"))
- .Select(e => e.FileName).ToArray();
- if (beatmaps.Length == 0)
- throw new FileNotFoundException(@"This directory contains no beatmaps");
- using (var stream = new StreamReader(ReadFile(beatmaps[0])))
- {
- var decoder = BeatmapDecoder.GetDecoder(stream);
- firstMap = decoder.Decode(stream);
- }
+ });
+ OsuLegacyDecoder.Register();
+ }
+
+ private ZipFile archive { get; set; }
+ private string[] beatmaps { get; set; }
+ private Beatmap firstMap { get; set; }
+
+ public OszArchiveReader(Stream archiveStream)
+ {
+ archive = ZipFile.Read(archiveStream);
+ beatmaps = archive.Entries.Where(e => e.FileName.EndsWith(@".osu"))
+ .Select(e => e.FileName).ToArray();
+ if (beatmaps.Length == 0)
+ throw new FileNotFoundException(@"This directory contains no beatmaps");
+ using (var stream = new StreamReader(ReadFile(beatmaps[0])))
+ {
+ var decoder = BeatmapDecoder.GetDecoder(stream);
+ firstMap = new Beatmap();
+ decoder.Decode(stream, firstMap);
+ }
}
public override string[] ReadBeatmaps()
@@ -43,9 +45,9 @@ namespace osu.Game.Beatmaps.IO
public override Stream ReadFile(string name)
{
- ZipEntry entry = archive.Entries.SingleOrDefault(e => e.FileName == name);
- if (entry == null)
- throw new FileNotFoundException();
+ ZipEntry entry = archive.Entries.SingleOrDefault(e => e.FileName == name);
+ if (entry == null)
+ throw new FileNotFoundException();
return entry.OpenReader();
}
@@ -53,9 +55,9 @@ namespace osu.Game.Beatmaps.IO
{
return firstMap.Metadata;
}
-
public override void Dispose()
- {
- archive.Dispose();
+
public override void Dispose()
+ {
+ archive.Dispose();
}
- }
+ }
}
\ No newline at end of file
diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs
index 36f8776eb0..7f8cf86c14 100644
--- a/osu.Game/Database/BeatmapDatabase.cs
+++ b/osu.Game/Database/BeatmapDatabase.cs
@@ -1,50 +1,100 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
+using System.Security.Cryptography;
using osu.Framework.Platform;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Formats;
using osu.Game.Beatmaps.IO;
using SQLite;
-namespace osu.Game.Database
-{
- public class BeatmapDatabase
- {
- private static SQLiteConnection connection { get; set; }
-
- public BeatmapDatabase(BasicStorage storage)
- {
- if (connection == null)
- {
- connection = storage.GetDatabase(@"beatmaps");
- connection.CreateTable();
- connection.CreateTable();
- connection.CreateTable();
- connection.CreateTable();
- }
+namespace osu.Game.Database
+{
+ public class BeatmapDatabase
+ {
+ private static SQLiteConnection connection { get; set; }
+ private BasicStorage storage;
+
+ public BeatmapDatabase(BasicStorage storage)
+ {
+ this.storage = storage;
+ if (connection == null)
+ {
+ connection = storage.GetDatabase(@"beatmaps");
+ connection.CreateTable();
+ connection.CreateTable();
+ connection.CreateTable();
+ connection.CreateTable();
+ }
}
-
public void AddBeatmap(ArchiveReader input)
- {
- var metadata = input.ReadMetadata();
- if (connection.Table().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
- return;
- string[] mapNames = input.ReadBeatmaps();
- var beatmapSet = new BeatmapSet { BeatmapSetID = metadata.BeatmapSetID };
- var maps = new List();
- foreach (var name in mapNames)
- {
- using (var stream = new StreamReader(input.ReadFile(name)))
+
public void AddBeatmap(string path)
+ {
+ string hash = null;
+ ArchiveReader reader;
+ if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader
+ {
+ using (var md5 = MD5.Create())
+ using (var input = storage.GetStream(path))
{
- var decoder = BeatmapDecoder.GetDecoder(stream);
- var beatmap = decoder.Decode(stream);
- maps.Add(beatmap);
- beatmap.BaseDifficultyID = connection.Insert(beatmap.BaseDifficulty);
- }
- }
- beatmapSet.BeatmapMetadataID = connection.Insert(metadata);
- connection.Insert(beatmapSet);
- connection.InsertAll(maps);
- }
- }
+ hash = BitConverter.ToString(md5.ComputeHash(input)).Replace("-", "").ToLowerInvariant();
+ input.Seek(0, SeekOrigin.Begin);
+ var outputPath = Path.Combine(@"beatmaps", hash.Remove(1), hash.Remove(2), hash);
+ using (var output = storage.GetStream(outputPath, FileAccess.Write))
+ input.CopyTo(output);
+ reader = ArchiveReader.GetReader(storage, path = outputPath);
+ }
+ }
+ else
+ reader = ArchiveReader.GetReader(storage, path);
+ var metadata = reader.ReadMetadata();
+ if (connection.Table().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
+ return; // TODO: Update this beatmap instead
+ string[] mapNames = reader.ReadBeatmaps();
+ var beatmapSet = new BeatmapSet
+ {
+ BeatmapSetID = metadata.BeatmapSetID,
+ Path = path,
+ Hash = hash,
+ };
+ var maps = new List();
+ 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);
+ maps.Add(beatmap);
+ beatmap.BaseDifficultyID = connection.Insert(beatmap.BaseDifficulty);
+ }
+ }
+ beatmapSet.BeatmapMetadataID = connection.Insert(metadata);
+ 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 beatmapSet)
+ {
+ 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
diff --git a/osu.Game/GameModes/Menu/MainMenu.cs b/osu.Game/GameModes/Menu/MainMenu.cs
index f6f9a79bf1..475d4c8dea 100644
--- a/osu.Game/GameModes/Menu/MainMenu.cs
+++ b/osu.Game/GameModes/Menu/MainMenu.cs
@@ -14,6 +14,7 @@ using osu.Game.GameModes.Play;
using osu.Game.Graphics.Containers;
using OpenTK;
using osu.Framework;
+using osu.Game.Overlays;
namespace osu.Game.GameModes.Menu
{
@@ -47,9 +48,7 @@ namespace osu.Game.GameModes.Menu
OnMulti = delegate { Push(new Lobby()); },
OnTest = delegate { Push(new TestBrowser()); },
OnExit = delegate { Scheduler.AddDelayed(Exit, ButtonSystem.EXIT_DELAY); },
- OnSettings = delegate {
- osu.Options.PoppedOut = !osu.Options.PoppedOut;
- },
+ OnSettings = osu.Options.ToggleVisibility,
}
}
}
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 9eb32117c5..65e7045445 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -31,7 +31,7 @@ namespace osu.Game
{
public string Path;
}
-
+
public Toolbar Toolbar;
public ChatConsole Chat;
public MainMenu MainMenu => intro?.ChildGameMode as MainMenu;
@@ -40,7 +40,7 @@ namespace osu.Game
private IpcChannel BeatmapIPC;
public Bindable PlayMode;
-
+
public OsuGame(string[] args)
{
this.args = args;
@@ -56,7 +56,7 @@ namespace osu.Game
public override void Load(BaseGame game)
{
BeatmapIPC = new IpcChannel(Host);
-
+
if (!Host.IsPrimaryInstance)
{
if (args.Length == 1 && File.Exists(args[0]))
@@ -73,8 +73,7 @@ namespace osu.Game
{
try
{
- var reader = ArchiveReader.GetReader(Host.Storage, message.Path);
- Beatmaps.AddBeatmap(reader);
+ Beatmaps.AddBeatmap(message.Path);
// TODO: Switch to beatmap list and select the new song
}
catch (Exception ex)
@@ -83,7 +82,7 @@ namespace osu.Game
Console.WriteLine($@"Failed to import beatmap: {ex}");
}
};
-
+
base.Load(game);
//attach our bindables to the audio subsystem.
@@ -96,9 +95,8 @@ namespace osu.Game
Toolbar = new Toolbar
{
OnHome = delegate { MainMenu?.MakeCurrent(); },
- OnSettings = delegate { Options.PoppedOut = !Options.PoppedOut; },
+ OnSettings = Options.ToggleVisibility,
OnPlayModeChange = delegate (PlayMode m) { PlayMode.Value = m; },
- Alpha = 0.001f,
},
Chat = new ChatConsole(API),
new VolumeControl
@@ -113,12 +111,6 @@ namespace osu.Game
}
});
- Toolbar.State = ToolbarState.Hidden;
- Toolbar.Flush();
-
- Chat.State = ChatConsoleState.Hidden;
- Chat.Flush();
-
intro.ModePushed += modeAdded;
intro.Exited += modeRemoved;
@@ -134,10 +126,10 @@ namespace osu.Game
switch (args.Key)
{
case Key.F8:
- Chat.State = Chat.State == ChatConsoleState.Hidden ? ChatConsoleState.Visible : ChatConsoleState.Hidden;
+ Chat.ToggleVisibility();
return true;
}
-
+
return base.OnKeyDown(state, args);
}
@@ -152,12 +144,12 @@ namespace osu.Game
//central game mode change logic.
if (newMode is Player || newMode is Intro)
{
- Toolbar.State = ToolbarState.Hidden;
- Chat.State = ChatConsoleState.Hidden;
+ Toolbar.State = Visibility.Hidden;
+ Chat.State = Visibility.Hidden;
}
else
{
- Toolbar.State = ToolbarState.Visible;
+ Toolbar.State = Visibility.Visible;
}
Cursor.FadeIn(100);
@@ -178,7 +170,7 @@ namespace osu.Game
});
return true;
}
-
+
return base.OnExiting();
}
diff --git a/osu.Game/Overlays/ChatConsole.cs b/osu.Game/Overlays/ChatConsole.cs
index 5763275486..820b9245d3 100644
--- a/osu.Game/Overlays/ChatConsole.cs
+++ b/osu.Game/Overlays/ChatConsole.cs
@@ -1,12 +1,12 @@
//Copyright (c) 2007-2016 ppy Pty Ltd .
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using OpenTK;
+using OpenTK.Graphics;
+using osu.Framework;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
@@ -17,15 +17,10 @@ using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Online.Chat;
using osu.Game.Online.Chat.Display;
-using OpenTK;
-using OpenTK.Graphics;
-using osu.Framework.Input;
-using OpenTK.Input;
-using osu.Framework;
namespace osu.Game.Overlays
{
- public class ChatConsole : Container, IStateful
+ public class ChatConsole : Overlay
{
private ChannelDisplay channelDisplay;
@@ -69,7 +64,7 @@ namespace osu.Game.Overlays
private long? lastMessageId;
- List careChannels;
+ private List careChannels;
private void initializeChannels()
{
@@ -112,7 +107,7 @@ namespace osu.Game.Overlays
careChannels.Add(channel);
}
- GetMessagesRequest fetchReq;
+ private GetMessagesRequest fetchReq;
public void FetchNewMessages(APIAccess api)
{
@@ -140,36 +135,18 @@ namespace osu.Game.Overlays
api.Queue(fetchReq);
}
- private ChatConsoleState state;
+ private const int transition_length = 500;
- public ChatConsoleState State
+ protected override void PopIn()
{
- get { return state; }
+ MoveToY(0, transition_length, EasingTypes.OutQuint);
+ FadeIn(transition_length, EasingTypes.OutQuint);
+ }
- set
- {
- state = value;
-
- const int transition_length = 500;
-
- switch (state)
- {
- case ChatConsoleState.Hidden:
- MoveToY(-Size.Y, transition_length, EasingTypes.InQuint);
- FadeOut(transition_length, EasingTypes.InQuint);
- break;
- case ChatConsoleState.Visible:
- MoveToY(0, transition_length, EasingTypes.OutQuint);
- FadeIn(transition_length, EasingTypes.OutQuint);
- break;
- }
- }
+ protected override void PopOut()
+ {
+ MoveToY(-Size.Y, transition_length, EasingTypes.InQuint);
+ FadeOut(transition_length, EasingTypes.InQuint);
}
}
-
- public enum ChatConsoleState
- {
- Visible,
- Hidden,
- }
}
diff --git a/osu.Game/Overlays/Options.cs b/osu.Game/Overlays/Options.cs
index bdab31bc6e..5bcc5e9a16 100644
--- a/osu.Game/Overlays/Options.cs
+++ b/osu.Game/Overlays/Options.cs
@@ -1,21 +1,20 @@
//Copyright (c) 2007-2016 ppy Pty Ltd .
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Graphics;
-using osu.Framework.Graphics.Containers;
-using osu.Framework.Graphics.Drawables;
-using osu.Framework.Graphics.Transformations;
using OpenTK;
using OpenTK.Graphics;
-using osu.Framework.Input;
using OpenTK.Input;
using osu.Framework;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Drawables;
+using osu.Framework.Graphics.Transformations;
+using osu.Framework.Input;
namespace osu.Game.Overlays
{
- public class Options : Container
+ public class Options : Overlay
{
- const float width = 300;
+ private const float width = 300;
public override void Load(BaseGame game)
{
@@ -41,36 +40,22 @@ namespace osu.Game.Overlays
switch (args.Key)
{
case Key.Escape:
- if (!poppedOut) return false;
+ if (State == Visibility.Hidden) return false;
- PoppedOut = false;
+ State = Visibility.Hidden;
return true;
}
return base.OnKeyDown(state, args);
}
- private bool poppedOut;
-
- public bool PoppedOut
+ protected override void PopIn()
{
- get { return poppedOut; }
+ MoveToX(0, 300, EasingTypes.Out);
+ }
- set
- {
- if (value == poppedOut) return;
-
- poppedOut = value;
-
- if (poppedOut)
- {
- MoveTo(new Vector2(0, 0), 300, EasingTypes.Out);
- }
- else
- {
- MoveTo(new Vector2(-width, 0), 300, EasingTypes.Out);
- }
-
- }
+ protected override void PopOut()
+ {
+ MoveToX(-width, 300, EasingTypes.Out);
}
}
}
diff --git a/osu.Game/Overlays/Overlay.cs b/osu.Game/Overlays/Overlay.cs
new file mode 100644
index 0000000000..648a78c248
--- /dev/null
+++ b/osu.Game/Overlays/Overlay.cs
@@ -0,0 +1,53 @@
+using osu.Framework;
+using osu.Framework.Graphics.Containers;
+
+namespace osu.Game.Overlays
+{
+ ///
+ /// An element which starts hidden and can be toggled to visible.
+ ///
+ public abstract class Overlay : Container, IStateful
+ {
+ public override void Load(BaseGame game)
+ {
+ base.Load(game);
+
+ //TODO: init code using Alpha or IsVisible override to ensure we don't call Load on children before we first get unhidden.
+ PopOut();
+ Flush();
+ }
+
+ private Visibility state;
+ public Visibility State
+ {
+ get { return state; }
+ set
+ {
+ if (value == state) return;
+ state = value;
+
+ switch (value)
+ {
+ case Visibility.Hidden:
+ PopOut();
+ break;
+ case Visibility.Visible:
+ PopIn();
+ break;
+ }
+ }
+ }
+
+ protected abstract void PopIn();
+
+ protected abstract void PopOut();
+
+ public void ToggleVisibility() => State = (State == Visibility.Visible ? Visibility.Hidden : Visibility.Visible);
+ }
+
+ public enum Visibility
+ {
+ Hidden,
+ Visible
+ }
+}
diff --git a/osu.Game/Overlays/Toolbar.cs b/osu.Game/Overlays/Toolbar.cs
index 185123e0e3..c4bc9518cc 100644
--- a/osu.Game/Overlays/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar.cs
@@ -1,24 +1,23 @@
//Copyright (c) 2007-2016 ppy Pty Ltd .
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+using System;
+using OpenTK;
+using OpenTK.Graphics;
+using osu.Framework;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Drawables;
-using OpenTK;
-using OpenTK.Graphics;
-using osu.Game.Graphics;
-using osu.Game.Configuration;
-using System;
using osu.Framework.Graphics.Transformations;
-using osu.Framework.Timing;
+using osu.Game.Configuration;
using osu.Game.GameModes.Play;
-using osu.Framework;
+using osu.Game.Graphics;
namespace osu.Game.Overlays
{
- public class Toolbar : Container, IStateful
+ public class Toolbar : Overlay
{
- const float height = 50;
+ private const float height = 50;
public Action OnSettings;
public Action OnHome;
@@ -26,29 +25,18 @@ namespace osu.Game.Overlays
private ToolbarModeSelector modeSelector;
- private ToolbarState state;
+ private const int transition_time = 200;
- public ToolbarState State
+ protected override void PopIn()
{
- get { return state; }
- set
- {
- state = value;
+ MoveToY(0, transition_time, EasingTypes.OutQuint);
+ FadeIn(transition_time, EasingTypes.OutQuint);
+ }
- const int transition_time = 200;
-
- switch (state)
- {
- case ToolbarState.Hidden:
- MoveToY(-Size.Y, transition_time, EasingTypes.InQuint);
- FadeOut(transition_time, EasingTypes.InQuint);
- break;
- case ToolbarState.Visible:
- MoveToY(0, transition_time, EasingTypes.OutQuint);
- FadeIn(transition_time, EasingTypes.OutQuint);
- break;
- }
- }
+ protected override void PopOut()
+ {
+ MoveToY(-Size.Y, transition_time, EasingTypes.InQuint);
+ FadeOut(transition_time, EasingTypes.InQuint);
}
public override void Load(BaseGame game)
@@ -119,10 +107,4 @@ namespace osu.Game.Overlays
public void SetGameMode(PlayMode mode) => modeSelector.SetGameMode(mode);
}
-
- public enum ToolbarState
- {
- Visible,
- Hidden,
- }
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 29c27d8090..d638868d73 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -164,6 +164,7 @@
+