diff --git a/osu.Android.props b/osu.Android.props
index 969eb205e0..c57fc342ba 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -62,6 +62,6 @@
-
+
diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
index 31221c05ee..8f353ae138 100644
--- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
+++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs
@@ -18,8 +18,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
///
public class DrawableNote : DrawableManiaHitObject, IKeyBindingHandler
{
- public const float CORNER_RADIUS = NotePiece.NOTE_HEIGHT / 2;
-
private readonly NotePiece headPiece;
public DrawableNote(Note hitObject)
diff --git a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
index 8b39946ab0..385ab4064d 100644
--- a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
+++ b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
@@ -90,6 +90,48 @@ namespace osu.Game.Tests.Beatmaps.IO
}
}
+ [Test]
+ public async Task TestImportCorruptThenImport()
+ {
+ //unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
+ using (HeadlessGameHost host = new CleanRunHeadlessGameHost("TestImportThenImport"))
+ {
+ try
+ {
+ var osu = loadOsu(host);
+
+ var imported = await LoadOszIntoOsu(osu);
+
+ var firstFile = imported.Files.First();
+
+ var files = osu.Dependencies.Get();
+
+ long originalLength;
+ using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath))
+ originalLength = stream.Length;
+
+ using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath, FileAccess.Write, FileMode.Create))
+ stream.WriteByte(0);
+
+ var importedSecondTime = await LoadOszIntoOsu(osu);
+
+ using (var stream = files.Storage.GetStream(firstFile.FileInfo.StoragePath))
+ Assert.AreEqual(stream.Length, originalLength, "Corruption was not fixed on second import");
+
+ // check the newly "imported" beatmap is actually just the restored previous import. since it matches hash.
+ Assert.IsTrue(imported.ID == importedSecondTime.ID);
+ Assert.IsTrue(imported.Beatmaps.First().ID == importedSecondTime.Beatmaps.First().ID);
+
+ checkBeatmapSetCount(osu, 1);
+ checkSingleReferencedFileCount(osu, 18);
+ }
+ finally
+ {
+ host.Exit();
+ }
+ }
+ }
+
[Test]
public async Task TestRollbackOnFailure()
{
diff --git a/osu.Game/IO/FileStore.cs b/osu.Game/IO/FileStore.cs
index 370d6786f5..bf4e881ed0 100644
--- a/osu.Game/IO/FileStore.cs
+++ b/osu.Game/IO/FileStore.cs
@@ -50,7 +50,16 @@ namespace osu.Game.IO
string path = info.StoragePath;
// we may be re-adding a file to fix missing store entries.
- if (!Storage.Exists(path))
+ bool requiresCopy = !Storage.Exists(path);
+
+ if (!requiresCopy)
+ {
+ // even if the file already exists, check the existing checksum for safety.
+ using (var stream = Storage.GetStream(path))
+ requiresCopy |= stream.ComputeSHA2Hash() != hash;
+ }
+
+ if (requiresCopy)
{
data.Seek(0, SeekOrigin.Begin);
diff --git a/osu.Game/Rulesets/Ruleset.cs b/osu.Game/Rulesets/Ruleset.cs
index 197c089f71..dd1b3615c7 100644
--- a/osu.Game/Rulesets/Ruleset.cs
+++ b/osu.Game/Rulesets/Ruleset.cs
@@ -84,7 +84,7 @@ namespace osu.Game.Rulesets
public virtual Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.Solid.QuestionCircle };
- public virtual IResourceStore CreateReourceStore() => new NamespacedResourceStore(new DllResourceStore(GetType().Assembly.Location), @"Resources");
+ public virtual IResourceStore CreateResourceStore() => new NamespacedResourceStore(new DllResourceStore(GetType().Assembly.Location), @"Resources");
public abstract string Description { get; }
diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs
index a34bb6e8ea..d68b0e94c5 100644
--- a/osu.Game/Rulesets/UI/DrawableRuleset.cs
+++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs
@@ -153,7 +153,7 @@ namespace osu.Game.Rulesets.UI
{
var dependencies = new DependencyContainer(base.CreateChildDependencies(parent));
- var resources = Ruleset.CreateReourceStore();
+ var resources = Ruleset.CreateResourceStore();
if (resources != null)
{
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index 0274973161..dd81569e26 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -69,11 +69,22 @@ namespace osu.Game.Screens.Menu
[BackgroundDependencyLoader(true)]
private void load(DirectOverlay direct, SettingsOverlay settings, OsuConfigManager config)
{
- if (host.CanExit)
- AddInternal(exitConfirmOverlay = new ExitConfirmOverlay { Action = this.Exit });
-
holdDelay = config.GetBindable(OsuSetting.UIHoldActivationDelay);
+ if (host.CanExit)
+ {
+ AddInternal(exitConfirmOverlay = new ExitConfirmOverlay
+ {
+ Action = () =>
+ {
+ if (holdDelay.Value > 0)
+ confirmAndExit();
+ else
+ this.Exit();
+ }
+ });
+ }
+
AddRangeInternal(new Drawable[]
{
new ParallaxContainer
@@ -241,7 +252,7 @@ namespace osu.Game.Screens.Menu
public override bool OnExiting(IScreen next)
{
- if (holdDelay.Value == 0 && !exitConfirmed && dialogOverlay != null && !(dialogOverlay.CurrentDialog is ConfirmExitDialog))
+ if (!exitConfirmed && dialogOverlay != null && !(dialogOverlay.CurrentDialog is ConfirmExitDialog))
{
dialogOverlay.Push(new ConfirmExitDialog(confirmAndExit, () => exitConfirmOverlay.Abort()));
return true;
diff --git a/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs b/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs
index 7f82d3cc12..6caef8e2aa 100644
--- a/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs
+++ b/osu.Game/Screens/Select/BeatmapDetailAreaTabControl.cs
@@ -49,7 +49,7 @@ namespace osu.Game.Screens.Select
{
Anchor = Anchor.BottomRight,
Origin = Anchor.BottomRight,
- Text = @"Mods",
+ Text = @"Selected Mods",
Alpha = 0,
},
};
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index a733a0e7f9..a27a94b8f9 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -26,7 +26,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 4bfa1ebcd0..a6516e6d1b 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -118,8 +118,8 @@
-
-
+
+