mirror of
https://github.com/ppy/osu.git
synced 2025-01-14 20:03:21 +08:00
Merge remote-tracking branch 'refs/remotes/ppy/master' into intro
This commit is contained in:
commit
189b51551d
@ -1,6 +1,7 @@
|
|||||||
# 2017-09-14
|
# 2017-09-14
|
||||||
clone_depth: 1
|
clone_depth: 1
|
||||||
version: '{branch}-{build}'
|
version: '{branch}-{build}'
|
||||||
|
image: Visual Studio 2017
|
||||||
configuration: Debug
|
configuration: Debug
|
||||||
cache:
|
cache:
|
||||||
- C:\ProgramData\chocolatey\bin -> appveyor.yml
|
- C:\ProgramData\chocolatey\bin -> appveyor.yml
|
||||||
@ -11,7 +12,7 @@ install:
|
|||||||
- cmd: git submodule update --init --recursive
|
- cmd: git submodule update --init --recursive
|
||||||
- cmd: choco install resharper-clt -y
|
- cmd: choco install resharper-clt -y
|
||||||
- cmd: choco install nvika -y
|
- cmd: choco install nvika -y
|
||||||
- cmd: appveyor DownloadFile https://github.com/peppy/CodeFileSanity/releases/download/v0.2.2/CodeFileSanity.exe
|
- cmd: appveyor DownloadFile https://github.com/peppy/CodeFileSanity/releases/download/v0.2.3/CodeFileSanity.exe
|
||||||
before_build:
|
before_build:
|
||||||
- cmd: CodeFileSanity.exe
|
- cmd: CodeFileSanity.exe
|
||||||
- cmd: nuget restore
|
- cmd: nuget restore
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 0bc71f95b455d3829b2abf662b5fe25989e6c43c
|
Subproject commit 5986f2126832451a5a7ec832a483e1dcec1b38b8
|
@ -7,7 +7,6 @@ using System.Configuration;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using osu.Framework.IO.Network;
|
using osu.Framework.IO.Network;
|
||||||
using FileWebRequest = osu.Framework.IO.Network.FileWebRequest;
|
using FileWebRequest = osu.Framework.IO.Network.FileWebRequest;
|
||||||
@ -19,7 +18,7 @@ namespace osu.Desktop.Deploy
|
|||||||
{
|
{
|
||||||
private const string nuget_path = @"packages\NuGet.CommandLine.4.3.0\tools\NuGet.exe";
|
private const string nuget_path = @"packages\NuGet.CommandLine.4.3.0\tools\NuGet.exe";
|
||||||
private const string squirrel_path = @"packages\squirrel.windows.1.7.8\tools\Squirrel.exe";
|
private const string squirrel_path = @"packages\squirrel.windows.1.7.8\tools\Squirrel.exe";
|
||||||
private const string msbuild_path = @"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe";
|
private const string msbuild_path = @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe";
|
||||||
|
|
||||||
public static string StagingFolder = ConfigurationManager.AppSettings["StagingFolder"];
|
public static string StagingFolder = ConfigurationManager.AppSettings["StagingFolder"];
|
||||||
public static string ReleasesFolder = ConfigurationManager.AppSettings["ReleasesFolder"];
|
public static string ReleasesFolder = ConfigurationManager.AppSettings["ReleasesFolder"];
|
||||||
@ -391,8 +390,8 @@ namespace osu.Desktop.Deploy
|
|||||||
|
|
||||||
public static void AuthenticatedBlockingPerform(this WebRequest r)
|
public static void AuthenticatedBlockingPerform(this WebRequest r)
|
||||||
{
|
{
|
||||||
r.AddHeader("Authorization", $"token {GitHubAccessToken}");
|
r.Headers.Add("Authorization", $"token {GitHubAccessToken}");
|
||||||
r.BlockingPerform();
|
r.Perform();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,12 +401,7 @@ namespace osu.Desktop.Deploy
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HttpWebRequest CreateWebRequest(string requestString = null)
|
protected override string Accept => "application/octet-stream";
|
||||||
{
|
|
||||||
var req = base.CreateWebRequest(requestString);
|
|
||||||
req.Accept = "application/octet-stream";
|
|
||||||
return req;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class ReleaseLine
|
internal class ReleaseLine
|
||||||
|
@ -7,20 +7,17 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using osu.Desktop.Overlays;
|
using osu.Desktop.Overlays;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game;
|
using osu.Game;
|
||||||
using osu.Game.Screens.Menu;
|
using OpenTK.Input;
|
||||||
|
|
||||||
namespace osu.Desktop
|
namespace osu.Desktop
|
||||||
{
|
{
|
||||||
internal class OsuGameDesktop : OsuGame
|
internal class OsuGameDesktop : OsuGame
|
||||||
{
|
{
|
||||||
private VersionManager versionManager;
|
|
||||||
|
|
||||||
public OsuGameDesktop(string[] args = null)
|
public OsuGameDesktop(string[] args = null)
|
||||||
: base(args)
|
: base(args)
|
||||||
{
|
{
|
||||||
@ -82,16 +79,11 @@ namespace osu.Desktop
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
LoadComponentAsync(versionManager = new VersionManager { Depth = int.MinValue });
|
LoadComponentAsync(new VersionManager { Depth = int.MinValue }, v =>
|
||||||
|
|
||||||
ScreenChanged += s =>
|
|
||||||
{
|
{
|
||||||
if (s is Intro && s.ChildScreen == null)
|
Add(v);
|
||||||
{
|
v.State = Visibility.Visible;
|
||||||
Add(versionManager);
|
});
|
||||||
versionManager.State = Visibility.Visible;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetHost(GameHost host)
|
public override void SetHost(GameHost host)
|
||||||
@ -105,19 +97,16 @@ namespace osu.Desktop
|
|||||||
desktopWindow.Icon = new Icon(Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType(), "lazer.ico"));
|
desktopWindow.Icon = new Icon(Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType(), "lazer.ico"));
|
||||||
desktopWindow.Title = Name;
|
desktopWindow.Title = Name;
|
||||||
|
|
||||||
desktopWindow.DragEnter += dragEnter;
|
desktopWindow.FileDrop += fileDrop;
|
||||||
desktopWindow.DragDrop += dragDrop;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dragDrop(DragEventArgs e)
|
private void fileDrop(object sender, FileDropEventArgs e)
|
||||||
{
|
{
|
||||||
// this method will only be executed if e.Effect in dragEnter gets set to something other that None.
|
var filePaths = new [] { e.FileName };
|
||||||
var dropData = (object[])e.Data.GetData(DataFormats.FileDrop);
|
|
||||||
var filePaths = dropData.Select(f => f.ToString()).ToArray();
|
|
||||||
|
|
||||||
if (filePaths.All(f => Path.GetExtension(f) == @".osz"))
|
if (filePaths.All(f => Path.GetExtension(f) == @".osz"))
|
||||||
Task.Run(() => BeatmapManager.Import(filePaths));
|
Task.Factory.StartNew(() => BeatmapManager.Import(filePaths), TaskCreationOptions.LongRunning);
|
||||||
else if (filePaths.All(f => Path.GetExtension(f) == @".osr"))
|
else if (filePaths.All(f => Path.GetExtension(f) == @".osr"))
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
@ -127,16 +116,5 @@ namespace osu.Desktop
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static readonly string[] allowed_extensions = { @".osz", @".osr" };
|
private static readonly string[] allowed_extensions = { @".osz", @".osr" };
|
||||||
|
|
||||||
private void dragEnter(DragEventArgs e)
|
|
||||||
{
|
|
||||||
// dragDrop will only be executed if e.Effect gets set to something other that None in this method.
|
|
||||||
bool isFile = e.Data.GetDataPresent(DataFormats.FileDrop);
|
|
||||||
if (isFile)
|
|
||||||
{
|
|
||||||
var paths = ((object[])e.Data.GetData(DataFormats.FileDrop)).Select(f => f.ToString()).ToArray();
|
|
||||||
e.Effect = allowed_extensions.Any(ext => paths.All(p => p.EndsWith(ext))) ? DragDropEffects.Copy : DragDropEffects.None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,34 @@
|
|||||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -57,7 +57,6 @@
|
|||||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<RunCodeAnalysis>false</RunCodeAnalysis>
|
<RunCodeAnalysis>false</RunCodeAnalysis>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||||
@ -76,7 +75,6 @@
|
|||||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@ -102,7 +100,6 @@
|
|||||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||||
<LangVersion>6</LangVersion>
|
<LangVersion>6</LangVersion>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<StartArguments>--tests</StartArguments>
|
<StartArguments>--tests</StartArguments>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -136,28 +133,44 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="mscorlib" />
|
<Reference Include="mscorlib" />
|
||||||
<Reference Include="NuGet.Squirrel, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="NuGet.Squirrel, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\squirrel.windows.1.7.8\lib\Net45\NuGet.Squirrel.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\squirrel.windows.1.7.8\lib\Net45\NuGet.Squirrel.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SharpCompress, Version=0.18.1.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
|
<Reference Include="SharpCompress, Version=0.18.1.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\SharpCompress.0.18.1\lib\net45\SharpCompress.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\SharpCompress.0.18.1\lib\net45\SharpCompress.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Splat, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Splat, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\Splat.2.0.0\lib\Net45\Splat.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\Splat.2.0.0\lib\Net45\Splat.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCLRaw.batteries_green, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a84b7dcfb1391f7f, processorArchitecture=MSIL">
|
||||||
|
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\net45\SQLitePCLRaw.batteries_green.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCLRaw.batteries_v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8226ea5df37bcae9, processorArchitecture=MSIL">
|
||||||
|
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\net45\SQLitePCLRaw.batteries_v2.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
|
||||||
|
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCLRaw.provider.e_sqlite3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9c301db686d0bd12, processorArchitecture=MSIL">
|
||||||
|
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.8\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Squirrel, Version=1.7.8.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Squirrel, Version=1.7.8.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\squirrel.windows.1.7.8\lib\Net45\Squirrel.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\squirrel.windows.1.7.8\lib\Net45\Squirrel.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
|
||||||
|
<HintPath>$(SolutionDir)\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -232,6 +245,10 @@
|
|||||||
<Project>{f167e17a-7de6-4af5-b920-a5112296c695}</Project>
|
<Project>{f167e17a-7de6-4af5-b920-a5112296c695}</Project>
|
||||||
<Name>osu.Game.Rulesets.Taiko</Name>
|
<Name>osu.Game.Rulesets.Taiko</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\osu.Game.Tests\osu.Game.Tests.csproj">
|
||||||
|
<Project>{54377672-20b1-40af-8087-5cf73bf3953a}</Project>
|
||||||
|
<Name>osu.Game.Tests</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
@ -257,4 +274,15 @@
|
|||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets'))" />
|
||||||
|
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets'))" />
|
||||||
|
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets'))" />
|
||||||
|
</Target>
|
||||||
|
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" />
|
||||||
|
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" />
|
||||||
</Project>
|
</Project>
|
@ -7,8 +7,14 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
|
|||||||
<package id="DeltaCompressionDotNet" version="1.1.0" targetFramework="net45" />
|
<package id="DeltaCompressionDotNet" version="1.1.0" targetFramework="net45" />
|
||||||
<package id="Mono.Cecil" version="0.9.6.4" targetFramework="net45" />
|
<package id="Mono.Cecil" version="0.9.6.4" targetFramework="net45" />
|
||||||
<package id="OpenTK" version="3.0.0-git00009" targetFramework="net461" />
|
<package id="OpenTK" version="3.0.0-git00009" targetFramework="net461" />
|
||||||
<package id="ppy.OpenTK" version="3.0" targetFramework="net45" />
|
|
||||||
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
||||||
<package id="Splat" version="2.0.0" targetFramework="net45" />
|
<package id="Splat" version="2.0.0" targetFramework="net45" />
|
||||||
|
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
|
||||||
|
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net461" />
|
||||||
|
<package id="SQLitePCLRaw.lib.e_sqlite3.linux" version="1.1.8" targetFramework="net461" />
|
||||||
|
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.8" targetFramework="net461" />
|
||||||
|
<package id="SQLitePCLRaw.lib.e_sqlite3.v110_xp" version="1.1.8" targetFramework="net461" />
|
||||||
|
<package id="SQLitePCLRaw.provider.e_sqlite3.net45" version="1.1.8" targetFramework="net461" />
|
||||||
<package id="squirrel.windows" version="1.7.8" targetFramework="net461" />
|
<package id="squirrel.windows" version="1.7.8" targetFramework="net461" />
|
||||||
|
<package id="System.ValueTuple" version="4.4.0" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@ -6,6 +6,7 @@ using NUnit.Framework;
|
|||||||
namespace osu.Game.Rulesets.Catch.Tests
|
namespace osu.Game.Rulesets.Catch.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
public class TestCaseCatchPlayer : Game.Tests.Visual.TestCasePlayer
|
public class TestCaseCatchPlayer : Game.Tests.Visual.TestCasePlayer
|
||||||
{
|
{
|
||||||
public TestCaseCatchPlayer() : base(typeof(CatchRuleset))
|
public TestCaseCatchPlayer() : base(typeof(CatchRuleset))
|
||||||
|
@ -8,6 +8,7 @@ using osu.Game.Rulesets.Catch.Objects;
|
|||||||
namespace osu.Game.Rulesets.Catch.Tests
|
namespace osu.Game.Rulesets.Catch.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
public class TestCaseCatchStacker : Game.Tests.Visual.TestCasePlayer
|
public class TestCaseCatchStacker : Game.Tests.Visual.TestCasePlayer
|
||||||
{
|
{
|
||||||
public TestCaseCatchStacker() : base(typeof(CatchRuleset))
|
public TestCaseCatchStacker() : base(typeof(CatchRuleset))
|
||||||
|
@ -13,6 +13,7 @@ using OpenTK;
|
|||||||
namespace osu.Game.Rulesets.Catch.Tests
|
namespace osu.Game.Rulesets.Catch.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
internal class TestCaseCatcher : OsuTestCase
|
internal class TestCaseCatcher : OsuTestCase
|
||||||
{
|
{
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[]
|
public override IReadOnlyList<Type> RequiredTypes => new[]
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -35,11 +35,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Collections" />
|
<Reference Include="System.Collections" />
|
||||||
@ -84,12 +84,12 @@
|
|||||||
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
||||||
<Name>osu.Framework</Name>
|
<Name>osu.Framework</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
{
|
{
|
||||||
beatmap = original;
|
beatmap = original;
|
||||||
|
|
||||||
BeatmapDifficulty difficulty = original.BeatmapInfo.Difficulty;
|
BeatmapDifficulty difficulty = original.BeatmapInfo.BaseDifficulty;
|
||||||
|
|
||||||
int seed = (int)Math.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)Math.Round(difficulty.ApproachRate);
|
int seed = (int)Math.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)Math.Round(difficulty.ApproachRate);
|
||||||
random = new FastRandom(seed);
|
random = new FastRandom(seed);
|
||||||
|
@ -47,7 +47,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
// The true distance, accounting for any repeats
|
// The true distance, accounting for any repeats
|
||||||
double distance = (distanceData?.Distance ?? 0) * repeatCount;
|
double distance = (distanceData?.Distance ?? 0) * repeatCount;
|
||||||
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
||||||
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.Difficulty.SliderMultiplier * difficultyPoint.SpeedMultiplier / timingPoint.BeatLength;
|
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * difficultyPoint.SpeedMultiplier / timingPoint.BeatLength;
|
||||||
// The duration of the osu! hit object
|
// The duration of the osu! hit object
|
||||||
double osuDuration = distance / osuVelocity;
|
double osuDuration = distance / osuVelocity;
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
if (drainTime == 0)
|
if (drainTime == 0)
|
||||||
drainTime = 10000;
|
drainTime = 10000;
|
||||||
|
|
||||||
BeatmapDifficulty difficulty = Beatmap.BeatmapInfo.Difficulty;
|
BeatmapDifficulty difficulty = Beatmap.BeatmapInfo.BaseDifficulty;
|
||||||
conversionDifficulty = ((difficulty.DrainRate + MathHelper.Clamp(difficulty.ApproachRate, 4, 7)) / 1.5 + Beatmap.HitObjects.Count / drainTime * 9f) / 38f * 5f / 1.15;
|
conversionDifficulty = ((difficulty.DrainRate + MathHelper.Clamp(difficulty.ApproachRate, 4, 7)) / 1.5 + Beatmap.HitObjects.Count / drainTime * 9f) / 38f * 5f / 1.15;
|
||||||
conversionDifficulty = Math.Min(conversionDifficulty.Value, 12);
|
conversionDifficulty = Math.Min(conversionDifficulty.Value, 12);
|
||||||
|
|
||||||
|
@ -21,6 +21,6 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override BeatmapConverter<ManiaHitObject> CreateBeatmapConverter() => new ManiaBeatmapConverter(true, (int)Math.Max(1, Math.Round(Beatmap.BeatmapInfo.Difficulty.CircleSize)));
|
protected override BeatmapConverter<ManiaHitObject> CreateBeatmapConverter() => new ManiaBeatmapConverter(true, (int)Math.Max(1, Math.Round(Beatmap.BeatmapInfo.BaseDifficulty.CircleSize)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ namespace osu.Game.Rulesets.Mania.Scoring
|
|||||||
|
|
||||||
protected override void SimulateAutoplay(Beatmap<ManiaHitObject> beatmap)
|
protected override void SimulateAutoplay(Beatmap<ManiaHitObject> beatmap)
|
||||||
{
|
{
|
||||||
BeatmapDifficulty difficulty = beatmap.BeatmapInfo.Difficulty;
|
BeatmapDifficulty difficulty = beatmap.BeatmapInfo.BaseDifficulty;
|
||||||
hpMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_min, hp_multiplier_mid, hp_multiplier_max);
|
hpMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_min, hp_multiplier_mid, hp_multiplier_max);
|
||||||
hpMissMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_miss_min, hp_multiplier_miss_mid, hp_multiplier_miss_max);
|
hpMissMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_miss_min, hp_multiplier_miss_mid, hp_multiplier_miss_max);
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ using OpenTK.Graphics;
|
|||||||
namespace osu.Game.Rulesets.Mania.Tests
|
namespace osu.Game.Rulesets.Mania.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
internal class TestCaseManiaHitObjects : OsuTestCase
|
internal class TestCaseManiaHitObjects : OsuTestCase
|
||||||
{
|
{
|
||||||
public TestCaseManiaHitObjects()
|
public TestCaseManiaHitObjects()
|
||||||
|
@ -20,6 +20,7 @@ using osu.Game.Tests.Visual;
|
|||||||
namespace osu.Game.Rulesets.Mania.Tests
|
namespace osu.Game.Rulesets.Mania.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
internal class TestCaseManiaPlayfield : OsuTestCase
|
internal class TestCaseManiaPlayfield : OsuTestCase
|
||||||
{
|
{
|
||||||
private const double start_time = 500;
|
private const double start_time = 500;
|
||||||
|
@ -88,18 +88,18 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
protected override BeatmapConverter<ManiaHitObject> CreateBeatmapConverter()
|
protected override BeatmapConverter<ManiaHitObject> CreateBeatmapConverter()
|
||||||
{
|
{
|
||||||
if (IsForCurrentRuleset)
|
if (IsForCurrentRuleset)
|
||||||
AvailableColumns = (int)Math.Max(1, Math.Round(WorkingBeatmap.BeatmapInfo.Difficulty.CircleSize));
|
AvailableColumns = (int)Math.Max(1, Math.Round(WorkingBeatmap.BeatmapInfo.BaseDifficulty.CircleSize));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float percentSliderOrSpinner = (float)WorkingBeatmap.Beatmap.HitObjects.Count(h => h is IHasEndTime) / WorkingBeatmap.Beatmap.HitObjects.Count;
|
float percentSliderOrSpinner = (float)WorkingBeatmap.Beatmap.HitObjects.Count(h => h is IHasEndTime) / WorkingBeatmap.Beatmap.HitObjects.Count;
|
||||||
if (percentSliderOrSpinner < 0.2)
|
if (percentSliderOrSpinner < 0.2)
|
||||||
AvailableColumns = 7;
|
AvailableColumns = 7;
|
||||||
else if (percentSliderOrSpinner < 0.3 || Math.Round(WorkingBeatmap.BeatmapInfo.Difficulty.CircleSize) >= 5)
|
else if (percentSliderOrSpinner < 0.3 || Math.Round(WorkingBeatmap.BeatmapInfo.BaseDifficulty.CircleSize) >= 5)
|
||||||
AvailableColumns = Math.Round(WorkingBeatmap.BeatmapInfo.Difficulty.OverallDifficulty) > 5 ? 7 : 6;
|
AvailableColumns = Math.Round(WorkingBeatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty) > 5 ? 7 : 6;
|
||||||
else if (percentSliderOrSpinner > 0.6)
|
else if (percentSliderOrSpinner > 0.6)
|
||||||
AvailableColumns = Math.Round(WorkingBeatmap.BeatmapInfo.Difficulty.OverallDifficulty) > 4 ? 5 : 4;
|
AvailableColumns = Math.Round(WorkingBeatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty) > 4 ? 5 : 4;
|
||||||
else
|
else
|
||||||
AvailableColumns = Math.Max(4, Math.Min((int)Math.Round(WorkingBeatmap.BeatmapInfo.Difficulty.OverallDifficulty) + 1, 7));
|
AvailableColumns = Math.Max(4, Math.Min((int)Math.Round(WorkingBeatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty) + 1, 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ManiaBeatmapConverter(IsForCurrentRuleset, AvailableColumns);
|
return new ManiaBeatmapConverter(IsForCurrentRuleset, AvailableColumns);
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -35,11 +35,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
@ -107,12 +107,12 @@
|
|||||||
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
||||||
<Name>osu.Framework</Name>
|
<Name>osu.Framework</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
|
using OpenTK;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Rulesets.Osu.Judgements;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
||||||
|
{
|
||||||
|
public class DrawableRepeatPoint : DrawableOsuHitObject
|
||||||
|
{
|
||||||
|
private readonly RepeatPoint repeatPoint;
|
||||||
|
private readonly DrawableSlider drawableSlider;
|
||||||
|
|
||||||
|
public double FadeInTime;
|
||||||
|
public double FadeOutTime;
|
||||||
|
|
||||||
|
public override bool RemoveWhenNotAlive => false;
|
||||||
|
|
||||||
|
public DrawableRepeatPoint(RepeatPoint repeatPoint, DrawableSlider drawableSlider) : base(repeatPoint)
|
||||||
|
{
|
||||||
|
this.repeatPoint = repeatPoint;
|
||||||
|
this.drawableSlider = drawableSlider;
|
||||||
|
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
Blending = BlendingMode.Additive;
|
||||||
|
Origin = Anchor.Centre;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new SpriteIcon
|
||||||
|
{
|
||||||
|
Icon = FontAwesome.fa_eercast,
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
Size = new Vector2(32),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void CheckForJudgements(bool userTriggered, double timeOffset)
|
||||||
|
{
|
||||||
|
if (repeatPoint.StartTime <= Time.Current)
|
||||||
|
AddJudgement(new OsuJudgement { Result = drawableSlider.Tracking ? HitResult.Great : HitResult.Miss });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdatePreemptState()
|
||||||
|
{
|
||||||
|
var animIn = Math.Min(150, repeatPoint.StartTime - FadeInTime);
|
||||||
|
|
||||||
|
this.Animate(
|
||||||
|
d => d.FadeIn(animIn),
|
||||||
|
d => d.ScaleTo(0.5f).ScaleTo(1.2f, animIn)
|
||||||
|
).Then(
|
||||||
|
d => d.ScaleTo(1, 150, Easing.Out)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdateCurrentState(ArmedState state)
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case ArmedState.Idle:
|
||||||
|
this.Delay(FadeOutTime - repeatPoint.StartTime).FadeOut();
|
||||||
|
break;
|
||||||
|
case ArmedState.Miss:
|
||||||
|
this.FadeOut(160);
|
||||||
|
break;
|
||||||
|
case ArmedState.Hit:
|
||||||
|
this.FadeOut(120, Easing.OutQuint)
|
||||||
|
.ScaleTo(Scale * 1.5f, 120, Easing.OutQuint);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -21,15 +21,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
private readonly List<ISliderProgress> components = new List<ISliderProgress>();
|
private readonly List<ISliderProgress> components = new List<ISliderProgress>();
|
||||||
|
|
||||||
private readonly Container<DrawableSliderTick> ticks;
|
private readonly Container<DrawableSliderTick> ticks;
|
||||||
|
private readonly Container<DrawableRepeatPoint> repeatPoints;
|
||||||
|
|
||||||
private readonly SliderBody body;
|
private readonly SliderBody body;
|
||||||
private readonly SliderBall ball;
|
private readonly SliderBall ball;
|
||||||
|
|
||||||
private readonly SliderBouncer bouncer2;
|
|
||||||
|
|
||||||
public DrawableSlider(Slider s) : base(s)
|
public DrawableSlider(Slider s) : base(s)
|
||||||
{
|
{
|
||||||
SliderBouncer bouncer1;
|
|
||||||
slider = s;
|
slider = s;
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
@ -41,16 +39,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
PathWidth = s.Scale * 64,
|
PathWidth = s.Scale * 64,
|
||||||
},
|
},
|
||||||
ticks = new Container<DrawableSliderTick>(),
|
ticks = new Container<DrawableSliderTick>(),
|
||||||
bouncer1 = new SliderBouncer(s, false)
|
repeatPoints = new Container<DrawableRepeatPoint>(),
|
||||||
{
|
|
||||||
Position = s.Curve.PositionAt(1),
|
|
||||||
Scale = new Vector2(s.Scale),
|
|
||||||
},
|
|
||||||
bouncer2 = new SliderBouncer(s, true)
|
|
||||||
{
|
|
||||||
Position = s.StackedPosition,
|
|
||||||
Scale = new Vector2(s.Scale),
|
|
||||||
},
|
|
||||||
ball = new SliderBall(s)
|
ball = new SliderBall(s)
|
||||||
{
|
{
|
||||||
Scale = new Vector2(s.Scale),
|
Scale = new Vector2(s.Scale),
|
||||||
@ -70,8 +59,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
|
|
||||||
components.Add(body);
|
components.Add(body);
|
||||||
components.Add(ball);
|
components.Add(ball);
|
||||||
components.Add(bouncer1);
|
|
||||||
components.Add(bouncer2);
|
|
||||||
|
|
||||||
AddNested(initialCircle);
|
AddNested(initialCircle);
|
||||||
|
|
||||||
@ -92,14 +79,34 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
ticks.Add(drawableTick);
|
ticks.Add(drawableTick);
|
||||||
AddNested(drawableTick);
|
AddNested(drawableTick);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var repeatPoint in s.RepeatPoints)
|
||||||
|
{
|
||||||
|
var repeatStartTime = s.StartTime + repeatPoint.RepeatIndex * repeatDuration;
|
||||||
|
var fadeInTime = repeatStartTime + (repeatPoint.StartTime - repeatStartTime) / 2 - (repeatPoint.RepeatIndex == 0 ? TIME_FADEIN : TIME_FADEIN / 2);
|
||||||
|
var fadeOutTime = repeatStartTime + repeatDuration;
|
||||||
|
|
||||||
|
var drawableRepeatPoint = new DrawableRepeatPoint(repeatPoint, this)
|
||||||
|
{
|
||||||
|
FadeInTime = fadeInTime,
|
||||||
|
FadeOutTime = fadeOutTime,
|
||||||
|
Position = repeatPoint.Position,
|
||||||
|
};
|
||||||
|
|
||||||
|
repeatPoints.Add(drawableRepeatPoint);
|
||||||
|
AddNested(drawableRepeatPoint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int currentRepeat;
|
private int currentRepeat;
|
||||||
|
public bool Tracking;
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
|
Tracking = ball.Tracking;
|
||||||
|
|
||||||
double progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
|
double progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1);
|
||||||
|
|
||||||
int repeat = slider.RepeatAt(progress);
|
int repeat = slider.RepeatAt(progress);
|
||||||
@ -112,8 +119,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
currentRepeat = repeat;
|
currentRepeat = repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
bouncer2.Position = slider.Curve.PositionAt(body.SnakedEnd ?? 0);
|
|
||||||
|
|
||||||
//todo: we probably want to reconsider this before adding scoring, but it looks and feels nice.
|
//todo: we probably want to reconsider this before adding scoring, but it looks and feels nice.
|
||||||
if (!initialCircle.Judgements.Any(j => j.IsHit))
|
if (!initialCircle.Judgements.Any(j => j.IsHit))
|
||||||
initialCircle.Position = slider.Curve.PositionAt(progress);
|
initialCircle.Position = slider.Curve.PositionAt(progress);
|
||||||
@ -126,12 +131,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
{
|
{
|
||||||
if (!userTriggered && Time.Current >= slider.EndTime)
|
if (!userTriggered && Time.Current >= slider.EndTime)
|
||||||
{
|
{
|
||||||
var ticksCount = ticks.Children.Count + 1;
|
var judgementsCount = ticks.Children.Count + repeatPoints.Children.Count + 1;
|
||||||
var ticksHit = ticks.Children.Count(t => t.Judgements.Any(j => j.IsHit));
|
var judgementsHit = ticks.Children.Count(t => t.Judgements.Any(j => j.IsHit)) + repeatPoints.Children.Count(t => t.Judgements.Any(j => j.IsHit));
|
||||||
if (initialCircle.Judgements.Any(j => j.IsHit))
|
if (initialCircle.Judgements.Any(j => j.IsHit))
|
||||||
ticksHit++;
|
judgementsHit++;
|
||||||
|
|
||||||
var hitFraction = (double)ticksHit / ticksCount;
|
var hitFraction = (double)judgementsHit / judgementsCount;
|
||||||
if (hitFraction == 1 && initialCircle.Judgements.Any(j => j.Result == HitResult.Great))
|
if (hitFraction == 1 && initialCircle.Judgements.Any(j => j.Result == HitResult.Great))
|
||||||
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
||||||
else if (hitFraction >= 0.5 && initialCircle.Judgements.Any(j => j.Result >= HitResult.Good))
|
else if (hitFraction >= 0.5 && initialCircle.Judgements.Any(j => j.Result >= HitResult.Good))
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
|
||||||
// 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.Graphics;
|
|
||||||
using OpenTK;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
|
|
||||||
{
|
|
||||||
public class SliderBouncer : Container, ISliderProgress
|
|
||||||
{
|
|
||||||
private readonly Slider slider;
|
|
||||||
private readonly bool isEnd;
|
|
||||||
private readonly SpriteIcon icon;
|
|
||||||
|
|
||||||
public SliderBouncer(Slider slider, bool isEnd)
|
|
||||||
{
|
|
||||||
this.slider = slider;
|
|
||||||
this.isEnd = isEnd;
|
|
||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
Blending = BlendingMode.Additive;
|
|
||||||
Origin = Anchor.Centre;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
icon = new SpriteIcon
|
|
||||||
{
|
|
||||||
Icon = FontAwesome.fa_eercast,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Size = new Vector2(48),
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
icon.Spin(1000, RotationDirection.Clockwise);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UpdateProgress(double progress, int repeat)
|
|
||||||
{
|
|
||||||
if (Time.Current < slider.StartTime)
|
|
||||||
Alpha = 0;
|
|
||||||
|
|
||||||
Alpha = repeat + 1 < slider.RepeatCount && repeat % 2 == (isEnd ? 0 : 1) ? 1 : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
10
osu.Game.Rulesets.Osu/Objects/RepeatPoint.cs
Normal file
10
osu.Game.Rulesets.Osu/Objects/RepeatPoint.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Objects
|
||||||
|
{
|
||||||
|
public class RepeatPoint : OsuHitObject
|
||||||
|
{
|
||||||
|
public int RepeatIndex { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -131,5 +131,33 @@ namespace osu.Game.Rulesets.Osu.Objects
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public IEnumerable<RepeatPoint> RepeatPoints
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var length = Curve.Distance;
|
||||||
|
var repeatPointDistance = Math.Min(Distance, length);
|
||||||
|
var repeatDuration = length / Velocity;
|
||||||
|
|
||||||
|
for (var repeat = 1; repeat < RepeatCount; repeat++)
|
||||||
|
{
|
||||||
|
for (var d = repeatPointDistance; d <= length; d += repeatPointDistance)
|
||||||
|
{
|
||||||
|
var repeatStartTime = StartTime + repeat * repeatDuration;
|
||||||
|
var distanceProgress = d / length;
|
||||||
|
|
||||||
|
yield return new RepeatPoint
|
||||||
|
{
|
||||||
|
RepeatIndex = repeat,
|
||||||
|
StartTime = repeatStartTime,
|
||||||
|
Position = Curve.PositionAt(distanceProgress),
|
||||||
|
StackHeight = StackHeight,
|
||||||
|
Scale = Scale,
|
||||||
|
ComboColour = ComboColour,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Osu.Scoring
|
|||||||
|
|
||||||
protected override void SimulateAutoplay(Beatmap<OsuHitObject> beatmap)
|
protected override void SimulateAutoplay(Beatmap<OsuHitObject> beatmap)
|
||||||
{
|
{
|
||||||
hpDrainRate = beatmap.BeatmapInfo.Difficulty.DrainRate;
|
hpDrainRate = beatmap.BeatmapInfo.BaseDifficulty.DrainRate;
|
||||||
|
|
||||||
foreach (var obj in beatmap.HitObjects)
|
foreach (var obj in beatmap.HitObjects)
|
||||||
{
|
{
|
||||||
@ -41,6 +41,10 @@ namespace osu.Game.Rulesets.Osu.Scoring
|
|||||||
// Ticks
|
// Ticks
|
||||||
foreach (var unused in slider.Ticks)
|
foreach (var unused in slider.Ticks)
|
||||||
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
||||||
|
|
||||||
|
//Repeats
|
||||||
|
foreach (var unused in slider.RepeatPoints)
|
||||||
|
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
||||||
}
|
}
|
||||||
|
|
||||||
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
AddJudgement(new OsuJudgement { Result = HitResult.Great });
|
||||||
|
@ -16,6 +16,7 @@ using OpenTK;
|
|||||||
namespace osu.Game.Rulesets.Osu.Tests
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
internal class TestCaseHitObjects : OsuTestCase
|
internal class TestCaseHitObjects : OsuTestCase
|
||||||
{
|
{
|
||||||
private FramedClock framedClock;
|
private FramedClock framedClock;
|
||||||
|
@ -125,7 +125,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
if (autoCursorScale && beatmap.Value != null)
|
if (autoCursorScale && beatmap.Value != null)
|
||||||
{
|
{
|
||||||
// if we have a beatmap available, let's get its circle size to figure out an automatic cursor scale modifier.
|
// if we have a beatmap available, let's get its circle size to figure out an automatic cursor scale modifier.
|
||||||
scale *= (float)(1 - 0.7 * (1 + beatmap.Value.BeatmapInfo.Difficulty.CircleSize - BeatmapDifficulty.DEFAULT_DIFFICULTY) / BeatmapDifficulty.DEFAULT_DIFFICULTY);
|
scale *= (float)(1 - 0.7 * (1 + beatmap.Value.BeatmapInfo.BaseDifficulty.CircleSize - BeatmapDifficulty.DEFAULT_DIFFICULTY) / BeatmapDifficulty.DEFAULT_DIFFICULTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
cursorContainer.Scale = new Vector2(scale);
|
cursorContainer.Scale = new Vector2(scale);
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -36,11 +36,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
@ -53,6 +53,7 @@
|
|||||||
<Compile Include="Objects\Drawables\Connections\ConnectionRenderer.cs" />
|
<Compile Include="Objects\Drawables\Connections\ConnectionRenderer.cs" />
|
||||||
<Compile Include="Objects\Drawables\Connections\FollowPointRenderer.cs" />
|
<Compile Include="Objects\Drawables\Connections\FollowPointRenderer.cs" />
|
||||||
<Compile Include="Judgements\OsuJudgement.cs" />
|
<Compile Include="Judgements\OsuJudgement.cs" />
|
||||||
|
<Compile Include="Objects\Drawables\DrawableRepeatPoint.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\ApproachCircle.cs" />
|
<Compile Include="Objects\Drawables\Pieces\ApproachCircle.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SpinnerBackground.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SpinnerBackground.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\CirclePiece.cs" />
|
<Compile Include="Objects\Drawables\Pieces\CirclePiece.cs" />
|
||||||
@ -66,13 +67,13 @@
|
|||||||
<Compile Include="Objects\Drawables\Pieces\NumberPiece.cs" />
|
<Compile Include="Objects\Drawables\Pieces\NumberPiece.cs" />
|
||||||
<Compile Include="Objects\Drawables\DrawableSliderTick.cs" />
|
<Compile Include="Objects\Drawables\DrawableSliderTick.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\RingPiece.cs" />
|
<Compile Include="Objects\Drawables\Pieces\RingPiece.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SliderBouncer.cs" />
|
|
||||||
<Compile Include="Objects\Drawables\Pieces\SpinnerDisc.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SpinnerDisc.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SpinnerSpmCounter.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SpinnerSpmCounter.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SpinnerTicks.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SpinnerTicks.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\TrianglesPiece.cs" />
|
<Compile Include="Objects\Drawables\Pieces\TrianglesPiece.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SliderBall.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SliderBall.cs" />
|
||||||
<Compile Include="Objects\Drawables\Pieces\SliderBody.cs" />
|
<Compile Include="Objects\Drawables\Pieces\SliderBody.cs" />
|
||||||
|
<Compile Include="Objects\RepeatPoint.cs" />
|
||||||
<Compile Include="Objects\SliderTick.cs" />
|
<Compile Include="Objects\SliderTick.cs" />
|
||||||
<Compile Include="OsuDifficulty\OsuDifficultyCalculator.cs" />
|
<Compile Include="OsuDifficulty\OsuDifficultyCalculator.cs" />
|
||||||
<Compile Include="OsuDifficulty\Preprocessing\OsuDifficultyBeatmap.cs" />
|
<Compile Include="OsuDifficulty\Preprocessing\OsuDifficultyBeatmap.cs" />
|
||||||
@ -113,12 +114,12 @@
|
|||||||
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
||||||
<Name>osu.Framework</Name>
|
<Name>osu.Framework</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
|
@ -51,7 +51,7 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
{
|
{
|
||||||
// Rewrite the beatmap info to add the slider velocity multiplier
|
// Rewrite the beatmap info to add the slider velocity multiplier
|
||||||
BeatmapInfo info = original.BeatmapInfo.DeepClone();
|
BeatmapInfo info = original.BeatmapInfo.DeepClone();
|
||||||
info.Difficulty.SliderMultiplier *= legacy_velocity_multiplier;
|
info.BaseDifficulty.SliderMultiplier *= legacy_velocity_multiplier;
|
||||||
|
|
||||||
Beatmap<TaikoHitObject> converted = base.ConvertBeatmap(original);
|
Beatmap<TaikoHitObject> converted = base.ConvertBeatmap(original);
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
double distance = distanceData.Distance * repeats * legacy_velocity_multiplier;
|
double distance = distanceData.Distance * repeats * legacy_velocity_multiplier;
|
||||||
|
|
||||||
// The velocity of the taiko hit object - calculated as the velocity of a drum roll
|
// The velocity of the taiko hit object - calculated as the velocity of a drum roll
|
||||||
double taikoVelocity = taiko_base_distance * beatmap.BeatmapInfo.Difficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
double taikoVelocity = taiko_base_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
||||||
// The duration of the taiko hit object
|
// The duration of the taiko hit object
|
||||||
double taikoDuration = distance / taikoVelocity;
|
double taikoDuration = distance / taikoVelocity;
|
||||||
|
|
||||||
@ -106,12 +106,12 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
speedAdjustedBeatLength *= speedAdjustment;
|
speedAdjustedBeatLength *= speedAdjustment;
|
||||||
|
|
||||||
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
||||||
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.Difficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier * legacy_velocity_multiplier / speedAdjustedBeatLength;
|
||||||
// The duration of the osu! hit object
|
// The duration of the osu! hit object
|
||||||
double osuDuration = distance / osuVelocity;
|
double osuDuration = distance / osuVelocity;
|
||||||
|
|
||||||
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
||||||
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.Difficulty.SliderTickRate, taikoDuration / repeats);
|
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate, taikoDuration / repeats);
|
||||||
|
|
||||||
if (!isForCurrentRuleset && tickSpacing > 0 && osuDuration < 2 * speedAdjustedBeatLength)
|
if (!isForCurrentRuleset && tickSpacing > 0 && osuDuration < 2 * speedAdjustedBeatLength)
|
||||||
{
|
{
|
||||||
@ -154,13 +154,13 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
Samples = obj.Samples,
|
Samples = obj.Samples,
|
||||||
IsStrong = strong,
|
IsStrong = strong,
|
||||||
Duration = taikoDuration,
|
Duration = taikoDuration,
|
||||||
TickRate = beatmap.BeatmapInfo.Difficulty.SliderTickRate == 3 ? 3 : 4,
|
TickRate = beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate == 3 ? 3 : 4,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (endTimeData != null)
|
else if (endTimeData != null)
|
||||||
{
|
{
|
||||||
double hitMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.Difficulty.OverallDifficulty, 3, 5, 7.5) * swell_hit_multiplier;
|
double hitMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty, 3, 5, 7.5) * swell_hit_multiplier;
|
||||||
|
|
||||||
yield return new Swell
|
yield return new Swell
|
||||||
{
|
{
|
||||||
|
@ -53,7 +53,7 @@ namespace osu.Game.Rulesets.Taiko.Scoring
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Taiko fails at the end of the map if the player has not half-filled their HP bar.
|
/// Taiko fails at the end of the map if the player has not half-filled their HP bar.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override bool HasFailed => Hits == MaxHits && Health.Value <= 0.5;
|
protected override bool FailCondition => Hits == MaxHits && Health.Value <= 0.5;
|
||||||
|
|
||||||
private double hpIncreaseTick;
|
private double hpIncreaseTick;
|
||||||
private double hpIncreaseGreat;
|
private double hpIncreaseGreat;
|
||||||
@ -71,12 +71,12 @@ namespace osu.Game.Rulesets.Taiko.Scoring
|
|||||||
|
|
||||||
protected override void SimulateAutoplay(Beatmap<TaikoHitObject> beatmap)
|
protected override void SimulateAutoplay(Beatmap<TaikoHitObject> beatmap)
|
||||||
{
|
{
|
||||||
double hpMultiplierNormal = 1 / (hp_hit_great * beatmap.HitObjects.FindAll(o => o is Hit).Count * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.Difficulty.DrainRate, 0.5, 0.75, 0.98));
|
double hpMultiplierNormal = 1 / (hp_hit_great * beatmap.HitObjects.FindAll(o => o is Hit).Count * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.5, 0.75, 0.98));
|
||||||
|
|
||||||
hpIncreaseTick = hp_hit_tick;
|
hpIncreaseTick = hp_hit_tick;
|
||||||
hpIncreaseGreat = hpMultiplierNormal * hp_hit_great;
|
hpIncreaseGreat = hpMultiplierNormal * hp_hit_great;
|
||||||
hpIncreaseGood = hpMultiplierNormal * hp_hit_good;
|
hpIncreaseGood = hpMultiplierNormal * hp_hit_good;
|
||||||
hpIncreaseMiss = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.Difficulty.DrainRate, hp_miss_min, hp_miss_mid, hp_miss_max);
|
hpIncreaseMiss = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, hp_miss_min, hp_miss_mid, hp_miss_max);
|
||||||
|
|
||||||
foreach (var obj in beatmap.HitObjects)
|
foreach (var obj in beatmap.HitObjects)
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,7 @@ using OpenTK;
|
|||||||
namespace osu.Game.Rulesets.Taiko.Tests
|
namespace osu.Game.Rulesets.Taiko.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
|
[Ignore("getting CI working")]
|
||||||
internal class TestCaseTaikoPlayfield : OsuTestCase
|
internal class TestCaseTaikoPlayfield : OsuTestCase
|
||||||
{
|
{
|
||||||
private const double default_duration = 1000;
|
private const double default_duration = 1000;
|
||||||
@ -67,7 +68,7 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
HitObjects = new List<HitObject> { new CentreHit() },
|
HitObjects = new List<HitObject> { new CentreHit() },
|
||||||
BeatmapInfo = new BeatmapInfo
|
BeatmapInfo = new BeatmapInfo
|
||||||
{
|
{
|
||||||
Difficulty = new BeatmapDifficulty(),
|
BaseDifficulty = new BeatmapDifficulty(),
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
Artist = @"Unknown",
|
Artist = @"Unknown",
|
||||||
|
@ -63,7 +63,7 @@ namespace osu.Game.Rulesets.Taiko.UI
|
|||||||
StartTime = time,
|
StartTime = time,
|
||||||
};
|
};
|
||||||
|
|
||||||
barLine.ApplyDefaults(Beatmap.ControlPointInfo, Beatmap.BeatmapInfo.Difficulty);
|
barLine.ApplyDefaults(Beatmap.ControlPointInfo, Beatmap.BeatmapInfo.BaseDifficulty);
|
||||||
|
|
||||||
bool isMajor = currentBeat % (int)currentPoint.TimeSignature == 0;
|
bool isMajor = currentBeat % (int)currentPoint.TimeSignature == 0;
|
||||||
Playfield.Add(isMajor ? new DrawableBarLineMajor(barLine) : new DrawableBarLine(barLine));
|
Playfield.Add(isMajor ? new DrawableBarLineMajor(barLine) : new DrawableBarLine(barLine));
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
<assemblyIdentity name="SharpCompress" publicKeyToken="afb0a02973931d96" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
<bindingRedirect oldVersion="0.0.0.0-0.18.1.0" newVersion="0.18.1.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -35,11 +35,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\OpenTK.3.0.0-git00009\lib\net20\OpenTK.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
@ -106,12 +106,12 @@
|
|||||||
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
<Project>{C76BF5B3-985E-4D39-95FE-97C9C879B83A}</Project>
|
||||||
<Name>osu.Framework</Name>
|
<Name>osu.Framework</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -85,7 +85,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
|
using (var stream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
|
||||||
{
|
{
|
||||||
var beatmap = decoder.Decode(new StreamReader(stream));
|
var beatmap = decoder.Decode(new StreamReader(stream));
|
||||||
var difficulty = beatmap.BeatmapInfo.Difficulty;
|
var difficulty = beatmap.BeatmapInfo.BaseDifficulty;
|
||||||
Assert.AreEqual(6.5f, difficulty.DrainRate);
|
Assert.AreEqual(6.5f, difficulty.DrainRate);
|
||||||
Assert.AreEqual(4, difficulty.CircleSize);
|
Assert.AreEqual(4, difficulty.CircleSize);
|
||||||
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
Assert.AreEqual(8, difficulty.OverallDifficulty);
|
||||||
|
@ -41,13 +41,15 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[NonParallelizable]
|
||||||
|
[Ignore("Binding IPC on Appveyor isn't working (port in use). Need to figure out why")]
|
||||||
public void TestImportOverIPC()
|
public void TestImportOverIPC()
|
||||||
{
|
{
|
||||||
using (HeadlessGameHost host = new HeadlessGameHost("host", true))
|
using (HeadlessGameHost host = new HeadlessGameHost("host", true))
|
||||||
using (HeadlessGameHost client = new HeadlessGameHost("client", true))
|
using (HeadlessGameHost client = new HeadlessGameHost("client", true))
|
||||||
{
|
{
|
||||||
Assert.IsTrue(host.IsPrimaryInstance);
|
Assert.IsTrue(host.IsPrimaryInstance);
|
||||||
Assert.IsTrue(!client.IsPrimaryInstance);
|
Assert.IsFalse(client.IsPrimaryInstance);
|
||||||
|
|
||||||
var osu = loadOsu(host);
|
var osu = loadOsu(host);
|
||||||
|
|
||||||
@ -95,8 +97,6 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
|
|
||||||
private OsuGameBase loadOsu(GameHost host)
|
private OsuGameBase loadOsu(GameHost host)
|
||||||
{
|
{
|
||||||
host.Storage.DeleteDatabase(@"client");
|
|
||||||
|
|
||||||
var osu = new OsuGameBase();
|
var osu = new OsuGameBase();
|
||||||
Task.Run(() => host.Run(osu));
|
Task.Run(() => host.Run(osu));
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
//ensure we were stored to beatmap database backing...
|
//ensure we were stored to beatmap database backing...
|
||||||
Assert.IsTrue(resultSets.Count() == 1, $@"Incorrect result count found ({resultSets.Count()} but should be 1).");
|
Assert.IsTrue(resultSets.Count() == 1, $@"Incorrect result count found ({resultSets.Count()} but should be 1).");
|
||||||
|
|
||||||
Func<IEnumerable<BeatmapInfo>> queryBeatmaps = () => store.QueryBeatmaps(s => s.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0);
|
Func<IEnumerable<BeatmapInfo>> queryBeatmaps = () => store.QueryBeatmaps(s => s.BeatmapSet.OnlineBeatmapSetID == 241526 && s.BaseDifficultyID > 0);
|
||||||
Func<IEnumerable<BeatmapSetInfo>> queryBeatmapSets = () => store.QueryBeatmapSets(s => s.OnlineBeatmapSetID == 241526);
|
Func<IEnumerable<BeatmapSetInfo>> queryBeatmapSets = () => store.QueryBeatmapSets(s => s.OnlineBeatmapSetID == 241526);
|
||||||
|
|
||||||
//if we don't re-check here, the set will be inserted but the beatmaps won't be present yet.
|
//if we don't re-check here, the set will be inserted but the beatmaps won't be present yet.
|
||||||
@ -157,7 +157,7 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
|
|
||||||
private void waitForOrAssert(Func<bool> result, string failureMessage, int timeout = 60000)
|
private void waitForOrAssert(Func<bool> result, string failureMessage, int timeout = 60000)
|
||||||
{
|
{
|
||||||
Action waitAction = () => { while (!result()) Thread.Sleep(20); };
|
Action waitAction = () => { while (!result()) Thread.Sleep(200); };
|
||||||
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout), failureMessage);
|
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout), failureMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
osu.Game.Tests/Visual/TestCaseAllPlayers.cs
Normal file
10
osu.Game.Tests/Visual/TestCaseAllPlayers.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Visual
|
||||||
|
{
|
||||||
|
public class TestCaseAllPlayers : TestCasePlayer
|
||||||
|
{
|
||||||
|
public override string Description => @"Showing everything to play the game.";
|
||||||
|
}
|
||||||
|
}
|
@ -29,7 +29,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Source = "osu!lazer",
|
Source = "osu!lazer",
|
||||||
Tags = "this beatmap has all the metrics",
|
Tags = "this beatmap has all the metrics",
|
||||||
},
|
},
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 7,
|
CircleSize = 7,
|
||||||
DrainRate = 1,
|
DrainRate = 1,
|
||||||
@ -53,7 +53,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Source = "osu!lazer",
|
Source = "osu!lazer",
|
||||||
Tags = "this beatmap has ratings metrics but not retries or fails",
|
Tags = "this beatmap has ratings metrics but not retries or fails",
|
||||||
},
|
},
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 6,
|
CircleSize = 6,
|
||||||
DrainRate = 9,
|
DrainRate = 9,
|
||||||
@ -75,7 +75,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Source = "osu!lazer",
|
Source = "osu!lazer",
|
||||||
Tags = "this beatmap has retries and fails but no ratings",
|
Tags = "this beatmap has retries and fails but no ratings",
|
||||||
},
|
},
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 3.7f,
|
CircleSize = 3.7f,
|
||||||
DrainRate = 6,
|
DrainRate = 6,
|
||||||
@ -98,7 +98,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Source = "osu!lazer",
|
Source = "osu!lazer",
|
||||||
Tags = "this beatmap has no metrics",
|
Tags = "this beatmap has no metrics",
|
||||||
},
|
},
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 5,
|
CircleSize = 5,
|
||||||
DrainRate = 5,
|
DrainRate = 5,
|
@ -65,7 +65,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 1.36,
|
StarDifficulty = 1.36,
|
||||||
Version = @"BASIC",
|
Version = @"BASIC",
|
||||||
Ruleset = mania,
|
Ruleset = mania,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 4,
|
CircleSize = 4,
|
||||||
DrainRate = 6.5f,
|
DrainRate = 6.5f,
|
||||||
@ -93,7 +93,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 2.22,
|
StarDifficulty = 2.22,
|
||||||
Version = @"NOVICE",
|
Version = @"NOVICE",
|
||||||
Ruleset = mania,
|
Ruleset = mania,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 4,
|
CircleSize = 4,
|
||||||
DrainRate = 7,
|
DrainRate = 7,
|
||||||
@ -121,7 +121,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 3.49,
|
StarDifficulty = 3.49,
|
||||||
Version = @"ADVANCED",
|
Version = @"ADVANCED",
|
||||||
Ruleset = mania,
|
Ruleset = mania,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 4,
|
CircleSize = 4,
|
||||||
DrainRate = 7.5f,
|
DrainRate = 7.5f,
|
||||||
@ -149,7 +149,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 4.24,
|
StarDifficulty = 4.24,
|
||||||
Version = @"EXHAUST",
|
Version = @"EXHAUST",
|
||||||
Ruleset = mania,
|
Ruleset = mania,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 4,
|
CircleSize = 4,
|
||||||
DrainRate = 8,
|
DrainRate = 8,
|
||||||
@ -177,7 +177,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 5.26,
|
StarDifficulty = 5.26,
|
||||||
Version = @"GRAVITY",
|
Version = @"GRAVITY",
|
||||||
Ruleset = mania,
|
Ruleset = mania,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 4,
|
CircleSize = 4,
|
||||||
DrainRate = 8.5f,
|
DrainRate = 8.5f,
|
||||||
@ -239,7 +239,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 1.40,
|
StarDifficulty = 1.40,
|
||||||
Version = @"yzrin's Kantan",
|
Version = @"yzrin's Kantan",
|
||||||
Ruleset = taiko,
|
Ruleset = taiko,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 2,
|
CircleSize = 2,
|
||||||
DrainRate = 7,
|
DrainRate = 7,
|
||||||
@ -267,7 +267,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 2.23,
|
StarDifficulty = 2.23,
|
||||||
Version = @"Futsuu",
|
Version = @"Futsuu",
|
||||||
Ruleset = taiko,
|
Ruleset = taiko,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 2,
|
CircleSize = 2,
|
||||||
DrainRate = 6,
|
DrainRate = 6,
|
||||||
@ -295,7 +295,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 3.19,
|
StarDifficulty = 3.19,
|
||||||
Version = @"Muzukashii",
|
Version = @"Muzukashii",
|
||||||
Ruleset = taiko,
|
Ruleset = taiko,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 2,
|
CircleSize = 2,
|
||||||
DrainRate = 6,
|
DrainRate = 6,
|
||||||
@ -323,7 +323,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 3.97,
|
StarDifficulty = 3.97,
|
||||||
Version = @"Charlotte's Oni",
|
Version = @"Charlotte's Oni",
|
||||||
Ruleset = taiko,
|
Ruleset = taiko,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 5,
|
CircleSize = 5,
|
||||||
DrainRate = 6,
|
DrainRate = 6,
|
||||||
@ -351,7 +351,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
StarDifficulty = 5.08,
|
StarDifficulty = 5.08,
|
||||||
Version = @"Labyrinth Oni",
|
Version = @"Labyrinth Oni",
|
||||||
Ruleset = taiko,
|
Ruleset = taiko,
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
CircleSize = 5,
|
CircleSize = 5,
|
||||||
DrainRate = 5,
|
DrainRate = 5,
|
@ -49,7 +49,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
AddStep("Toggle", modSelect.ToggleVisibility);
|
AddStep("Toggle", modSelect.ToggleVisibility);
|
||||||
|
|
||||||
foreach (var ruleset in rulesets.AllRulesets)
|
foreach (var ruleset in rulesets.AvailableRulesets)
|
||||||
AddStep(ruleset.CreateInstance().Description, () => modSelect.Ruleset.Value = ruleset);
|
AddStep(ruleset.CreateInstance().Description, () => modSelect.Ruleset.Value = ruleset);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -66,13 +66,11 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
progressingNotifications.RemoveAll(n => n.State == ProgressNotificationState.Completed);
|
progressingNotifications.RemoveAll(n => n.State == ProgressNotificationState.Completed);
|
||||||
|
|
||||||
while (progressingNotifications.Count(n => n.State == ProgressNotificationState.Active) < 3)
|
if (progressingNotifications.Count(n => n.State == ProgressNotificationState.Active) < 3)
|
||||||
{
|
{
|
||||||
var p = progressingNotifications.FirstOrDefault(n => n.IsAlive && n.State == ProgressNotificationState.Queued);
|
var p = progressingNotifications.FirstOrDefault(n => n.IsAlive && n.State == ProgressNotificationState.Queued);
|
||||||
if (p == null)
|
if (p != null)
|
||||||
break;
|
p.State = ProgressNotificationState.Active;
|
||||||
|
|
||||||
p.State = ProgressNotificationState.Active;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var n in progressingNotifications.FindAll(n => n.State == ProgressNotificationState.Active))
|
foreach (var n in progressingNotifications.FindAll(n => n.State == ProgressNotificationState.Active))
|
@ -1,12 +1,16 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.MathUtils;
|
using osu.Framework.MathUtils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.IO;
|
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Game.Screens.Select.Filter;
|
using osu.Game.Screens.Select.Filter;
|
||||||
@ -24,8 +28,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
private DependencyContainer dependencies;
|
private DependencyContainer dependencies;
|
||||||
|
|
||||||
private FileStore files;
|
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
|
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -37,12 +39,13 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
var storage = new TestStorage(@"TestCasePlaySongSelect");
|
var storage = new TestStorage(@"TestCasePlaySongSelect");
|
||||||
|
|
||||||
var backingDatabase = storage.GetDatabase(@"client");
|
// this is by no means clean. should be replacing inside of OsuGameBase somehow.
|
||||||
backingDatabase.CreateTable<StoreVersion>();
|
var context = new OsuDbContext();
|
||||||
|
|
||||||
dependencies.Cache(rulesets = new RulesetStore(backingDatabase));
|
Func<OsuDbContext> contextFactory = () => context;
|
||||||
dependencies.Cache(files = new FileStore(backingDatabase, storage));
|
|
||||||
dependencies.Cache(manager = new BeatmapManager(storage, files, backingDatabase, rulesets, null));
|
dependencies.Cache(rulesets = new RulesetStore(contextFactory));
|
||||||
|
dependencies.Cache(manager = new BeatmapManager(storage, contextFactory, rulesets, null));
|
||||||
|
|
||||||
for (int i = 0; i < 100; i += 10)
|
for (int i = 0; i < 100; i += 10)
|
||||||
manager.Import(createTestBeatmapSet(i));
|
manager.Import(createTestBeatmapSet(i));
|
||||||
@ -61,7 +64,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
return new BeatmapSetInfo
|
return new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = 1234 + i,
|
OnlineBeatmapSetID = 1234 + i,
|
||||||
Hash = "d8e8fca2dc0f896fd7cb4cb0031ba249",
|
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = 1234 + i,
|
OnlineBeatmapSetID = 1234 + i,
|
||||||
@ -75,10 +78,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
OnlineBeatmapID = 1234 + i,
|
OnlineBeatmapID = 1234 + i,
|
||||||
Ruleset = rulesets.Query<RulesetInfo>().First(),
|
Ruleset = rulesets.AvailableRulesets.First(),
|
||||||
Path = "normal.osu",
|
Path = "normal.osu",
|
||||||
Version = "Normal",
|
Version = "Normal",
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
OverallDifficulty = 3.5f,
|
OverallDifficulty = 3.5f,
|
||||||
}
|
}
|
||||||
@ -86,10 +89,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
OnlineBeatmapID = 1235 + i,
|
OnlineBeatmapID = 1235 + i,
|
||||||
Ruleset = rulesets.Query<RulesetInfo>().First(),
|
Ruleset = rulesets.AvailableRulesets.First(),
|
||||||
Path = "hard.osu",
|
Path = "hard.osu",
|
||||||
Version = "Hard",
|
Version = "Hard",
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
OverallDifficulty = 5,
|
OverallDifficulty = 5,
|
||||||
}
|
}
|
||||||
@ -97,10 +100,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
new BeatmapInfo
|
new BeatmapInfo
|
||||||
{
|
{
|
||||||
OnlineBeatmapID = 1236 + i,
|
OnlineBeatmapID = 1236 + i,
|
||||||
Ruleset = rulesets.Query<RulesetInfo>().First(),
|
Ruleset = rulesets.AvailableRulesets.First(),
|
||||||
Path = "insane.osu",
|
Path = "insane.osu",
|
||||||
Version = "Insane",
|
Version = "Insane",
|
||||||
Difficulty = new BeatmapDifficulty
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
{
|
{
|
||||||
OverallDifficulty = 7,
|
OverallDifficulty = 7,
|
||||||
}
|
}
|
@ -48,7 +48,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
HitObjects = objects,
|
HitObjects = objects,
|
||||||
BeatmapInfo = new BeatmapInfo
|
BeatmapInfo = new BeatmapInfo
|
||||||
{
|
{
|
||||||
Difficulty = new BeatmapDifficulty(),
|
BaseDifficulty = new BeatmapDifficulty(),
|
||||||
Metadata = new BeatmapMetadata()
|
Metadata = new BeatmapMetadata()
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -4,10 +4,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.MathUtils;
|
using osu.Framework.Graphics.Cursor;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
{
|
{
|
||||||
@ -19,29 +18,37 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
FillFlowContainer flow;
|
FillFlowContainer flow;
|
||||||
|
|
||||||
Add(flow = new FillFlowContainer
|
Add(new ScrollContainer
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Size = new Vector2(0.5f),
|
Child = flow = new FillFlowContainer
|
||||||
Anchor = Anchor.Centre,
|
{
|
||||||
Origin = Anchor.Centre
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Direction = FillDirection.Full,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
int i = 50;
|
|
||||||
foreach (FontAwesome fa in Enum.GetValues(typeof(FontAwesome)))
|
foreach (FontAwesome fa in Enum.GetValues(typeof(FontAwesome)))
|
||||||
|
flow.Add(new Icon(fa));
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Icon : Container, IHasTooltip
|
||||||
|
{
|
||||||
|
public string TooltipText { get; }
|
||||||
|
|
||||||
|
public Icon(FontAwesome fa)
|
||||||
{
|
{
|
||||||
flow.Add(new SpriteIcon
|
TooltipText = fa.ToString();
|
||||||
|
|
||||||
|
AutoSizeAxes = Axes.Both;
|
||||||
|
Child = new SpriteIcon
|
||||||
{
|
{
|
||||||
Icon = fa,
|
Icon = fa,
|
||||||
Size = new Vector2(60),
|
Size = new Vector2(60),
|
||||||
Colour = new Color4(
|
};
|
||||||
Math.Max(0.5f, RNG.NextSingle()),
|
|
||||||
Math.Max(0.5f, RNG.NextSingle()),
|
|
||||||
Math.Max(0.5f, RNG.NextSingle()),
|
|
||||||
1)
|
|
||||||
});
|
|
||||||
|
|
||||||
if (i-- == 0) break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,6 +6,10 @@
|
|||||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
</configuration>
|
</configuration>
|
@ -39,14 +39,9 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="SQLite.Net">
|
<Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
|
||||||
<HintPath>$(SolutionDir)\packages\SQLite.Net.Core-PCL.3.1.1\lib\portable-win8+net45+wp8+wpa81+MonoAndroid1+MonoTouch1\SQLite.Net.dll</HintPath>
|
<HintPath>$(SolutionDir)\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll</HintPath>
|
||||||
</Reference>
|
<Private>True</Private>
|
||||||
<Reference Include="SQLite.Net.Platform.Win32">
|
|
||||||
<HintPath>$(SolutionDir)\packages\SQLite.Net-PCL.3.1.1\lib\net4\SQLite.Net.Platform.Win32.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SQLite.Net.Platform.Generic">
|
|
||||||
<HintPath>$(SolutionDir)\packages\SQLite.Net-PCL.3.1.1\lib\net40\SQLite.Net.Platform.Generic.dll</HintPath>
|
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -79,7 +74,7 @@
|
|||||||
<Name>osu.Game.Rulesets.Taiko</Name>
|
<Name>osu.Game.Rulesets.Taiko</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}</Project>
|
<Project>{2a66dd92-adb1-4994-89e2-c94e04acda0d}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj">
|
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj">
|
||||||
@ -95,6 +90,56 @@
|
|||||||
<Compile Include="Beatmaps\IO\ImportBeatmapTest.cs" />
|
<Compile Include="Beatmaps\IO\ImportBeatmapTest.cs" />
|
||||||
<Compile Include="Resources\Resource.cs" />
|
<Compile Include="Resources\Resource.cs" />
|
||||||
<Compile Include="Beatmaps\Formats\OsuLegacyDecoderTest.cs" />
|
<Compile Include="Beatmaps\Formats\OsuLegacyDecoderTest.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBeatmapDetailArea.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBeatmapDetails.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBeatmapOptionsOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBeatmapSetOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBeatSyncedContainer.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBreadcrumbs.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseBreakOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseChatDisplay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseContextMenu.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseDialogOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseDirect.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseDrawableRoom.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseDrawings.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseEditor.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseEditorComposeTimeline.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseEditorMenuBar.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseEditorSummaryTimeline.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseGamefield.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseGraph.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseIconButton.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseKeyConfiguration.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseKeyCounter.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseLeaderboard.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseMedalOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseMenuButtonSystem.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseMenuOverlays.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseMods.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseMusicController.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseNotificationOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseOnScreenDisplay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseAllPlayers.cs" />
|
||||||
|
<Compile Include="Visual\TestCasePlaySongSelect.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseReplay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseReplaySettingsOverlay.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseResults.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseRoomInspector.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseScoreCounter.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseScrollingPlayfield.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseSettings.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseSkipButton.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseSocial.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseSongProgress.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseStoryboard.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseTabControl.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseTextAwesome.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseTwoLayerButton.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseUserPanel.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseUserProfile.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseUserRanks.cs" />
|
||||||
|
<Compile Include="Visual\TestCaseWaveform.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Resources\Soleily - Renatus %28Gamu%29 [Insane].osu" />
|
<EmbeddedResource Include="Resources\Soleily - Renatus %28Gamu%29 [Insane].osu" />
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
-->
|
-->
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NUnit" version="3.8.1" targetFramework="net461" />
|
<package id="NUnit" version="3.8.1" targetFramework="net461" />
|
||||||
<package id="OpenTK" version="3.0.0-git00009" targetFramework="net461" />
|
<package id="OpenTK" version="3.0.0-git00009" targetFramework="net461" />
|
||||||
<package id="SQLite.Net.Core-PCL" version="3.1.1" targetFramework="net45" />
|
<package id="System.ValueTuple" version="4.4.0" targetFramework="net461" />
|
||||||
<package id="SQLite.Net-PCL" version="3.1.1" targetFramework="net45" />
|
|
||||||
</packages>
|
</packages>
|
@ -72,7 +72,7 @@ namespace osu.Game.Beatmaps
|
|||||||
AuthorString = @"Unknown Creator",
|
AuthorString = @"Unknown Creator",
|
||||||
},
|
},
|
||||||
Version = @"Normal",
|
Version = @"Normal",
|
||||||
Difficulty = new BeatmapDifficulty()
|
BaseDifficulty = new BeatmapDifficulty()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using SQLite.Net.Attributes;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
@ -12,8 +12,9 @@ namespace osu.Game.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const float DEFAULT_DIFFICULTY = 5;
|
public const float DEFAULT_DIFFICULTY = 5;
|
||||||
|
|
||||||
[PrimaryKey, AutoIncrement]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
public int ID { get; set; }
|
public int ID { get; set; }
|
||||||
|
|
||||||
public float DrainRate { get; set; } = DEFAULT_DIFFICULTY;
|
public float DrainRate { get; set; } = DEFAULT_DIFFICULTY;
|
||||||
public float CircleSize { get; set; } = DEFAULT_DIFFICULTY;
|
public float CircleSize { get; set; } = DEFAULT_DIFFICULTY;
|
||||||
public float OverallDifficulty { get; set; } = DEFAULT_DIFFICULTY;
|
public float OverallDifficulty { get; set; } = DEFAULT_DIFFICULTY;
|
||||||
|
@ -2,51 +2,57 @@
|
|||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Database;
|
||||||
using osu.Game.IO.Serialization;
|
using osu.Game.IO.Serialization;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using SQLite.Net.Attributes;
|
|
||||||
using SQLiteNetExtensions.Attributes;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
public class BeatmapInfo : IEquatable<BeatmapInfo>, IJsonSerializable
|
public class BeatmapInfo : IEquatable<BeatmapInfo>, IJsonSerializable, IHasPrimaryKey
|
||||||
{
|
{
|
||||||
[PrimaryKey, AutoIncrement]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
public int ID { get; set; }
|
public int ID { get; set; }
|
||||||
|
|
||||||
//TODO: should be in database
|
//TODO: should be in database
|
||||||
public int BeatmapVersion;
|
public int BeatmapVersion;
|
||||||
|
|
||||||
|
private int? onlineBeatmapID;
|
||||||
|
private int? onlineBeatmapSetID;
|
||||||
|
|
||||||
[JsonProperty("id")]
|
[JsonProperty("id")]
|
||||||
public int? OnlineBeatmapID { get; set; }
|
public int? OnlineBeatmapID
|
||||||
|
{
|
||||||
|
get { return onlineBeatmapID; }
|
||||||
|
set { onlineBeatmapID = value > 0 ? value : null; }
|
||||||
|
}
|
||||||
|
|
||||||
[JsonProperty("beatmapset_id")]
|
[JsonProperty("beatmapset_id")]
|
||||||
public int? OnlineBeatmapSetID { get; set; }
|
[NotMapped]
|
||||||
|
public int? OnlineBeatmapSetID
|
||||||
|
{
|
||||||
|
get { return onlineBeatmapSetID; }
|
||||||
|
set { onlineBeatmapSetID = value > 0 ? value : null; }
|
||||||
|
}
|
||||||
|
|
||||||
[ForeignKey(typeof(BeatmapSetInfo))]
|
|
||||||
public int BeatmapSetInfoID { get; set; }
|
public int BeatmapSetInfoID { get; set; }
|
||||||
|
|
||||||
[ManyToOne]
|
[Required]
|
||||||
public BeatmapSetInfo BeatmapSet { get; set; }
|
public BeatmapSetInfo BeatmapSet { get; set; }
|
||||||
|
|
||||||
[ForeignKey(typeof(BeatmapMetadata))]
|
|
||||||
public int BeatmapMetadataID { get; set; }
|
|
||||||
|
|
||||||
[OneToOne(CascadeOperations = CascadeOperation.All)]
|
|
||||||
public BeatmapMetadata Metadata { get; set; }
|
public BeatmapMetadata Metadata { get; set; }
|
||||||
|
|
||||||
[ForeignKey(typeof(BeatmapDifficulty)), NotNull]
|
|
||||||
public int BaseDifficultyID { get; set; }
|
public int BaseDifficultyID { get; set; }
|
||||||
|
|
||||||
[OneToOne(CascadeOperations = CascadeOperation.All)]
|
public BeatmapDifficulty BaseDifficulty { get; set; }
|
||||||
public BeatmapDifficulty Difficulty { get; set; }
|
|
||||||
|
|
||||||
[Ignore]
|
[NotMapped]
|
||||||
public BeatmapMetrics Metrics { get; set; }
|
public BeatmapMetrics Metrics { get; set; }
|
||||||
|
|
||||||
[Ignore]
|
[NotMapped]
|
||||||
public BeatmapOnlineInfo OnlineInfo { get; set; }
|
public BeatmapOnlineInfo OnlineInfo { get; set; }
|
||||||
|
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
@ -59,7 +65,6 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// MD5 is kept for legacy support (matching against replays, osu-web-10 etc.).
|
/// MD5 is kept for legacy support (matching against replays, osu-web-10 etc.).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Indexed]
|
|
||||||
[JsonProperty("file_md5")]
|
[JsonProperty("file_md5")]
|
||||||
public string MD5Hash { get; set; }
|
public string MD5Hash { get; set; }
|
||||||
|
|
||||||
@ -69,10 +74,8 @@ namespace osu.Game.Beatmaps
|
|||||||
public float StackLeniency { get; set; }
|
public float StackLeniency { get; set; }
|
||||||
public bool SpecialStyle { get; set; }
|
public bool SpecialStyle { get; set; }
|
||||||
|
|
||||||
[ForeignKey(typeof(RulesetInfo))]
|
|
||||||
public int RulesetID { get; set; }
|
public int RulesetID { get; set; }
|
||||||
|
|
||||||
[OneToOne(CascadeOperations = CascadeOperation.CascadeRead)]
|
|
||||||
public RulesetInfo Ruleset { get; set; }
|
public RulesetInfo Ruleset { get; set; }
|
||||||
|
|
||||||
public bool LetterboxInBreaks { get; set; }
|
public bool LetterboxInBreaks { get; set; }
|
||||||
@ -101,7 +104,7 @@ namespace osu.Game.Beatmaps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Ignore]
|
[NotMapped]
|
||||||
public int[] Bookmarks { get; set; } = new int[0];
|
public int[] Bookmarks { get; set; } = new int[0];
|
||||||
|
|
||||||
public double DistanceSpacing { get; set; }
|
public double DistanceSpacing { get; set; }
|
||||||
|
@ -6,7 +6,9 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Ionic.Zip;
|
using Ionic.Zip;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using osu.Framework.Audio.Track;
|
using osu.Framework.Audio.Track;
|
||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Graphics.Textures;
|
using osu.Framework.Graphics.Textures;
|
||||||
@ -15,14 +17,13 @@ using osu.Framework.Logging;
|
|||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game.Beatmaps.Formats;
|
using osu.Game.Beatmaps.Formats;
|
||||||
using osu.Game.Beatmaps.IO;
|
using osu.Game.Beatmaps.IO;
|
||||||
|
using osu.Game.Database;
|
||||||
using osu.Game.IO;
|
using osu.Game.IO;
|
||||||
using osu.Game.IPC;
|
using osu.Game.IPC;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using SQLite.Net;
|
|
||||||
using osu.Game.Online.API.Requests;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using osu.Game.Online.API;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
@ -58,9 +59,19 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
private readonly Storage storage;
|
private readonly Storage storage;
|
||||||
|
|
||||||
private readonly FileStore files;
|
private BeatmapStore createBeatmapStore(Func<OsuDbContext> context)
|
||||||
|
{
|
||||||
|
var store = new BeatmapStore(context);
|
||||||
|
store.BeatmapSetAdded += s => BeatmapSetAdded?.Invoke(s);
|
||||||
|
store.BeatmapSetRemoved += s => BeatmapSetRemoved?.Invoke(s);
|
||||||
|
store.BeatmapHidden += b => BeatmapHidden?.Invoke(b);
|
||||||
|
store.BeatmapRestored += b => BeatmapRestored?.Invoke(b);
|
||||||
|
return store;
|
||||||
|
}
|
||||||
|
|
||||||
private readonly SQLiteConnection connection;
|
private readonly Func<OsuDbContext> createContext;
|
||||||
|
|
||||||
|
private readonly FileStore files;
|
||||||
|
|
||||||
private readonly RulesetStore rulesets;
|
private readonly RulesetStore rulesets;
|
||||||
|
|
||||||
@ -83,22 +94,27 @@ namespace osu.Game.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Func<Storage> GetStableStorage { private get; set; }
|
public Func<Storage> GetStableStorage { private get; set; }
|
||||||
|
|
||||||
public BeatmapManager(Storage storage, FileStore files, SQLiteConnection connection, RulesetStore rulesets, APIAccess api, IIpcHost importHost = null)
|
public BeatmapManager(Storage storage, Func<OsuDbContext> context, RulesetStore rulesets, APIAccess api, IIpcHost importHost = null)
|
||||||
{
|
{
|
||||||
beatmaps = new BeatmapStore(connection);
|
createContext = context;
|
||||||
beatmaps.BeatmapSetAdded += s => BeatmapSetAdded?.Invoke(s);
|
importContext = new Lazy<OsuDbContext>(() =>
|
||||||
beatmaps.BeatmapSetRemoved += s => BeatmapSetRemoved?.Invoke(s);
|
{
|
||||||
beatmaps.BeatmapHidden += b => BeatmapHidden?.Invoke(b);
|
var c = createContext();
|
||||||
beatmaps.BeatmapRestored += b => BeatmapRestored?.Invoke(b);
|
c.Database.AutoTransactionsEnabled = false;
|
||||||
|
return c;
|
||||||
|
});
|
||||||
|
|
||||||
this.storage = storage;
|
beatmaps = createBeatmapStore(context);
|
||||||
this.files = files;
|
files = new FileStore(context, storage);
|
||||||
this.connection = connection;
|
|
||||||
|
this.storage = files.Storage;
|
||||||
this.rulesets = rulesets;
|
this.rulesets = rulesets;
|
||||||
this.api = api;
|
this.api = api;
|
||||||
|
|
||||||
if (importHost != null)
|
if (importHost != null)
|
||||||
ipc = new BeatmapIPCChannel(importHost, this);
|
ipc = new BeatmapIPCChannel(importHost, this);
|
||||||
|
|
||||||
|
beatmaps.Cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -156,7 +172,7 @@ namespace osu.Game.Beatmaps
|
|||||||
notification.State = ProgressNotificationState.Completed;
|
notification.State = ProgressNotificationState.Completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly object importLock = new object();
|
private readonly Lazy<OsuDbContext> importContext;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Import a beatmap from an <see cref="ArchiveReader"/>.
|
/// Import a beatmap from an <see cref="ArchiveReader"/>.
|
||||||
@ -164,13 +180,29 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <param name="archiveReader">The beatmap to be imported.</param>
|
/// <param name="archiveReader">The beatmap to be imported.</param>
|
||||||
public BeatmapSetInfo Import(ArchiveReader archiveReader)
|
public BeatmapSetInfo Import(ArchiveReader archiveReader)
|
||||||
{
|
{
|
||||||
BeatmapSetInfo set = null;
|
|
||||||
|
|
||||||
// let's only allow one concurrent import at a time for now.
|
// let's only allow one concurrent import at a time for now.
|
||||||
lock (importLock)
|
lock (importContext)
|
||||||
connection.RunInTransaction(() => Import(set = importToStorage(archiveReader)));
|
{
|
||||||
|
var context = importContext.Value;
|
||||||
|
|
||||||
return set;
|
using (var transaction = context.BeginTransaction())
|
||||||
|
{
|
||||||
|
// create local stores so we can isolate and thread safely, and share a context/transaction.
|
||||||
|
var iFiles = new FileStore(() => context, storage);
|
||||||
|
var iBeatmaps = createBeatmapStore(() => context);
|
||||||
|
|
||||||
|
BeatmapSetInfo set = importToStorage(iFiles, iBeatmaps, archiveReader);
|
||||||
|
|
||||||
|
if (set.ID == 0)
|
||||||
|
{
|
||||||
|
iBeatmaps.Add(set);
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.SaveChanges(transaction);
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -182,7 +214,7 @@ namespace osu.Game.Beatmaps
|
|||||||
// If we have an ID then we already exist in the database.
|
// If we have an ID then we already exist in the database.
|
||||||
if (beatmapSetInfo.ID != 0) return;
|
if (beatmapSetInfo.ID != 0) return;
|
||||||
|
|
||||||
beatmaps.Add(beatmapSetInfo);
|
createBeatmapStore(createContext).Add(beatmapSetInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -213,11 +245,17 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
request.Success += data =>
|
request.Success += data =>
|
||||||
{
|
{
|
||||||
downloadNotification.State = ProgressNotificationState.Completed;
|
downloadNotification.Text = $"Importing {beatmapSetInfo.Metadata.Artist} - {beatmapSetInfo.Metadata.Title}";
|
||||||
|
|
||||||
using (var stream = new MemoryStream(data))
|
Task.Factory.StartNew(() =>
|
||||||
using (var archive = new OszArchiveReader(stream))
|
{
|
||||||
Import(archive);
|
// This gets scheduled back to the update thread, but we want the import to run in the background.
|
||||||
|
using (var stream = new MemoryStream(data))
|
||||||
|
using (var archive = new OszArchiveReader(stream))
|
||||||
|
Import(archive);
|
||||||
|
|
||||||
|
downloadNotification.State = ProgressNotificationState.Completed;
|
||||||
|
}, TaskCreationOptions.LongRunning);
|
||||||
|
|
||||||
currentDownloads.Remove(request);
|
currentDownloads.Remove(request);
|
||||||
};
|
};
|
||||||
@ -241,7 +279,7 @@ namespace osu.Game.Beatmaps
|
|||||||
PostNotification?.Invoke(downloadNotification);
|
PostNotification?.Invoke(downloadNotification);
|
||||||
|
|
||||||
// don't run in the main api queue as this is a long-running task.
|
// don't run in the main api queue as this is a long-running task.
|
||||||
Task.Run(() => request.Perform(api));
|
Task.Factory.StartNew(() => request.Perform(api), TaskCreationOptions.LongRunning);
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
@ -260,10 +298,31 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <param name="beatmapSet">The beatmap set to delete.</param>
|
/// <param name="beatmapSet">The beatmap set to delete.</param>
|
||||||
public void Delete(BeatmapSetInfo beatmapSet)
|
public void Delete(BeatmapSetInfo beatmapSet)
|
||||||
{
|
{
|
||||||
if (!beatmaps.Delete(beatmapSet)) return;
|
lock (importContext)
|
||||||
|
{
|
||||||
|
var context = importContext.Value;
|
||||||
|
|
||||||
if (!beatmapSet.Protected)
|
using (var transaction = context.BeginTransaction())
|
||||||
files.Dereference(beatmapSet.Files.Select(f => f.FileInfo).ToArray());
|
{
|
||||||
|
context.ChangeTracker.AutoDetectChangesEnabled = false;
|
||||||
|
|
||||||
|
// re-fetch the beatmap set on the import context.
|
||||||
|
beatmapSet = context.BeatmapSetInfo.Include(s => s.Files).ThenInclude(f => f.FileInfo).First(s => s.ID == beatmapSet.ID);
|
||||||
|
|
||||||
|
// create local stores so we can isolate and thread safely, and share a context/transaction.
|
||||||
|
var iFiles = new FileStore(() => context, storage);
|
||||||
|
var iBeatmaps = createBeatmapStore(() => context);
|
||||||
|
|
||||||
|
if (iBeatmaps.Delete(beatmapSet))
|
||||||
|
{
|
||||||
|
if (!beatmapSet.Protected)
|
||||||
|
iFiles.Dereference(beatmapSet.Files.Select(f => f.FileInfo).ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
context.ChangeTracker.AutoDetectChangesEnabled = true;
|
||||||
|
context.SaveChanges(transaction);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -283,7 +342,7 @@ namespace osu.Game.Beatmaps
|
|||||||
/// Is a no-op for already usable beatmaps.
|
/// Is a no-op for already usable beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="beatmapSet">The beatmap to restore.</param>
|
/// <param name="beatmapSet">The beatmap to restore.</param>
|
||||||
public void Undelete(BeatmapSetInfo beatmapSet)
|
private void undelete(BeatmapStore beatmaps, FileStore files, BeatmapSetInfo beatmapSet)
|
||||||
{
|
{
|
||||||
if (!beatmaps.Undelete(beatmapSet)) return;
|
if (!beatmaps.Undelete(beatmapSet)) return;
|
||||||
|
|
||||||
@ -302,9 +361,6 @@ namespace osu.Game.Beatmaps
|
|||||||
if (beatmapInfo == null || beatmapInfo == DefaultBeatmap?.BeatmapInfo)
|
if (beatmapInfo == null || beatmapInfo == DefaultBeatmap?.BeatmapInfo)
|
||||||
return DefaultBeatmap;
|
return DefaultBeatmap;
|
||||||
|
|
||||||
lock (beatmaps)
|
|
||||||
beatmaps.Populate(beatmapInfo);
|
|
||||||
|
|
||||||
if (beatmapInfo.BeatmapSet == null)
|
if (beatmapInfo.BeatmapSet == null)
|
||||||
throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetInfoID} is not in the local database.");
|
throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetInfoID} is not in the local database.");
|
||||||
|
|
||||||
@ -318,32 +374,12 @@ namespace osu.Game.Beatmaps
|
|||||||
return working;
|
return working;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reset the manager to an empty state.
|
|
||||||
/// </summary>
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
lock (beatmaps)
|
|
||||||
beatmaps.Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Perform a lookup query on available <see cref="BeatmapSetInfo"/>s.
|
/// Perform a lookup query on available <see cref="BeatmapSetInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query.</param>
|
/// <param name="query">The query.</param>
|
||||||
/// <returns>The first result for the provided query, or null if no results were found.</returns>
|
/// <returns>The first result for the provided query, or null if no results were found.</returns>
|
||||||
public BeatmapSetInfo QueryBeatmapSet(Func<BeatmapSetInfo, bool> query)
|
public BeatmapSetInfo QueryBeatmapSet(Expression<Func<BeatmapSetInfo, bool>> query) => beatmaps.BeatmapSets.AsNoTracking().FirstOrDefault(query);
|
||||||
{
|
|
||||||
lock (beatmaps)
|
|
||||||
{
|
|
||||||
BeatmapSetInfo set = beatmaps.Query<BeatmapSetInfo>().FirstOrDefault(query);
|
|
||||||
|
|
||||||
if (set != null)
|
|
||||||
beatmaps.Populate(set);
|
|
||||||
|
|
||||||
return set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Refresh an existing instance of a <see cref="BeatmapSetInfo"/> from the store.
|
/// Refresh an existing instance of a <see cref="BeatmapSetInfo"/> from the store.
|
||||||
@ -357,35 +393,21 @@ namespace osu.Game.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query.</param>
|
/// <param name="query">The query.</param>
|
||||||
/// <returns>Results from the provided query.</returns>
|
/// <returns>Results from the provided query.</returns>
|
||||||
public List<BeatmapSetInfo> QueryBeatmapSets(Expression<Func<BeatmapSetInfo, bool>> query)
|
public IEnumerable<BeatmapSetInfo> QueryBeatmapSets(Expression<Func<BeatmapSetInfo, bool>> query) => beatmaps.BeatmapSets.AsNoTracking().Where(query);
|
||||||
{
|
|
||||||
return beatmaps.QueryAndPopulate(query);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Perform a lookup query on available <see cref="BeatmapInfo"/>s.
|
/// Perform a lookup query on available <see cref="BeatmapInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query.</param>
|
/// <param name="query">The query.</param>
|
||||||
/// <returns>The first result for the provided query, or null if no results were found.</returns>
|
/// <returns>The first result for the provided query, or null if no results were found.</returns>
|
||||||
public BeatmapInfo QueryBeatmap(Func<BeatmapInfo, bool> query)
|
public BeatmapInfo QueryBeatmap(Expression<Func<BeatmapInfo, bool>> query) => beatmaps.Beatmaps.AsNoTracking().FirstOrDefault(query);
|
||||||
{
|
|
||||||
BeatmapInfo set = beatmaps.Query<BeatmapInfo>().FirstOrDefault(query);
|
|
||||||
|
|
||||||
if (set != null)
|
|
||||||
beatmaps.Populate(set);
|
|
||||||
|
|
||||||
return set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Perform a lookup query on available <see cref="BeatmapInfo"/>s.
|
/// Perform a lookup query on available <see cref="BeatmapInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query.</param>
|
/// <param name="query">The query.</param>
|
||||||
/// <returns>Results from the provided query.</returns>
|
/// <returns>Results from the provided query.</returns>
|
||||||
public List<BeatmapInfo> QueryBeatmaps(Expression<Func<BeatmapInfo, bool>> query)
|
public IEnumerable<BeatmapInfo> QueryBeatmaps(Expression<Func<BeatmapInfo, bool>> query) => beatmaps.Beatmaps.AsNoTracking().Where(query);
|
||||||
{
|
|
||||||
lock (beatmaps) return beatmaps.QueryAndPopulate(query);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates an <see cref="ArchiveReader"/> from a valid storage path.
|
/// Creates an <see cref="ArchiveReader"/> from a valid storage path.
|
||||||
@ -395,9 +417,9 @@ namespace osu.Game.Beatmaps
|
|||||||
private ArchiveReader getReaderFrom(string path)
|
private ArchiveReader getReaderFrom(string path)
|
||||||
{
|
{
|
||||||
if (ZipFile.IsZipFile(path))
|
if (ZipFile.IsZipFile(path))
|
||||||
|
// ReSharper disable once InconsistentlySynchronizedField
|
||||||
return new OszArchiveReader(storage.GetStream(path));
|
return new OszArchiveReader(storage.GetStream(path));
|
||||||
else
|
return new LegacyFilesystemReader(path);
|
||||||
return new LegacyFilesystemReader(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -406,7 +428,7 @@ namespace osu.Game.Beatmaps
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="reader">The beatmap archive to be read.</param>
|
/// <param name="reader">The beatmap archive to be read.</param>
|
||||||
/// <returns>The imported beatmap, or an existing instance if it is already present.</returns>
|
/// <returns>The imported beatmap, or an existing instance if it is already present.</returns>
|
||||||
private BeatmapSetInfo importToStorage(ArchiveReader reader)
|
private BeatmapSetInfo importToStorage(FileStore files, BeatmapStore beatmaps, ArchiveReader reader)
|
||||||
{
|
{
|
||||||
// let's make sure there are actually .osu files to import.
|
// let's make sure there are actually .osu files to import.
|
||||||
string mapName = reader.Filenames.FirstOrDefault(f => f.EndsWith(".osu"));
|
string mapName = reader.Filenames.FirstOrDefault(f => f.EndsWith(".osu"));
|
||||||
@ -422,13 +444,11 @@ namespace osu.Game.Beatmaps
|
|||||||
var hash = hashable.ComputeSHA2Hash();
|
var hash = hashable.ComputeSHA2Hash();
|
||||||
|
|
||||||
// check if this beatmap has already been imported and exit early if so.
|
// check if this beatmap has already been imported and exit early if so.
|
||||||
BeatmapSetInfo beatmapSet;
|
var beatmapSet = beatmaps.BeatmapSets.FirstOrDefault(b => b.Hash == hash);
|
||||||
lock (beatmaps)
|
|
||||||
beatmapSet = beatmaps.QueryAndPopulate<BeatmapSetInfo>(b => b.Hash == hash).FirstOrDefault();
|
|
||||||
|
|
||||||
if (beatmapSet != null)
|
if (beatmapSet != null)
|
||||||
{
|
{
|
||||||
Undelete(beatmapSet);
|
undelete(beatmaps, files, beatmapSet);
|
||||||
|
|
||||||
// ensure all files are present and accessible
|
// ensure all files are present and accessible
|
||||||
foreach (var f in beatmapSet.Files)
|
foreach (var f in beatmapSet.Files)
|
||||||
@ -438,6 +458,8 @@ namespace osu.Game.Beatmaps
|
|||||||
files.Add(s, false);
|
files.Add(s, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: delete any files which shouldn't exist any more.
|
||||||
|
|
||||||
return beatmapSet;
|
return beatmapSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,10 +509,11 @@ namespace osu.Game.Beatmaps
|
|||||||
// TODO: Diff beatmap metadata with set metadata and leave it here if necessary
|
// TODO: Diff beatmap metadata with set metadata and leave it here if necessary
|
||||||
beatmap.BeatmapInfo.Metadata = null;
|
beatmap.BeatmapInfo.Metadata = null;
|
||||||
|
|
||||||
|
RulesetInfo ruleset = rulesets.GetRuleset(beatmap.BeatmapInfo.RulesetID);
|
||||||
|
|
||||||
// TODO: this should be done in a better place once we actually need to dynamically update it.
|
// TODO: this should be done in a better place once we actually need to dynamically update it.
|
||||||
beatmap.BeatmapInfo.Ruleset = rulesets.Query<RulesetInfo>().FirstOrDefault(r => r.ID == beatmap.BeatmapInfo.RulesetID);
|
beatmap.BeatmapInfo.Ruleset = ruleset;
|
||||||
beatmap.BeatmapInfo.StarDifficulty = rulesets.Query<RulesetInfo>().FirstOrDefault(r => r.ID == beatmap.BeatmapInfo.RulesetID)?.CreateInstance()?.CreateDifficultyCalculator(beatmap)
|
beatmap.BeatmapInfo.StarDifficulty = ruleset?.CreateInstance()?.CreateDifficultyCalculator(beatmap).Calculate() ?? 0;
|
||||||
.Calculate() ?? 0;
|
|
||||||
|
|
||||||
beatmapSet.Beatmaps.Add(beatmap.BeatmapInfo);
|
beatmapSet.Beatmaps.Add(beatmap.BeatmapInfo);
|
||||||
}
|
}
|
||||||
@ -502,17 +525,10 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a list of all usable <see cref="BeatmapSetInfo"/>s.
|
/// Returns a list of all usable <see cref="BeatmapSetInfo"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="populate">Whether returned objects should be pre-populated with all data.</param>
|
|
||||||
/// <returns>A list of available <see cref="BeatmapSetInfo"/>.</returns>
|
/// <returns>A list of available <see cref="BeatmapSetInfo"/>.</returns>
|
||||||
public List<BeatmapSetInfo> GetAllUsableBeatmapSets(bool populate = true)
|
public List<BeatmapSetInfo> GetAllUsableBeatmapSets()
|
||||||
{
|
{
|
||||||
lock (beatmaps)
|
return beatmaps.BeatmapSets.Where(s => !s.DeletePending).ToList();
|
||||||
{
|
|
||||||
if (populate)
|
|
||||||
return beatmaps.QueryAndPopulate<BeatmapSetInfo>(b => !b.DeletePending).ToList();
|
|
||||||
else
|
|
||||||
return beatmaps.Query<BeatmapSetInfo>(b => !b.DeletePending).ToList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class BeatmapManagerWorkingBeatmap : WorkingBeatmap
|
protected class BeatmapManagerWorkingBeatmap : WorkingBeatmap
|
||||||
@ -547,7 +563,10 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
return beatmap;
|
return beatmap;
|
||||||
}
|
}
|
||||||
catch { return null; }
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string getPathForFile(string filename) => BeatmapSetInfo.Files.First(f => string.Equals(f.Filename, filename, StringComparison.InvariantCultureIgnoreCase)).FileInfo.StoragePath;
|
private string getPathForFile(string filename) => BeatmapSetInfo.Files.First(f => string.Equals(f.Filename, filename, StringComparison.InvariantCultureIgnoreCase)).FileInfo.StoragePath;
|
||||||
@ -561,7 +580,10 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
return new TextureStore(new RawTextureLoaderStore(store), false).Get(getPathForFile(Metadata.BackgroundFile));
|
return new TextureStore(new RawTextureLoaderStore(store), false).Get(getPathForFile(Metadata.BackgroundFile));
|
||||||
}
|
}
|
||||||
catch { return null; }
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Track GetTrack()
|
protected override Track GetTrack()
|
||||||
@ -571,7 +593,10 @@ namespace osu.Game.Beatmaps
|
|||||||
var trackData = store.GetStream(getPathForFile(Metadata.AudioFile));
|
var trackData = store.GetStream(getPathForFile(Metadata.AudioFile));
|
||||||
return trackData == null ? null : new TrackBass(trackData);
|
return trackData == null ? null : new TrackBass(trackData);
|
||||||
}
|
}
|
||||||
catch { return new TrackVirtual(); }
|
catch
|
||||||
|
{
|
||||||
|
return new TrackVirtual();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Waveform GetWaveform() => new Waveform(store.GetStream(getPathForFile(Metadata.AudioFile)));
|
protected override Waveform GetWaveform() => new Waveform(store.GetStream(getPathForFile(Metadata.AudioFile)));
|
||||||
@ -595,9 +620,9 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
public void DeleteAll()
|
public void DeleteAll()
|
||||||
{
|
{
|
||||||
var maps = GetAllUsableBeatmapSets().ToArray();
|
var maps = GetAllUsableBeatmapSets();
|
||||||
|
|
||||||
if (maps.Length == 0) return;
|
if (maps.Count == 0) return;
|
||||||
|
|
||||||
var notification = new ProgressNotification
|
var notification = new ProgressNotification
|
||||||
{
|
{
|
||||||
@ -615,8 +640,8 @@ namespace osu.Game.Beatmaps
|
|||||||
// user requested abort
|
// user requested abort
|
||||||
return;
|
return;
|
||||||
|
|
||||||
notification.Text = $"Deleting ({i} of {maps.Length})";
|
notification.Text = $"Deleting ({i} of {maps.Count})";
|
||||||
notification.Progress = (float)++i / maps.Length;
|
notification.Progress = (float)++i / maps.Count;
|
||||||
Delete(b);
|
Delete(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +1,37 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using SQLite.Net.Attributes;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
public class BeatmapMetadata
|
public class BeatmapMetadata
|
||||||
{
|
{
|
||||||
[PrimaryKey, AutoIncrement]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
public int ID { get; set; }
|
public int ID { get; set; }
|
||||||
|
|
||||||
public int? OnlineBeatmapSetID { get; set; }
|
private int? onlineBeatmapSetID;
|
||||||
|
|
||||||
|
[NotMapped]
|
||||||
|
[JsonProperty(@"id")]
|
||||||
|
public int? OnlineBeatmapSetID
|
||||||
|
{
|
||||||
|
get { return onlineBeatmapSetID; }
|
||||||
|
set { onlineBeatmapSetID = value > 0 ? value : null; }
|
||||||
|
}
|
||||||
|
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
public string TitleUnicode { get; set; }
|
public string TitleUnicode { get; set; }
|
||||||
public string Artist { get; set; }
|
public string Artist { get; set; }
|
||||||
public string ArtistUnicode { get; set; }
|
public string ArtistUnicode { get; set; }
|
||||||
|
|
||||||
|
public List<BeatmapInfo> Beatmaps { get; set; }
|
||||||
|
public List<BeatmapSetInfo> BeatmapSets { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper property to deserialize a username to <see cref="User"/>.
|
/// Helper property to deserialize a username to <see cref="User"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1,27 +1,24 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using osu.Game.IO;
|
using osu.Game.IO;
|
||||||
using SQLite.Net.Attributes;
|
|
||||||
using SQLiteNetExtensions.Attributes;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
public class BeatmapSetFileInfo
|
public class BeatmapSetFileInfo
|
||||||
{
|
{
|
||||||
[PrimaryKey, AutoIncrement]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
public int ID { get; set; }
|
public int ID { get; set; }
|
||||||
|
|
||||||
[ForeignKey(typeof(BeatmapSetInfo)), NotNull]
|
|
||||||
public int BeatmapSetInfoID { get; set; }
|
public int BeatmapSetInfoID { get; set; }
|
||||||
|
|
||||||
[ForeignKey(typeof(FileInfo)), NotNull]
|
|
||||||
public int FileInfoID { get; set; }
|
public int FileInfoID { get; set; }
|
||||||
|
|
||||||
[OneToOne(CascadeOperations = CascadeOperation.CascadeRead)]
|
|
||||||
public FileInfo FileInfo { get; set; }
|
public FileInfo FileInfo { get; set; }
|
||||||
|
|
||||||
[NotNull]
|
[Required]
|
||||||
public string Filename { get; set; }
|
public string Filename { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,41 +2,35 @@
|
|||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using SQLite.Net.Attributes;
|
using osu.Game.Database;
|
||||||
using SQLiteNetExtensions.Attributes;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
public class BeatmapSetInfo
|
public class BeatmapSetInfo : IHasPrimaryKey
|
||||||
{
|
{
|
||||||
[PrimaryKey, AutoIncrement]
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
public int ID { get; set; }
|
public int ID { get; set; }
|
||||||
|
|
||||||
public int? OnlineBeatmapSetID { get; set; }
|
public int? OnlineBeatmapSetID { get; set; }
|
||||||
|
|
||||||
[OneToOne(CascadeOperations = CascadeOperation.All)]
|
|
||||||
public BeatmapMetadata Metadata { get; set; }
|
public BeatmapMetadata Metadata { get; set; }
|
||||||
|
|
||||||
[NotNull, ForeignKey(typeof(BeatmapMetadata))]
|
|
||||||
public int BeatmapMetadataID { get; set; }
|
|
||||||
|
|
||||||
[OneToMany(CascadeOperations = CascadeOperation.All)]
|
|
||||||
public List<BeatmapInfo> Beatmaps { get; set; }
|
public List<BeatmapInfo> Beatmaps { get; set; }
|
||||||
|
|
||||||
[Ignore]
|
[NotMapped]
|
||||||
public BeatmapSetOnlineInfo OnlineInfo { get; set; }
|
public BeatmapSetOnlineInfo OnlineInfo { get; set; }
|
||||||
|
|
||||||
public double MaxStarDifficulty => Beatmaps.Max(b => b.StarDifficulty);
|
public double MaxStarDifficulty => Beatmaps.Max(b => b.StarDifficulty);
|
||||||
|
|
||||||
[Indexed]
|
[NotMapped]
|
||||||
public bool DeletePending { get; set; }
|
public bool DeletePending { get; set; }
|
||||||
|
|
||||||
public string Hash { get; set; }
|
public string Hash { get; set; }
|
||||||
|
|
||||||
public string StoryboardFile => Files.FirstOrDefault(f => f.Filename.EndsWith(".osb"))?.Filename;
|
public string StoryboardFile => Files.FirstOrDefault(f => f.Filename.EndsWith(".osb"))?.Filename;
|
||||||
|
|
||||||
[OneToMany(CascadeOperations = CascadeOperation.All)]
|
|
||||||
public List<BeatmapSetFileInfo> Files { get; set; }
|
public List<BeatmapSetFileInfo> Files { get; set; }
|
||||||
|
|
||||||
public bool Protected { get; set; }
|
public bool Protected { get; set; }
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user