diff --git a/osu.Desktop.VisualTests/Tests/TestCaseModSelect.cs b/osu.Desktop.VisualTests/Tests/TestCaseModSelectOverlay.cs
similarity index 75%
rename from osu.Desktop.VisualTests/Tests/TestCaseModSelect.cs
rename to osu.Desktop.VisualTests/Tests/TestCaseModSelectOverlay.cs
index 90473bee63..a1428380a5 100644
--- a/osu.Desktop.VisualTests/Tests/TestCaseModSelect.cs
+++ b/osu.Desktop.VisualTests/Tests/TestCaseModSelectOverlay.cs
@@ -5,24 +5,28 @@ using osu.Framework.Graphics;
using osu.Game.Overlays.Mods;
using osu.Framework.GameModes.Testing;
using osu.Game.Modes;
+using osu.Game.Graphics;
+using osu.Framework.Allocation;
+using osu.Game.Overlays;
namespace osu.Desktop.VisualTests.Tests
{
- class TestCaseModSelect : TestCase
+ class TestCaseModSelectOverlay : TestCase
{
public override string Name => @"Mod Select";
public override string Description => @"Tests the mod select overlay";
- private ModSelect modSelect;
+ private ModSelectOverlay modSelect;
+ private WaveOverlayContainer wave;
public override void Reset()
{
base.Reset();
- Add(modSelect = new ModSelect
+ Add(modSelect = new ModSelectOverlay
{
- RelativeSizeAxes = Axes.Both,
+ RelativeSizeAxes = Axes.X,
Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre,
ModMode = PlayMode.Osu,
diff --git a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
index 5f06bbd04c..7f28fb9001 100644
--- a/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
+++ b/osu.Desktop.VisualTests/osu.Desktop.VisualTests.csproj
@@ -191,7 +191,7 @@
-
+
diff --git a/osu.Game/Modes/Mod.cs b/osu.Game/Modes/Mod.cs
index 5a68ea5219..1730ecdb85 100644
--- a/osu.Game/Modes/Mod.cs
+++ b/osu.Game/Modes/Mod.cs
@@ -215,7 +215,7 @@ namespace osu.Game.Modes
public override FontAwesome Icon => FontAwesome.fa_osu_mod_autopilot;
public override string Description(PlayMode mode) => @"Automatic cursor movement - just follow the rhythm.";
public override double ScoreMultiplier(PlayMode mode) => 0;
- public override bool Ranked(PlayMode mode) => mode == PlayMode.Osu;
+ public override bool Ranked(PlayMode mode) => false;
}
public class ModPerfect : ModSuddenDeath
diff --git a/osu.Game/Overlays/Mods/AssistedSection.cs b/osu.Game/Overlays/Mods/AssistedSection.cs
index 4b843ed2dc..fe05815e27 100644
--- a/osu.Game/Overlays/Mods/AssistedSection.cs
+++ b/osu.Game/Overlays/Mods/AssistedSection.cs
@@ -86,6 +86,7 @@ namespace osu.Game
private void load(OsuColour colours)
{
Colour = colours.Blue;
+ SelectedColour = colours.BlueLight;
}
public AssistedSection(PlayMode mode)
diff --git a/osu.Game/Overlays/Mods/DifficultyIncreaseSection.cs b/osu.Game/Overlays/Mods/DifficultyIncreaseSection.cs
index 8df6d1ddd6..4f3c88ea1d 100644
--- a/osu.Game/Overlays/Mods/DifficultyIncreaseSection.cs
+++ b/osu.Game/Overlays/Mods/DifficultyIncreaseSection.cs
@@ -21,6 +21,7 @@ namespace osu.Game
private void load(OsuColour colours)
{
Colour = colours.Yellow;
+ SelectedColour = colours.YellowLight;
}
public DifficultyIncreaseSection()
diff --git a/osu.Game/Overlays/Mods/DifficultyReductionSection.cs b/osu.Game/Overlays/Mods/DifficultyReductionSection.cs
index c4e1e81b5c..f3a343e50e 100644
--- a/osu.Game/Overlays/Mods/DifficultyReductionSection.cs
+++ b/osu.Game/Overlays/Mods/DifficultyReductionSection.cs
@@ -19,6 +19,7 @@ namespace osu.Game
private void load(OsuColour colours)
{
Colour = colours.Green;
+ SelectedColour = colours.GreenLight;
}
public DifficultyReductionSection()
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index 5f8bda03e8..cb45a2f0b7 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -52,6 +52,12 @@ namespace osu.Game.Overlays.Mods
iconsContainer.RotateTo(Selected ? 5f : 0f, 300, EasingTypes.OutElastic);
iconsContainer.ScaleTo(Selected ? 1.1f : 1f, 300, EasingTypes.OutElastic);
+ for (int i = 0; i < icons.Length; i++)
+ {
+ // TODO: Find out how to fade between colours here (FadeColour makes the colours look different)
+ if (Selected && i == icons.Length - 1) icons[i].Colour = SelectedColour;
+ else icons[i].Colour = Colour;
+ }
displaySelectedMod();
}
@@ -74,8 +80,8 @@ namespace osu.Game.Overlays.Mods
}
set
{
+ if (value == backgroundColour) return;
backgroundColour = value;
-
foreach (ModIcon icon in icons)
{
icon.Colour = value;
@@ -83,6 +89,21 @@ namespace osu.Game.Overlays.Mods
}
}
+ private Color4 selectedColour;
+ public Color4 SelectedColour
+ {
+ get
+ {
+ return selectedColour;
+ }
+ set
+ {
+ if (value == selectedColour) return;
+ selectedColour = value;
+ if (Selected) icons[0].Colour = value;
+ }
+ }
+
private Mod[] mods;
public Mod[] Mods
{
@@ -92,6 +113,7 @@ namespace osu.Game.Overlays.Mods
}
set
{
+ if (mods == value) return;
mods = value;
createIcons();
if (value.Length > 0)
diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs
index 98205559ad..644460c073 100644
--- a/osu.Game/Overlays/Mods/ModSection.cs
+++ b/osu.Game/Overlays/Mods/ModSection.cs
@@ -102,6 +102,25 @@ namespace osu.Game.Overlays.Mods
}
}
+ private Color4 selectedColour = Color4.White;
+ public Color4 SelectedColour
+ {
+ get
+ {
+ return selectedColour;
+ }
+ set
+ {
+ if (value == selectedColour) return;
+ selectedColour = value;
+
+ foreach (ModButton button in buttons)
+ {
+ button.SelectedColour = value;
+ }
+ }
+ }
+
private void buttonPressed(Mod mod)
{
Action?.Invoke(SelectedMods);
diff --git a/osu.Game/Overlays/Mods/ModSelect.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
similarity index 67%
rename from osu.Game/Overlays/Mods/ModSelect.cs
rename to osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 7efff1aaac..ac261606ef 100644
--- a/osu.Game/Overlays/Mods/ModSelect.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -1,7 +1,6 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using System.Linq;
+
using System.Collections.Generic;
using OpenTK;
using OpenTK.Graphics;
@@ -15,20 +14,14 @@ using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Sprites;
using osu.Game.Modes;
-using System;
using osu.Framework.Allocation;
namespace osu.Game.Overlays.Mods
{
- public class ModSelect : OverlayContainer
+ public class ModSelectOverlay : WaveOverlayContainer
{
- private readonly int waves_duration = 1000;
- private readonly int move_up_duration = 1500;
- private readonly int move_up_delay = 200;
- private readonly int move_out_duration = 500;
- private readonly int button_duration = 1500;
- private readonly int ranked_multiplier_duration = 2000;
-
+ private readonly int button_duration = 800; // 1000
+ private readonly int ranked_multiplier_duration = 800; // 1000
private readonly float content_width = 0.8f;
private Color4 low_multiplier_colour;
@@ -42,9 +35,13 @@ namespace osu.Game.Overlays.Mods
private DifficultyReductionSection difficultyReductionSection;
private DifficultyIncreaseSection difficultyIncreaseSection;
private AssistedSection assistedSection;
-
- private Container contentContainer;
- private Container[] waves;
+ private ModSection[] sections
+ {
+ get
+ {
+ return new ModSection[] { difficultyReductionSection, difficultyIncreaseSection, assistedSection };
+ }
+ }
public Bindable SelectedMods = new Bindable();
@@ -87,64 +84,35 @@ namespace osu.Game.Overlays.Mods
}
}
- protected override void PopIn()
+ protected override void TransitionIn()
{
- FadeIn(move_up_duration, EasingTypes.OutQuint);
+ rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, EasingTypes.OutQuint);
+ rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, EasingTypes.OutQuint);
- Delay(move_up_delay);
- Schedule(() =>
- {
- contentContainer.MoveToY(0, move_up_duration, EasingTypes.OutQuint);
-
- rankedMultiplerContainer.MoveToX(0, ranked_multiplier_duration, EasingTypes.OutQuint);
- rankedMultiplerContainer.FadeIn(ranked_multiplier_duration, EasingTypes.OutQuint);
-
- ModSection[] sections = { difficultyReductionSection, difficultyIncreaseSection, assistedSection };
- for (int i = 0; i < sections.Length; i++)
- {
- sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, EasingTypes.OutQuint);
- sections[i].ButtonsContainer.MoveToX(0, button_duration, EasingTypes.OutQuint);
- sections[i].FadeIn(button_duration, EasingTypes.OutQuint);
- }
- });
-
- for (int i = 0; i < waves.Length; i++)
+ foreach (ModSection section in sections)
{
- waves[i].MoveToY(-200, waves_duration + ((i + 1) * 500), EasingTypes.OutQuint);
+ section.ButtonsContainer.TransformSpacingTo(new Vector2(50f, 0f), button_duration, EasingTypes.OutQuint);
+ section.ButtonsContainer.MoveToX(0, button_duration, EasingTypes.OutQuint);
+ section.ButtonsContainer.FadeIn(button_duration, EasingTypes.OutQuint);
}
}
- protected override void PopOut()
+ protected override void TransitionOut()
{
- FadeOut(move_out_duration, EasingTypes.InSine);
-
- contentContainer.MoveToY(DrawHeight, move_out_duration, EasingTypes.InSine);
-
- rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, move_out_duration, EasingTypes.InSine);
- rankedMultiplerContainer.FadeOut(move_out_duration, EasingTypes.InSine);
-
- ModSection[] sections = { difficultyReductionSection, difficultyIncreaseSection, assistedSection };
- for (int i = 0; i < sections.Length; i++)
- {
- sections[i].ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), move_out_duration, EasingTypes.InSine);
- sections[i].ButtonsContainer.MoveToX(100f, move_out_duration, EasingTypes.InSine);
- sections[i].FadeIn(move_out_duration, EasingTypes.InSine);
- }
-
- for (int i = 0; i < waves.Length; i++)
- {
- waves[i].MoveToY(DrawHeight + 200);
+ rankedMultiplerContainer.MoveToX(rankedMultiplerContainer.DrawSize.X, close_duration, EasingTypes.InSine);
+ rankedMultiplerContainer.FadeOut(close_duration, EasingTypes.InSine);
+
+ foreach (ModSection section in sections)
+ {
+ section.ButtonsContainer.TransformSpacingTo(new Vector2(100f, 0f), close_duration, EasingTypes.InSine);
+ section.ButtonsContainer.MoveToX(100f, close_duration, EasingTypes.InSine);
+ section.ButtonsContainer.FadeTo(0.01f, close_duration, EasingTypes.InSine); // TODO: Fix this so 0.01 opacity isn't used
}
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
- waves[0].Colour = colours.BlueLight;
- waves[1].Colour = colours.Blue;
- waves[2].Colour = colours.BlueDark;
- waves[3].Colour = colours.BlueDarker;
-
low_multiplier_colour = colours.Red;
high_multiplier_colour = colours.Green;
}
@@ -250,111 +218,50 @@ namespace osu.Game.Overlays.Mods
SelectedMods.Value = selectedMods.ToArray();
}
- public ModSelect()
+ public ModSelectOverlay()
{
+ FirstWaveColour = OsuColour.FromHex(@"19b0e2");
+ SecondWaveColour = OsuColour.FromHex(@"2280a2");
+ ThirdWaveColour = OsuColour.FromHex(@"005774");
+ FourthWaveColour = OsuColour.FromHex(@"003a4e");
+
+ Height = 548; // TODO: Remove when autosize works
+ //AutoSizeAxes = Axes.Y;
+ //Content.RelativeSizeAxes = Axes.X;
+ //Content.AutoSizeAxes = Axes.Y;
Children = new Drawable[]
{
new Container
{
RelativeSizeAxes = Axes.Both,
- Origin = Anchor.BottomLeft,
- Anchor = Anchor.BottomLeft,
Masking = true,
- Children = waves = new Container[]
+ Children = new Drawable[]
{
- new Container
+ new Box
{
RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Width = 1.5f,
- Position = new Vector2(0f),
- Rotation = -10f,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- },
- },
+ Colour = new Color4(36, 50, 68, 255)
},
- new Container
+ new Triangles
{
+ TriangleScale = 5,
RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.BottomRight,
- Origin = Anchor.BottomRight,
- Width = 1.5f,
- Position = new Vector2(0f, 50f),
- Rotation = 8f,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- },
- },
- },
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.BottomLeft,
- Origin = Anchor.BottomLeft,
- Width = 1.5f,
- Position = new Vector2(0f, 150f),
- Rotation = -5f,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- },
- },
- },
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Anchor = Anchor.BottomRight,
- Origin = Anchor.BottomRight,
- Width = 1.5f,
- Position = new Vector2(0f, 300f),
- Rotation = 2f,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- },
- },
+ ColourLight = new Color4(53, 66, 82, 255),
+ ColourDark = new Color4(41, 54, 70, 255),
},
},
},
- contentContainer = new Container
+ new FlowContainer
{
- RelativeSizeAxes = Axes.Both,
- Origin = Anchor.Centre,
- Anchor = Anchor.Centre,
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.BottomCentre,
+ Origin = Anchor.BottomCentre,
+ Direction = FlowDirections.Vertical,
+ Spacing = new Vector2(0f, 10f),
Children = new Drawable[]
{
- new Container
- {
- RelativeSizeAxes = Axes.Both,
- Masking = true,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = new Color4(36, 50, 68, 255)
- },
- new Triangles
- {
- TriangleScale = 5,
- RelativeSizeAxes = Axes.Both,
- ColourLight = new Color4(53, 66, 82, 255),
- ColourDark = new Color4(41, 54, 70, 255),
- },
- }
- },
+ // Header
new Container
{
RelativeSizeAxes = Axes.X,
@@ -410,6 +317,7 @@ namespace osu.Game.Overlays.Mods
},
},
},
+ // Body
modSectionsContainer = new FlowContainer
{
Origin = Anchor.TopCentre,
@@ -418,10 +326,6 @@ namespace osu.Game.Overlays.Mods
AutoSizeAxes = Axes.Y,
Spacing = new Vector2(0f, 10f),
Width = content_width,
- Margin = new MarginPadding
- {
- Top = 100,
- },
Children = new Drawable[]
{
difficultyReductionSection = new DifficultyReductionSection
@@ -447,16 +351,13 @@ namespace osu.Game.Overlays.Mods
},
},
},
+ // Footer
new Container
{
RelativeSizeAxes = Axes.X,
Height = 70,
- Origin = Anchor.BottomCentre,
- Anchor = Anchor.BottomCentre,
- Margin = new MarginPadding
- {
- Bottom = 50,
- },
+ Origin = Anchor.TopCentre,
+ Anchor = Anchor.TopCentre,
Children = new Drawable[]
{
new Box
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
new file mode 100644
index 0000000000..095c4e8ac5
--- /dev/null
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -0,0 +1,277 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using OpenTK.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Sprites;
+using OpenTK;
+using osu.Framework.Graphics.Transformations;
+
+namespace osu.Game.Overlays
+{
+ public abstract class WaveOverlayContainer : OverlayContainer
+ {
+ private readonly float first_wave_position = -130;
+ private readonly float second_wave_position = 0;
+ private readonly float third_wave_position = 70;
+ private readonly float fourth_wave_position = 100;
+ private readonly float container_position = -150;
+ private float[] wave_positions
+ {
+ get
+ {
+ return new float[] { first_wave_position, second_wave_position, third_wave_position, fourth_wave_position };
+ }
+ }
+
+ private readonly float first_wave_duration = 700;
+ private readonly float second_wave_duration = 800;
+ private readonly float third_wave_duration = 900;
+ private readonly float fourth_wave_duration = 1000;
+ private readonly float container_wait = 300;
+ private readonly float container_duration = 500;
+ private readonly float content_duration = 800;
+ internal readonly float close_duration = 500;
+ private readonly float content_transition_wait = 150; // 100
+ private float [] wave_durations
+ {
+ get
+ {
+ return new float[] { first_wave_duration, second_wave_duration, third_wave_duration, fourth_wave_duration };
+ }
+ }
+
+ private readonly float first_wave_rotation = 13;
+ private readonly float second_wave_rotation = -7;
+ private readonly float third_wave_rotation = 4;
+ private readonly float fourth_wave_rotation = -2;
+
+ private Container firstWave, secondWave, thirdWave, fourthWave, wavesContainer;
+ private readonly Container[] waves;
+
+ private readonly Container contentContainer;
+ protected override Container Content => contentContainer;
+
+ private EdgeEffect waveShadow = new EdgeEffect
+ {
+ Type = EdgeEffectType.Shadow,
+ Colour = Color4.Black.Opacity(50),
+ Radius = 20f,
+ };
+
+ private Color4 firstWaveColour;
+ public Color4 FirstWaveColour
+ {
+ get
+ {
+ return firstWaveColour;
+ }
+ set
+ {
+ if (firstWaveColour == value) return;
+ firstWaveColour = value;
+ firstWave.Colour = value;
+ }
+ }
+
+ private Color4 secondWaveColour;
+ public Color4 SecondWaveColour
+ {
+ get
+ {
+ return secondWaveColour;
+ }
+ set
+ {
+ if (secondWaveColour == value) return;
+ secondWaveColour = value;
+ secondWave.Colour = value;
+ }
+ }
+
+ private Color4 thirdWaveColour;
+ public Color4 ThirdWaveColour
+ {
+ get
+ {
+ return thirdWaveColour;
+ }
+ set
+ {
+ if (thirdWaveColour == value) return;
+ thirdWaveColour = value;
+ thirdWave.Colour = value;
+ }
+ }
+
+ private Color4 fourthWaveColour;
+ public Color4 FourthWaveColour
+ {
+ get
+ {
+ return fourthWaveColour;
+ }
+ set
+ {
+ if (fourthWaveColour == value) return;
+ fourthWaveColour = value;
+ fourthWave.Colour = value;
+ }
+ }
+
+ protected override void PopIn()
+ {
+ base.Show();
+
+ FadeIn();
+ for (int i = 0; i < waves.Length; i++)
+ {
+ waves[i].MoveToY(wave_positions[i], wave_durations[i], EasingTypes.OutQuint);
+ }
+
+ DelayReset();
+ Delay(container_wait);
+ Schedule(() =>
+ {
+ if (State == Visibility.Visible)
+ {
+ wavesContainer.MoveToY(container_position, container_duration, EasingTypes.None);
+ contentContainer.FadeIn(content_duration, EasingTypes.OutQuint);
+ contentContainer.MoveToY(0, content_duration, EasingTypes.OutQuint);
+
+ Delay(content_transition_wait);
+ Schedule(() => { if (State == Visibility.Visible) TransitionIn(); });
+ }
+ });
+ }
+
+ protected abstract void TransitionIn();
+
+ protected override void PopOut()
+ {
+ FadeIn();
+ foreach (Container wave in waves)
+ {
+ wave.MoveToY(DrawHeight, close_duration, EasingTypes.InSine);
+ }
+ wavesContainer.MoveToY(0, close_duration, EasingTypes.InSine);
+
+ contentContainer.MoveToY(DrawHeight, close_duration, EasingTypes.InSine);
+ contentContainer.FadeOut(close_duration, EasingTypes.InSine);
+
+ TransitionOut();
+
+ DelayReset();
+ Delay(close_duration);
+ Schedule(() => { if (State == Visibility.Hidden) FadeOut(); });
+ }
+
+ protected abstract void TransitionOut();
+
+ public WaveOverlayContainer()
+ {
+ Masking = true;
+
+ AddInternal(wavesContainer = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Origin = Anchor.TopCentre,
+ Anchor = Anchor.TopCentre,
+ Children = new Drawable[]
+ {
+ firstWave = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Origin = Anchor.TopLeft,
+ Anchor = Anchor.TopLeft,
+ Size = new Vector2(1.5f),
+ Rotation = first_wave_rotation,
+ Colour = FirstWaveColour,
+ Masking = true,
+ EdgeEffect = waveShadow,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ },
+ },
+ secondWave = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Origin = Anchor.TopRight,
+ Anchor = Anchor.TopRight,
+ Size = new Vector2(1.5f),
+ Rotation = second_wave_rotation,
+ Colour = SecondWaveColour,
+ Masking = true,
+ EdgeEffect = waveShadow,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ },
+ },
+ thirdWave = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Origin = Anchor.TopLeft,
+ Anchor = Anchor.TopLeft,
+ Size = new Vector2(1.5f),
+ Rotation = third_wave_rotation,
+ Colour = ThirdWaveColour,
+ Masking = true,
+ EdgeEffect = waveShadow,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ },
+ },
+ fourthWave = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Origin = Anchor.TopRight,
+ Anchor = Anchor.TopRight,
+ Size = new Vector2(1.5f),
+ Rotation = fourth_wave_rotation,
+ Colour = FourthWaveColour,
+ Masking = true,
+ EdgeEffect = waveShadow,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ },
+ },
+ },
+ },
+ });
+
+ AddInternal(contentContainer = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Anchor = Anchor.BottomCentre,
+ Origin = Anchor.BottomCentre,
+ Children = new Drawable[]
+ {
+ new Box
+ {
+ RelativeSizeAxes = Axes.Both,
+ Colour = Color4.White.Opacity(50),
+ },
+ },
+ });
+
+ waves = new Container[] { firstWave, secondWave, thirdWave, fourthWave };
+ }
+ }
+}
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 9a82ff68cf..1145c7b18a 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -29,6 +29,7 @@ using OpenTK.Input;
using System.Collections.Generic;
using osu.Framework.Graphics.Containers;
using osu.Framework.Threading;
+using osu.Game.Overlays.Mods;
namespace osu.Game.Screens.Select
{
@@ -44,7 +45,7 @@ namespace osu.Game.Screens.Select
private static readonly Vector2 wedged_container_size = new Vector2(0.5f, 225);
private BeatmapInfoWedge beatmapInfoWedge;
- private Overlays.Mods.ModSelect modSelect;
+ private ModSelectOverlay modSelect;
private static readonly Vector2 background_blur = new Vector2(20);
private CancellationTokenSource initialAddSetsTask;
@@ -134,11 +135,15 @@ namespace osu.Game.Screens.Select
Right = 20,
},
},
- modSelect = new Overlays.Mods.ModSelect
+ modSelect = new ModSelectOverlay
{
- RelativeSizeAxes = Axes.Both,
+ RelativeSizeAxes = Axes.X,
Origin = Anchor.BottomCentre,
Anchor = Anchor.BottomCentre,
+ Margin = new MarginPadding
+ {
+ Bottom = 50,
+ },
},
footer = new Footer()
{
@@ -258,12 +263,6 @@ namespace osu.Game.Screens.Select
protected override bool OnExiting(GameMode next)
{
- if (modSelect.State == Visibility.Visible)
- {
- modSelect.Hide();
- return true;
- }
-
beatmapInfoWedge.MoveToX(-100, 800, EasingTypes.InQuint);
beatmapInfoWedge.RotateTo(10, 800, EasingTypes.InQuint);
@@ -286,6 +285,7 @@ namespace osu.Game.Screens.Select
private void playMode_ValueChanged(object sender, EventArgs e)
{
+ modSelect.ModMode = playMode;
}
private void changeBackground(WorkingBeatmap beatmap)
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index a93782a22a..2c0a7fa6cb 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -272,7 +272,7 @@
-
+
@@ -280,6 +280,7 @@
+