diff --git a/osu-framework b/osu-framework
index 3f4545aae8..ba5bd2ecc0 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 3f4545aae82650dc87cac7dd5df64e6e47918da1
+Subproject commit ba5bd2ecc0541b23eaa478b4712d3bc7af7eae11
diff --git a/osu.Desktop.Deploy/osu.Desktop.Deploy.csproj b/osu.Desktop.Deploy/osu.Desktop.Deploy.csproj
index a66c9c8993..6727a86a91 100644
--- a/osu.Desktop.Deploy/osu.Desktop.Deploy.csproj
+++ b/osu.Desktop.Deploy/osu.Desktop.Deploy.csproj
@@ -111,10 +111,6 @@
-
- {65dc628f-a640-4111-ab35-3a5652bc1e17}
- osu.Framework.Desktop
-
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}
osu.Framework
diff --git a/osu.Desktop.Tests/Platform/TestStorage.cs b/osu.Desktop.Tests/Platform/TestStorage.cs
index 39e4d8049f..d28b5d5c48 100644
--- a/osu.Desktop.Tests/Platform/TestStorage.cs
+++ b/osu.Desktop.Tests/Platform/TestStorage.cs
@@ -2,7 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Framework;
-using osu.Framework.Desktop.Platform;
+using osu.Framework.Platform;
using SQLite.Net;
using SQLite.Net.Interop;
using SQLite.Net.Platform.Generic;
diff --git a/osu.Desktop.Tests/Visual/OsuTestCase.cs b/osu.Desktop.Tests/Visual/OsuTestCase.cs
index 1b48ded4e2..a1366867a2 100644
--- a/osu.Desktop.Tests/Visual/OsuTestCase.cs
+++ b/osu.Desktop.Tests/Visual/OsuTestCase.cs
@@ -1,7 +1,7 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.Desktop.Platform;
+using osu.Framework.Platform;
using osu.Framework.Testing;
using osu.Game;
diff --git a/osu.Desktop.Tests/osu.Desktop.Tests.csproj b/osu.Desktop.Tests/osu.Desktop.Tests.csproj
index f894b25f06..3e8e656b94 100644
--- a/osu.Desktop.Tests/osu.Desktop.Tests.csproj
+++ b/osu.Desktop.Tests/osu.Desktop.Tests.csproj
@@ -5,7 +5,7 @@
Debug
AnyCPU
{230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}
- Library
+ WinExe
Properties
osu.Desktop.Tests
osu.Desktop.Tests
@@ -32,6 +32,9 @@
4
false
+
+
+
@@ -116,14 +119,6 @@
-
- {65DC628F-A640-4111-AB35-3A5652BC1E17}
- osu.Framework.Desktop
-
-
- {007b2356-ab6f-4bd9-96d5-116fc2dce69a}
- osu.Framework.Testing
-
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}
osu.Framework
@@ -149,7 +144,7 @@
osu.Game.Rulesets.Taiko
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}
+ {2a66dd92-adb1-4994-89e2-c94e04acda0d}
osu.Game
diff --git a/osu.Desktop/OpenTK.dll.config b/osu.Desktop/OpenTK.dll.config
deleted file mode 100644
index 5620e3d9e2..0000000000
--- a/osu.Desktop/OpenTK.dll.config
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/osu.Desktop/Properties/AssemblyInfo.cs b/osu.Desktop/Properties/AssemblyInfo.cs
deleted file mode 100644
index fe7ad20124..0000000000
--- a/osu.Desktop/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2007-2017 ppy Pty Ltd .
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using System.Reflection;
-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!lazer")]
-[assembly: AssemblyDescription("click the circles. to the beat.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("ppy Pty Ltd")]
-[assembly: AssemblyProduct("osu!lazer")]
-[assembly: AssemblyCopyright("ppy Pty Ltd 2007-2017")]
-[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("55e28cb2-7b6c-4595-8dcc-9871d8aad7e9")]
-
-[assembly: AssemblyVersion("0.0.0")]
-[assembly: AssemblyFileVersion("0.0.0")]
diff --git a/osu.Desktop/app.config b/osu.Desktop/app.config
deleted file mode 100644
index a704cc3750..0000000000
--- a/osu.Desktop/app.config
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
deleted file mode 100644
index 87d9ce8eec..0000000000
--- a/osu.Desktop/osu.Desktop.csproj
+++ /dev/null
@@ -1,275 +0,0 @@
-
-
-
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}
- Debug
- AnyCPU
- WinExe
- Properties
- osu.Desktop
- osu!
- 3CF060CD28877D0E3112948951A64B2A7CEEC909
- codesigning.pfx
- false
- false
- false
-
-
- 3.5
-
-
- osu.Desktop.Program
- OnOutputUpdated
- false
- LocalIntranet
- v4.6.1
- true
- publish\
- true
- Disk
- false
- Foreground
- 7
- Days
- false
- false
- true
- 2
- 1.0.0.%2a
- false
- true
- 12.0.0
- 2.0
-
-
-
-
-
-
- true
- full
- false
- bin\Debug\
- DEBUG
- prompt
- 0
- true
- false
- AnyCPU
- true
- AllRules.ruleset
- false
- false
- false
-
-
- 6
-
-
- none
- true
- bin\Release\
-
-
- prompt
- 4
- true
- false
- AnyCPU
- true
- AllRules.ruleset
- false
- false
-
-
-
-
-
-
- lazer.ico
-
-
- Properties\app.manifest
-
-
- true
- bin\Debug\
- DEBUG
- true
- 0
- true
- full
- AnyCPU
- false
- 6
- prompt
- AllRules.ruleset
- --tests
- false
-
-
-
- $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.dll
- True
-
-
- $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.MsDelta.dll
- True
-
-
- $(SolutionDir)\packages\DeltaCompressionDotNet.1.1.0\lib\net20\DeltaCompressionDotNet.PatchApi.dll
- True
-
-
- $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.dll
- True
-
-
- $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Mdb.dll
- True
-
-
- $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Pdb.dll
- True
-
-
- $(SolutionDir)\packages\Mono.Cecil.0.9.6.4\lib\net45\Mono.Cecil.Rocks.dll
- True
-
-
-
- $(SolutionDir)\packages\squirrel.windows.1.7.8\lib\Net45\NuGet.Squirrel.dll
- True
-
-
- $(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll
- True
-
-
- $(SolutionDir)\packages\SharpCompress.0.18.1\lib\net45\SharpCompress.dll
- True
-
-
- $(SolutionDir)\packages\Splat.2.0.0\lib\Net45\Splat.dll
- True
-
-
- $(SolutionDir)\packages\squirrel.windows.1.7.8\lib\Net45\Squirrel.dll
- True
-
-
-
-
-
-
-
-
-
- osu.licenseheader
-
-
-
-
-
-
-
-
-
- False
- .NET Framework 3.5 SP1 Client Profile
- false
-
-
- False
- .NET Framework 2.0 %28x86%29
- true
-
-
- False
- .NET Framework 3.0 %28x86%29
- false
-
-
- False
- .NET Framework 3.5
- false
-
-
- False
- .NET Framework 3.5 SP1
- false
-
-
-
-
- {65dc628f-a640-4111-ab35-3a5652bc1e17}
- osu.Framework.Desktop
-
-
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}
- osu.Framework.Testing
-
-
- {c76bf5b3-985e-4d39-95fe-97c9c879b83a}
- osu.Framework
-
-
- {d9a367c9-4c1a-489f-9b05-a0cea2b53b58}
- osu.Game.Resources
-
-
- {230ac4f3-7783-49fb-9aec-b83cda3b9f3d}
- osu.Desktop.Tests
-
-
- {c92a607b-1fdd-4954-9f92-03ff547d9080}
- osu.Game.Rulesets.Osu
-
-
- {58f6c80c-1253-4a0e-a465-b8c85ebeadf3}
- osu.Game.Rulesets.Catch
-
-
- {48f4582b-7687-4621-9cbe-5c24197cb536}
- osu.Game.Rulesets.Mania
-
-
- {f167e17a-7de6-4af5-b920-a5112296c695}
- osu.Game.Rulesets.Taiko
-
-
- {0d3fbf8a-7464-4cf7-8c90-3e7886df2d4d}
- osu.Game
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/osu.Desktop/packages.config b/osu.Desktop/packages.config
deleted file mode 100644
index 58f9102aa1..0000000000
--- a/osu.Desktop/packages.config
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
index d6efe45adf..7cad9306c1 100644
--- a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
+++ b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
@@ -6,7 +6,6 @@ using osu.Game.Rulesets.Catch.Objects;
using System.Collections.Generic;
using System;
using osu.Game.Rulesets.Objects.Types;
-using osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Osu.UI;
diff --git a/osu.Game.Rulesets.Catch/CatchDifficultyCalculator.cs b/osu.Game.Rulesets.Catch/CatchDifficultyCalculator.cs
index a865299cff..3c6cc4b1a3 100644
--- a/osu.Game.Rulesets.Catch/CatchDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Catch/CatchDifficultyCalculator.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Catch.Beatmaps;
using osu.Game.Rulesets.Catch.Objects;
using System.Collections.Generic;
diff --git a/osu.Game.Rulesets.Catch/Tests/TestCaseCatcher.cs b/osu.Game.Rulesets.Catch/Tests/TestCaseCatcher.cs
new file mode 100644
index 0000000000..6a065e197d
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/Tests/TestCaseCatcher.cs
@@ -0,0 +1,43 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+using osu.Framework.Allocation;
+using osu.Framework.Graphics;
+using osu.Game.Rulesets.Catch.UI;
+using osu.Game.Tests.Visual;
+using OpenTK;
+
+namespace osu.Game.Rulesets.Catch.Tests
+{
+ [TestFixture]
+ internal class TestCaseCatcher : OsuTestCase
+ {
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(CatcherArea),
+ };
+
+ [BackgroundDependencyLoader]
+ private void load(RulesetStore rulesets)
+ {
+ Children = new Drawable[]
+ {
+ new CatchInputManager(rulesets.GetRuleset(2))
+ {
+ RelativeSizeAxes = Axes.Both,
+ Child = new CatcherArea
+ {
+ RelativePositionAxes = Axes.Both,
+ RelativeSizeAxes = Axes.Both,
+ Anchor = Anchor.BottomLeft,
+ Origin = Anchor.BottomLeft,
+ Size = new Vector2(1, 0.2f),
+ }
+ },
+ };
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs b/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
index 8f332bdcbf..1aee75fb78 100644
--- a/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
+++ b/osu.Game.Rulesets.Catch/UI/CatchRulesetContainer.cs
@@ -3,7 +3,6 @@
using osu.Framework.Input;
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Catch.Beatmaps;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.Objects.Drawable;
diff --git a/osu.Game.Rulesets.Catch/app.config b/osu.Game.Rulesets.Catch/app.config
index faeaf001de..11af32e2cf 100644
--- a/osu.Game.Rulesets.Catch/app.config
+++ b/osu.Game.Rulesets.Catch/app.config
@@ -6,6 +6,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
index 18e1ee29ca..1676b73003 100644
--- a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
+++ b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj
@@ -33,6 +33,10 @@
false
+
+ ..\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll
+ True
+
$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll
True
@@ -59,6 +63,7 @@
+
@@ -78,12 +83,16 @@
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}
osu.Framework
+
+ {d9a367c9-4c1a-489f-9b05-a0cea2b53b58}
+ osu.Game.Resources
+
{C92A607B-1FDD-4954-9F92-03FF547D9080}
osu.Game.Rulesets.Osu
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}
+ {2a66dd92-adb1-4994-89e2-c94e04acda0d}
osu.Game
diff --git a/osu.Game.Rulesets.Catch/packages.config b/osu.Game.Rulesets.Catch/packages.config
index 0b1838ceee..cde428acea 100644
--- a/osu.Game.Rulesets.Catch/packages.config
+++ b/osu.Game.Rulesets.Catch/packages.config
@@ -1,4 +1,5 @@
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs
index be670936fd..d7c86e1f89 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.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 osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using System;
using System.Collections.Generic;
diff --git a/osu.Game.Rulesets.Mania/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/ManiaDifficultyCalculator.cs
index 1f01750f44..b98802db69 100644
--- a/osu.Game.Rulesets.Mania/ManiaDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Mania/ManiaDifficultyCalculator.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Mania.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using System.Collections.Generic;
diff --git a/osu.Game.Rulesets.Mania/Testing/TestCaseManiaHitObjects.cs b/osu.Game.Rulesets.Mania/Testing/TestCaseManiaHitObjects.cs
new file mode 100644
index 0000000000..a5568b7f6d
--- /dev/null
+++ b/osu.Game.Rulesets.Mania/Testing/TestCaseManiaHitObjects.cs
@@ -0,0 +1,96 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using NUnit.Framework;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Rulesets.Mania.Objects;
+using osu.Game.Rulesets.Mania.Objects.Drawables;
+using osu.Game.Tests.Visual;
+using OpenTK;
+using OpenTK.Graphics;
+
+namespace osu.Game.Rulesets.Mania.Testing
+{
+ [TestFixture]
+ internal class TestCaseManiaHitObjects : OsuTestCase
+ {
+ public TestCaseManiaHitObjects()
+ {
+ Add(new FillFlowContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Y,
+ Direction = FillDirection.Horizontal,
+ Spacing = new Vector2(10, 0),
+ // Imagine that the containers containing the drawable notes are the "columns"
+ Children = new Drawable[]
+ {
+ new Container
+ {
+ Name = "Normal note column",
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Y,
+ Width = 50,
+ Children = new[]
+ {
+ new Container
+ {
+ Name = "Timing section",
+ RelativeSizeAxes = Axes.Both,
+ RelativeChildSize = new Vector2(1, 10000),
+ Children = new[]
+ {
+ new DrawableNote(new Note(), ManiaAction.Key1)
+ {
+ Y = 5000,
+ LifetimeStart = double.MinValue,
+ LifetimeEnd = double.MaxValue,
+ AccentColour = Color4.Red
+ },
+ new DrawableNote(new Note(), ManiaAction.Key1)
+ {
+ Y = 6000,
+ LifetimeStart = double.MinValue,
+ LifetimeEnd = double.MaxValue,
+ AccentColour = Color4.Red
+ }
+ }
+ }
+ }
+ },
+ new Container
+ {
+ Name = "Hold note column",
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Y,
+ Width = 50,
+ Children = new[]
+ {
+ new Container
+ {
+ Name = "Timing section",
+ RelativeSizeAxes = Axes.Both,
+ RelativeChildSize = new Vector2(1, 10000),
+ Children = new[]
+ {
+ new DrawableHoldNote(new HoldNote(), ManiaAction.Key1)
+ {
+ Y = 5000,
+ Height = 1000,
+ LifetimeStart = double.MinValue,
+ LifetimeEnd = double.MaxValue,
+ AccentColour = Color4.Red
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Mania/Testing/TestCaseManiaPlayfield.cs b/osu.Game.Rulesets.Mania/Testing/TestCaseManiaPlayfield.cs
new file mode 100644
index 0000000000..4b68334efb
--- /dev/null
+++ b/osu.Game.Rulesets.Mania/Testing/TestCaseManiaPlayfield.cs
@@ -0,0 +1,163 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System;
+using System.Linq;
+using NUnit.Framework;
+using osu.Framework.Allocation;
+using osu.Framework.Extensions.IEnumerableExtensions;
+using osu.Framework.Graphics;
+using osu.Framework.Timing;
+using osu.Game.Rulesets.Mania.Judgements;
+using osu.Game.Rulesets.Mania.Objects;
+using osu.Game.Rulesets.Mania.Objects.Drawables;
+using osu.Game.Rulesets.Mania.Timing;
+using osu.Game.Rulesets.Mania.UI;
+using osu.Game.Rulesets.Objects.Drawables;
+using osu.Game.Rulesets.Timing;
+using osu.Game.Tests.Visual;
+
+namespace osu.Game.Rulesets.Mania.Testing
+{
+ [TestFixture]
+ internal class TestCaseManiaPlayfield : OsuTestCase
+ {
+ private const double start_time = 500;
+ private const double duration = 500;
+
+ public override string Description => @"Mania playfield";
+
+ protected override double TimePerAction => 200;
+
+ private RulesetInfo maniaRuleset;
+
+ public TestCaseManiaPlayfield()
+ {
+ var rng = new Random(1337);
+
+ AddStep("1 column", () => createPlayfield(1, SpecialColumnPosition.Normal));
+ AddStep("4 columns", () => createPlayfield(4, SpecialColumnPosition.Normal));
+ AddStep("Left special style", () => createPlayfield(4, SpecialColumnPosition.Left));
+ AddStep("Right special style", () => createPlayfield(4, SpecialColumnPosition.Right));
+ AddStep("5 columns", () => createPlayfield(5, SpecialColumnPosition.Normal));
+ AddStep("8 columns", () => createPlayfield(8, SpecialColumnPosition.Normal));
+ AddStep("Left special style", () => createPlayfield(8, SpecialColumnPosition.Left));
+ AddStep("Right special style", () => createPlayfield(8, SpecialColumnPosition.Right));
+ AddStep("Reversed", () => createPlayfield(4, SpecialColumnPosition.Normal, true));
+
+ AddStep("Notes with input", () => createPlayfieldWithNotes(false));
+ AddStep("Notes with input (reversed)", () => createPlayfieldWithNotes(false, true));
+ AddStep("Notes with gravity", () => createPlayfieldWithNotes(true));
+ AddStep("Notes with gravity (reversed)", () => createPlayfieldWithNotes(true, true));
+
+ AddStep("Hit explosion", () =>
+ {
+ var playfield = createPlayfield(4, SpecialColumnPosition.Normal);
+
+ int col = rng.Next(0, 4);
+
+ var note = new DrawableNote(new Note { Column = col }, ManiaAction.Key1)
+ {
+ AccentColour = playfield.Columns.ElementAt(col).AccentColour
+ };
+
+ playfield.OnJudgement(note, new ManiaJudgement { Result = HitResult.Perfect });
+ });
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(RulesetStore rulesets)
+ {
+ maniaRuleset = rulesets.GetRuleset(3);
+ }
+
+ private SpeedAdjustmentContainer createTimingChange(double time, bool gravity) => new ManiaSpeedAdjustmentContainer(new MultiplierControlPoint(time)
+ {
+ TimingPoint = { BeatLength = 1000 }
+ }, gravity ? ScrollingAlgorithm.Gravity : ScrollingAlgorithm.Basic);
+
+ private ManiaPlayfield createPlayfield(int cols, SpecialColumnPosition specialPos, bool inverted = false)
+ {
+ Clear();
+
+ var inputManager = new ManiaInputManager(maniaRuleset, cols) { RelativeSizeAxes = Axes.Both };
+ Add(inputManager);
+
+ ManiaPlayfield playfield;
+ inputManager.Add(playfield = new ManiaPlayfield(cols)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ SpecialColumnPosition = specialPos
+ });
+
+ playfield.Inverted.Value = inverted;
+
+ return playfield;
+ }
+
+ private void createPlayfieldWithNotes(bool gravity, bool inverted = false)
+ {
+ Clear();
+
+ var rateAdjustClock = new StopwatchClock(true) { Rate = 1 };
+
+ var inputManager = new ManiaInputManager(maniaRuleset, 4) { RelativeSizeAxes = Axes.Both };
+ Add(inputManager);
+
+ ManiaPlayfield playfield;
+ inputManager.Add(playfield = new ManiaPlayfield(4)
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Clock = new FramedClock(rateAdjustClock)
+ });
+
+ playfield.Inverted.Value = inverted;
+
+ if (!gravity)
+ playfield.Columns.ForEach(c => c.Add(createTimingChange(0, false)));
+
+ for (double t = start_time; t <= start_time + duration; t += 100)
+ {
+ if (gravity)
+ playfield.Columns.ElementAt(0).Add(createTimingChange(t, true));
+
+ playfield.Add(new DrawableNote(new Note
+ {
+ StartTime = t,
+ Column = 0
+ }, ManiaAction.Key1));
+
+ if (gravity)
+ playfield.Columns.ElementAt(3).Add(createTimingChange(t, true));
+
+ playfield.Add(new DrawableNote(new Note
+ {
+ StartTime = t,
+ Column = 3
+ }, ManiaAction.Key4));
+ }
+
+ if (gravity)
+ playfield.Columns.ElementAt(1).Add(createTimingChange(start_time, true));
+
+ playfield.Add(new DrawableHoldNote(new HoldNote
+ {
+ StartTime = start_time,
+ Duration = duration,
+ Column = 1
+ }, ManiaAction.Key2));
+
+ if (gravity)
+ playfield.Columns.ElementAt(2).Add(createTimingChange(start_time, true));
+
+ playfield.Add(new DrawableHoldNote(new HoldNote
+ {
+ StartTime = start_time,
+ Duration = duration,
+ Column = 2
+ }, ManiaAction.Key3));
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaRulesetContainer.cs b/osu.Game.Rulesets.Mania/UI/ManiaRulesetContainer.cs
index e9c4895284..3b49d81674 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaRulesetContainer.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaRulesetContainer.cs
@@ -13,7 +13,6 @@ using osu.Framework.Lists;
using osu.Framework.MathUtils;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
-using osu.Game.Rulesets.Beatmaps;
using osu.Game.Rulesets.Mania.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Mania.Objects.Drawables;
diff --git a/osu.Game.Rulesets.Mania/app.config b/osu.Game.Rulesets.Mania/app.config
index faeaf001de..11af32e2cf 100644
--- a/osu.Game.Rulesets.Mania/app.config
+++ b/osu.Game.Rulesets.Mania/app.config
@@ -6,6 +6,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
index 739f1cf48c..20e4bfafe6 100644
--- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
+++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj
@@ -33,6 +33,10 @@
false
+
+ ..\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll
+ True
+
$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll
True
@@ -83,6 +87,8 @@
+
+
@@ -96,16 +102,6 @@
-
-
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A}
- osu.Framework
-
-
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}
- osu.Game
-
-
osu.licenseheader
@@ -114,7 +110,20 @@
-
+
+
+ {C76BF5B3-985E-4D39-95FE-97C9C879B83A}
+ osu.Framework
+
+
+ {d9a367c9-4c1a-489f-9b05-a0cea2b53b58}
+ osu.Game.Resources
+
+
+ {2a66dd92-adb1-4994-89e2-c94e04acda0d}
+ osu.Game
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/osu.Desktop/osu.nuspec b/osu.Game/osu.nuspec
similarity index 100%
rename from osu.Desktop/osu.nuspec
rename to osu.Game/osu.nuspec
diff --git a/osu.Game/packages.config b/osu.Game/packages.config
index 292ba22c06..c8de5709c3 100644
--- a/osu.Game/packages.config
+++ b/osu.Game/packages.config
@@ -4,11 +4,17 @@ Copyright (c) 2007-2017 ppy Pty Ltd .
Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-->
-
+
+
+
+
+
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/osu.sln b/osu.sln
index 3799c890b9..ccef0c370c 100644
--- a/osu.sln
+++ b/osu.sln
@@ -1,24 +1,14 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26228.9
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop", "osu.Desktop\osu.Desktop.csproj", "{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game", "osu.Game\osu.Game.csproj", "{2A66DD92-ADB1-4994-89E2-C94E04ACDA0D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework", "osu-framework\osu.Framework\osu.Framework.csproj", "{C76BF5B3-985E-4D39-95FE-97C9C879B83A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game", "osu.Game\osu.Game.csproj", "{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Resources", "osu-resources\osu.Game.Resources\osu.Game.Resources.csproj", "{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{7A75DFA2-DE65-4458-98AF-26AF96FFD6DC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework.Desktop", "osu-framework\osu.Framework.Desktop\osu.Framework.Desktop.csproj", "{65DC628F-A640-4111-AB35-3A5652BC1E17}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Tests", "osu.Game.Tests\osu.Game.Tests.csproj", "{54377672-20B1-40AF-8087-5CF73BF3953A}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Osu", "osu.Game.Rulesets.Osu\osu.Game.Rulesets.Osu.csproj", "{C92A607B-1FDD-4954-9F92-03FF547D9080}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Catch", "osu.Game.Rulesets.Catch\osu.Game.Rulesets.Catch.csproj", "{58F6C80C-1253-4A0E-A465-B8C85EBEADF3}"
@@ -27,16 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Taiko", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Mania", "osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj", "{48F4582B-7687-4621-9CBE-5C24197CB536}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop.Tests", "osu.Desktop.Tests\osu.Desktop.Tests.csproj", "{230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Desktop.Deploy", "osu.Desktop.Deploy\osu.Desktop.Deploy.csproj", "{BAEA2F74-0315-4667-84E0-ACAC0B4BF785}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{6EAD7610-89D8-48A2-8BE0-E348297E4D8B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{80683232-505E-41EA-A37C-2CFCF1C88C57}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Framework.Testing", "osu-framework\osu.Framework.Testing\osu.Framework.Testing.csproj", "{007B2356-AB6F-4BD9-96D5-116FC2DCE69A}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -56,30 +38,12 @@ Global
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.Release|Any CPU.Build.0 = Release|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
{C76BF5B3-985E-4D39-95FE-97C9C879B83A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.Release|Any CPU.Build.0 = Release|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.Release|Any CPU.Build.0 = Release|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
{D9A367C9-4C1A-489F-9B05-A0CEA2B53B58}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.Release|Any CPU.Build.0 = Release|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {65DC628F-A640-4111-AB35-3A5652BC1E17}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.Release|Any CPU.Build.0 = Release|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {54377672-20B1-40AF-8087-5CF73BF3953A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
{C92A607B-1FDD-4954-9F92-03FF547D9080}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C92A607B-1FDD-4954-9F92-03FF547D9080}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C92A607B-1FDD-4954-9F92-03FF547D9080}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -104,40 +68,13 @@ Global
{48F4582B-7687-4621-9CBE-5C24197CB536}.Release|Any CPU.Build.0 = Release|Any CPU
{48F4582B-7687-4621-9CBE-5C24197CB536}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
{48F4582B-7687-4621-9CBE-5C24197CB536}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.Release|Any CPU.Build.0 = Release|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D}.VisualTests|Any CPU.Build.0 = Debug|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
{BAEA2F74-0315-4667-84E0-ACAC0B4BF785}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.Release|Any CPU.Build.0 = Release|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A}.VisualTests|Any CPU.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {2A66DD92-ADB1-4994-89E2-C94E04ACDA0D} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {C76BF5B3-985E-4D39-95FE-97C9C879B83A} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC}
- {0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {D9A367C9-4C1A-489F-9B05-A0CEA2B53B58} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {65DC628F-A640-4111-AB35-3A5652BC1E17} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC}
- {54377672-20B1-40AF-8087-5CF73BF3953A} = {80683232-505E-41EA-A37C-2CFCF1C88C57}
- {C92A607B-1FDD-4954-9F92-03FF547D9080} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {58F6C80C-1253-4A0E-A465-B8C85EBEADF3} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {F167E17A-7DE6-4AF5-B920-A5112296C695} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {48F4582B-7687-4621-9CBE-5C24197CB536} = {0D37A2AD-80A4-464F-A1DE-1560B70F1CE3}
- {230AC4F3-7783-49FB-9AEC-B83CDA3B9F3D} = {80683232-505E-41EA-A37C-2CFCF1C88C57}
- {BAEA2F74-0315-4667-84E0-ACAC0B4BF785} = {6EAD7610-89D8-48A2-8BE0-E348297E4D8B}
- {007B2356-AB6F-4BD9-96D5-116FC2DCE69A} = {7A75DFA2-DE65-4458-98AF-26AF96FFD6DC}
- EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.TextStylePolicy = $1