diff --git a/osu-framework b/osu-framework
index 798409058a42..288236eaba95 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 798409058a421307b5a92aeea4cd60a065f5a0d4
+Subproject commit 288236eaba95dfa15268a55f38c009a97d806f25
diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs
index 08bf6d15a76c..789fbb6af362 100644
--- a/osu.Desktop/Overlays/VersionManager.cs
+++ b/osu.Desktop/Overlays/VersionManager.cs
@@ -61,13 +61,13 @@ private void load(NotificationManager notification, OsuColour colours, TextureSt
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(5),
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
diff --git a/osu.Desktop/Program.cs b/osu.Desktop/Program.cs
index 3171e474dca8..3fd990634b14 100644
--- a/osu.Desktop/Program.cs
+++ b/osu.Desktop/Program.cs
@@ -12,6 +12,7 @@
using osu.Game.Modes.Mania;
using osu.Game.Modes.Osu;
using osu.Game.Modes.Taiko;
+using osu.Game.Modes.Vitaru;
namespace osu.Desktop
{
@@ -45,6 +46,7 @@ public static int Main(string[] args)
Ruleset.Register(new TaikoRuleset());
Ruleset.Register(new ManiaRuleset());
Ruleset.Register(new CatchRuleset());
+ Ruleset.Register(new VitaruRuleset());
host.Run(new OsuGameDesktop(args));
}
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index 527a027ca2fa..3c380207035c 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -214,6 +214,10 @@
{f167e17a-7de6-4af5-b920-a5112296c695}
osu.Game.Modes.Taiko
+
+ {9a615027-b2ab-435e-b865-0c7209933457}
+ osu.Game.Modes.Vitaru
+
{0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d}
osu.Game
diff --git a/osu.Desktop/osu.nuspec b/osu.Desktop/osu.nuspec
index 2888f7c040ec..4c529f57e5d5 100644
--- a/osu.Desktop/osu.nuspec
+++ b/osu.Desktop/osu.nuspec
@@ -17,7 +17,8 @@
-
+
+
diff --git a/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs b/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs
index 95bc0954de3b..39a7862db603 100644
--- a/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs
+++ b/osu.Game.Modes.Osu/Objects/Drawables/HitExplosion.cs
@@ -25,7 +25,7 @@ public HitExplosion(OsuJudgementInfo judgement, OsuHitObject h = null)
AutoSizeAxes = Axes.Both;
Origin = Anchor.Centre;
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
Spacing = new Vector2(0, 2);
Position = (h?.StackedEndPosition ?? Vector2.Zero) + judgement.PositionOffset;
diff --git a/osu.Game.Modes.Osu/OsuScoreProcessor.cs b/osu.Game.Modes.Osu/OsuScoreProcessor.cs
index 949325955832..e73db8d9010c 100644
--- a/osu.Game.Modes.Osu/OsuScoreProcessor.cs
+++ b/osu.Game.Modes.Osu/OsuScoreProcessor.cs
@@ -12,6 +12,7 @@ public OsuScoreProcessor(int hitObjectCount)
: base(hitObjectCount)
{
Health.Value = 1;
+ Accuracy.Value = 1;
}
protected override void UpdateCalculations(JudgementInfo judgement)
diff --git a/osu.Game.Modes.Vitaru/Objects/Character.cs b/osu.Game.Modes.Vitaru/Objects/Character.cs
new file mode 100644
index 000000000000..c83af22158f0
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/Objects/Character.cs
@@ -0,0 +1,15 @@
+using osu.Framework.Graphics.Containers;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ class Character : Container
+ {
+
+
+ }
+}
diff --git a/osu.Game.Modes.Vitaru/Objects/VitaruHitObject.cs b/osu.Game.Modes.Vitaru/Objects/VitaruHitObject.cs
new file mode 100644
index 000000000000..b8bb74daff4d
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/Objects/VitaruHitObject.cs
@@ -0,0 +1,8 @@
+using osu.Game.Modes.Objects;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ public class VitaruHitObject : HitObject
+ {
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/OpenTK.dll.config b/osu.Game.Modes.Vitaru/OpenTK.dll.config
new file mode 100644
index 000000000000..e725f6d96af3
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/OpenTK.dll.config
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/osu.Game.Modes.Vitaru/Properties/AssemblyInfo.cs b/osu.Game.Modes.Vitaru/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000000..85ce8028e928
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/Properties/AssemblyInfo.cs
@@ -0,0 +1,39 @@
+//Copyright (c) 2007-2016 ppy Pty Ltd .
+//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("osu.Game.Modes.Vitaru")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("osu.Game.Modes.Vitaru")]
+[assembly: AssemblyCopyright("Copyright © 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("58f6c80c-1253-4a0e-a465-b8c85ebeadf3")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/osu.Game.Modes.Vitaru/UI/VitaruComboCounter.cs b/osu.Game.Modes.Vitaru/UI/VitaruComboCounter.cs
new file mode 100644
index 000000000000..44bf2b4e73fc
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/UI/VitaruComboCounter.cs
@@ -0,0 +1,14 @@
+//Copyright (c) 2007-2017 ppy Pty Ltd .
+//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+
+
+using osu.Framework.Graphics.Containers;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ public class VitaruComboCounter : Container
+ {
+
+ }
+}
diff --git a/osu.Game.Modes.Vitaru/UI/VitaruHitObjectConverter.cs b/osu.Game.Modes.Vitaru/UI/VitaruHitObjectConverter.cs
new file mode 100644
index 000000000000..c80e7f5364de
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/UI/VitaruHitObjectConverter.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using osu.Game.Beatmaps;
+using osu.Game.Modes.Objects;
+using osu.Game.Modes.Vitaru.UI;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ internal class VitaruHitObjectConverter : HitObjectConverter
+ {
+ public override List Convert(Beatmap beatmap)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/UI/VitaruJudgementInfo.cs b/osu.Game.Modes.Vitaru/UI/VitaruJudgementInfo.cs
new file mode 100644
index 000000000000..fcf8c13059a8
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/UI/VitaruJudgementInfo.cs
@@ -0,0 +1,13 @@
+using System;
+using osu.Game.Modes.Objects.Drawables;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ internal class VitaruJudgementInfo
+ {
+ public static explicit operator VitaruJudgementInfo(JudgementInfo v)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/UI/VitaruObjectRenderer.cs b/osu.Game.Modes.Vitaru/UI/VitaruObjectRenderer.cs
new file mode 100644
index 000000000000..4c86f905ed05
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/UI/VitaruObjectRenderer.cs
@@ -0,0 +1,27 @@
+//Copyright (c) 2007-2017 ppy Pty Ltd .
+//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System;
+using osu.Game.Modes.Objects;
+using osu.Game.Modes.Objects.Drawables;
+using osu.Game.Modes.Vitaru.UI;
+using osu.Game.Modes.Vitaru.UI;
+using osu.Game.Modes.UI;
+using System.Collections.Generic;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ /*public class VitaruObjectRenderer : HitRenderer
+ {
+ public List Character { get; internal set; }
+
+ protected override HitObjectConverter Converter => new VitaruHitObjectConverter();
+
+ protected override Playfield CreatePlayfield() => new VitaruPlayfield();
+
+ protected override DrawableHitObject GetVisualRepresentation(VitaruHitObject h)
+ {
+
+ }
+ }*/
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/UI/VitaruPlayfield.cs b/osu.Game.Modes.Vitaru/UI/VitaruPlayfield.cs
new file mode 100644
index 000000000000..2f3af73523f4
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/UI/VitaruPlayfield.cs
@@ -0,0 +1,78 @@
+//Copyright (c) 2007-2017 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.Game.Modes.Objects.Drawables;
+using osu.Game.Modes.Vitaru.UI;
+using osu.Game.Modes.UI;
+using System;
+
+namespace osu.Game.Modes.Vitaru.UI
+{
+ public class VitaruPlayfield
+ {/*
+ private Container PlayArea;
+ private Container EnemyArea;
+ private Container JudgementLayer;
+
+ public override Vector2 Size
+ {
+ get
+ {
+ var parentSize = Parent.DrawSize;
+ var aspectSize = parentSize.X * 0.75f < parentSize.Y ? new Vector2(parentSize.X, parentSize.X * 0.75f) : new Vector2(parentSize.Y * 4f / 3f, parentSize.Y);
+
+ return new Vector2(aspectSize.X / parentSize.X, aspectSize.Y / parentSize.Y) * base.Size;
+ }
+ }
+
+ public VitaruPlayfield()
+ {
+ Anchor = Anchor.Centre;
+ Origin = Anchor.Centre;
+ RelativeSizeAxes = Axes.Both;
+ Size = new Vector2(0.75f);
+
+ Add(new Drawable[]
+ {
+ PlayArea = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Depth = 1,
+ },
+ EnemyArea = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Depth = 1,
+ },
+ JudgementLayer = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Depth = 1
+ }
+ });
+ }
+
+ public override void Add(DrawableHitObject h)
+ {
+ h.Depth = (float)h.HitObject.StartTime;
+ DrawableEnemy c = h as DrawableEnemy;
+
+
+ h.OnJudgement += judgement;
+
+ base.Add(h);
+ }
+
+ private void judgement(DrawableHitObject arg1, JudgementInfo arg2)
+ {
+ throw new NotImplementedException();
+ }*/
+
+ /*private void judgement(DrawableHitObject h, JudgementInfo j)
+ {
+ DeathSprite explosion = new DeathSprite((VitaruJudgementInfo)j, (VitaruHitObject)h.HitObject);
+ }*/
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/VitaruHitRenderer.cs b/osu.Game.Modes.Vitaru/VitaruHitRenderer.cs
new file mode 100644
index 000000000000..9ad841933652
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/VitaruHitRenderer.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+using osu.Game.Modes.Objects;
+using osu.Game.Modes.UI;
+
+namespace osu.Game.Modes.Vitaru
+{
+ internal class VitaruHitRenderer : HitRenderer
+ {
+ public List Enemy { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/VitaruObjectParser.cs b/osu.Game.Modes.Vitaru/VitaruObjectParser.cs
new file mode 100644
index 000000000000..510755092974
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/VitaruObjectParser.cs
@@ -0,0 +1,13 @@
+using System;
+using osu.Game.Modes.Objects;
+
+namespace osu.Game.Modes.Vitaru
+{
+ internal class VitaruObjectParser : HitObjectParser
+ {
+ public override HitObject Parse(string text)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/VitaruRuleset.cs b/osu.Game.Modes.Vitaru/VitaruRuleset.cs
new file mode 100644
index 000000000000..6bfae4f6f352
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/VitaruRuleset.cs
@@ -0,0 +1,47 @@
+//Copyright (c) 2007-2017 ppy Pty Ltd .
+//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System.Collections.Generic;
+using osu.Game.Modes.Objects;
+using osu.Game.Modes.UI;
+using osu.Game.Modes.Vitaru.UI;
+using System;
+using osu.Game.Modes.Vitaru.UI;
+using osu.Game.Graphics;
+using osu.Game.Beatmaps;
+
+namespace osu.Game.Modes.Vitaru
+{
+ public class VitaruRuleset : Ruleset
+ {
+ public override ScoreOverlay CreateScoreOverlay() => new VitaruScoreOverlay();
+
+ public override HitObjectParser CreateHitObjectParser() => new VitaruObjectParser();
+
+ public ScoreProcessor CreateScoreProcessor() => new VitaruScoreProcessor();
+
+ public override ScoreProcessor CreateScoreProcessor(int hitObjectCount)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override HitRenderer CreateHitRendererWith(Beatmap beatmap)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IEnumerable GetModsFor(ModType type)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override FontAwesome Icon => FontAwesome.fa_osu_vitaru_o;
+
+ protected override PlayMode PlayMode => PlayMode.Vitaru;
+ }
+}
diff --git a/osu.Game.Modes.Vitaru/VitaruScoreOverlay.cs b/osu.Game.Modes.Vitaru/VitaruScoreOverlay.cs
new file mode 100644
index 000000000000..f20f921874a9
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/VitaruScoreOverlay.cs
@@ -0,0 +1,30 @@
+using System;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Modes.UI;
+using osu.Game.Screens.Play;
+
+namespace osu.Game.Modes.Vitaru
+{
+ internal class VitaruScoreOverlay : ScoreOverlay
+ {
+ protected override PercentageCounter CreateAccuracyCounter()
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override ComboCounter CreateComboCounter()
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override KeyCounterCollection CreateKeyCounter()
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override ScoreCounter CreateScoreCounter()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/VitaruScoreProcessor.cs b/osu.Game.Modes.Vitaru/VitaruScoreProcessor.cs
new file mode 100644
index 000000000000..507aa5f56e42
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/VitaruScoreProcessor.cs
@@ -0,0 +1,13 @@
+using System;
+using osu.Game.Modes.Objects.Drawables;
+
+namespace osu.Game.Modes.Vitaru
+{
+ internal class VitaruScoreProcessor : ScoreProcessor
+ {
+ protected override void UpdateCalculations(JudgementInfo newJudgement)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/osu.Game.Modes.Vitaru.csproj b/osu.Game.Modes.Vitaru/osu.Game.Modes.Vitaru.csproj
new file mode 100644
index 000000000000..6c33e15a7564
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/osu.Game.Modes.Vitaru.csproj
@@ -0,0 +1,92 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {9A615027-B2AB-435E-B865-0C7209933457}
+ Library
+ Properties
+ osu.Game.Modes.Vitaru
+ osu.Game.Modes.Vitaru
+ v4.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\ppy.OpenTK.2.0.50727.1339\lib\net45\OpenTK.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ osu.licenseheader
+
+
+
+
+
+
+ {C76BF5B3-985E-4D39-95FE-97C9C879B83A}
+ osu.Framework
+
+
+ {d9a367c9-4c1a-489f-9b05-a0cea2b53b58}
+ osu.Game.Resources
+
+
+ {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}
+ osu.Game
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osu.Game.Modes.Vitaru/packages.config b/osu.Game.Modes.Vitaru/packages.config
new file mode 100644
index 000000000000..c76124f7dacf
--- /dev/null
+++ b/osu.Game.Modes.Vitaru/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs
index 1db339a5b6ca..f110fc37ac5b 100644
--- a/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs
+++ b/osu.Game/Beatmaps/Drawables/BeatmapPanel.cs
@@ -86,7 +86,7 @@ public BeatmapPanel(BeatmapInfo beatmap)
new FillFlowContainer
{
Padding = new MarginPadding(5),
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
@@ -95,19 +95,17 @@ public BeatmapPanel(BeatmapInfo beatmap)
new DifficultyIcon(beatmap)
{
Scale = new Vector2(1.8f),
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.CentreLeft,
},
new FillFlowContainer
{
Padding = new MarginPadding { Left = 5 },
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
new FillFlowContainer
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(4, 0),
AutoSizeAxes = Axes.Both,
Children = new[]
diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
index 0a1fc5f33180..bbdc22e30d76 100644
--- a/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
+++ b/osu.Game/Beatmaps/Drawables/BeatmapSetHeader.cs
@@ -38,7 +38,7 @@ public BeatmapSetHeader(WorkingBeatmap beatmap)
},
new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Padding = new MarginPadding { Top = 5, Left = 18, Right = 10, Bottom = 10 },
AutoSizeAxes = Axes.Both,
Children = new[]
@@ -111,7 +111,7 @@ public PanelBackground(WorkingBeatmap working)
new FillFlowContainer
{
Depth = -1,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
RelativeSizeAxes = Axes.Both,
// This makes the gradient not be perfectly horizontal, but diagonal at a ~40° angle
Shear = new Vector2(0.8f, 0),
diff --git a/osu.Game/Beatmaps/Drawables/Panel.cs b/osu.Game/Beatmaps/Drawables/Panel.cs
index 891e86164cfa..7a37f9cd7f94 100644
--- a/osu.Game/Beatmaps/Drawables/Panel.cs
+++ b/osu.Game/Beatmaps/Drawables/Panel.cs
@@ -18,10 +18,6 @@ class Panel : Container, IStateful
public override bool RemoveWhenNotAlive => false;
- public bool IsOnScreen;
-
- public override bool IsAlive => IsOnScreen && base.IsAlive;
-
private Container nestedContainer;
protected override Container Content => nestedContainer;
diff --git a/osu.Game/Graphics/TextAwesome.cs b/osu.Game/Graphics/TextAwesome.cs
index 13d3cbc8c380..91010e65c11f 100644
--- a/osu.Game/Graphics/TextAwesome.cs
+++ b/osu.Game/Graphics/TextAwesome.cs
@@ -827,6 +827,7 @@ public enum FontAwesome
fa_osu_mania_o = 0xe001,
fa_osu_fruits_o = 0xe002,
fa_osu_taiko_o = 0xe003,
+ fa_osu_vitaru_o = 0xe04b,
// gamemode icons without circles
fa_osu_filled_circle = 0xe004,
diff --git a/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs b/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs
index d65429927990..9b30418c6a40 100644
--- a/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs
+++ b/osu.Game/Graphics/UserInterface/OsuDropDownMenuItem.cs
@@ -21,7 +21,7 @@ public OsuDropDownMenuItem(string text, U value) : base(text, value)
{
new FillFlowContainer
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Children = new Drawable[]
diff --git a/osu.Game/Graphics/UserInterface/PercentageCounter.cs b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
index ee4066b33655..1b29fcc88ffc 100644
--- a/osu.Game/Graphics/UserInterface/PercentageCounter.cs
+++ b/osu.Game/Graphics/UserInterface/PercentageCounter.cs
@@ -26,7 +26,7 @@ public void SetFraction(float numerator, float denominator)
public PercentageCounter()
{
DisplayedCountSpriteText.FixedWidth = true;
- Count = 1.0f;
+ Count = DisplayedCount = 1.0f;
}
protected override string FormatCount(float count)
diff --git a/osu.Game/Graphics/UserInterface/StarCounter.cs b/osu.Game/Graphics/UserInterface/StarCounter.cs
index 10ffcffa7f03..d603493d38df 100644
--- a/osu.Game/Graphics/UserInterface/StarCounter.cs
+++ b/osu.Game/Graphics/UserInterface/StarCounter.cs
@@ -71,7 +71,7 @@ public StarCounter(int starCount = 10)
stars = new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(star_spacing),
}
};
diff --git a/osu.Game/Modes/PlayMode.cs b/osu.Game/Modes/PlayMode.cs
index 8d1e5158b035..4ecbce905d83 100644
--- a/osu.Game/Modes/PlayMode.cs
+++ b/osu.Game/Modes/PlayMode.cs
@@ -14,6 +14,8 @@ public enum PlayMode
[Description(@"osu!catch")]
Catch = 2,
[Description(@"osu!mania")]
- Mania = 3
+ Mania = 3,
+ [Description(@"osu!vitaru")]
+ Vitaru = 4
}
}
diff --git a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs b/osu.Game/Online/Chat/Drawables/DrawableChannel.cs
index b8eb1e466a13..f5fac3d4c527 100644
--- a/osu.Game/Online/Chat/Drawables/DrawableChannel.cs
+++ b/osu.Game/Online/Chat/Drawables/DrawableChannel.cs
@@ -41,7 +41,7 @@ public DrawableChannel(Channel channel)
{
flow = new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Padding = new MarginPadding { Left = 20, Right = 20 }
diff --git a/osu.Game/Overlays/Dialog/PopupDialog.cs b/osu.Game/Overlays/Dialog/PopupDialog.cs
index e307b44bb1d9..0e92b4d0aff5 100644
--- a/osu.Game/Overlays/Dialog/PopupDialog.cs
+++ b/osu.Game/Overlays/Dialog/PopupDialog.cs
@@ -173,7 +173,7 @@ public PopupDialog()
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Position = new Vector2(0f, -50f),
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0f, 10f),
Children = new Drawable[]
{
@@ -236,7 +236,7 @@ public PopupDialog()
Origin = Anchor.TopCentre,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
},
},
},
diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs
index 811e9606fe27..3cec80465334 100644
--- a/osu.Game/Overlays/Mods/ModButton.cs
+++ b/osu.Game/Overlays/Mods/ModButton.cs
@@ -236,7 +236,7 @@ private void createIcons()
public ModButton(Mod m)
{
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
Spacing = new Vector2(0f, -5f);
Size = new Vector2(100f);
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 0a5d0e49e1d4..3e212a13900e 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -33,7 +33,7 @@ public class ModSelectOverlay : WaveOverlayContainer
private FillFlowContainer modSectionsContainer;
- public Bindable SelectedMods = new Bindable();
+ public readonly Bindable SelectedMods = new Bindable();
public readonly Bindable PlayMode = new Bindable();
@@ -95,8 +95,6 @@ protected override void PopOut()
section.ButtonsContainer.MoveToX(100f, APPEAR_DURATION, EasingTypes.InSine);
section.ButtonsContainer.FadeOut(APPEAR_DURATION, EasingTypes.InSine);
}
-
- TriggerFocusLost();
}
protected override void PopIn()
@@ -112,8 +110,6 @@ protected override void PopIn()
section.ButtonsContainer.MoveToX(0, button_duration, EasingTypes.OutQuint);
section.ButtonsContainer.FadeIn(button_duration, EasingTypes.OutQuint);
}
-
- Schedule(TriggerFocusContention);
}
public void DeselectAll()
@@ -244,7 +240,7 @@ public ModSelectOverlay()
AutoSizeAxes = Axes.Y,
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0f, 10f),
Children = new Drawable[]
{
@@ -268,7 +264,7 @@ public ModSelectOverlay()
Anchor = Anchor.TopCentre,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Width = content_width,
Padding = new MarginPadding
{
@@ -336,7 +332,7 @@ public ModSelectOverlay()
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
Width = content_width,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Padding = new MarginPadding
{
Top = 20,
diff --git a/osu.Game/Overlays/NotificationManager.cs b/osu.Game/Overlays/NotificationManager.cs
index 5c666da8aee8..2c499e108432 100644
--- a/osu.Game/Overlays/NotificationManager.cs
+++ b/osu.Game/Overlays/NotificationManager.cs
@@ -46,7 +46,7 @@ private void load()
{
sections = new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
Children = new []
diff --git a/osu.Game/Overlays/Notifications/NotificationSection.cs b/osu.Game/Overlays/Notifications/NotificationSection.cs
index 91c89d41be56..8366c83527a8 100644
--- a/osu.Game/Overlays/Notifications/NotificationSection.cs
+++ b/osu.Game/Overlays/Notifications/NotificationSection.cs
@@ -60,7 +60,7 @@ private void load(OsuColour colours)
{
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
Padding = new MarginPadding
{
diff --git a/osu.Game/Overlays/Options/OptionDropDown.cs b/osu.Game/Overlays/Options/OptionDropDown.cs
index 7e2cab2a6135..41e59e63a6c6 100644
--- a/osu.Game/Overlays/Options/OptionDropDown.cs
+++ b/osu.Game/Overlays/Options/OptionDropDown.cs
@@ -89,7 +89,7 @@ public OptionDropDown()
{
Items = new KeyValuePair[0];
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
Children = new Drawable[]
diff --git a/osu.Game/Overlays/Options/OptionsSection.cs b/osu.Game/Overlays/Options/OptionsSection.cs
index f87e69e30763..fc61128a0d64 100644
--- a/osu.Game/Overlays/Options/OptionsSection.cs
+++ b/osu.Game/Overlays/Options/OptionsSection.cs
@@ -61,7 +61,7 @@ public OptionsSection()
FlowContent = new FillFlowContainer
{
Margin = new MarginPadding { Top = header_size + header_margin },
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 30),
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
diff --git a/osu.Game/Overlays/Options/OptionsSubsection.cs b/osu.Game/Overlays/Options/OptionsSubsection.cs
index ef10e15abf01..7d501ad68c1a 100644
--- a/osu.Game/Overlays/Options/OptionsSubsection.cs
+++ b/osu.Game/Overlays/Options/OptionsSubsection.cs
@@ -20,7 +20,7 @@ public OptionsSubsection()
{
RelativeSizeAxes = Axes.X;
AutoSizeAxes = Axes.Y;
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
AddInternal(new Drawable[]
{
new OsuSpriteText
@@ -31,7 +31,7 @@ public OptionsSubsection()
},
content = new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5),
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
diff --git a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs b/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs
index db799ccae2a9..45f7ac3d3eba 100644
--- a/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs
+++ b/osu.Game/Overlays/Options/Sections/General/LoginOptions.cs
@@ -100,7 +100,7 @@ private void performLogin()
private void load(APIAccess api, OsuConfigManager config)
{
this.api = api;
- Direction = FillDirection.Down;
+ Direction = FillDirection.Vertical;
Spacing = new Vector2(0, 5);
AutoSizeAxes = Axes.Y;
RelativeSizeAxes = Axes.X;
diff --git a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs b/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs
index 5393c42843c8..6aa9b66f5c18 100644
--- a/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs
+++ b/osu.Game/Overlays/Options/Sections/MaintenanceSection.cs
@@ -39,12 +39,20 @@ public MaintenanceSection()
RelativeSizeAxes = Axes.X,
Text = "Run osu! updater",
},
- new OptionLabel
+ new Container
{
- Text = "TODO: osu version here",
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- },
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Children = new[]
+ {
+ new OptionLabel
+ {
+ Text = "osu!lazer",
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ },
+ }
+ }
};
}
}
diff --git a/osu.Game/Overlays/Options/Sidebar.cs b/osu.Game/Overlays/Options/Sidebar.cs
index 5a1128749c77..b0618ed3a6be 100644
--- a/osu.Game/Overlays/Options/Sidebar.cs
+++ b/osu.Game/Overlays/Options/Sidebar.cs
@@ -40,7 +40,7 @@ public Sidebar()
Anchor = Anchor.CentreLeft,
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
}
}
},
diff --git a/osu.Game/Overlays/OptionsOverlay.cs b/osu.Game/Overlays/OptionsOverlay.cs
index 968914c6c089..89a2d029f6ba 100644
--- a/osu.Game/Overlays/OptionsOverlay.cs
+++ b/osu.Game/Overlays/OptionsOverlay.cs
@@ -77,7 +77,7 @@ private void load(OsuGame game, OsuColour colours)
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
@@ -98,7 +98,7 @@ private void load(OsuGame game, OsuColour colours)
{
AutoSizeAxes = Axes.Y,
RelativeSizeAxes = Axes.X,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = sections,
}
}
diff --git a/osu.Game/Overlays/Toolbar/Toolbar.cs b/osu.Game/Overlays/Toolbar/Toolbar.cs
index 948b9c96fcb6..59b738367915 100644
--- a/osu.Game/Overlays/Toolbar/Toolbar.cs
+++ b/osu.Game/Overlays/Toolbar/Toolbar.cs
@@ -43,7 +43,7 @@ public Toolbar()
new ToolbarBackground(),
new FillFlowContainer
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
Children = new Drawable[]
@@ -66,7 +66,7 @@ public Toolbar()
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
Children = new Drawable[]
diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
index 0e8165283e04..ac80a9f40594 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs
@@ -84,7 +84,7 @@ public ToolbarButton()
},
Flow = new FillFlowContainer
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(5),
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
@@ -107,7 +107,7 @@ public ToolbarButton()
},
tooltipContainer = new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
RelativeSizeAxes = Axes.Both, //stops us being considered in parent's autosize
Anchor = (TooltipAnchor & Anchor.x0) > 0 ? Anchor.BottomLeft : Anchor.BottomRight,
Origin = TooltipAnchor,
diff --git a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
index 31b8500155dd..b2086b1c2d69 100644
--- a/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
+++ b/osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
@@ -36,7 +36,7 @@ public ToolbarModeSelector()
{
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Padding = new MarginPadding { Left = padding, Right = padding },
diff --git a/osu.Game/Overlays/WaveOverlayContainer.cs b/osu.Game/Overlays/WaveOverlayContainer.cs
index 37a939005bc4..139cbd4581db 100644
--- a/osu.Game/Overlays/WaveOverlayContainer.cs
+++ b/osu.Game/Overlays/WaveOverlayContainer.cs
@@ -9,6 +9,8 @@
using osu.Framework.Graphics.Sprites;
using OpenTK;
using osu.Framework.Graphics.Transforms;
+using osu.Framework.Graphics.Primitives;
+using System;
namespace osu.Game.Overlays
{
@@ -86,9 +88,10 @@ protected WaveOverlayContainer()
AddInternal(wavesContainer = new Container
{
- RelativeSizeAxes = Axes.Both,
+ RelativeSizeAxes = Axes.X,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
+ Masking = true,
Children = new[]
{
firstWave = new Wave
@@ -123,19 +126,13 @@ protected WaveOverlayContainer()
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.BottomCentre,
Origin = Anchor.BottomCentre,
- Children = new Drawable[]
- {
- new Box
- {
- RelativeSizeAxes = Axes.Both,
- Colour = Color4.White.Opacity(50),
- },
- },
});
}
protected override void PopIn()
{
+ base.PopIn();
+
foreach (var w in wavesContainer.Children)
w.State = Visibility.Visible;
@@ -145,6 +142,8 @@ protected override void PopIn()
protected override void PopOut()
{
+ base.PopOut();
+
contentContainer.FadeOut(DISAPPEAR_DURATION, EasingTypes.In);
contentContainer.MoveToY(DrawHeight * 2f, DISAPPEAR_DURATION, EasingTypes.In);
@@ -152,14 +151,23 @@ protected override void PopOut()
w.State = Visibility.Hidden;
}
+ protected override void UpdateAfterChildren()
+ {
+ base.UpdateAfterChildren();
+
+ // This is done as an optimization, such that invisible parts of the waves
+ // are masked away, and thus do not consume fill rate.
+ wavesContainer.Height = Math.Max(0, DrawHeight - (contentContainer.DrawHeight - contentContainer.Y));
+ }
+
private class Wave : Container, IStateful
{
public float FinalPosition;
public Wave()
{
- RelativeSizeAxes = Axes.Both;
- Size = new Vector2(1.5f);
+ RelativeSizeAxes = Axes.X;
+ Width = 1.5f;
Masking = true;
EdgeEffect = new EdgeEffect
{
@@ -177,6 +185,15 @@ public Wave()
};
}
+ protected override void Update()
+ {
+ base.Update();
+
+ // We can not use RelativeSizeAxes for Height, because the height
+ // of our parent diminishes as the content moves up.
+ Height = Parent.Parent.DrawSize.Y * 1.5f;
+ }
+
private Visibility state;
public Visibility State
{
@@ -188,7 +205,7 @@ public Visibility State
switch (value)
{
case Visibility.Hidden:
- MoveToY(DrawHeight / Height, DISAPPEAR_DURATION, easing_hide);
+ MoveToY(Parent.Parent.DrawSize.Y, DISAPPEAR_DURATION, easing_hide);
break;
case Visibility.Visible:
MoveToY(FinalPosition, APPEAR_DURATION, easing_show);
diff --git a/osu.Game/Screens/GameScreenWhiteBox.cs b/osu.Game/Screens/GameScreenWhiteBox.cs
index 623b411e351b..ec5ae137131c 100644
--- a/osu.Game/Screens/GameScreenWhiteBox.cs
+++ b/osu.Game/Screens/GameScreenWhiteBox.cs
@@ -126,7 +126,7 @@ public ScreenWhiteBox()
},
childModeButtons = new FillFlowContainer
{
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
RelativeSizeAxes = Axes.Both,
diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs
index f26fded19d1b..b29898c2a43a 100644
--- a/osu.Game/Screens/Menu/ButtonSystem.cs
+++ b/osu.Game/Screens/Menu/ButtonSystem.cs
@@ -78,7 +78,7 @@ public ButtonSystem()
},
buttonFlow = new FlowContainerWithOrigin
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(-WEDGE_WIDTH, 0),
Anchor = Anchor.Centre,
AutoSizeAxes = Axes.Both,
diff --git a/osu.Game/Screens/Menu/Disclaimer.cs b/osu.Game/Screens/Menu/Disclaimer.cs
index deb9a4dbf8d4..493d9d9b0996 100644
--- a/osu.Game/Screens/Menu/Disclaimer.cs
+++ b/osu.Game/Screens/Menu/Disclaimer.cs
@@ -32,7 +32,7 @@ public Disclaimer()
AutoSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 2),
Children = new Drawable[]
{
diff --git a/osu.Game/Screens/Play/KeyCounterCollection.cs b/osu.Game/Screens/Play/KeyCounterCollection.cs
index 0a93032a20cb..7e0519d972ff 100644
--- a/osu.Game/Screens/Play/KeyCounterCollection.cs
+++ b/osu.Game/Screens/Play/KeyCounterCollection.cs
@@ -12,7 +12,7 @@ public class KeyCounterCollection : FillFlowContainer
{
public KeyCounterCollection()
{
- Direction = FillDirection.Right;
+ Direction = FillDirection.Horizontal;
AutoSizeAxes = Axes.Both;
}
diff --git a/osu.Game/Screens/Play/PauseOverlay.cs b/osu.Game/Screens/Play/PauseOverlay.cs
index 8004f967ad79..056158167033 100644
--- a/osu.Game/Screens/Play/PauseOverlay.cs
+++ b/osu.Game/Screens/Play/PauseOverlay.cs
@@ -105,7 +105,7 @@ private void load(OsuColour colours)
{
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 50),
Origin = Anchor.Centre,
Anchor = Anchor.Centre,
@@ -113,11 +113,12 @@ private void load(OsuColour colours)
{
new FillFlowContainer
{
- AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Down,
- Spacing = new Vector2(0, 20),
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 20),
Children = new Drawable[]
{
new OsuSpriteText
@@ -144,6 +145,8 @@ private void load(OsuColour colours)
},
new FillFlowContainer
{
+ Origin = Anchor.TopCentre,
+ Anchor = Anchor.TopCentre,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
Masking = true,
@@ -188,9 +191,9 @@ private void load(OsuColour colours)
},
retryCounterContainer = new FillFlowContainer
{
- AutoSizeAxes = Axes.Both,
Origin = Anchor.TopCentre,
- Anchor = Anchor.TopCentre
+ Anchor = Anchor.TopCentre,
+ AutoSizeAxes = Axes.Both,
}
}
},
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index bc04dbb2f746..77f2e74c9c1c 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -136,7 +136,7 @@ public BeatmapMetadataDisplay(WorkingBeatmap beatmap)
AutoSizeAxes = Axes.Both,
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
new OsuSpriteText
diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs
index 1c8972e4bedd..5cccfe4aa0af 100644
--- a/osu.Game/Screens/Ranking/Results.cs
+++ b/osu.Game/Screens/Ranking/Results.cs
@@ -68,7 +68,7 @@ public ScoreDisplay(Score s)
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
new OsuSpriteText
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index a3493971cb0e..e0374884c9e2 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -125,7 +125,7 @@ public void UpdateBeatmap(WorkingBeatmap beatmap)
{
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Margin = new MarginPadding { Top = 10, Left = 25, Right = 10, Bottom = 20 },
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
@@ -147,7 +147,7 @@ public void UpdateBeatmap(WorkingBeatmap beatmap)
new FillFlowContainer
{
Margin = new MarginPadding { Top = 10 },
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
Children = new []
{
diff --git a/osu.Game/Screens/Select/CarouselContainer.cs b/osu.Game/Screens/Select/CarouselContainer.cs
index 5d8c11d22357..eee51443a733 100644
--- a/osu.Game/Screens/Select/CarouselContainer.cs
+++ b/osu.Game/Screens/Select/CarouselContainer.cs
@@ -16,6 +16,7 @@
using OpenTK.Input;
using System.Collections;
using osu.Framework.MathUtils;
+using System.Diagnostics;
namespace osu.Game.Screens.Select
{
@@ -23,73 +24,33 @@ class CarouselContainer : ScrollContainer, IEnumerable
{
private Container scrollableContent;
private List groups = new List();
+ private List panels = new List();
public BeatmapGroup SelectedGroup { get; private set; }
public BeatmapPanel SelectedPanel { get; private set; }
private List yPositions = new List();
- private CarouselLifetimeList lifetime;
public CarouselContainer()
{
DistanceDecayJump = 0.01;
- Add(scrollableContent = new Container(lifetime = new CarouselLifetimeList(DepthComparer))
+ Add(scrollableContent = new Container
{
RelativeSizeAxes = Axes.X,
});
}
- internal class CarouselLifetimeList : LifetimeList
- {
- public CarouselLifetimeList(IComparer comparer)
- : base(comparer)
- {
- }
-
- public int StartIndex;
- public int EndIndex;
-
- public override bool Update(FrameTimeInfo time)
- {
- bool anyAliveChanged = false;
-
- //check existing items to make sure they haven't died.
- foreach (var item in AliveItems.ToArray())
- {
- item.UpdateTime(time);
- if (!item.IsAlive)
- {
- //todo: make this more efficient
- int i = IndexOf(item);
- anyAliveChanged |= CheckItem(item, ref i);
- }
- }
-
- //handle custom range
- for (int i = StartIndex; i < EndIndex; i++)
- {
- var item = this[i];
- item.UpdateTime(time);
- anyAliveChanged |= CheckItem(item, ref i);
- }
-
- return anyAliveChanged;
- }
- }
-
public void AddGroup(BeatmapGroup group)
{
- group.State = BeatmapGroupState.Collapsed;
groups.Add(group);
- group.Header.Depth = -scrollableContent.Children.Count();
- scrollableContent.Add(group.Header);
-
+ panels.Add(group.Header);
+ group.Header.UpdateClock(Clock);
foreach (BeatmapPanel panel in group.BeatmapPanels)
{
- panel.Depth = -scrollableContent.Children.Count();
- scrollableContent.Add(panel);
+ panels.Add(panel);
+ panel.UpdateClock(Clock);
}
computeYPositions();
@@ -98,6 +59,9 @@ public void AddGroup(BeatmapGroup group)
public void RemoveGroup(BeatmapGroup group)
{
groups.Remove(group);
+ foreach (var p in group.BeatmapPanels)
+ panels.Remove(p);
+
scrollableContent.Remove(group.Header);
scrollableContent.Remove(group.BeatmapPanels);
@@ -107,7 +71,7 @@ public void RemoveGroup(BeatmapGroup group)
private void movePanel(Panel panel, bool advance, bool animated, ref float currentY)
{
yPositions.Add(currentY);
- panel.MoveToY(currentY, animated && (panel.IsOnScreen || panel.State != PanelSelectedState.Hidden) ? 750 : 0, EasingTypes.OutExpo);
+ panel.MoveToY(currentY, animated ? 750 : 0, EasingTypes.OutExpo);
if (advance)
currentY += panel.DrawHeight + 5;
@@ -172,14 +136,16 @@ public void SelectBeatmap(BeatmapInfo beatmap, bool animated = true)
var panel = group.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(beatmap));
if (panel != null)
{
- SelectGroup(group, panel, animated);
+ selectGroup(group, panel, animated);
return;
}
}
}
- public void SelectGroup(BeatmapGroup group, BeatmapPanel panel, bool animated = true)
+ private void selectGroup(BeatmapGroup group, BeatmapPanel panel, bool animated = true)
{
+ Trace.Assert(group.BeatmapPanels.Contains(panel), @"Selected panel must be in provided group");
+
if (SelectedGroup != null && SelectedGroup != group && SelectedGroup.State != BeatmapGroupState.Hidden)
SelectedGroup.State = BeatmapGroupState.Collapsed;
@@ -194,19 +160,20 @@ public void SelectGroup(BeatmapGroup group, BeatmapPanel panel, bool animated =
public void Sort(FilterControl.SortMode mode)
{
+ List sortedGroups = new List(groups);
switch (mode)
{
case FilterControl.SortMode.Artist:
- groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Artist, y.BeatmapSet.Metadata.Artist));
+ sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Artist, y.BeatmapSet.Metadata.Artist));
break;
case FilterControl.SortMode.Title:
- groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Title, y.BeatmapSet.Metadata.Title));
+ sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Title, y.BeatmapSet.Metadata.Title));
break;
case FilterControl.SortMode.Author:
- groups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Author, y.BeatmapSet.Metadata.Author));
+ sortedGroups.Sort((x, y) => string.Compare(x.BeatmapSet.Metadata.Author, y.BeatmapSet.Metadata.Author));
break;
case FilterControl.SortMode.Difficulty:
- groups.Sort((x, y) =>
+ sortedGroups.Sort((x, y) =>
{
float xAverage = 0, yAverage = 0;
int counter = 0;
@@ -232,22 +199,23 @@ public void Sort(FilterControl.SortMode mode)
default:
throw new NotImplementedException();
}
- scrollableContent.Clear(false);
- lifetime.Clear();
- foreach (BeatmapGroup group in groups)
- {
- group.Header.Depth = -scrollableContent.Children.Count();
- scrollableContent.Add(group.Header);
- foreach (BeatmapPanel panel in group.BeatmapPanels)
- {
- panel.Depth = -scrollableContent.Children.Count();
- scrollableContent.Add(panel);
- }
- }
+ scrollableContent.Clear(false);
+ panels.Clear();
+ groups.Clear();
+ foreach (BeatmapGroup group in sortedGroups)
+ AddGroup(group);
}
+ ///
+ /// Computes the x-offset of currently visible panels. Makes the carousel appear round.
+ ///
+ ///
+ /// Vertical distance from the center of the carousel container
+ /// ranging from -1 to 1.
+ ///
+ /// Half the height of the carousel container.
private static float offsetX(float dist, float halfHeight)
{
// The radius of the circle the carousel moves on.
@@ -286,34 +254,46 @@ protected override void Update()
{
base.Update();
- // Determine which items stopped being on screen for future removal from the lifetimelist.
float drawHeight = DrawHeight;
- float halfHeight = drawHeight / 2;
- foreach (Panel p in lifetime.AliveItems)
+ // Remove all panels that should no longer be on-screen
+ scrollableContent.RemoveAll(delegate (Panel p)
{
float panelPosY = p.Position.Y;
- p.IsOnScreen = panelPosY >= Current - p.DrawHeight && panelPosY <= Current + drawHeight;
- updatePanel(p, halfHeight);
- }
+ bool remove = panelPosY < Current - p.DrawHeight || panelPosY > Current + drawHeight || !p.IsPresent;
+ return remove;
+ });
+
+ // Find index range of all panels that should be on-screen
+ Trace.Assert(panels.Count == yPositions.Count);
- // Determine range of indices for items that are now definitely on screen to be added
- // to the lifetimelist in the future.
int firstIndex = yPositions.BinarySearch(Current - Panel.MAX_HEIGHT);
if (firstIndex < 0) firstIndex = ~firstIndex;
int lastIndex = yPositions.BinarySearch(Current + drawHeight);
if (lastIndex < 0) lastIndex = ~lastIndex;
- lifetime.StartIndex = firstIndex;
- lifetime.EndIndex = lastIndex;
-
+ // Add those panels within the previously found index range that should be displayed.
for (int i = firstIndex; i < lastIndex; ++i)
{
- Panel p = lifetime[i];
- if (p.State != PanelSelectedState.Hidden)
- p.IsOnScreen = true; //we don't want to update the on-screen state of hidden pannels as they have incorrect (stacked) y values.
- updatePanel(p, halfHeight);
+ Panel panel = panels[i];
+ if (panel.State == PanelSelectedState.Hidden)
+ continue;
+
+ // Only add if we're not already part of the content.
+ if (!scrollableContent.Contains(panel))
+ {
+ // Makes sure headers are always _below_ panels,
+ // and depth flows downward.
+ panel.Depth = i + (panel is BeatmapSetHeader ? panels.Count : 0);
+ scrollableContent.Add(panel);
+ }
}
+
+ // Update externally controlled state of currently visible panels
+ // (e.g. x-offset and opacity).
+ float halfHeight = drawHeight / 2;
+ foreach (Panel p in scrollableContent.Children)
+ updatePanel(p, halfHeight);
}
protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)
@@ -355,7 +335,7 @@ public void SelectNext(int direction = 1, bool skipDifficulties = true)
if (i >= 0 && i < SelectedGroup.BeatmapPanels.Count)
{
//changing difficulty panel, not set.
- SelectGroup(SelectedGroup, SelectedGroup.BeatmapPanels[i]);
+ selectGroup(SelectedGroup, SelectedGroup.BeatmapPanels[i]);
return;
}
}
@@ -376,13 +356,16 @@ public void SelectNext(int direction = 1, bool skipDifficulties = true)
public void SelectRandom()
{
- if (groups.Count < 1)
+ List visibleGroups = this.groups.Where((BeatmapGroup selectGroup) => selectGroup.State != BeatmapGroupState.Hidden).ToList();
+ if (visibleGroups.Count < 1)
return;
- BeatmapGroup group = groups[RNG.Next(groups.Count)];
+ BeatmapGroup group = visibleGroups[RNG.Next(visibleGroups.Count)];
BeatmapPanel panel = group?.BeatmapPanels.First();
+
if (panel == null)
return;
- SelectGroup(group, panel);
+
+ selectGroup(group, panel);
}
public IEnumerator GetEnumerator() => groups.GetEnumerator();
diff --git a/osu.Game/Screens/Select/FilterControl.cs b/osu.Game/Screens/Select/FilterControl.cs
index fd7992ba163d..af47e7378825 100644
--- a/osu.Game/Screens/Select/FilterControl.cs
+++ b/osu.Game/Screens/Select/FilterControl.cs
@@ -55,7 +55,7 @@ public FilterControl()
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
Width = 0.4f, // TODO: InnerWidth property or something
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
searchTextBox = new SearchTextBox {
@@ -188,7 +188,7 @@ public GroupSortTabs()
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(10, 0),
Children = new Drawable[]
{
@@ -210,17 +210,16 @@ public GroupSortTabs()
groupsEllipsis = new TextAwesome
{
Icon = FontAwesome.fa_ellipsis_h,
+ Origin = Anchor.TopLeft,
TextSize = 14,
Margin = new MarginPadding { Top = 5, Bottom = 5 },
- Origin = Anchor.BottomLeft,
- Anchor = Anchor.BottomLeft,
}
}
},
new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(10, 0),
Origin = Anchor.TopRight,
Anchor = Anchor.TopRight,
@@ -241,10 +240,9 @@ public GroupSortTabs()
sortEllipsis = new TextAwesome
{
Icon = FontAwesome.fa_ellipsis_h,
+ Origin = Anchor.TopLeft,
TextSize = 14,
Margin = new MarginPadding { Top = 5, Bottom = 5 },
- Origin = Anchor.BottomLeft,
- Anchor = Anchor.BottomLeft,
}
}
},
diff --git a/osu.Game/Screens/Select/Footer.cs b/osu.Game/Screens/Select/Footer.cs
index 2b62e8d452db..48ce098cd792 100644
--- a/osu.Game/Screens/Select/Footer.cs
+++ b/osu.Game/Screens/Select/Footer.cs
@@ -98,13 +98,13 @@ public Footer()
Position = new Vector2(BackButton.SIZE_EXTENDED.X + padding, 0),
RelativeSizeAxes = Axes.Y,
AutoSizeAxes = Axes.X,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(padding, 0),
Children = new Drawable[]
{
buttons = new FillFlowContainer
{
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Spacing = new Vector2(0.2f, 0),
AutoSizeAxes = Axes.Both,
}
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
index 6e68b7917ba4..36f51ed92dfa 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsButton.cs
@@ -115,7 +115,7 @@ public BeatmapOptionsButton()
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Children = new Drawable[]
{
iconText = new TextAwesome
diff --git a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
index 47152dc1659d..d1a60d2a2b64 100644
--- a/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
+++ b/osu.Game/Screens/Select/Options/BeatmapOptionsOverlay.cs
@@ -132,7 +132,7 @@ class ButtonFlow : FillFlowContainer
public ButtonFlow()
{
- Direction = FillDirection.Right;
+ Direction = FillDirection.Horizontal;
}
}
}
diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs
index 68783f33dbb8..316cc50dae7b 100644
--- a/osu.Game/Screens/Select/PlaySongSelect.cs
+++ b/osu.Game/Screens/Select/PlaySongSelect.cs
@@ -396,6 +396,7 @@ private void addBeatmapSet(BeatmapSetInfo beatmapSet, Framework.Game game, bool
{
beatmapGroups.Add(group);
+ group.State = BeatmapGroupState.Collapsed;
carousel.AddGroup(group);
filterChanged(false, false);
@@ -403,11 +404,7 @@ private void addBeatmapSet(BeatmapSetInfo beatmapSet, Framework.Game game, bool
if (Beatmap == null || select)
carousel.SelectBeatmap(beatmapSet.Beatmaps.First());
else
- {
- var panel = group.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(Beatmap.BeatmapInfo));
- if (panel != null)
- carousel.SelectGroup(group, panel);
- }
+ carousel.SelectBeatmap(Beatmap.BeatmapInfo);
}));
}
diff --git a/osu.Game/Screens/Tournament/Drawings.cs b/osu.Game/Screens/Tournament/Drawings.cs
index 53ebe2606f34..f9155bbc2ac3 100644
--- a/osu.Game/Screens/Tournament/Drawings.cs
+++ b/osu.Game/Screens/Tournament/Drawings.cs
@@ -77,7 +77,7 @@ private void load(TextureStore textures, Storage storage)
new FillFlowContainer
{
RelativeSizeAxes = Axes.Both,
- Direction = FillDirection.Right,
+ Direction = FillDirection.Horizontal,
Children = new Drawable[]
{
@@ -173,7 +173,7 @@ private void load(TextureStore textures, Storage storage)
Position = new Vector2(0, 35f),
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5f),
Children = new Drawable[]
@@ -212,7 +212,7 @@ private void load(TextureStore textures, Storage storage)
Position = new Vector2(0, -5f),
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5f),
Children = new Drawable[]
@@ -294,6 +294,9 @@ private void reset(bool loadLastResults = false)
reloadTeams();
+ if (!storage.Exists(results_filename))
+ return;
+
if (loadLastResults)
{
try
diff --git a/osu.Game/Screens/Tournament/Group.cs b/osu.Game/Screens/Tournament/Group.cs
index c3a911a79101..44af4c81825d 100644
--- a/osu.Game/Screens/Tournament/Group.cs
+++ b/osu.Game/Screens/Tournament/Group.cs
@@ -144,7 +144,7 @@ public GroupTeam(Team team)
RelativeSizeAxes = Axes.X,
AutoSizeAxes = Axes.Y,
- Direction = FillDirection.Down,
+ Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5f),
Children = new Drawable[]
diff --git a/osu.sln b/osu.sln
index bda60c631831..144c6c86594c 100644
--- a/osu.sln
+++ b/osu.sln
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop", "osu.Desktop\osu.Desktop.csproj", "{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}"
EndProject
@@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop.Deploy", "osu.D
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{6EAD7610-89D8-48A2-8BE0-E348297E4D8B}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Modes.Vitaru", "osu.Game.Modes.Vitaru\osu.Game.Modes.Vitaru.csproj", "{9A615027-B2AB-435E-B865-0C7209933457}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -91,6 +93,10 @@ Global
{230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Release|Any CPU.Build.0 = Release|Any CPU
{BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A615027-B2AB-435E-B865-0C7209933457}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A615027-B2AB-435E-B865-0C7209933457}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A615027-B2AB-435E-B865-0C7209933457}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A615027-B2AB-435E-B865-0C7209933457}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -109,6 +115,7 @@ Global
{48F4582B-7687-4621-9CBE-5C24197CB536} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
{230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
{BAEA2F74-0315-4667-84E0-ACAC0B4BF785} = {6EAD7610-89D8-48A2-8BE0-E348297E4D8B}
+ {9A615027-B2AB-435E-B865-0C7209933457} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0