diff --git a/.vscode/launch.json b/.vscode/launch.json
index 11141dc182..32c82685c0 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -22,7 +22,7 @@
},
"type": "mono",
"request": "launch",
- "program": "${workspaceRoot}/osu.Game.Tests/bin/Debug/net471/osu.Game.Tests.exe",
+ "program": "${workspaceRoot}/osu.Game.Tests/bin/Release/net471/osu.Game.Tests.exe",
"cwd": "${workspaceRoot}",
"preLaunchTask": "Build (Release, msbuild)",
"runtimeExecutable": null,
diff --git a/osu-framework b/osu-framework
index 84fdfc77a8..aebfa5bc5c 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 84fdfc77a86d581638e69f5e8061c118de4b30f9
+Subproject commit aebfa5bc5c634c1fd0c103e0c17518e5111a67c7
diff --git a/osu.Game.Rulesets.Catch.Tests/TestCaseCatcherArea.cs b/osu.Game.Rulesets.Catch.Tests/TestCaseCatcherArea.cs
index f239290ed4..5119260c53 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestCaseCatcherArea.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestCaseCatcherArea.cs
@@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Catch.Tests
Child = catcherArea = new TestCatcherArea(new BeatmapDifficulty { CircleSize = size })
{
Anchor = Anchor.CentreLeft,
- Origin = Anchor.BottomLeft
+ Origin = Anchor.TopLeft
},
};
}
diff --git a/osu.Game.Rulesets.Catch.Tests/TestCaseFruitObjects.cs b/osu.Game.Rulesets.Catch.Tests/TestCaseFruitObjects.cs
index 275752523d..e77dd76353 100644
--- a/osu.Game.Rulesets.Catch.Tests/TestCaseFruitObjects.cs
+++ b/osu.Game.Rulesets.Catch.Tests/TestCaseFruitObjects.cs
@@ -25,6 +25,7 @@ namespace osu.Game.Rulesets.Catch.Tests
typeof(DrawableCatchHitObject),
typeof(DrawableFruit),
typeof(DrawableDroplet),
+ typeof(BananaShower),
typeof(Pulp),
};
@@ -53,12 +54,19 @@ namespace osu.Game.Rulesets.Catch.Tests
private DrawableFruit createDrawable(int index)
{
- var fruit = new Fruit
- {
- StartTime = 1000000000000,
- IndexInBeatmap = index,
- Scale = 1.5f,
- };
+ Fruit fruit = index == 5
+ ? new BananaShower.Banana
+ {
+ StartTime = 1000000000000,
+ IndexInBeatmap = index,
+ Scale = 1.5f,
+ }
+ : new Fruit
+ {
+ StartTime = 1000000000000,
+ IndexInBeatmap = index,
+ Scale = 1.5f,
+ };
return new DrawableFruit(fruit)
{
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
index 41792b10a4..4603148114 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableFruit.cs
@@ -18,12 +18,19 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
private Circle border;
+ private const float drawable_radius = (float)CatchHitObject.OBJECT_RADIUS * radius_adjust;
+
+ ///
+ /// Because we're adding a border around the fruit, we need to scale down some.
+ ///
+ private const float radius_adjust = 1.1f;
+
public DrawableFruit(Fruit h)
: base(h)
{
Origin = Anchor.Centre;
- Size = new Vector2((float)CatchHitObject.OBJECT_RADIUS);
+ Size = new Vector2(drawable_radius);
Masking = false;
Rotation = (float)(RNG.NextDouble() - 0.5f) * 40;
@@ -44,14 +51,14 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
Hollow = !HitObject.HyperDash,
Type = EdgeEffectType.Glow,
- Radius = 4,
+ Radius = 4 * radius_adjust,
Colour = HitObject.HyperDash ? Color4.Red : AccentColour.Darken(1).Opacity(0.6f)
},
- Size = new Vector2(Height * 1.5f),
+ Size = new Vector2(Height),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
BorderColour = Color4.White,
- BorderThickness = 4f,
+ BorderThickness = 3f * radius_adjust,
Children = new Framework.Graphics.Drawable[]
{
new Box
@@ -82,8 +89,8 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
private Framework.Graphics.Drawable createPulp(FruitVisualRepresentation representation)
{
- const float large_pulp_3 = 13f;
- const float distance_from_centre_3 = 0.23f;
+ const float large_pulp_3 = 8f * radius_adjust;
+ const float distance_from_centre_3 = 0.15f;
const float large_pulp_4 = large_pulp_3 * 0.925f;
const float distance_from_centre_4 = distance_from_centre_3 / 0.925f;
@@ -106,11 +113,9 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
new Pulp
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.BottomCentre,
AccentColour = AccentColour,
Size = new Vector2(small_pulp),
- Y = 0.05f,
+ Y = -0.34f,
},
new Pulp
{
@@ -146,11 +151,9 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
new Pulp
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.BottomCentre,
AccentColour = AccentColour,
Size = new Vector2(small_pulp),
- Y = 0.1f,
+ Y = -0.3f,
},
new Pulp
{
@@ -186,11 +189,9 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
new Pulp
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
AccentColour = AccentColour,
Size = new Vector2(small_pulp),
- Y = -0.1f,
+ Y = -0.33f,
},
new Pulp
{
@@ -220,10 +221,9 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
new Pulp
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
AccentColour = AccentColour,
Size = new Vector2(small_pulp),
+ Y = -0.25f,
},
new Pulp
{
@@ -253,16 +253,15 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
{
new Pulp
{
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
AccentColour = AccentColour,
Size = new Vector2(small_pulp),
- Y = -0.15f
+ Y = -0.3f
},
new Pulp
{
AccentColour = AccentColour,
- Size = new Vector2(large_pulp_4 * 1.2f, large_pulp_4 * 3),
+ Size = new Vector2(large_pulp_4 * 0.8f, large_pulp_4 * 2.5f),
+ Y = 0.05f,
},
}
};
diff --git a/osu.Game.Rulesets.Catch/Objects/Drawable/Pieces/Pulp.cs b/osu.Game.Rulesets.Catch/Objects/Drawable/Pieces/Pulp.cs
index d17a72a165..250dc8c7f1 100644
--- a/osu.Game.Rulesets.Catch/Objects/Drawable/Pieces/Pulp.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Drawable/Pieces/Pulp.cs
@@ -29,14 +29,24 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable.Pieces
set
{
accentColour = value;
-
- EdgeEffect = new EdgeEffectParameters
- {
- Type = EdgeEffectType.Glow,
- Radius = 8,
- Colour = accentColour.Darken(0.2f).Opacity(0.75f)
- };
+ if (IsLoaded) updateAccentColour();
}
}
+
+ private void updateAccentColour()
+ {
+ EdgeEffect = new EdgeEffectParameters
+ {
+ Type = EdgeEffectType.Glow,
+ Radius = Size.X / 2,
+ Colour = accentColour.Darken(0.2f).Opacity(0.75f)
+ };
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+ updateAccentColour();
+ }
}
}
diff --git a/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs b/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
index 070dc19a6f..52763e09af 100644
--- a/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
@@ -32,6 +32,8 @@ namespace osu.Game.Rulesets.Catch.UI
public override PassThroughInputManager CreateInputManager() => new CatchInputManager(Ruleset.RulesetInfo);
+ protected override Vector2 PlayfieldArea => new Vector2(0.86f); // matches stable's vertical offset for catcher plate
+
protected override DrawableHitObject GetVisualRepresentation(CatchHitObject h)
{
switch (h)
diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
index 181536a91e..d8c7b5130d 100644
--- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs
@@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Catch.UI
{
public class CatcherArea : Container
{
- public const float CATCHER_SIZE = 172;
+ public const float CATCHER_SIZE = 84;
protected readonly Catcher MovableCatcher;
@@ -99,8 +99,6 @@ namespace osu.Game.Rulesets.Catch.UI
public class Catcher : Container, IKeyBindingHandler
{
- private Texture texture;
-
private Container caughtFruit;
public Container ExplodingFruitTarget;
@@ -121,10 +119,8 @@ namespace osu.Game.Rulesets.Catch.UI
}
[BackgroundDependencyLoader]
- private void load(TextureStore textures)
+ private void load()
{
- texture = textures.Get(@"Play/Catch/fruit-catcher-idle");
-
Children = new Drawable[]
{
caughtFruit = new Container
@@ -196,13 +192,7 @@ namespace osu.Game.Rulesets.Catch.UI
Scheduler.AddDelayed(beginTrail, HyperDashing ? 25 : 50);
}
- private Sprite createCatcherSprite() => new Sprite
- {
- Size = new Vector2(CATCHER_SIZE),
- FillMode = FillMode.Fill,
- Texture = texture,
- OriginPosition = new Vector2(-3, 10) // temporary until the sprite is aligned correctly.
- };
+ private Sprite createCatcherSprite() => new CatcherSprite();
///
/// Add a caught fruit to the catcher's stack.
@@ -411,6 +401,23 @@ namespace osu.Game.Rulesets.Catch.UI
f.Expire();
}
}
+
+ private class CatcherSprite : Sprite
+ {
+ public CatcherSprite()
+ {
+ Size = new Vector2(CATCHER_SIZE);
+
+ // Sets the origin roughly to the centre of the catcher's plate to allow for correct scaling.
+ OriginPosition = new Vector2(-0.02f, 0.06f) * CATCHER_SIZE;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(TextureStore textures)
+ {
+ Texture = textures.Get(@"Play/Catch/fruit-catcher-idle");
+ }
+ }
}
}
}
diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModDualStages.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModDualStages.cs
index 7f3985b26d..256811b4c1 100644
--- a/osu.Game.Rulesets.Mania/Mods/ManiaModDualStages.cs
+++ b/osu.Game.Rulesets.Mania/Mods/ManiaModDualStages.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override string Name => "Dual Stages";
public override string ShortenedName => "DS";
public override string Description => @"Double the stages, double the fun!";
- public override double ScoreMultiplier => 0;
+ public override double ScoreMultiplier => 1;
private bool isForCurrentRuleset;
diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModRandom.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModRandom.cs
index 5af898287a..2f951461c3 100644
--- a/osu.Game.Rulesets.Mania/Mods/ManiaModRandom.cs
+++ b/osu.Game.Rulesets.Mania/Mods/ManiaModRandom.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mania.Mods
public override string ShortenedName => "RD";
public override FontAwesome Icon => FontAwesome.fa_osu_dice;
public override string Description => @"Shuffle around the keys!";
- public override double ScoreMultiplier => 0;
+ public override double ScoreMultiplier => 1;
public void ApplyToRulesetContainer(RulesetContainer rulesetContainer)
{
diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModAutopilot.cs b/osu.Game.Rulesets.Osu/Mods/OsuModAutopilot.cs
index 3573c133c2..b2ddd65e38 100644
--- a/osu.Game.Rulesets.Osu/Mods/OsuModAutopilot.cs
+++ b/osu.Game.Rulesets.Osu/Mods/OsuModAutopilot.cs
@@ -13,8 +13,7 @@ namespace osu.Game.Rulesets.Osu.Mods
public override string ShortenedName => "AP";
public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot;
public override string Description => @"Automatic cursor movement - just follow the rhythm.";
- public override double ScoreMultiplier => 0;
- public override bool Ranked => false;
+ public override double ScoreMultiplier => 1;
public override Type[] IncompatibleMods => new[] { typeof(OsuModSpunOut), typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail), typeof(ModAutoplay) };
}
}
diff --git a/osu.Game.Tests/Visual/TestCaseMods.cs b/osu.Game.Tests/Visual/TestCaseMods.cs
index d3d21509fd..3255478bea 100644
--- a/osu.Game.Tests/Visual/TestCaseMods.cs
+++ b/osu.Game.Tests/Visual/TestCaseMods.cs
@@ -39,8 +39,6 @@ namespace osu.Game.Tests.Visual
typeof(SpecialSection),
};
- private const string unranked_suffix = " (Unranked)";
-
private RulesetStore rulesets;
private ModDisplay modDisplay;
private TestModSelectOverlay modSelect;
@@ -121,7 +119,7 @@ namespace osu.Game.Tests.Visual
private void testManiaMods(ManiaRuleset ruleset)
{
- testMultiplierTextUnranked(ruleset.GetModsFor(ModType.Special).First(m => m is ManiaModRandom));
+ testRankedText(ruleset.GetModsFor(ModType.Special).First(m => m is ManiaModRandom));
}
private void testSingleMod(Mod mod)
@@ -198,13 +196,16 @@ namespace osu.Game.Tests.Visual
checkLabelColor(Color4.White);
}
- private void testMultiplierTextUnranked(Mod mod)
+ private void testRankedText(Mod mod)
{
- AddAssert("check for ranked", () => !modSelect.MultiplierLabel.Text.EndsWith(unranked_suffix));
+ AddWaitStep(1, "wait for fade");
+ AddAssert("check for ranked", () => modSelect.UnrankedLabel.Alpha == 0);
selectNext(mod);
- AddAssert("check for unranked", () => modSelect.MultiplierLabel.Text.EndsWith(unranked_suffix));
+ AddWaitStep(1, "wait for fade");
+ AddAssert("check for unranked", () => modSelect.UnrankedLabel.Alpha != 0);
selectPrevious(mod);
- AddAssert("check for ranked", () => !modSelect.MultiplierLabel.Text.EndsWith(unranked_suffix));
+ AddWaitStep(1, "wait for fade");
+ AddAssert("check for ranked", () => modSelect.UnrankedLabel.Alpha == 0);
}
private void selectNext(Mod mod) => AddStep($"left click {mod.Name}", () => modSelect.GetModButton(mod)?.SelectNext(1));
@@ -240,6 +241,7 @@ namespace osu.Game.Tests.Visual
}
public new OsuSpriteText MultiplierLabel => base.MultiplierLabel;
+ public new OsuSpriteText UnrankedLabel => base.UnrankedLabel;
public new TriangleButton DeselectAllButton => base.DeselectAllButton;
public new Color4 LowMultiplierColour => base.LowMultiplierColour;
diff --git a/osu.Game/Database/ArchiveModelManager.cs b/osu.Game/Database/ArchiveModelManager.cs
index 74c7b3df5d..7741fe9ab3 100644
--- a/osu.Game/Database/ArchiveModelManager.cs
+++ b/osu.Game/Database/ArchiveModelManager.cs
@@ -174,7 +174,7 @@ namespace osu.Game.Database
/// The archive to be imported.
public TModel Import(ArchiveReader archive)
{
- TModel item;
+ TModel item = null;
delayEvents();
try
@@ -212,14 +212,17 @@ namespace osu.Game.Database
Logger.Log($"Import of {archive.Name} successfully completed!", LoggingTarget.Database);
}
- catch
+ catch (Exception e)
{
- Logger.Log($"Import of {archive.Name} failed and has been rolled back.", LoggingTarget.Database);
+ Logger.Error(e, $"Import of {archive.Name} failed and has been rolled back.", LoggingTarget.Database);
item = null;
}
+ finally
+ {
+ // we only want to flush events after we've confirmed the write context didn't have any errors.
+ flushEvents(item != null);
+ }
- // we only want to flush events after we've confirmed the write context didn't have any errors.
- flushEvents(item != null);
return item;
}
@@ -243,12 +246,8 @@ namespace osu.Game.Database
/// The item to delete.
public void Delete(TModel item)
{
- using (var usage = ContextFactory.GetForWrite())
+ using (ContextFactory.GetForWrite())
{
- var context = usage.Context;
-
- context.ChangeTracker.AutoDetectChangesEnabled = false;
-
// re-fetch the model on the import context.
var foundModel = queryModel().Include(s => s.Files).ThenInclude(f => f.FileInfo).First(s => s.ID == item.ID);
@@ -256,8 +255,6 @@ namespace osu.Game.Database
if (ModelStore.Delete(foundModel))
Files.Dereference(foundModel.Files.Select(f => f.FileInfo).ToArray());
-
- context.ChangeTracker.AutoDetectChangesEnabled = true;
}
}
diff --git a/osu.Game/Database/DatabaseContextFactory.cs b/osu.Game/Database/DatabaseContextFactory.cs
index ec408456e3..a1d371f431 100644
--- a/osu.Game/Database/DatabaseContextFactory.cs
+++ b/osu.Game/Database/DatabaseContextFactory.cs
@@ -48,7 +48,14 @@ namespace osu.Game.Database
Monitor.Enter(writeLock);
if (currentWriteTransaction == null && withTransaction)
+ {
+ // this mitigates the fact that changes on tracked entities will not be rolled back with the transaction by ensuring write operations are always executed in isolated contexts.
+ // if this results in sub-optimal efficiency, we may need to look into removing Database-level transactions in favour of running SaveChanges where we currently commit the transaction.
+ if (threadContexts.IsValueCreated)
+ recycleThreadContexts();
+
currentWriteTransaction = threadContexts.Value.Database.BeginTransaction();
+ }
Interlocked.Increment(ref currentWriteUsages);
@@ -64,24 +71,25 @@ namespace osu.Game.Database
currentWriteDidWrite |= usage.PerformedWrite;
currentWriteDidError |= usage.Errors.Any();
- if (usages > 0) return;
-
- if (currentWriteDidError)
- currentWriteTransaction?.Rollback();
- else
- currentWriteTransaction?.Commit();
-
- currentWriteTransaction = null;
- currentWriteDidWrite = false;
- currentWriteDidError = false;
-
- if (currentWriteDidWrite)
+ if (usages == 0)
{
- // explicitly dispose to ensure any outstanding flushes happen as soon as possible (and underlying resources are purged).
- usage.Context.Dispose();
+ if (currentWriteDidError)
+ currentWriteTransaction?.Rollback();
+ else
+ currentWriteTransaction?.Commit();
- // once all writes are complete, we want to refresh thread-specific contexts to make sure they don't have stale local caches.
- recycleThreadContexts();
+ if (currentWriteDidWrite || currentWriteDidError)
+ {
+ // explicitly dispose to ensure any outstanding flushes happen as soon as possible (and underlying resources are purged).
+ usage.Context.Dispose();
+
+ // once all writes are complete, we want to refresh thread-specific contexts to make sure they don't have stale local caches.
+ recycleThreadContexts();
+ }
+
+ currentWriteTransaction = null;
+ currentWriteDidWrite = false;
+ currentWriteDidError = false;
}
}
finally
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 632c00d1fd..f1624721da 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -31,7 +31,7 @@ namespace osu.Game.Overlays.Mods
protected Color4 LowMultiplierColour, HighMultiplierColour;
protected readonly TriangleButton DeselectAllButton;
- protected readonly OsuSpriteText MultiplierLabel;
+ protected readonly OsuSpriteText MultiplierLabel, UnrankedLabel;
private readonly FillFlowContainer footerContainer;
protected override bool BlockPassThroughKeyboard => false;
@@ -58,6 +58,7 @@ namespace osu.Game.Overlays.Mods
LowMultiplierColour = colours.Red;
HighMultiplierColour = colours.Green;
+ UnrankedLabel.Colour = colours.Blue;
if (osu != null)
Ruleset.BindTo(osu.Ruleset);
@@ -99,15 +100,14 @@ namespace osu.Game.Overlays.Mods
}
MultiplierLabel.Text = $"{multiplier:N2}x";
- if (!ranked)
- MultiplierLabel.Text += " (Unranked)";
-
if (multiplier > 1.0)
MultiplierLabel.FadeColour(HighMultiplierColour, 200);
else if (multiplier < 1.0)
MultiplierLabel.FadeColour(LowMultiplierColour, 200);
else
MultiplierLabel.FadeColour(Color4.White, 200);
+
+ UnrankedLabel.FadeTo(ranked ? 0 : 1, 200);
}
protected override void PopOut()
@@ -352,23 +352,33 @@ namespace osu.Game.Overlays.Mods
},
new OsuSpriteText
{
- Text = @"Score Multiplier: ",
+ Text = @"Score Multiplier:",
TextSize = 30,
- Shadow = true,
Margin = new MarginPadding
{
- Top = 5
+ Top = 5,
+ Right = 10
}
},
MultiplierLabel = new OsuSpriteText
{
Font = @"Exo2.0-Bold",
TextSize = 30,
- Shadow = true,
Margin = new MarginPadding
{
Top = 5
}
+ },
+ UnrankedLabel = new OsuSpriteText
+ {
+ Font = @"Exo2.0-Bold",
+ Text = @"(Unranked)",
+ TextSize = 30,
+ Margin = new MarginPadding
+ {
+ Top = 5,
+ Left = 10
+ }
}
}
}
diff --git a/osu.Game/Rulesets/Mods/ModAutoplay.cs b/osu.Game/Rulesets/Mods/ModAutoplay.cs
index 75f37b993d..7058d1bed6 100644
--- a/osu.Game/Rulesets/Mods/ModAutoplay.cs
+++ b/osu.Game/Rulesets/Mods/ModAutoplay.cs
@@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Mods
public override string ShortenedName => "AT";
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
public override string Description => "Watch a perfect automated play through the song.";
- public override double ScoreMultiplier => 0;
+ public override double ScoreMultiplier => 1;
public bool AllowFail => false;
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };
}
diff --git a/osu.Game/Rulesets/Mods/ModRelax.cs b/osu.Game/Rulesets/Mods/ModRelax.cs
index e4137254e6..0bd9becd78 100644
--- a/osu.Game/Rulesets/Mods/ModRelax.cs
+++ b/osu.Game/Rulesets/Mods/ModRelax.cs
@@ -11,7 +11,7 @@ namespace osu.Game.Rulesets.Mods
public override string Name => "Relax";
public override string ShortenedName => "RX";
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
- public override double ScoreMultiplier => 0;
+ public override double ScoreMultiplier => 1;
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModNoFail), typeof(ModSuddenDeath) };
}
}
diff --git a/osu.Game/Screens/Multi/Header.cs b/osu.Game/Screens/Multi/Header.cs
index de71b20007..46610a36d8 100644
--- a/osu.Game/Screens/Multi/Header.cs
+++ b/osu.Game/Screens/Multi/Header.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Screens.Multi
{
public const float HEIGHT = 121;
- private readonly OsuSpriteText screenTitle;
+ private readonly OsuSpriteText screenType;
private readonly HeaderBreadcrumbControl breadcrumbs;
public Header(Screen initialScreen)
@@ -67,7 +67,7 @@ namespace osu.Game.Screens.Multi
Text = "multiplayer ",
TextSize = 25,
},
- screenTitle = new OsuSpriteText
+ screenType = new OsuSpriteText
{
TextSize = 25,
Font = @"Exo2.0-Light",
@@ -86,14 +86,14 @@ namespace osu.Game.Screens.Multi
},
};
- breadcrumbs.Current.ValueChanged += s => screenTitle.Text = ((MultiplayerScreen)s).Title;
+ breadcrumbs.Current.ValueChanged += s => screenType.Text = ((MultiplayerScreen)s).Type.ToLower();
breadcrumbs.Current.TriggerChange();
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- screenTitle.Colour = colours.Yellow;
+ screenType.Colour = colours.Yellow;
breadcrumbs.StripColour = colours.Green;
}
diff --git a/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs b/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
index 60ffe2c0b9..016babcaa5 100644
--- a/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
+++ b/osu.Game/Screens/Multi/Screens/Lounge/Lounge.cs
@@ -25,7 +25,7 @@ namespace osu.Game.Screens.Multi.Screens.Lounge
protected readonly FillFlowContainer RoomsContainer;
protected readonly RoomInspector Inspector;
- public override string Title => "lounge";
+ public override string Title => "Lounge";
protected override Container TransitionContent => content;
diff --git a/osu.Game/Screens/Multi/Screens/MultiplayerScreen.cs b/osu.Game/Screens/Multi/Screens/MultiplayerScreen.cs
index 191fe66037..fa9b40684c 100644
--- a/osu.Game/Screens/Multi/Screens/MultiplayerScreen.cs
+++ b/osu.Game/Screens/Multi/Screens/MultiplayerScreen.cs
@@ -15,6 +15,11 @@ namespace osu.Game.Screens.Multi.Screens
protected virtual Container TransitionContent => Content;
+ ///
+ /// The type to display in the title of the .
+ ///
+ public virtual string Type => Title;
+
protected override void OnEntering(Screen last)
{
base.OnEntering(last);
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index 32161a0b8e..7cbd2e4403 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -57,6 +57,7 @@ namespace osu.Game.Screens.Ranking
{
base.OnEntering(last);
(Background as BackgroundScreenBeatmap)?.BlurTo(background_blur, 2500, Easing.OutQuint);
+ Background.ScaleTo(1.1f, transition_time, Easing.OutQuint);
allCircles.ForEach(c =>
{
@@ -102,6 +103,8 @@ namespace osu.Game.Screens.Ranking
c.ScaleTo(0, transition_time, Easing.OutSine);
});
+ Background.ScaleTo(1f, transition_time / 4, Easing.OutQuint);
+
Content.FadeOut(transition_time / 4);
return base.OnExiting(next);
@@ -160,7 +163,6 @@ namespace osu.Game.Screens.Ranking
{
RelativeSizeAxes = Axes.Both,
ParallaxAmount = 0.01f,
- Scale = new Vector2(1 / circle_outer_scale / overscan),
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Children = new Drawable[]