diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
index f3c7939a94..445f81c6d4 100644
--- a/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
+++ b/osu.Game.Rulesets.Osu/Mods/OsuModBlinds.cs
@@ -12,6 +12,7 @@ using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
+using osu.Game.Scoring;
using osuTK;
using osuTK.Graphics;
@@ -41,6 +42,8 @@ namespace osu.Game.Rulesets.Osu.Mods
scoreProcessor.Health.ValueChanged += health => { blinds.AnimateClosedness((float)health.NewValue); };
}
+ public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;
+
///
/// Element for the Blinds mod drawing 2 black boxes covering the whole screen which resize inside a restricted area with some leniency.
///
diff --git a/osu.Game.Tests/Visual/Editor/TestCaseWaveform.cs b/osu.Game.Tests/Visual/Editor/TestCaseWaveform.cs
index c35e8741c1..ce6ca08a61 100644
--- a/osu.Game.Tests/Visual/Editor/TestCaseWaveform.cs
+++ b/osu.Game.Tests/Visual/Editor/TestCaseWaveform.cs
@@ -3,12 +3,13 @@
using NUnit.Framework;
using osu.Framework.Allocation;
+using osu.Framework.Audio.Track;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Audio;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
+using osu.Game.Beatmaps;
using osu.Game.Graphics.Sprites;
-using osuTK;
using osuTK.Graphics;
namespace osu.Game.Tests.Visual.Editor
@@ -16,35 +17,38 @@ namespace osu.Game.Tests.Visual.Editor
[TestFixture]
public class TestCaseWaveform : OsuTestCase
{
+ private WorkingBeatmap waveformBeatmap;
+
[BackgroundDependencyLoader]
private void load()
{
- Beatmap.Value = new WaveformTestBeatmap();
+ waveformBeatmap = new WaveformTestBeatmap();
+ }
- FillFlowContainer flow;
- Child = flow = new FillFlowContainer
+ [TestCase(1f)]
+ [TestCase(1f / 2)]
+ [TestCase(1f / 4)]
+ [TestCase(1f / 8)]
+ [TestCase(1f / 16)]
+ [TestCase(0f)]
+ public void TestResolution(float resolution)
+ {
+ TestWaveformGraph graph = null;
+
+ AddStep("add graph", () =>
{
- RelativeSizeAxes = Axes.Both,
- Direction = FillDirection.Vertical,
- Spacing = new Vector2(0, 10),
- };
-
- for (int i = 1; i <= 16; i *= 2)
- {
- var newDisplay = new WaveformGraph
- {
- RelativeSizeAxes = Axes.Both,
- Resolution = 1f / i,
- Waveform = Beatmap.Value.Waveform,
- };
-
- flow.Add(new Container
+ Child = new Container
{
RelativeSizeAxes = Axes.X,
Height = 100,
Children = new Drawable[]
{
- newDisplay,
+ graph = new TestWaveformGraph
+ {
+ RelativeSizeAxes = Axes.Both,
+ Resolution = resolution,
+ Waveform = waveformBeatmap.Waveform,
+ },
new Container
{
Anchor = Anchor.Centre,
@@ -62,13 +66,42 @@ namespace osu.Game.Tests.Visual.Editor
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Text = $"Resolution: {1f / i:0.00}"
+ Text = $"Resolution: {resolution:0.00}"
}
}
}
}
- });
- }
+ };
+ });
+
+ AddUntilStep("wait for load", () => graph.ResampledWaveform != null);
+ }
+
+ [Test]
+ public void TestDefaultBeatmap()
+ {
+ TestWaveformGraph graph = null;
+
+ AddStep("add graph", () =>
+ {
+ Child = new Container
+ {
+ RelativeSizeAxes = Axes.X,
+ Height = 100,
+ Child = graph = new TestWaveformGraph
+ {
+ RelativeSizeAxes = Axes.Both,
+ Waveform = new DummyWorkingBeatmap().Waveform,
+ },
+ };
+ });
+
+ AddUntilStep("wait for load", () => graph.ResampledWaveform != null);
+ }
+
+ public class TestWaveformGraph : WaveformGraph
+ {
+ public new Waveform ResampledWaveform => base.ResampledWaveform;
}
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestCasePlayerLoader.cs b/osu.Game.Tests/Visual/Gameplay/TestCasePlayerLoader.cs
index 1f0a97cc58..15c38e6d18 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestCasePlayerLoader.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestCasePlayerLoader.cs
@@ -12,6 +12,7 @@ using osu.Framework.Screens;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu;
using osu.Game.Rulesets.Scoring;
+using osu.Game.Scoring;
using osu.Game.Screens;
using osu.Game.Screens.Play;
using osu.Game.Tests.Beatmaps;
@@ -96,6 +97,8 @@ namespace osu.Game.Tests.Visual.Gameplay
{
Applied = true;
}
+
+ public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;
}
private class TestPlayer : Player
diff --git a/osu.Game/Online/API/Requests/Responses/APIMod.cs b/osu.Game/Online/API/Requests/Responses/APIMod.cs
index d7dda07b33..b9da4f49ee 100644
--- a/osu.Game/Online/API/Requests/Responses/APIMod.cs
+++ b/osu.Game/Online/API/Requests/Responses/APIMod.cs
@@ -8,5 +8,7 @@ namespace osu.Game.Online.API.Requests.Responses
public class APIMod : IMod
{
public string Acronym { get; set; }
+
+ public bool Equals(IMod other) => Acronym == other?.Acronym;
}
}
diff --git a/osu.Game/Overlays/Profile/Header/CentreHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/CentreHeaderContainer.cs
index c1ad2011f8..b441775393 100644
--- a/osu.Game/Overlays/Profile/Header/CentreHeaderContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/CentreHeaderContainer.cs
@@ -134,17 +134,17 @@ namespace osu.Game.Overlays.Profile.Header
DetailsVisible.BindValueChanged(visible =>
{
- hiddenDetailContainer.Alpha = visible.NewValue ? 1 : 0;
- expandedDetailContainer.Alpha = visible.NewValue ? 0 : 1;
- }, true);
+ hiddenDetailContainer.FadeTo(visible.NewValue ? 0 : 1, 200, Easing.OutQuint);
+ expandedDetailContainer.FadeTo(visible.NewValue ? 1 : 0, 200, Easing.OutQuint);
+ });
User.BindValueChanged(user => updateDisplay(user.NewValue));
}
private void updateDisplay(User user)
{
- hiddenDetailGlobal.Content = user?.Statistics?.Ranks.Global?.ToString("#,##0") ?? "-";
- hiddenDetailCountry.Content = user?.Statistics?.Ranks.Country?.ToString("#,##0") ?? "-";
+ hiddenDetailGlobal.Content = user?.Statistics?.Ranks.Global?.ToString("\\##,##0") ?? "-";
+ hiddenDetailCountry.Content = user?.Statistics?.Ranks.Country?.ToString("\\##,##0") ?? "-";
}
}
}
diff --git a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs
index bb54d0ac51..1dabf167e3 100644
--- a/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs
+++ b/osu.Game/Overlays/Profile/Header/Components/RankGraph.cs
@@ -188,7 +188,7 @@ namespace osu.Game.Overlays.Profile.Header.Components
}
}
- public string TooltipText => User.Value?.Statistics?.Ranks.Global == null ? "" : $"{ranks[dayIndex].Value:#,##0}|{ranked_days - ranks[dayIndex].Key + 1}";
+ public string TooltipText => User.Value?.Statistics?.Ranks.Global == null ? "" : $"#{ranks[dayIndex].Value:#,##0}|{ranked_days - ranks[dayIndex].Key + 1}";
public ITooltip GetCustomTooltip() => new RankGraphTooltip();
diff --git a/osu.Game/Overlays/Profile/Header/DetailHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/DetailHeaderContainer.cs
index 9bb0affe7d..de710c5fcd 100644
--- a/osu.Game/Overlays/Profile/Header/DetailHeaderContainer.cs
+++ b/osu.Game/Overlays/Profile/Header/DetailHeaderContainer.cs
@@ -26,14 +26,40 @@ namespace osu.Game.Overlays.Profile.Header
private OverlinedInfoContainer ppInfo;
private OverlinedInfoContainer detailGlobalRank;
private OverlinedInfoContainer detailCountryRank;
+ private FillFlowContainer fillFlow;
private RankGraph rankGraph;
public readonly Bindable User = new Bindable();
+ private bool expanded = true;
+
+ public bool Expanded
+ {
+ set
+ {
+ if (expanded == value) return;
+
+ expanded = value;
+
+ if (fillFlow == null) return;
+
+ fillFlow.ClearTransforms();
+
+ if (expanded)
+ fillFlow.AutoSizeAxes = Axes.Y;
+ else
+ {
+ fillFlow.AutoSizeAxes = Axes.None;
+ fillFlow.ResizeHeightTo(0, 200, Easing.OutQuint);
+ }
+ }
+ }
+
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
AutoSizeAxes = Axes.Y;
+
User.ValueChanged += e => updateDisplay(e.NewValue);
InternalChildren = new Drawable[]
@@ -43,10 +69,13 @@ namespace osu.Game.Overlays.Profile.Header
RelativeSizeAxes = Axes.Both,
Colour = colours.CommunityUserGrayGreenDarkest,
},
- new FillFlowContainer
+ fillFlow = new FillFlowContainer
{
RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
+ AutoSizeAxes = expanded ? Axes.Y : Axes.None,
+ AutoSizeDuration = 200,
+ AutoSizeEasing = Easing.OutQuint,
+ Masking = true,
Padding = new MarginPadding { Horizontal = UserProfileOverlay.CONTENT_X_MARGIN, Vertical = 10 },
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 20),
@@ -148,8 +177,8 @@ namespace osu.Game.Overlays.Profile.Header
foreach (var scoreRankInfo in scoreRankInfos)
scoreRankInfo.Value.RankCount = user?.Statistics?.GradesCount[scoreRankInfo.Key] ?? 0;
- detailGlobalRank.Content = user?.Statistics?.Ranks.Global?.ToString("#,##0") ?? "-";
- detailCountryRank.Content = user?.Statistics?.Ranks.Country?.ToString("#,##0") ?? "-";
+ detailGlobalRank.Content = user?.Statistics?.Ranks.Global?.ToString("\\##,##0") ?? "-";
+ detailCountryRank.Content = user?.Statistics?.Ranks.Country?.ToString("\\##,##0") ?? "-";
rankGraph.User.Value = user;
}
diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs
index f5233cf70c..2d8c47b11a 100644
--- a/osu.Game/Overlays/Profile/ProfileHeader.cs
+++ b/osu.Game/Overlays/Profile/ProfileHeader.cs
@@ -117,7 +117,7 @@ namespace osu.Game.Overlays.Profile
infoTabControl.AddItem("Info");
infoTabControl.AddItem("Modding");
- centreHeaderContainer.DetailsVisible.BindValueChanged(visible => detailHeaderContainer.Alpha = visible.NewValue ? 1 : 0, true);
+ centreHeaderContainer.DetailsVisible.BindValueChanged(visible => detailHeaderContainer.Expanded = visible.NewValue, true);
User.ValueChanged += e => updateDisplay(e.NewValue);
}
diff --git a/osu.Game/Rulesets/Mods/IApplicableToScoreProcessor.cs b/osu.Game/Rulesets/Mods/IApplicableToScoreProcessor.cs
index 1d0ed94ef4..cb00770868 100644
--- a/osu.Game/Rulesets/Mods/IApplicableToScoreProcessor.cs
+++ b/osu.Game/Rulesets/Mods/IApplicableToScoreProcessor.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using osu.Game.Rulesets.Scoring;
+using osu.Game.Scoring;
namespace osu.Game.Rulesets.Mods
{
@@ -10,6 +11,14 @@ namespace osu.Game.Rulesets.Mods
///
public interface IApplicableToScoreProcessor : IApplicableMod
{
+ ///
+ /// Provide a to a mod. Called once on initialisation of a play instance.
+ ///
void ApplyToScoreProcessor(ScoreProcessor scoreProcessor);
+
+ ///
+ /// Called every time a rank calculation is requested. Allows mods to adjust the final rank.
+ ///
+ ScoreRank AdjustRank(ScoreRank rank, double accuracy);
}
}
diff --git a/osu.Game/Rulesets/Mods/IMod.cs b/osu.Game/Rulesets/Mods/IMod.cs
index 448ad0eb30..a5e19f293c 100644
--- a/osu.Game/Rulesets/Mods/IMod.cs
+++ b/osu.Game/Rulesets/Mods/IMod.cs
@@ -1,11 +1,12 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
using Newtonsoft.Json;
namespace osu.Game.Rulesets.Mods
{
- public interface IMod
+ public interface IMod : IEquatable
{
///
/// The shortened name of this mod.
diff --git a/osu.Game/Rulesets/Mods/Mod.cs b/osu.Game/Rulesets/Mods/Mod.cs
index d2d0a5bb26..023d37497a 100644
--- a/osu.Game/Rulesets/Mods/Mod.cs
+++ b/osu.Game/Rulesets/Mods/Mod.cs
@@ -70,5 +70,7 @@ namespace osu.Game.Rulesets.Mods
/// Creates a copy of this initialised to a default state.
///
public virtual Mod CreateCopy() => (Mod)Activator.CreateInstance(GetType());
+
+ public bool Equals(IMod other) => GetType() == other?.GetType();
}
}
diff --git a/osu.Game/Rulesets/Mods/ModFlashlight.cs b/osu.Game/Rulesets/Mods/ModFlashlight.cs
index 31d3720cee..306d1b2a9c 100644
--- a/osu.Game/Rulesets/Mods/ModFlashlight.cs
+++ b/osu.Game/Rulesets/Mods/ModFlashlight.cs
@@ -16,6 +16,7 @@ using osu.Game.Graphics;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
+using osu.Game.Scoring;
using osuTK;
using osuTK.Graphics;
@@ -46,6 +47,8 @@ namespace osu.Game.Rulesets.Mods
Combo.BindTo(scoreProcessor.Combo);
}
+ public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;
+
public virtual void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset)
{
var flashlight = CreateFlashlight();
diff --git a/osu.Game/Rulesets/Mods/ModHidden.cs b/osu.Game/Rulesets/Mods/ModHidden.cs
index c7e3f0a78f..ea1c56623f 100644
--- a/osu.Game/Rulesets/Mods/ModHidden.cs
+++ b/osu.Game/Rulesets/Mods/ModHidden.cs
@@ -8,10 +8,12 @@ using System.Collections.Generic;
using System.Linq;
using osu.Framework.Bindables;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Rulesets.Scoring;
+using osu.Game.Scoring;
namespace osu.Game.Rulesets.Mods
{
- public abstract class ModHidden : Mod, IReadFromConfig, IApplicableToDrawableHitObjects
+ public abstract class ModHidden : Mod, IReadFromConfig, IApplicableToDrawableHitObjects, IApplicableToScoreProcessor
{
public override string Name => "Hidden";
public override string Acronym => "HD";
@@ -32,6 +34,25 @@ namespace osu.Game.Rulesets.Mods
d.ApplyCustomUpdateState += ApplyHiddenState;
}
+ public void ApplyToScoreProcessor(ScoreProcessor scoreProcessor)
+ {
+ // Default value of ScoreProcessor's Rank in Hidden Mod should be SS+
+ scoreProcessor.Rank.Value = ScoreRank.XH;
+ }
+
+ public ScoreRank AdjustRank(ScoreRank rank, double accuracy)
+ {
+ switch (rank)
+ {
+ case ScoreRank.X:
+ return ScoreRank.XH;
+ case ScoreRank.S:
+ return ScoreRank.SH;
+ default:
+ return rank;
+ }
+ }
+
protected virtual void ApplyHiddenState(DrawableHitObject hitObject, ArmedState state)
{
}
diff --git a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs
index 6a82050d26..809661db8e 100644
--- a/osu.Game/Rulesets/Mods/ModSuddenDeath.cs
+++ b/osu.Game/Rulesets/Mods/ModSuddenDeath.cs
@@ -5,6 +5,7 @@ using System;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
using osu.Game.Rulesets.Scoring;
+using osu.Game.Scoring;
namespace osu.Game.Rulesets.Mods
{
@@ -24,6 +25,8 @@ namespace osu.Game.Rulesets.Mods
scoreProcessor.FailConditions += FailCondition;
}
+ public ScoreRank AdjustRank(ScoreRank rank, double accuracy) => rank;
+
protected virtual bool FailCondition(ScoreProcessor scoreProcessor) => scoreProcessor.Combo.Value == 0;
}
}
diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
index a2937ff959..cc52b0a038 100644
--- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
+++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs
@@ -10,6 +10,7 @@ using osu.Framework.Extensions;
using osu.Framework.Extensions.TypeExtensions;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Judgements;
+using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.UI;
using osu.Game.Scoring;
@@ -60,6 +61,11 @@ namespace osu.Game.Rulesets.Scoring
///
public readonly BindableInt Combo = new BindableInt();
+ ///
+ /// The current selected mods
+ ///
+ public readonly Bindable> Mods = new Bindable>(Array.Empty());
+
///
/// Create a for this processor.
///
@@ -98,7 +104,12 @@ namespace osu.Game.Rulesets.Scoring
protected ScoreProcessor()
{
Combo.ValueChanged += delegate { HighestCombo.Value = Math.Max(HighestCombo.Value, Combo.Value); };
- Accuracy.ValueChanged += delegate { Rank.Value = rankFrom(Accuracy.Value); };
+ Accuracy.ValueChanged += delegate
+ {
+ Rank.Value = rankFrom(Accuracy.Value);
+ foreach (var mod in Mods.Value.OfType())
+ Rank.Value = mod.AdjustRank(Rank.Value, Accuracy.Value);
+ };
}
private ScoreRank rankFrom(double acc)
diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs
index d36f963016..8bdc30ac94 100644
--- a/osu.Game/Scoring/ScoreInfo.cs
+++ b/osu.Game/Scoring/ScoreInfo.cs
@@ -177,6 +177,8 @@ namespace osu.Game.Scoring
protected class DeserializedMod : IMod
{
public string Acronym { get; set; }
+
+ public bool Equals(IMod other) => Acronym == other?.Acronym;
}
public override string ToString() => $"{User} playing {Beatmap}";
diff --git a/osu.Game/Screens/Multi/Play/TimeshiftPlayer.cs b/osu.Game/Screens/Multi/Play/TimeshiftPlayer.cs
index 9692dc513d..88c6fc5e2e 100644
--- a/osu.Game/Screens/Multi/Play/TimeshiftPlayer.cs
+++ b/osu.Game/Screens/Multi/Play/TimeshiftPlayer.cs
@@ -56,7 +56,7 @@ namespace osu.Game.Screens.Multi.Play
if (ruleset.Value.ID != playlistItem.Ruleset.ID)
throw new InvalidOperationException("Current Ruleset does not match PlaylistItem's Ruleset");
- if (!playlistItem.RequiredMods.All(m => Mods.Value.Contains(m)))
+ if (!playlistItem.RequiredMods.All(m => Mods.Value.Any(m.Equals)))
throw new InvalidOperationException("Current Mods do not match PlaylistItem's RequiredMods");
var req = new CreateRoomScoreRequest(roomId.Value ?? 0, playlistItem.ID);
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 5bf54877fc..81fa348d72 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -106,6 +106,8 @@ namespace osu.Game.Screens.Play
showStoryboard = config.GetBindable(OsuSetting.ShowStoryboard);
ScoreProcessor = DrawableRuleset.CreateScoreProcessor();
+ ScoreProcessor.Mods.BindTo(Mods);
+
if (!ScoreProcessor.Mode.Disabled)
config.BindWith(OsuSetting.ScoreDisplayMode, ScoreProcessor.Mode);
diff --git a/osu.Game/Screens/Play/SkipOverlay.cs b/osu.Game/Screens/Play/SkipOverlay.cs
index 738877232d..65cf5e51f3 100644
--- a/osu.Game/Screens/Play/SkipOverlay.cs
+++ b/osu.Game/Screens/Play/SkipOverlay.cs
@@ -38,6 +38,10 @@ namespace osu.Game.Screens.Play
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true;
protected override bool BlockPositionalInput => false;
+ ///
+ /// Displays a skip overlay, giving the user the ability to skip forward.
+ ///
+ /// The time at which gameplay begins to appear.
public SkipOverlay(double startTime)
{
this.startTime = startTime;
@@ -87,16 +91,21 @@ namespace osu.Game.Screens.Play
};
}
- private const double skip_required_cutoff = 3000;
+ ///
+ /// Duration before gameplay start time required before skip button displays.
+ ///
+ private const double skip_buffer = 1000;
+
private const double fade_time = 300;
- private double beginFadeTime => startTime - skip_required_cutoff - fade_time;
+ private double beginFadeTime => startTime - fade_time;
protected override void LoadComplete()
{
base.LoadComplete();
- if (startTime < skip_required_cutoff)
+ // skip is not required if there is no extra "empty" time to skip.
+ if (Clock.CurrentTime > beginFadeTime - skip_buffer)
{
Alpha = 0;
Expire();
@@ -107,7 +116,7 @@ namespace osu.Game.Screens.Play
using (BeginAbsoluteSequence(beginFadeTime))
this.FadeOut(fade_time);
- button.Action = () => RequestSeek?.Invoke(startTime - skip_required_cutoff - fade_time);
+ button.Action = () => RequestSeek?.Invoke(beginFadeTime);
displayTime = Time.Current;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index f27a3ed776..b5f6be32ed 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 20810886f3..e5b4d61615 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -105,8 +105,8 @@
-
-
+
+