mirror of
https://github.com/ppy/osu.git
synced 2025-02-22 04:32:55 +08:00
Merge remote-tracking branch 'upstream/master' into peppy-improve-volume-controls
This commit is contained in:
commit
2cc7953421
@ -1,21 +1,17 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="RulesetTests (catch)" type="DotNetProject" factoryName=".NET Project">
|
<configuration default="false" name="RulesetTests (catch)" type="DotNetProject" factoryName=".NET Project">
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests/bin/Debug/net471/osu.Game.Rulesets.Catch.Tests.exe" />
|
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Catch.Tests.dll" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
<option name="PROGRAM_PARAMETERS" value="" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests" />
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
<option name="PASS_PARENT_ENVS" value="1" />
|
||||||
<envs>
|
|
||||||
<env name="ASPNETCORE_ENVIRONMENT" value="Development" />
|
|
||||||
<env name="ASPNETCORE_URLS" value="http://localhost:5000" />
|
|
||||||
</envs>
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj" />
|
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj" />
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
<option name="PROJECT_TFM" value=".NETCoreApp,Version=v2.1" />
|
||||||
<browser url="http://localhost:5000" />
|
<browser url="http://localhost:5000" />
|
||||||
<method />
|
<method />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,21 +1,17 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="RulesetTests (mania)" type="DotNetProject" factoryName=".NET Project">
|
<configuration default="false" name="RulesetTests (mania)" type="DotNetProject" factoryName=".NET Project">
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests/bin/Debug/net471/osu.Game.Rulesets.Mania.Tests.exe" />
|
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Mania.Tests.dll" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
<option name="PROGRAM_PARAMETERS" value="" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests" />
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
<option name="PASS_PARENT_ENVS" value="1" />
|
||||||
<envs>
|
|
||||||
<env name="ASPNETCORE_ENVIRONMENT" value="Development" />
|
|
||||||
<env name="ASPNETCORE_URLS" value="http://localhost:5000" />
|
|
||||||
</envs>
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj" />
|
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj" />
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
<option name="PROJECT_TFM" value=".NETCoreApp,Version=v2.1" />
|
||||||
<browser url="http://localhost:5000" />
|
<browser url="http://localhost:5000" />
|
||||||
<method />
|
<method />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,21 +1,17 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="RulesetTests (osu!)" type="DotNetProject" factoryName=".NET Project">
|
<configuration default="false" name="RulesetTests (osu!)" type="DotNetProject" factoryName=".NET Project">
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests/bin/Debug/net471/osu.Game.Rulesets.Osu.Tests.exe" />
|
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Osu.Tests.dll" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
<option name="PROGRAM_PARAMETERS" value="" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests" />
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
<option name="PASS_PARENT_ENVS" value="1" />
|
||||||
<envs>
|
|
||||||
<env name="ASPNETCORE_ENVIRONMENT" value="Development" />
|
|
||||||
<env name="ASPNETCORE_URLS" value="http://localhost:5000" />
|
|
||||||
</envs>
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj" />
|
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj" />
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
<option name="PROJECT_TFM" value=".NETCoreApp,Version=v2.1" />
|
||||||
<browser url="http://localhost:5000" />
|
<browser url="http://localhost:5000" />
|
||||||
<method />
|
<method />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,21 +1,17 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
<component name="ProjectRunConfigurationManager">
|
||||||
<configuration default="false" name="RulesetTests (taiko)" type="DotNetProject" factoryName=".NET Project">
|
<configuration default="false" name="RulesetTests (taiko)" type="DotNetProject" factoryName=".NET Project">
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests/bin/Debug/net471/osu.Game.Rulesets.Taiko.Tests.exe" />
|
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests/bin/Debug/netcoreapp2.1/osu.Game.Rulesets.Taiko.Tests.dll" />
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
<option name="PROGRAM_PARAMETERS" value="" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests" />
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
<option name="PASS_PARENT_ENVS" value="1" />
|
||||||
<envs>
|
|
||||||
<env name="ASPNETCORE_ENVIRONMENT" value="Development" />
|
|
||||||
<env name="ASPNETCORE_URLS" value="http://localhost:5000" />
|
|
||||||
</envs>
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||||
|
<option name="USE_MONO" value="0" />
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj" />
|
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj" />
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
<option name="PROJECT_TFM" value=".NETCoreApp,Version=v2.1" />
|
||||||
<browser url="http://localhost:5000" />
|
<browser url="http://localhost:5000" />
|
||||||
<method />
|
<method />
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="VisualTests (net471)" type="DotNetProject" factoryName=".NET Project" singleton="true">
|
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Game.Tests/bin/Debug/net471/osu.Game.Tests.exe" />
|
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Game.Tests" />
|
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
|
||||||
<envs />
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Game.Tests/osu.Game.Tests.csproj" />
|
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
|
||||||
<method />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
@ -1,18 +0,0 @@
|
|||||||
<component name="ProjectRunConfigurationManager">
|
|
||||||
<configuration default="false" name="osu! (net471)" type="DotNetProject" factoryName=".NET Project" singleton="true">
|
|
||||||
<option name="EXE_PATH" value="$PROJECT_DIR$/osu.Desktop/bin/Debug/net471/osu!.exe" />
|
|
||||||
<option name="PROGRAM_PARAMETERS" value="" />
|
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/osu.Desktop" />
|
|
||||||
<option name="PASS_PARENT_ENVS" value="1" />
|
|
||||||
<envs />
|
|
||||||
<option name="USE_MONO" value="0" />
|
|
||||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
|
||||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/osu.Desktop/osu.Desktop.csproj" />
|
|
||||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
|
||||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
|
||||||
<option name="PROJECT_TFM" value=".NETFramework,Version=v4.7.1" />
|
|
||||||
<method />
|
|
||||||
</configuration>
|
|
||||||
</component>
|
|
72
.vscode/launch.json
vendored
72
.vscode/launch.json
vendored
@ -2,63 +2,7 @@
|
|||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "VisualTests (Debug, net471)",
|
"name": "VisualTests (Debug)",
|
||||||
"windows": {
|
|
||||||
"type": "clr"
|
|
||||||
},
|
|
||||||
"type": "mono",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceRoot}/osu.Game.Tests/bin/Debug/net471/osu.Game.Tests.exe",
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"preLaunchTask": "Build (Debug, msbuild)",
|
|
||||||
"runtimeExecutable": null,
|
|
||||||
"env": {},
|
|
||||||
"console": "internalConsole"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "VisualTests (Release, net471)",
|
|
||||||
"windows": {
|
|
||||||
"type": "clr"
|
|
||||||
},
|
|
||||||
"type": "mono",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceRoot}/osu.Game.Tests/bin/Release/net471/osu.Game.Tests.exe",
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"preLaunchTask": "Build (Release, msbuild)",
|
|
||||||
"runtimeExecutable": null,
|
|
||||||
"env": {},
|
|
||||||
"console": "internalConsole"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "osu! (Debug, net471)",
|
|
||||||
"windows": {
|
|
||||||
"type": "clr"
|
|
||||||
},
|
|
||||||
"type": "mono",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceRoot}/osu.Desktop/bin/Debug/net471/osu!.exe",
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"preLaunchTask": "Build (Debug, msbuild)",
|
|
||||||
"runtimeExecutable": null,
|
|
||||||
"env": {},
|
|
||||||
"console": "internalConsole"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "osu! (Release, net471)",
|
|
||||||
"windows": {
|
|
||||||
"type": "clr"
|
|
||||||
},
|
|
||||||
"type": "mono",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceRoot}/osu.Desktop/bin/Release/net471/osu!.exe",
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"preLaunchTask": "Build (Release, msbuild)",
|
|
||||||
"runtimeExecutable": null,
|
|
||||||
"env": {},
|
|
||||||
"console": "internalConsole"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "VisualTests (Debug, netcoreapp2.1)",
|
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "dotnet",
|
"program": "dotnet",
|
||||||
@ -66,12 +10,12 @@
|
|||||||
"${workspaceRoot}/osu.Game.Tests/bin/Debug/netcoreapp2.1/osu.Game.Tests.dll"
|
"${workspaceRoot}/osu.Game.Tests/bin/Debug/netcoreapp2.1/osu.Game.Tests.dll"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceRoot}",
|
"cwd": "${workspaceRoot}",
|
||||||
"preLaunchTask": "Build tests (Debug, dotnet)",
|
"preLaunchTask": "Build tests (Debug)",
|
||||||
"env": {},
|
"env": {},
|
||||||
"console": "internalConsole"
|
"console": "internalConsole"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VisualTests (Release, netcoreapp2.1)",
|
"name": "VisualTests (Release)",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "dotnet",
|
"program": "dotnet",
|
||||||
@ -79,12 +23,12 @@
|
|||||||
"${workspaceRoot}/osu.Game.Tests/bin/Release/netcoreapp2.1/osu.Game.Tests.dll"
|
"${workspaceRoot}/osu.Game.Tests/bin/Release/netcoreapp2.1/osu.Game.Tests.dll"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceRoot}",
|
"cwd": "${workspaceRoot}",
|
||||||
"preLaunchTask": "Build tests (Release, dotnet)",
|
"preLaunchTask": "Build tests (Release)",
|
||||||
"env": {},
|
"env": {},
|
||||||
"console": "internalConsole"
|
"console": "internalConsole"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "osu! (Debug, netcoreapp2.1)",
|
"name": "osu! (Debug)",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "dotnet",
|
"program": "dotnet",
|
||||||
@ -92,12 +36,12 @@
|
|||||||
"${workspaceRoot}/osu.Desktop/bin/Debug/netcoreapp2.1/osu!.dll",
|
"${workspaceRoot}/osu.Desktop/bin/Debug/netcoreapp2.1/osu!.dll",
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceRoot}",
|
"cwd": "${workspaceRoot}",
|
||||||
"preLaunchTask": "Build osu! (Debug, dotnet)",
|
"preLaunchTask": "Build osu! (Debug)",
|
||||||
"env": {},
|
"env": {},
|
||||||
"console": "internalConsole"
|
"console": "internalConsole"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "osu! (Release, netcoreapp2.1)",
|
"name": "osu! (Release)",
|
||||||
"type": "coreclr",
|
"type": "coreclr",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "dotnet",
|
"program": "dotnet",
|
||||||
@ -105,7 +49,7 @@
|
|||||||
"${workspaceRoot}/osu.Desktop/bin/Release/netcoreapp2.1/osu!.dll",
|
"${workspaceRoot}/osu.Desktop/bin/Release/netcoreapp2.1/osu!.dll",
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceRoot}",
|
"cwd": "${workspaceRoot}",
|
||||||
"preLaunchTask": "Build osu! (Release, dotnet)",
|
"preLaunchTask": "Build osu! (Release)",
|
||||||
"env": {},
|
"env": {},
|
||||||
"console": "internalConsole"
|
"console": "internalConsole"
|
||||||
}
|
}
|
||||||
|
44
.vscode/tasks.json
vendored
44
.vscode/tasks.json
vendored
@ -4,34 +4,7 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
{
|
||||||
"label": "Build (Debug, msbuild)",
|
"label": "Build osu! (Debug)",
|
||||||
"type": "shell",
|
|
||||||
"command": "msbuild",
|
|
||||||
"args": [
|
|
||||||
"/p:TargetFramework=net471",
|
|
||||||
"/p:GenerateFullPaths=true",
|
|
||||||
"/m",
|
|
||||||
"/verbosity:m"
|
|
||||||
],
|
|
||||||
"group": "build",
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Build (Release, msbuild)",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "msbuild",
|
|
||||||
"args": [
|
|
||||||
"/p:Configuration=Release",
|
|
||||||
"/p:TargetFramework=net471",
|
|
||||||
"/p:GenerateFullPaths=true",
|
|
||||||
"/m",
|
|
||||||
"/verbosity:m"
|
|
||||||
],
|
|
||||||
"group": "build",
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Build osu! (Debug, dotnet)",
|
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
"args": [
|
"args": [
|
||||||
@ -47,7 +20,7 @@
|
|||||||
"problemMatcher": "$msCompile"
|
"problemMatcher": "$msCompile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Build osu! (Release, dotnet)",
|
"label": "Build osu! (Release)",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
"args": [
|
"args": [
|
||||||
@ -64,7 +37,7 @@
|
|||||||
"problemMatcher": "$msCompile"
|
"problemMatcher": "$msCompile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Build tests (Debug, dotnet)",
|
"label": "Build tests (Debug)",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
"args": [
|
"args": [
|
||||||
@ -80,7 +53,7 @@
|
|||||||
"problemMatcher": "$msCompile"
|
"problemMatcher": "$msCompile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Build tests (Release, dotnet)",
|
"label": "Build tests (Release)",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "dotnet",
|
"command": "dotnet",
|
||||||
"args": [
|
"args": [
|
||||||
@ -96,15 +69,6 @@
|
|||||||
"group": "build",
|
"group": "build",
|
||||||
"problemMatcher": "$msCompile"
|
"problemMatcher": "$msCompile"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Restore (net471)",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "nuget",
|
|
||||||
"args": [
|
|
||||||
"restore"
|
|
||||||
],
|
|
||||||
"problemMatcher": []
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Restore (netcoreapp2.1)",
|
"label": "Restore (netcoreapp2.1)",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
|
36
COMPILING.md
36
COMPILING.md
@ -1,36 +0,0 @@
|
|||||||
# Linux
|
|
||||||
### 1. Requirements:
|
|
||||||
Mono >= 5.4.0 (>= 5.8.0 recommended)
|
|
||||||
Please check [here](http://www.mono-project.com/download/) for stable or [here](http://www.mono-project.com/download/alpha/) for an alpha release.
|
|
||||||
NuGet >= 4.4.0
|
|
||||||
msbuild
|
|
||||||
git
|
|
||||||
|
|
||||||
### 2. Cloning project
|
|
||||||
Clone the entire repository with submodules using
|
|
||||||
```
|
|
||||||
git clone https://github.com/ppy/osu --recursive
|
|
||||||
```
|
|
||||||
Then restore NuGet packages from the repository
|
|
||||||
```
|
|
||||||
nuget restore
|
|
||||||
```
|
|
||||||
### 3. Compiling
|
|
||||||
Simply run `msbuild` where `osu.sln` is located, this will create all binaries in `osu/osu.Desktop/bin/Debug`.
|
|
||||||
### 4. Optimizing
|
|
||||||
If you want additional performance you can change build type to Release with
|
|
||||||
```
|
|
||||||
msbuild -p:Configuration=Release
|
|
||||||
```
|
|
||||||
Additionally, mono provides an AOT utility which attempts to precompile binaries. You can utilize that by running
|
|
||||||
```
|
|
||||||
mono --aot ./osu\!.exe
|
|
||||||
```
|
|
||||||
### 5. Troubleshooting
|
|
||||||
You may run into trouble with NuGet versioning, as the one in packaging system is almost always out of date. Simply run
|
|
||||||
```
|
|
||||||
nuget
|
|
||||||
sudo nuget update -self
|
|
||||||
```
|
|
||||||
**Warning** NuGet creates few config files when it's run for the first time.
|
|
||||||
Do not run NuGet as root on the first run or you might run into very peculiar issues.
|
|
@ -118,7 +118,7 @@ namespace osu.Desktop.Overlays
|
|||||||
Icon = FontAwesome.fa_check_square;
|
Icon = FontAwesome.fa_check_square;
|
||||||
Activated = delegate
|
Activated = delegate
|
||||||
{
|
{
|
||||||
Process.Start($"https://github.com/ppy/osu/releases/tag/v{version}");
|
Process.Start($"https://osu.ppy.sh/home/changelog/{version}");
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -26,10 +26,10 @@
|
|||||||
<ProjectReference Include="..\osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj" />
|
<ProjectReference Include="..\osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj" />
|
||||||
<ProjectReference Include="..\osu.Game.Rulesets.Taiko\osu.Game.Rulesets.Taiko.csproj" />
|
<ProjectReference Include="..\osu.Game.Rulesets.Taiko\osu.Game.Rulesets.Taiko.csproj" />
|
||||||
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj" />
|
<ProjectReference Include="..\osu-resources\osu.Game.Resources\osu.Game.Resources.csproj" />
|
||||||
<PackageReference Include="Microsoft.Win32.Registry" Version="4.4.0" />
|
<PackageReference Include="Microsoft.Win32.Registry" Version="4.5.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Package References">
|
<ItemGroup Label="Package References">
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.0.3" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.0" />
|
||||||
<PackageReference Include="squirrel.windows" Version="1.8.0" Condition="'$(TargetFramework)' == 'net471'" />
|
<PackageReference Include="squirrel.windows" Version="1.8.0" Condition="'$(TargetFramework)' == 'net471'" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Resources">
|
<ItemGroup Label="Resources">
|
||||||
|
@ -53,10 +53,10 @@ namespace osu.Game.Rulesets.Catch.Tests
|
|||||||
return beatmap;
|
return beatmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Player CreatePlayer(WorkingBeatmap beatmap, Ruleset ruleset)
|
protected override Player CreatePlayer(Ruleset ruleset)
|
||||||
{
|
{
|
||||||
beatmap.Mods.Value = beatmap.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
Beatmap.Value.Mods.Value = Beatmap.Value.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
||||||
return base.CreatePlayer(beatmap, ruleset);
|
return base.CreatePlayer(ruleset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,56 +82,25 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
{
|
{
|
||||||
new CatchModEasy(),
|
new CatchModEasy(),
|
||||||
new CatchModNoFail(),
|
new CatchModNoFail(),
|
||||||
new MultiMod
|
new MultiMod(new CatchModHalfTime(), new CatchModDaycore())
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new CatchModHalfTime(),
|
|
||||||
new CatchModDaycore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.DifficultyIncrease:
|
case ModType.DifficultyIncrease:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new CatchModHardRock(),
|
new CatchModHardRock(),
|
||||||
new MultiMod
|
new MultiMod(new CatchModSuddenDeath(), new CatchModPerfect()),
|
||||||
{
|
new MultiMod(new CatchModDoubleTime(), new CatchModNightcore()),
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new CatchModSuddenDeath(),
|
|
||||||
new CatchModPerfect(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new MultiMod
|
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new CatchModDoubleTime(),
|
|
||||||
new CatchModNightcore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new CatchModHidden(),
|
new CatchModHidden(),
|
||||||
new CatchModFlashlight(),
|
new CatchModFlashlight(),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.Special:
|
case ModType.Special:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new CatchModRelax(),
|
new CatchModRelax(),
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
new MultiMod
|
new MultiMod(new CatchModAutoplay(), new ModCinema()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new CatchModAutoplay(),
|
|
||||||
new ModCinema(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return new Mod[] { };
|
return new Mod[] { };
|
||||||
}
|
}
|
||||||
|
@ -98,17 +98,12 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent)
|
|
||||||
=> dependencies = new DependencyContainer(base.CreateLocalDependencies(parent));
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(RulesetStore rulesets, SettingsStore settings)
|
private void load(RulesetStore rulesets, SettingsStore settings)
|
||||||
{
|
{
|
||||||
maniaRuleset = rulesets.GetRuleset(3);
|
maniaRuleset = rulesets.GetRuleset(3);
|
||||||
|
|
||||||
dependencies.Cache(new ManiaConfigManager(settings, maniaRuleset, 4));
|
Dependencies.Cache(new ManiaConfigManager(settings, maniaRuleset, 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ManiaPlayfield createPlayfield(int cols, bool inverted = false)
|
private ManiaPlayfield createPlayfield(int cols, bool inverted = false)
|
||||||
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Mania.Configuration
|
|||||||
{
|
{
|
||||||
public class ManiaConfigManager : RulesetConfigManager<ManiaSetting>
|
public class ManiaConfigManager : RulesetConfigManager<ManiaSetting>
|
||||||
{
|
{
|
||||||
public ManiaConfigManager(SettingsStore settings, RulesetInfo ruleset, int variant)
|
public ManiaConfigManager(SettingsStore settings, RulesetInfo ruleset, int? variant = null)
|
||||||
: base(settings, ruleset, variant)
|
: base(settings, ruleset, variant)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using System.Linq;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Difficulty;
|
using osu.Game.Rulesets.Difficulty;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Mania.Mods;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
|
|
||||||
@ -141,5 +142,22 @@ namespace osu.Game.Rulesets.Mania.Difficulty
|
|||||||
|
|
||||||
return difficulty;
|
return difficulty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Mod[] DifficultyAdjustmentMods => new Mod[]
|
||||||
|
{
|
||||||
|
new ManiaModDoubleTime(),
|
||||||
|
new ManiaModHalfTime(),
|
||||||
|
new ManiaModEasy(),
|
||||||
|
new ManiaModHardRock(),
|
||||||
|
new ManiaModKey1(),
|
||||||
|
new ManiaModKey2(),
|
||||||
|
new ManiaModKey3(),
|
||||||
|
new ManiaModKey4(),
|
||||||
|
new ManiaModKey5(),
|
||||||
|
new ManiaModKey6(),
|
||||||
|
new ManiaModKey7(),
|
||||||
|
new ManiaModKey8(),
|
||||||
|
new ManiaModKey9(),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,11 @@ using osu.Game.Graphics;
|
|||||||
using osu.Game.Rulesets.Mania.Replays;
|
using osu.Game.Rulesets.Mania.Replays;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Rulesets.Configuration;
|
||||||
using osu.Game.Rulesets.Difficulty;
|
using osu.Game.Rulesets.Difficulty;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Mania.Configuration;
|
||||||
using osu.Game.Rulesets.Mania.Difficulty;
|
using osu.Game.Rulesets.Mania.Difficulty;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
|
||||||
@ -105,78 +108,34 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
{
|
{
|
||||||
new ManiaModEasy(),
|
new ManiaModEasy(),
|
||||||
new ManiaModNoFail(),
|
new ManiaModNoFail(),
|
||||||
new MultiMod
|
new MultiMod(new ManiaModHalfTime(), new ManiaModDaycore()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new ManiaModHalfTime(),
|
|
||||||
new ManiaModDaycore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.DifficultyIncrease:
|
case ModType.DifficultyIncrease:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new ManiaModHardRock(),
|
new ManiaModHardRock(),
|
||||||
new MultiMod
|
new MultiMod(new ManiaModSuddenDeath(), new ManiaModPerfect()),
|
||||||
{
|
new MultiMod(new ManiaModDoubleTime(), new ManiaModNightcore()),
|
||||||
Mods = new Mod[]
|
new MultiMod(new ManiaModFadeIn(), new ManiaModHidden()),
|
||||||
{
|
|
||||||
new ManiaModSuddenDeath(),
|
|
||||||
new ManiaModPerfect(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new MultiMod
|
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new ManiaModDoubleTime(),
|
|
||||||
new ManiaModNightcore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new MultiMod
|
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new ManiaModFadeIn(),
|
|
||||||
new ManiaModHidden(),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new ManiaModFlashlight(),
|
new ManiaModFlashlight(),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.Special:
|
case ModType.Special:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new MultiMod
|
new MultiMod(new ManiaModKey4(),
|
||||||
{
|
new ManiaModKey5(),
|
||||||
Mods = new Mod[]
|
new ManiaModKey6(),
|
||||||
{
|
new ManiaModKey7(),
|
||||||
new ManiaModKey4(),
|
new ManiaModKey8(),
|
||||||
new ManiaModKey5(),
|
new ManiaModKey9(),
|
||||||
new ManiaModKey6(),
|
new ManiaModKey1(),
|
||||||
new ManiaModKey7(),
|
new ManiaModKey2(),
|
||||||
new ManiaModKey8(),
|
new ManiaModKey3()),
|
||||||
new ManiaModKey9(),
|
|
||||||
new ManiaModKey1(),
|
|
||||||
new ManiaModKey2(),
|
|
||||||
new ManiaModKey3(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new ManiaModRandom(),
|
new ManiaModRandom(),
|
||||||
new ManiaModDualStages(),
|
new ManiaModDualStages(),
|
||||||
new ManiaModMirror(),
|
new ManiaModMirror(),
|
||||||
new MultiMod
|
new MultiMod(new ManiaModAutoplay(), new ModCinema()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new ManiaModAutoplay(),
|
|
||||||
new ModCinema(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return new Mod[] { };
|
return new Mod[] { };
|
||||||
}
|
}
|
||||||
@ -194,6 +153,8 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
|
|
||||||
public override IConvertibleReplayFrame CreateConvertibleReplayFrame() => new ManiaReplayFrame();
|
public override IConvertibleReplayFrame CreateConvertibleReplayFrame() => new ManiaReplayFrame();
|
||||||
|
|
||||||
|
public override IRulesetConfigManager CreateConfig(SettingsStore settings) => new ManiaConfigManager(settings, RulesetInfo);
|
||||||
|
|
||||||
public ManiaRuleset(RulesetInfo rulesetInfo = null)
|
public ManiaRuleset(RulesetInfo rulesetInfo = null)
|
||||||
: base(rulesetInfo)
|
: base(rulesetInfo)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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.Linq;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
@ -24,5 +26,18 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
|
|
||||||
mbc.TargetColumns = KeyCount;
|
mbc.TargetColumns = KeyCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[]
|
||||||
|
{
|
||||||
|
typeof(ManiaModKey1),
|
||||||
|
typeof(ManiaModKey2),
|
||||||
|
typeof(ManiaModKey3),
|
||||||
|
typeof(ManiaModKey4),
|
||||||
|
typeof(ManiaModKey5),
|
||||||
|
typeof(ManiaModKey6),
|
||||||
|
typeof(ManiaModKey7),
|
||||||
|
typeof(ManiaModKey8),
|
||||||
|
typeof(ManiaModKey9),
|
||||||
|
}.Except(new[] { GetType() }).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using OpenTK;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
||||||
{
|
{
|
||||||
@ -28,7 +29,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
: base(barLine)
|
: base(barLine)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
Height = 1;
|
Height = 2f;
|
||||||
|
|
||||||
AddInternal(new Box
|
AddInternal(new Box
|
||||||
{
|
{
|
||||||
@ -36,6 +37,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
Anchor = Anchor.BottomCentre,
|
Anchor = Anchor.BottomCentre,
|
||||||
Origin = Anchor.BottomCentre,
|
Origin = Anchor.BottomCentre,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = new Color4(255, 204, 33, 255),
|
||||||
});
|
});
|
||||||
|
|
||||||
bool isMajor = barLine.BeatIndex % (int)barLine.ControlPoint.TimeSignature == 0;
|
bool isMajor = barLine.BeatIndex % (int)barLine.ControlPoint.TimeSignature == 0;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// 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.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
|
using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
@ -23,9 +23,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
private readonly DrawableNote head;
|
private readonly DrawableNote head;
|
||||||
private readonly DrawableNote tail;
|
private readonly DrawableNote tail;
|
||||||
|
|
||||||
private readonly GlowPiece glowPiece;
|
|
||||||
private readonly BodyPiece bodyPiece;
|
private readonly BodyPiece bodyPiece;
|
||||||
private readonly Container fullHeightContainer;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time at which the user started holding this hold note. Null if the user is not holding this hold note.
|
/// Time at which the user started holding this hold note. Null if the user is not holding this hold note.
|
||||||
@ -37,25 +35,17 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private bool hasBroken;
|
private bool hasBroken;
|
||||||
|
|
||||||
|
private readonly Container<DrawableHoldNoteTick> tickContainer;
|
||||||
|
|
||||||
public DrawableHoldNote(HoldNote hitObject, ManiaAction action)
|
public DrawableHoldNote(HoldNote hitObject, ManiaAction action)
|
||||||
: base(hitObject, action)
|
: base(hitObject, action)
|
||||||
{
|
{
|
||||||
Container<DrawableHoldNoteTick> tickContainer;
|
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
|
|
||||||
InternalChildren = new Drawable[]
|
InternalChildren = new Drawable[]
|
||||||
{
|
{
|
||||||
// The hit object itself cannot be used for various elements because the tail overshoots it
|
|
||||||
// So a specialized container that is updated to contain the tail height is used
|
|
||||||
fullHeightContainer = new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Child = glowPiece = new GlowPiece()
|
|
||||||
},
|
|
||||||
bodyPiece = new BodyPiece
|
bodyPiece = new BodyPiece
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
},
|
},
|
||||||
tickContainer = new Container<DrawableHoldNoteTick>
|
tickContainer = new Container<DrawableHoldNoteTick>
|
||||||
@ -92,21 +82,10 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
{
|
{
|
||||||
base.AccentColour = value;
|
base.AccentColour = value;
|
||||||
|
|
||||||
glowPiece.AccentColour = value;
|
|
||||||
bodyPiece.AccentColour = value;
|
bodyPiece.AccentColour = value;
|
||||||
head.AccentColour = value;
|
head.AccentColour = value;
|
||||||
tail.AccentColour = value;
|
tail.AccentColour = value;
|
||||||
}
|
tickContainer.ForEach(t => t.AccentColour = value);
|
||||||
}
|
|
||||||
|
|
||||||
protected override void UpdateState(ArmedState state)
|
|
||||||
{
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case ArmedState.Hit:
|
|
||||||
// Good enough for now, we just want them to have a lifetime end
|
|
||||||
this.Delay(2000).Expire();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,12 +100,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
// Make the body piece not lie under the head note
|
// Make the body piece not lie under the head note
|
||||||
bodyPiece.Y = head.Height;
|
bodyPiece.Y = head.Height / 2;
|
||||||
bodyPiece.Height = DrawHeight - head.Height;
|
bodyPiece.Height = DrawHeight - head.Height / 2 + tail.Height / 2;
|
||||||
|
|
||||||
// Make the fullHeightContainer "contain" the height of the tail note, keeping in mind
|
|
||||||
// that the tail note overshoots the height of this hit object
|
|
||||||
fullHeightContainer.Height = DrawHeight + tail.Height;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool OnPressed(ManiaAction action)
|
public bool OnPressed(ManiaAction action)
|
||||||
@ -175,8 +150,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
: base(holdNote.HitObject.Head, action)
|
: base(holdNote.HitObject.Head, action)
|
||||||
{
|
{
|
||||||
this.holdNote = holdNote;
|
this.holdNote = holdNote;
|
||||||
|
|
||||||
GlowPiece.Alpha = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool OnPressed(ManiaAction action)
|
public override bool OnPressed(ManiaAction action)
|
||||||
@ -194,11 +167,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateState(ArmedState state)
|
|
||||||
{
|
|
||||||
// The holdnote keeps scrolling through for now, so having the head disappear looks weird
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -219,8 +187,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
: base(holdNote.HitObject.Tail, action)
|
: base(holdNote.HitObject.Tail, action)
|
||||||
{
|
{
|
||||||
this.holdNote = holdNote;
|
this.holdNote = holdNote;
|
||||||
|
|
||||||
GlowPiece.Alpha = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void CheckForJudgements(bool userTriggered, double timeOffset)
|
protected override void CheckForJudgements(bool userTriggered, double timeOffset)
|
||||||
@ -253,11 +219,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateState(ArmedState state)
|
|
||||||
{
|
|
||||||
// The holdnote keeps scrolling through, so having the tail disappear looks weird
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool OnPressed(ManiaAction action) => false; // Tail doesn't handle key down
|
public override bool OnPressed(ManiaAction action) => false; // Tail doesn't handle key down
|
||||||
|
|
||||||
public override bool OnReleased(ManiaAction action)
|
public override bool OnReleased(ManiaAction action)
|
||||||
|
@ -8,7 +8,6 @@ using osu.Framework.Extensions.Color4Extensions;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Rulesets.Mania.Judgements;
|
using osu.Game.Rulesets.Mania.Judgements;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
|
||||||
@ -87,16 +86,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
AddJudgement(new HoldNoteTickJudgement { Result = HitResult.Perfect });
|
AddJudgement(new HoldNoteTickJudgement { Result = HitResult.Perfect });
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateState(ArmedState state)
|
|
||||||
{
|
|
||||||
switch (State.Value)
|
|
||||||
{
|
|
||||||
case ArmedState.Hit:
|
|
||||||
AccentColour = Color4.Green;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
if (AllJudged)
|
if (AllJudged)
|
||||||
|
@ -27,5 +27,18 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
if (action != null)
|
if (action != null)
|
||||||
Action = action.Value;
|
Action = action.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void UpdateState(ArmedState state)
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case ArmedState.Miss:
|
||||||
|
this.FadeOut(150, Easing.In).Expire();
|
||||||
|
break;
|
||||||
|
case ArmedState.Hit:
|
||||||
|
this.FadeOut(150, Easing.OutQuint).Expire();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 osu.Framework.Extensions.Color4Extensions;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Rulesets.Mania.Judgements;
|
using osu.Game.Rulesets.Mania.Judgements;
|
||||||
using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
|
using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
||||||
@ -16,9 +17,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DrawableNote : DrawableManiaHitObject<Note>, IKeyBindingHandler<ManiaAction>
|
public class DrawableNote : DrawableManiaHitObject<Note>, IKeyBindingHandler<ManiaAction>
|
||||||
{
|
{
|
||||||
protected readonly GlowPiece GlowPiece;
|
|
||||||
|
|
||||||
private readonly LaneGlowPiece laneGlowPiece;
|
|
||||||
private readonly NotePiece headPiece;
|
private readonly NotePiece headPiece;
|
||||||
|
|
||||||
public DrawableNote(Note hitObject, ManiaAction action)
|
public DrawableNote(Note hitObject, ManiaAction action)
|
||||||
@ -27,14 +25,11 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
|
|
||||||
|
CornerRadius = 5;
|
||||||
|
Masking = true;
|
||||||
|
|
||||||
InternalChildren = new Drawable[]
|
InternalChildren = new Drawable[]
|
||||||
{
|
{
|
||||||
laneGlowPiece = new LaneGlowPiece
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre
|
|
||||||
},
|
|
||||||
GlowPiece = new GlowPiece(),
|
|
||||||
headPiece = new NotePiece
|
headPiece = new NotePiece
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
@ -49,9 +44,14 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
base.AccentColour = value;
|
base.AccentColour = value;
|
||||||
laneGlowPiece.AccentColour = AccentColour;
|
|
||||||
GlowPiece.AccentColour = AccentColour;
|
|
||||||
headPiece.AccentColour = AccentColour;
|
headPiece.AccentColour = AccentColour;
|
||||||
|
|
||||||
|
EdgeEffect = new EdgeEffectParameters
|
||||||
|
{
|
||||||
|
Type = EdgeEffectType.Glow,
|
||||||
|
Colour = AccentColour.Lighten(1f).Opacity(0.6f),
|
||||||
|
Radius = 10,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,17 +71,6 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables
|
|||||||
AddJudgement(new ManiaJudgement { Result = result });
|
AddJudgement(new ManiaJudgement { Result = result });
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateState(ArmedState state)
|
|
||||||
{
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case ArmedState.Hit:
|
|
||||||
case ArmedState.Miss:
|
|
||||||
this.FadeOut(100).Expire();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool OnPressed(ManiaAction action)
|
public virtual bool OnPressed(ManiaAction action)
|
||||||
{
|
{
|
||||||
if (action != Action)
|
if (action != Action)
|
||||||
|
@ -123,8 +123,8 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces
|
|||||||
if (!IsLoaded)
|
if (!IsLoaded)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreground.Colour = AccentColour.Opacity(0.4f);
|
foreground.Colour = AccentColour.Opacity(0.9f);
|
||||||
background.Colour = AccentColour.Opacity(0.2f);
|
background.Colour = AccentColour.Opacity(0.6f);
|
||||||
|
|
||||||
subtractionCache.Invalidate();
|
subtractionCache.Invalidate();
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal class NotePiece : Container, IHasAccentColour
|
internal class NotePiece : Container, IHasAccentColour
|
||||||
{
|
{
|
||||||
private const float head_height = 10;
|
public const float NOTE_HEIGHT = 10;
|
||||||
private const float head_colour_height = 6;
|
private const float head_colour_height = 6;
|
||||||
|
|
||||||
private readonly Box colouredBox;
|
private readonly Box colouredBox;
|
||||||
@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables.Pieces
|
|||||||
public NotePiece()
|
public NotePiece()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
Height = head_height;
|
Height = NOTE_HEIGHT;
|
||||||
|
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
public ManiaAction Action;
|
public ManiaAction Action;
|
||||||
|
|
||||||
private readonly Box background;
|
private readonly Box background;
|
||||||
|
private readonly Box backgroundOverlay;
|
||||||
private readonly Container hitTargetBar;
|
private readonly Container hitTargetBar;
|
||||||
private readonly Container keyIcon;
|
private readonly Container keyIcon;
|
||||||
|
|
||||||
@ -42,22 +43,32 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
protected override Container<Drawable> Content => content;
|
protected override Container<Drawable> Content => content;
|
||||||
private readonly Container<Drawable> content;
|
private readonly Container<Drawable> content;
|
||||||
|
|
||||||
private const float opacity_released = 0.1f;
|
|
||||||
private const float opacity_pressed = 0.25f;
|
|
||||||
|
|
||||||
public Column()
|
public Column()
|
||||||
: base(ScrollingDirection.Up)
|
: base(ScrollingDirection.Up)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Y;
|
RelativeSizeAxes = Axes.Y;
|
||||||
Width = column_width;
|
Width = column_width;
|
||||||
|
|
||||||
|
Masking = true;
|
||||||
|
CornerRadius = 5;
|
||||||
|
|
||||||
InternalChildren = new Drawable[]
|
InternalChildren = new Drawable[]
|
||||||
{
|
{
|
||||||
background = new Box
|
background = new Box
|
||||||
{
|
{
|
||||||
Name = "Background",
|
Name = "Background",
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Alpha = opacity_released
|
Alpha = 0.3f
|
||||||
|
},
|
||||||
|
backgroundOverlay = new Box
|
||||||
|
{
|
||||||
|
Name = "Background Gradient Overlay",
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Height = 0.5f,
|
||||||
|
Anchor = Anchor.TopLeft,
|
||||||
|
Origin = Anchor.TopLeft,
|
||||||
|
Blending = BlendingMode.Additive,
|
||||||
|
Alpha = 0
|
||||||
},
|
},
|
||||||
new Container
|
new Container
|
||||||
{
|
{
|
||||||
@ -182,6 +193,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
accentColour = value;
|
accentColour = value;
|
||||||
|
|
||||||
background.Colour = accentColour;
|
background.Colour = accentColour;
|
||||||
|
backgroundOverlay.Colour = ColourInfo.GradientVertical(accentColour.Opacity(0.6f), accentColour.Opacity(0));
|
||||||
|
|
||||||
hitTargetBar.EdgeEffect = new EdgeEffectParameters
|
hitTargetBar.EdgeEffect = new EdgeEffectParameters
|
||||||
{
|
{
|
||||||
@ -223,8 +235,8 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
{
|
{
|
||||||
if (action == Action)
|
if (action == Action)
|
||||||
{
|
{
|
||||||
background.FadeTo(opacity_pressed, 50, Easing.OutQuint);
|
backgroundOverlay.FadeTo(1, 50, Easing.OutQuint).Then().FadeTo(0.5f, 250, Easing.OutQuint);
|
||||||
keyIcon.ScaleTo(1.4f, 50, Easing.OutQuint);
|
keyIcon.ScaleTo(1.4f, 50, Easing.OutQuint).Then().ScaleTo(1.3f, 250, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -234,8 +246,8 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
{
|
{
|
||||||
if (action == Action)
|
if (action == Action)
|
||||||
{
|
{
|
||||||
background.FadeTo(opacity_released, 800, Easing.OutQuart);
|
backgroundOverlay.FadeTo(0, 250, Easing.OutQuint);
|
||||||
keyIcon.ScaleTo(1f, 400, Easing.OutQuart);
|
keyIcon.ScaleTo(1f, 125, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -265,8 +277,13 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
if (action != Action)
|
if (action != Action)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var hitObject = HitObjects.Objects.LastOrDefault(h => h.HitObject.StartTime > Time.Current) ?? HitObjects.Objects.FirstOrDefault();
|
var nextObject =
|
||||||
hitObject?.PlaySamples();
|
HitObjects.AliveObjects.FirstOrDefault(h => h.HitObject.StartTime > Time.Current) ??
|
||||||
|
// fallback to non-alive objects to find next off-screen object
|
||||||
|
HitObjects.Objects.FirstOrDefault(h => h.HitObject.StartTime > Time.Current) ??
|
||||||
|
HitObjects.Objects.LastOrDefault();
|
||||||
|
|
||||||
|
nextObject?.PlaySamples();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 OpenTK;
|
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.MathUtils;
|
||||||
using osu.Game.Rulesets.Mania.Objects.Drawables;
|
using osu.Game.Rulesets.Mania.Objects.Drawables;
|
||||||
|
using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces;
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.UI
|
namespace osu.Game.Rulesets.Mania.UI
|
||||||
{
|
{
|
||||||
internal class HitExplosion : CompositeDrawable
|
internal class HitExplosion : CompositeDrawable
|
||||||
{
|
{
|
||||||
private readonly Box inner;
|
private readonly CircularContainer circle;
|
||||||
|
|
||||||
public HitExplosion(DrawableHitObject judgedObject)
|
public HitExplosion(DrawableHitObject judgedObject)
|
||||||
{
|
{
|
||||||
@ -22,33 +24,32 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
Anchor = Anchor.TopCentre;
|
Anchor = Anchor.TopCentre;
|
||||||
Origin = Anchor.Centre;
|
Origin = Anchor.Centre;
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.X;
|
||||||
Size = new Vector2(isTick ? 0.5f : 1);
|
Y = NotePiece.NOTE_HEIGHT / 2;
|
||||||
FillMode = FillMode.Fit;
|
Height = NotePiece.NOTE_HEIGHT;
|
||||||
|
|
||||||
Blending = BlendingMode.Additive;
|
// scale roughly in-line with visual appearance of notes
|
||||||
|
Scale = new Vector2(isTick ? 0.4f : 0.8f);
|
||||||
|
|
||||||
Color4 accent = isTick ? Color4.White : judgedObject.AccentColour;
|
InternalChild = circle = new CircularContainer
|
||||||
|
|
||||||
InternalChild = new CircularContainer
|
|
||||||
{
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Masking = true,
|
Masking = true,
|
||||||
BorderThickness = 1,
|
// we want our size to be very small so the glow dominates it.
|
||||||
BorderColour = accent,
|
Size = new Vector2(0.1f),
|
||||||
EdgeEffect = new EdgeEffectParameters
|
EdgeEffect = new EdgeEffectParameters
|
||||||
{
|
{
|
||||||
Type = EdgeEffectType.Glow,
|
Type = EdgeEffectType.Glow,
|
||||||
Colour = accent,
|
Colour = Interpolation.ValueAt(0.1f, judgedObject.AccentColour, Color4.White, 0, 1),
|
||||||
Radius = 10,
|
Radius = 100,
|
||||||
Hollow = true
|
|
||||||
},
|
},
|
||||||
Child = inner = new Box
|
Child = new Box
|
||||||
{
|
{
|
||||||
|
Alpha = 0,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Colour = accent,
|
AlwaysPresent = true
|
||||||
Alpha = 1,
|
|
||||||
AlwaysPresent = true,
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -57,8 +58,8 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
this.ScaleTo(2f, 600, Easing.OutQuint).FadeOut(500);
|
circle.ResizeTo(circle.Size * new Vector2(4, 20), 1000, Easing.OutQuint);
|
||||||
inner.FadeOut(250);
|
this.FadeIn(16).Then().FadeOut(500, Easing.OutQuint);
|
||||||
|
|
||||||
Expire(true);
|
Expire(true);
|
||||||
}
|
}
|
||||||
|
@ -10,12 +10,9 @@ using osu.Framework.Input;
|
|||||||
using osu.Framework.MathUtils;
|
using osu.Framework.MathUtils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.Configuration;
|
|
||||||
using osu.Game.Input.Handlers;
|
using osu.Game.Input.Handlers;
|
||||||
using osu.Game.Rulesets.Configuration;
|
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Mods;
|
using osu.Game.Rulesets.Mania.Mods;
|
||||||
using osu.Game.Rulesets.Mania.Configuration;
|
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Mania.Objects.Drawables;
|
using osu.Game.Rulesets.Mania.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.Mania.Replays;
|
using osu.Game.Rulesets.Mania.Replays;
|
||||||
@ -103,7 +100,5 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
protected override Vector2 PlayfieldArea => new Vector2(1, 0.8f);
|
protected override Vector2 PlayfieldArea => new Vector2(1, 0.8f);
|
||||||
|
|
||||||
protected override ReplayInputHandler CreateReplayInputHandler(Replay replay) => new ManiaFramedReplayInputHandler(replay);
|
protected override ReplayInputHandler CreateReplayInputHandler(Replay replay) => new ManiaFramedReplayInputHandler(replay);
|
||||||
|
|
||||||
protected override IRulesetConfigManager CreateConfig(Ruleset ruleset, SettingsStore settings) => new ManiaConfigManager(settings, Ruleset.RulesetInfo, Variant);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ using osu.Framework.Configuration;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
@ -78,6 +77,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
RelativeSizeAxes = Axes.Y,
|
RelativeSizeAxes = Axes.Y,
|
||||||
AutoSizeAxes = Axes.X,
|
AutoSizeAxes = Axes.X,
|
||||||
Masking = true,
|
Masking = true,
|
||||||
|
CornerRadius = 5,
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new Box
|
new Box
|
||||||
@ -183,15 +183,15 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colours)
|
private void load()
|
||||||
{
|
{
|
||||||
normalColumnColours = new List<Color4>
|
normalColumnColours = new List<Color4>
|
||||||
{
|
{
|
||||||
colours.RedDark,
|
new Color4(94, 0, 57, 255),
|
||||||
colours.GreenDark
|
new Color4(6, 84, 0, 255)
|
||||||
};
|
};
|
||||||
|
|
||||||
specialColumnColour = colours.BlueDark;
|
specialColumnColour = new Color4(0, 48, 63, 255);
|
||||||
|
|
||||||
// Set the special column + colour + key
|
// Set the special column + colour + key
|
||||||
foreach (var column in Columns)
|
foreach (var column in Columns)
|
||||||
|
@ -8,6 +8,7 @@ using osu.Game.Rulesets.Difficulty;
|
|||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Osu.Difficulty.Preprocessing;
|
using osu.Game.Rulesets.Osu.Difficulty.Preprocessing;
|
||||||
using osu.Game.Rulesets.Osu.Difficulty.Skills;
|
using osu.Game.Rulesets.Osu.Difficulty.Skills;
|
||||||
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Difficulty
|
namespace osu.Game.Rulesets.Osu.Difficulty
|
||||||
@ -71,5 +72,13 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
|
|
||||||
return starRating;
|
return starRating;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Mod[] DifficultyAdjustmentMods => new Mod[]
|
||||||
|
{
|
||||||
|
new OsuModDoubleTime(),
|
||||||
|
new OsuModHalfTime(),
|
||||||
|
new OsuModEasy(),
|
||||||
|
new OsuModHardRock(),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,57 +93,26 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
{
|
{
|
||||||
new OsuModEasy(),
|
new OsuModEasy(),
|
||||||
new OsuModNoFail(),
|
new OsuModNoFail(),
|
||||||
new MultiMod
|
new MultiMod(new OsuModHalfTime(), new OsuModDaycore()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new OsuModHalfTime(),
|
|
||||||
new OsuModDaycore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.DifficultyIncrease:
|
case ModType.DifficultyIncrease:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new OsuModHardRock(),
|
new OsuModHardRock(),
|
||||||
new MultiMod
|
new MultiMod(new OsuModSuddenDeath(), new OsuModPerfect()),
|
||||||
{
|
new MultiMod(new OsuModDoubleTime(), new OsuModNightcore()),
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new OsuModSuddenDeath(),
|
|
||||||
new OsuModPerfect(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new MultiMod
|
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new OsuModDoubleTime(),
|
|
||||||
new OsuModNightcore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new OsuModHidden(),
|
new OsuModHidden(),
|
||||||
new OsuModFlashlight(),
|
new OsuModFlashlight(),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.Special:
|
case ModType.Special:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new OsuModRelax(),
|
new OsuModRelax(),
|
||||||
new OsuModAutopilot(),
|
new OsuModAutopilot(),
|
||||||
new OsuModSpunOut(),
|
new OsuModSpunOut(),
|
||||||
new MultiMod
|
new MultiMod(new OsuModAutoplay(), new ModCinema()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new OsuModAutoplay(),
|
|
||||||
new ModCinema(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new OsuModTarget(),
|
new OsuModTarget(),
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return new Mod[] { };
|
return new Mod[] { };
|
||||||
}
|
}
|
||||||
@ -161,7 +130,7 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
|
|
||||||
public override string ShortName => "osu";
|
public override string ShortName => "osu";
|
||||||
|
|
||||||
public override SettingsSubsection CreateSettings() => new OsuSettings();
|
public override RulesetSettingsSubsection CreateSettings() => new OsuSettings(this);
|
||||||
|
|
||||||
public override int? LegacyID => 0;
|
public override int? LegacyID => 0;
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
|
|
||||||
private Bindable<double> cursorScale;
|
private Bindable<double> cursorScale;
|
||||||
private Bindable<bool> autoCursorScale;
|
private Bindable<bool> autoCursorScale;
|
||||||
private Bindable<WorkingBeatmap> beatmap;
|
private readonly IBindable<WorkingBeatmap> beatmap = new Bindable<WorkingBeatmap>();
|
||||||
|
|
||||||
public OsuCursor()
|
public OsuCursor()
|
||||||
{
|
{
|
||||||
@ -96,7 +96,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuConfigManager config, OsuGameBase game)
|
private void load(OsuConfigManager config, IBindableBeatmap beatmap)
|
||||||
{
|
{
|
||||||
Child = cursorContainer = new SkinnableDrawable("cursor", _ => new CircularContainer
|
Child = cursorContainer = new SkinnableDrawable("cursor", _ => new CircularContainer
|
||||||
{
|
{
|
||||||
@ -160,7 +160,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
};
|
};
|
||||||
|
|
||||||
beatmap = game.Beatmap.GetBoundCopy();
|
this.beatmap.BindTo(beatmap);
|
||||||
beatmap.ValueChanged += v => calculateScale();
|
beatmap.ValueChanged += v => calculateScale();
|
||||||
|
|
||||||
cursorScale = config.GetBindable<double>(OsuSetting.GameplayCursorSize);
|
cursorScale = config.GetBindable<double>(OsuSetting.GameplayCursorSize);
|
||||||
|
@ -64,9 +64,7 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
|
|
||||||
public override void PostProcess()
|
public override void PostProcess()
|
||||||
{
|
{
|
||||||
connectionLayer.HitObjects = HitObjects.Objects
|
connectionLayer.HitObjects = HitObjects.Objects.Select(d => d.HitObject).OfType<OsuHitObject>();
|
||||||
.Select(d => d.HitObject)
|
|
||||||
.OrderBy(h => h.StartTime).OfType<OsuHitObject>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onJudgement(DrawableHitObject judgedObject, Judgement judgement)
|
private void onJudgement(DrawableHitObject judgedObject, Judgement judgement)
|
||||||
|
@ -8,10 +8,15 @@ using osu.Game.Overlays.Settings;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.UI
|
namespace osu.Game.Rulesets.Osu.UI
|
||||||
{
|
{
|
||||||
public class OsuSettings : SettingsSubsection
|
public class OsuSettings : RulesetSettingsSubsection
|
||||||
{
|
{
|
||||||
protected override string Header => "osu!";
|
protected override string Header => "osu!";
|
||||||
|
|
||||||
|
public OsuSettings(Ruleset ruleset)
|
||||||
|
: base(ruleset)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuConfigManager config)
|
private void load(OsuConfigManager config)
|
||||||
{
|
{
|
||||||
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Difficulty;
|
using osu.Game.Rulesets.Difficulty;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Taiko.Mods;
|
||||||
using osu.Game.Rulesets.Taiko.Objects;
|
using osu.Game.Rulesets.Taiko.Objects;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Taiko.Difficulty
|
namespace osu.Game.Rulesets.Taiko.Difficulty
|
||||||
@ -62,6 +63,14 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
|
|||||||
return starRating;
|
return starRating;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Mod[] DifficultyAdjustmentMods => new Mod[]
|
||||||
|
{
|
||||||
|
new TaikoModDoubleTime(),
|
||||||
|
new TaikoModHalfTime(),
|
||||||
|
new TaikoModEasy(),
|
||||||
|
new TaikoModHardRock(),
|
||||||
|
};
|
||||||
|
|
||||||
private bool calculateStrainValues()
|
private bool calculateStrainValues()
|
||||||
{
|
{
|
||||||
// Traverse hitObjects in pairs to calculate the strain value of NextHitObject from the strain value of CurrentHitObject and environment.
|
// Traverse hitObjects in pairs to calculate the strain value of NextHitObject from the strain value of CurrentHitObject and environment.
|
||||||
|
@ -84,56 +84,25 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
{
|
{
|
||||||
new TaikoModEasy(),
|
new TaikoModEasy(),
|
||||||
new TaikoModNoFail(),
|
new TaikoModNoFail(),
|
||||||
new MultiMod
|
new MultiMod(new TaikoModHalfTime(), new TaikoModDaycore()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new TaikoModHalfTime(),
|
|
||||||
new TaikoModDaycore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.DifficultyIncrease:
|
case ModType.DifficultyIncrease:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new TaikoModHardRock(),
|
new TaikoModHardRock(),
|
||||||
new MultiMod
|
new MultiMod(new TaikoModSuddenDeath(), new TaikoModPerfect()),
|
||||||
{
|
new MultiMod(new TaikoModDoubleTime(), new TaikoModNightcore()),
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new TaikoModSuddenDeath(),
|
|
||||||
new TaikoModPerfect(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new MultiMod
|
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new TaikoModDoubleTime(),
|
|
||||||
new TaikoModNightcore(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new TaikoModHidden(),
|
new TaikoModHidden(),
|
||||||
new TaikoModFlashlight(),
|
new TaikoModFlashlight(),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.Special:
|
case ModType.Special:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new TaikoModRelax(),
|
new TaikoModRelax(),
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
new MultiMod
|
new MultiMod(new TaikoModAutoplay(), new ModCinema()),
|
||||||
{
|
|
||||||
Mods = new Mod[]
|
|
||||||
{
|
|
||||||
new TaikoModAutoplay(),
|
|
||||||
new ModCinema(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return new Mod[] { };
|
return new Mod[] { };
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual(string.Empty, metadata.Source);
|
Assert.AreEqual(string.Empty, metadata.Source);
|
||||||
Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", metadata.Tags);
|
Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", metadata.Tags);
|
||||||
Assert.AreEqual(557821, beatmapInfo.OnlineBeatmapID);
|
Assert.AreEqual(557821, beatmapInfo.OnlineBeatmapID);
|
||||||
Assert.AreEqual(241526, metadata.OnlineBeatmapSetID);
|
Assert.AreEqual(241526, beatmapInfo.BeatmapSet.OnlineBeatmapSetID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
var beatmap = decodeAsJson(normal);
|
var beatmap = decodeAsJson(normal);
|
||||||
var meta = beatmap.BeatmapInfo.Metadata;
|
var meta = beatmap.BeatmapInfo.Metadata;
|
||||||
Assert.AreEqual(241526, meta.OnlineBeatmapSetID);
|
Assert.AreEqual(241526, beatmap.BeatmapInfo.BeatmapSet.OnlineBeatmapSetID);
|
||||||
Assert.AreEqual("Soleily", meta.Artist);
|
Assert.AreEqual("Soleily", meta.Artist);
|
||||||
Assert.AreEqual("Soleily", meta.ArtistUnicode);
|
Assert.AreEqual("Soleily", meta.ArtistUnicode);
|
||||||
Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
|
Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
|
||||||
|
@ -48,17 +48,20 @@ namespace osu.Game.Tests.Beatmaps.IO
|
|||||||
{
|
{
|
||||||
var reader = new ZipArchiveReader(osz);
|
var reader = new ZipArchiveReader(osz);
|
||||||
|
|
||||||
BeatmapMetadata meta;
|
Beatmap beatmap;
|
||||||
using (var stream = new StreamReader(reader.GetStream("Soleily - Renatus (Deif) [Platter].osu")))
|
|
||||||
meta = Decoder.GetDecoder<Beatmap>(stream).Decode(stream).Metadata;
|
|
||||||
|
|
||||||
Assert.AreEqual(241526, meta.OnlineBeatmapSetID);
|
using (var stream = new StreamReader(reader.GetStream("Soleily - Renatus (Deif) [Platter].osu")))
|
||||||
|
beatmap = Decoder.GetDecoder<Beatmap>(stream).Decode(stream);
|
||||||
|
|
||||||
|
var meta = beatmap.Metadata;
|
||||||
|
|
||||||
|
Assert.AreEqual(241526, beatmap.BeatmapInfo.BeatmapSet.OnlineBeatmapSetID);
|
||||||
Assert.AreEqual("Soleily", meta.Artist);
|
Assert.AreEqual("Soleily", meta.Artist);
|
||||||
Assert.AreEqual("Soleily", meta.ArtistUnicode);
|
Assert.AreEqual("Soleily", meta.ArtistUnicode);
|
||||||
Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
|
Assert.AreEqual("03. Renatus - Soleily 192kbps.mp3", meta.AudioFile);
|
||||||
Assert.AreEqual("Deif", meta.AuthorString);
|
Assert.AreEqual("Deif", meta.AuthorString);
|
||||||
Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
|
Assert.AreEqual("machinetop_background.jpg", meta.BackgroundFile);
|
||||||
Assert.AreEqual(164471 + LegacyBeatmapDecoder.UniversalOffset, meta.PreviewTime);
|
Assert.AreEqual(164471, meta.PreviewTime);
|
||||||
Assert.AreEqual(string.Empty, meta.Source);
|
Assert.AreEqual(string.Empty, meta.Source);
|
||||||
Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
|
Assert.AreEqual("MBC7 Unisphere 地球ヤバイEP Chikyu Yabai", meta.Tags);
|
||||||
Assert.AreEqual("Renatus", meta.Title);
|
Assert.AreEqual("Renatus", meta.Title);
|
||||||
|
@ -0,0 +1,152 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Rulesets.Difficulty;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.NonVisual
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class DifficultyAdjustmentModCombinationsTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void TestNoMods()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator().CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(1, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSingleMod()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator(new ModA()).CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(2, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
Assert.IsTrue(combinations[1] is ModA);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDoubleMod()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator(new ModA(), new ModB()).CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(4, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
Assert.IsTrue(combinations[1] is ModA);
|
||||||
|
Assert.IsTrue(combinations[2] is MultiMod);
|
||||||
|
Assert.IsTrue(combinations[3] is ModB);
|
||||||
|
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[2]).Mods[0] is ModA);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[2]).Mods[1] is ModB);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestIncompatibleMods()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator(new ModA(), new ModIncompatibleWithA()).CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(3, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
Assert.IsTrue(combinations[1] is ModA);
|
||||||
|
Assert.IsTrue(combinations[2] is ModIncompatibleWithA);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestDoubleIncompatibleMods()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator(new ModA(), new ModB(), new ModIncompatibleWithA(), new ModIncompatibleWithAAndB()).CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(8, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
Assert.IsTrue(combinations[1] is ModA);
|
||||||
|
Assert.IsTrue(combinations[2] is MultiMod);
|
||||||
|
Assert.IsTrue(combinations[3] is ModB);
|
||||||
|
Assert.IsTrue(combinations[4] is MultiMod);
|
||||||
|
Assert.IsTrue(combinations[5] is ModIncompatibleWithA);
|
||||||
|
Assert.IsTrue(combinations[6] is MultiMod);
|
||||||
|
Assert.IsTrue(combinations[7] is ModIncompatibleWithAAndB);
|
||||||
|
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[2]).Mods[0] is ModA);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[2]).Mods[1] is ModB);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[4]).Mods[0] is ModB);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[4]).Mods[1] is ModIncompatibleWithA);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[6]).Mods[0] is ModIncompatibleWithA);
|
||||||
|
Assert.IsTrue(((MultiMod)combinations[6]).Mods[1] is ModIncompatibleWithAAndB);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestIncompatibleThroughBaseType()
|
||||||
|
{
|
||||||
|
var combinations = new TestDifficultyCalculator(new ModAofA(), new ModIncompatibleWithAofA()).CreateDifficultyAdjustmentModCombinations();
|
||||||
|
|
||||||
|
Assert.AreEqual(3, combinations.Length);
|
||||||
|
Assert.IsTrue(combinations[0] is NoModMod);
|
||||||
|
Assert.IsTrue(combinations[1] is ModAofA);
|
||||||
|
Assert.IsTrue(combinations[2] is ModIncompatibleWithAofA);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModA : Mod
|
||||||
|
{
|
||||||
|
public override string Name => nameof(ModA);
|
||||||
|
public override string ShortenedName => nameof(ModA);
|
||||||
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModIncompatibleWithA), typeof(ModIncompatibleWithAAndB) };
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModB : Mod
|
||||||
|
{
|
||||||
|
public override string Name => nameof(ModB);
|
||||||
|
public override string ShortenedName => nameof(ModB);
|
||||||
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModIncompatibleWithAAndB) };
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModIncompatibleWithA : Mod
|
||||||
|
{
|
||||||
|
public override string Name => $"Incompatible With {nameof(ModA)}";
|
||||||
|
public override string ShortenedName => $"Incompatible With {nameof(ModA)}";
|
||||||
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModA) };
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModAofA : ModA
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModIncompatibleWithAofA : ModIncompatibleWithA
|
||||||
|
{
|
||||||
|
// Incompatible through base type
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ModIncompatibleWithAAndB : Mod
|
||||||
|
{
|
||||||
|
public override string Name => $"Incompatible With {nameof(ModA)} and {nameof(ModB)}";
|
||||||
|
public override string ShortenedName => $"Incompatible With {nameof(ModA)} and {nameof(ModB)}";
|
||||||
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModA), typeof(ModB) };
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TestDifficultyCalculator : DifficultyCalculator
|
||||||
|
{
|
||||||
|
public TestDifficultyCalculator(params Mod[] mods)
|
||||||
|
: base(null)
|
||||||
|
{
|
||||||
|
DifficultyAdjustmentMods = mods;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override double Calculate(Dictionary<string, double> categoryDifficulty = null) => throw new NotImplementedException();
|
||||||
|
|
||||||
|
protected override Mod[] DifficultyAdjustmentMods { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
@ -13,12 +12,11 @@ namespace osu.Game.Tests.Visual
|
|||||||
[Description("Player instantiated with an autoplay mod.")]
|
[Description("Player instantiated with an autoplay mod.")]
|
||||||
public class TestCaseAutoplay : TestCasePlayer
|
public class TestCaseAutoplay : TestCasePlayer
|
||||||
{
|
{
|
||||||
protected override Player CreatePlayer(WorkingBeatmap beatmap, Ruleset ruleset)
|
protected override Player CreatePlayer(Ruleset ruleset)
|
||||||
{
|
{
|
||||||
beatmap.Mods.Value = beatmap.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
Beatmap.Value.Mods.Value = Beatmap.Value.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
||||||
return new ScoreAccessiblePlayer
|
return new ScoreAccessiblePlayer
|
||||||
{
|
{
|
||||||
InitialBeatmap = beatmap,
|
|
||||||
AllowPause = false,
|
AllowPause = false,
|
||||||
AllowLeadIn = false,
|
AllowLeadIn = false,
|
||||||
AllowResults = false,
|
AllowResults = false,
|
||||||
|
@ -449,7 +449,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = id,
|
|
||||||
// Create random metadata, then we can check if sorting works based on these
|
// Create random metadata, then we can check if sorting works based on these
|
||||||
Artist = $"peppy{id.ToString().PadLeft(6, '0')}",
|
Artist = $"peppy{id.ToString().PadLeft(6, '0')}",
|
||||||
Title = $"test set #{id}!",
|
Title = $"test set #{id}!",
|
||||||
@ -503,7 +502,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = id,
|
|
||||||
// Create random metadata, then we can check if sorting works based on these
|
// Create random metadata, then we can check if sorting works based on these
|
||||||
Artist = $"peppy{id.ToString().PadLeft(6, '0')}",
|
Artist = $"peppy{id.ToString().PadLeft(6, '0')}",
|
||||||
Title = $"test set #{id}!",
|
Title = $"test set #{id}!",
|
||||||
|
@ -6,7 +6,6 @@ using System.Linq;
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@ -29,14 +28,11 @@ namespace osu.Game.Tests.Visual
|
|||||||
private RulesetStore rulesets;
|
private RulesetStore rulesets;
|
||||||
private TestBeatmapInfoWedge infoWedge;
|
private TestBeatmapInfoWedge infoWedge;
|
||||||
private readonly List<IBeatmap> beatmaps = new List<IBeatmap>();
|
private readonly List<IBeatmap> beatmaps = new List<IBeatmap>();
|
||||||
private readonly Bindable<WorkingBeatmap> beatmap = new Bindable<WorkingBeatmap>();
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase game, RulesetStore rulesets)
|
private void load(RulesetStore rulesets)
|
||||||
{
|
{
|
||||||
this.rulesets = rulesets;
|
this.rulesets = rulesets;
|
||||||
|
|
||||||
beatmap.BindTo(game.Beatmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
@ -53,11 +49,11 @@ namespace osu.Game.Tests.Visual
|
|||||||
AddStep("show", () =>
|
AddStep("show", () =>
|
||||||
{
|
{
|
||||||
infoWedge.State = Visibility.Visible;
|
infoWedge.State = Visibility.Visible;
|
||||||
infoWedge.Beatmap = beatmap;
|
infoWedge.Beatmap = Beatmap;
|
||||||
});
|
});
|
||||||
|
|
||||||
// select part is redundant, but wait for load isn't
|
// select part is redundant, but wait for load isn't
|
||||||
selectBeatmap(beatmap.Value.Beatmap);
|
selectBeatmap(Beatmap.Value.Beatmap);
|
||||||
|
|
||||||
AddWaitStep(3);
|
AddWaitStep(3);
|
||||||
|
|
||||||
@ -120,8 +116,8 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
selectNullBeatmap();
|
selectNullBeatmap();
|
||||||
AddAssert("check empty version", () => string.IsNullOrEmpty(infoWedge.Info.VersionLabel.Text));
|
AddAssert("check empty version", () => string.IsNullOrEmpty(infoWedge.Info.VersionLabel.Text));
|
||||||
AddAssert("check default title", () => infoWedge.Info.TitleLabel.Text == beatmap.Default.BeatmapInfo.Metadata.Title);
|
AddAssert("check default title", () => infoWedge.Info.TitleLabel.Text == Beatmap.Default.BeatmapInfo.Metadata.Title);
|
||||||
AddAssert("check default artist", () => infoWedge.Info.ArtistLabel.Text == beatmap.Default.BeatmapInfo.Metadata.Artist);
|
AddAssert("check default artist", () => infoWedge.Info.ArtistLabel.Text == Beatmap.Default.BeatmapInfo.Metadata.Artist);
|
||||||
AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.Children.Any());
|
AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.Children.Any());
|
||||||
AddAssert("check no infolabels", () => !infoWedge.Info.InfoLabelContainer.Children.Any());
|
AddAssert("check no infolabels", () => !infoWedge.Info.InfoLabelContainer.Children.Any());
|
||||||
}
|
}
|
||||||
@ -133,7 +129,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
AddStep($"select {b.Metadata.Title} beatmap", () =>
|
AddStep($"select {b.Metadata.Title} beatmap", () =>
|
||||||
{
|
{
|
||||||
infoBefore = infoWedge.Info;
|
infoBefore = infoWedge.Info;
|
||||||
infoWedge.Beatmap = beatmap.Value = new TestWorkingBeatmap(b);
|
infoWedge.Beatmap = Beatmap.Value = new TestWorkingBeatmap(b);
|
||||||
});
|
});
|
||||||
|
|
||||||
AddUntilStep(() => infoWedge.Info != infoBefore, "wait for async load");
|
AddUntilStep(() => infoWedge.Info != infoBefore, "wait for async load");
|
||||||
@ -143,8 +139,8 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
AddStep("select null beatmap", () =>
|
AddStep("select null beatmap", () =>
|
||||||
{
|
{
|
||||||
beatmap.Value = beatmap.Default;
|
Beatmap.Value = Beatmap.Default;
|
||||||
infoWedge.Beatmap = beatmap;
|
infoWedge.Beatmap = Beatmap;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Framework.MathUtils;
|
using osu.Framework.MathUtils;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Online.API.Requests;
|
|
||||||
using osu.Game.Overlays.BeatmapSet.Scores;
|
using osu.Game.Overlays.BeatmapSet.Scores;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Osu.Mods;
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
@ -15,6 +14,7 @@ using osu.Game.Users;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
@ -22,9 +22,9 @@ namespace osu.Game.Tests.Visual
|
|||||||
[System.ComponentModel.Description("in BeatmapOverlay")]
|
[System.ComponentModel.Description("in BeatmapOverlay")]
|
||||||
public class TestCaseBeatmapScoresContainer : OsuTestCase
|
public class TestCaseBeatmapScoresContainer : OsuTestCase
|
||||||
{
|
{
|
||||||
private readonly IEnumerable<OnlineScore> scores;
|
private readonly IEnumerable<APIScore> scores;
|
||||||
private readonly IEnumerable<OnlineScore> anotherScores;
|
private readonly IEnumerable<APIScore> anotherScores;
|
||||||
private readonly OnlineScore topScore;
|
private readonly APIScore topScore;
|
||||||
private readonly Box background;
|
private readonly Box background;
|
||||||
|
|
||||||
public TestCaseBeatmapScoresContainer()
|
public TestCaseBeatmapScoresContainer()
|
||||||
@ -52,12 +52,12 @@ namespace osu.Game.Tests.Visual
|
|||||||
AddStep("remove scores", () => scoresContainer.Scores = null);
|
AddStep("remove scores", () => scoresContainer.Scores = null);
|
||||||
AddStep("resize to big", () => container.ResizeWidthTo(1, 300));
|
AddStep("resize to big", () => container.ResizeWidthTo(1, 300));
|
||||||
AddStep("resize to normal", () => container.ResizeWidthTo(0.8f, 300));
|
AddStep("resize to normal", () => container.ResizeWidthTo(0.8f, 300));
|
||||||
AddStep("online scores", () => scoresContainer.Beatmap = new BeatmapInfo { OnlineBeatmapSetID = 1, OnlineBeatmapID = 75, Ruleset = new OsuRuleset().RulesetInfo });
|
AddStep("online scores", () => scoresContainer.Beatmap = new BeatmapInfo { OnlineBeatmapID = 75, Ruleset = new OsuRuleset().RulesetInfo });
|
||||||
|
|
||||||
|
|
||||||
scores = new[]
|
scores = new[]
|
||||||
{
|
{
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -80,7 +80,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 1234567890,
|
TotalScore = 1234567890,
|
||||||
Accuracy = 1,
|
Accuracy = 1,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -102,7 +102,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 1234789,
|
TotalScore = 1234789,
|
||||||
Accuracy = 0.9997,
|
Accuracy = 0.9997,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -123,7 +123,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 12345678,
|
TotalScore = 12345678,
|
||||||
Accuracy = 0.9854,
|
Accuracy = 0.9854,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -143,7 +143,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 1234567,
|
TotalScore = 1234567,
|
||||||
Accuracy = 0.8765,
|
Accuracy = 0.8765,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -169,7 +169,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
anotherScores = new[]
|
anotherScores = new[]
|
||||||
{
|
{
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -191,7 +191,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 1234789,
|
TotalScore = 1234789,
|
||||||
Accuracy = 0.9997,
|
Accuracy = 0.9997,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -214,7 +214,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 1234567890,
|
TotalScore = 1234567890,
|
||||||
Accuracy = 1,
|
Accuracy = 1,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -230,7 +230,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 123456,
|
TotalScore = 123456,
|
||||||
Accuracy = 0.6543,
|
Accuracy = 0.6543,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -251,7 +251,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
TotalScore = 12345678,
|
TotalScore = 12345678,
|
||||||
Accuracy = 0.9854,
|
Accuracy = 0.9854,
|
||||||
},
|
},
|
||||||
new OnlineScore
|
new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
@ -279,7 +279,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
s.Statistics.Add(HitResult.Meh, RNG.Next(2000));
|
s.Statistics.Add(HitResult.Meh, RNG.Next(2000));
|
||||||
}
|
}
|
||||||
|
|
||||||
topScore = new OnlineScore
|
topScore = new APIScore
|
||||||
{
|
{
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
|
@ -35,9 +35,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
typeof(MessageFormatter)
|
typeof(MessageFormatter)
|
||||||
};
|
};
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
|
|
||||||
|
|
||||||
public TestCaseChatLink()
|
public TestCaseChatLink()
|
||||||
{
|
{
|
||||||
Add(textContainer = new TestChatLineContainer
|
Add(textContainer = new TestChatLineContainer
|
||||||
@ -53,7 +50,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
private void load(OsuColour colours)
|
private void load(OsuColour colours)
|
||||||
{
|
{
|
||||||
linkColour = colours.Blue;
|
linkColour = colours.Blue;
|
||||||
dependencies.Cache(new ChatOverlay
|
Dependencies.Cache(new ChatOverlay
|
||||||
{
|
{
|
||||||
AvailableChannels =
|
AvailableChannels =
|
||||||
{
|
{
|
||||||
|
@ -17,14 +17,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(Compose) };
|
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(Compose) };
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase osuGame)
|
private void load()
|
||||||
{
|
{
|
||||||
osuGame.Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
||||||
|
Child = new Compose();
|
||||||
var compose = new Compose();
|
|
||||||
compose.Beatmap.BindTo(osuGame.Beatmap);
|
|
||||||
|
|
||||||
Child = compose;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
@ -16,9 +15,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestCaseEditorComposeTimeline : OsuTestCase
|
public class TestCaseEditorComposeTimeline : OsuTestCase
|
||||||
{
|
{
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(ScrollableTimeline), typeof(ScrollingTimelineContainer), typeof(BeatmapWaveformGraph), typeof(TimelineButton) };
|
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(TimelineArea), typeof(Timeline), typeof(TimelineButton) };
|
||||||
|
|
||||||
private readonly ScrollableTimeline timeline;
|
|
||||||
|
|
||||||
public TestCaseEditorComposeTimeline()
|
public TestCaseEditorComposeTimeline()
|
||||||
{
|
{
|
||||||
@ -30,19 +27,14 @@ namespace osu.Game.Tests.Visual
|
|||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
State = Visibility.Visible
|
State = Visibility.Visible
|
||||||
},
|
},
|
||||||
timeline = new ScrollableTimeline
|
new TimelineArea
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Size = new Vector2(1000, 100)
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Size = new Vector2(0.8f, 100)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuGameBase osuGame)
|
|
||||||
{
|
|
||||||
timeline.Beatmap.BindTo(osuGame.Beatmap);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase osuGame)
|
private void load()
|
||||||
{
|
{
|
||||||
var testBeatmap = new Beatmap
|
var testBeatmap = new Beatmap
|
||||||
{
|
{
|
||||||
@ -53,7 +53,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
osuGame.Beatmap.Value = new TestWorkingBeatmap(testBeatmap);
|
Beatmap.Value = new TestWorkingBeatmap(testBeatmap);
|
||||||
|
|
||||||
Child = new TimingPointVisualiser(testBeatmap, 5000) { Clock = Clock };
|
Child = new TimingPointVisualiser(testBeatmap, 5000) { Clock = Clock };
|
||||||
|
|
||||||
|
@ -19,19 +19,16 @@ namespace osu.Game.Tests.Visual
|
|||||||
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(SummaryTimeline) };
|
public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(SummaryTimeline) };
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase osuGame)
|
private void load()
|
||||||
{
|
{
|
||||||
osuGame.Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
||||||
|
|
||||||
SummaryTimeline summaryTimeline;
|
Add(new SummaryTimeline
|
||||||
Add(summaryTimeline = new SummaryTimeline
|
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Size = new Vector2(500, 50)
|
Size = new Vector2(500, 50)
|
||||||
});
|
});
|
||||||
|
|
||||||
summaryTimeline.Beatmap.BindTo(osuGame.Beatmap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,15 +32,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
typeof(NotNullAttribute)
|
typeof(NotNullAttribute)
|
||||||
};
|
};
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent)
|
|
||||||
=> dependencies = new DependencyContainer(parent);
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase osuGame)
|
private void load()
|
||||||
{
|
{
|
||||||
osuGame.Beatmap.Value = new TestWorkingBeatmap(new Beatmap
|
Beatmap.Value = new TestWorkingBeatmap(new Beatmap
|
||||||
{
|
{
|
||||||
HitObjects = new List<HitObject>
|
HitObjects = new List<HitObject>
|
||||||
{
|
{
|
||||||
@ -63,8 +58,8 @@ namespace osu.Game.Tests.Visual
|
|||||||
});
|
});
|
||||||
|
|
||||||
var clock = new DecoupleableInterpolatingFramedClock { IsCoupled = false };
|
var clock = new DecoupleableInterpolatingFramedClock { IsCoupled = false };
|
||||||
dependencies.CacheAs<IAdjustableClock>(clock);
|
Dependencies.CacheAs<IAdjustableClock>(clock);
|
||||||
dependencies.CacheAs<IFrameBasedClock>(clock);
|
Dependencies.CacheAs<IFrameBasedClock>(clock);
|
||||||
|
|
||||||
Child = new OsuHitObjectComposer(new OsuRuleset());
|
Child = new OsuHitObjectComposer(new OsuRuleset());
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
// 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 NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Timing;
|
using osu.Framework.Timing;
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
@ -15,8 +12,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestCaseMusicController : OsuTestCase
|
public class TestCaseMusicController : OsuTestCase
|
||||||
{
|
{
|
||||||
private readonly Bindable<WorkingBeatmap> beatmapBacking = new Bindable<WorkingBeatmap>();
|
|
||||||
|
|
||||||
public TestCaseMusicController()
|
public TestCaseMusicController()
|
||||||
{
|
{
|
||||||
Clock = new FramedClock();
|
Clock = new FramedClock();
|
||||||
@ -30,13 +25,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
AddToggleStep(@"toggle visibility", state => mc.State = state ? Visibility.Visible : Visibility.Hidden);
|
AddToggleStep(@"toggle visibility", state => mc.State = state ? Visibility.Visible : Visibility.Hidden);
|
||||||
AddStep(@"show", () => mc.State = Visibility.Visible);
|
AddStep(@"show", () => mc.State = Visibility.Visible);
|
||||||
AddToggleStep(@"toggle beatmap lock", state => beatmapBacking.Disabled = state);
|
AddToggleStep(@"toggle beatmap lock", state => Beatmap.Disabled = state);
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuGameBase game)
|
|
||||||
{
|
|
||||||
beatmapBacking.BindTo(game.Beatmap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
private RulesetStore rulesets;
|
private RulesetStore rulesets;
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
|
||||||
private WorkingBeatmap defaultBeatmap;
|
private WorkingBeatmap defaultBeatmap;
|
||||||
|
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[]
|
public override IReadOnlyList<Type> RequiredTypes => new[]
|
||||||
@ -48,8 +47,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
typeof(DrawableCarouselBeatmapSet),
|
typeof(DrawableCarouselBeatmapSet),
|
||||||
};
|
};
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
|
|
||||||
|
|
||||||
private class TestSongSelect : PlaySongSelect
|
private class TestSongSelect : PlaySongSelect
|
||||||
{
|
{
|
||||||
public WorkingBeatmap CurrentBeatmap => Beatmap.Value;
|
public WorkingBeatmap CurrentBeatmap => Beatmap.Value;
|
||||||
@ -58,7 +55,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase game)
|
private void load()
|
||||||
{
|
{
|
||||||
TestSongSelect songSelect = null;
|
TestSongSelect songSelect = null;
|
||||||
|
|
||||||
@ -67,10 +64,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
// this is by no means clean. should be replacing inside of OsuGameBase somehow.
|
// this is by no means clean. should be replacing inside of OsuGameBase somehow.
|
||||||
IDatabaseContextFactory factory = new SingletonContextFactory(new OsuDbContext());
|
IDatabaseContextFactory factory = new SingletonContextFactory(new OsuDbContext());
|
||||||
|
|
||||||
dependencies.Cache(rulesets = new RulesetStore(factory));
|
Dependencies.Cache(rulesets = new RulesetStore(factory));
|
||||||
dependencies.Cache(manager = new BeatmapManager(storage, factory, rulesets, null, null)
|
Dependencies.Cache(manager = new BeatmapManager(storage, factory, rulesets, null, null)
|
||||||
{
|
{
|
||||||
DefaultBeatmap = defaultBeatmap = game.Beatmap.Default
|
DefaultBeatmap = defaultBeatmap = Beatmap.Default
|
||||||
});
|
});
|
||||||
|
|
||||||
void loadNewSongSelect(bool deleteMaps = false) => AddStep("reload song select", () =>
|
void loadNewSongSelect(bool deleteMaps = false) => AddStep("reload song select", () =>
|
||||||
@ -78,7 +75,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
if (deleteMaps)
|
if (deleteMaps)
|
||||||
{
|
{
|
||||||
manager.Delete(manager.GetAllUsableBeatmapSets());
|
manager.Delete(manager.GetAllUsableBeatmapSets());
|
||||||
game.Beatmap.SetDefault();
|
Beatmap.SetDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (songSelect != null)
|
if (songSelect != null)
|
||||||
@ -125,7 +122,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = 1234 + i,
|
|
||||||
// Create random metadata, then we can check if sorting works based on these
|
// Create random metadata, then we can check if sorting works based on these
|
||||||
Artist = "MONACA " + RNG.Next(0, 9),
|
Artist = "MONACA " + RNG.Next(0, 9),
|
||||||
Title = "Black Song " + RNG.Next(0, 9),
|
Title = "Black Song " + RNG.Next(0, 9),
|
||||||
|
@ -15,17 +15,12 @@ namespace osu.Game.Tests.Visual
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestCasePlaybackControl : OsuTestCase
|
public class TestCasePlaybackControl : OsuTestCase
|
||||||
{
|
{
|
||||||
private DependencyContainer dependencies;
|
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent)
|
|
||||||
=> dependencies = new DependencyContainer(parent);
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
var clock = new DecoupleableInterpolatingFramedClock { IsCoupled = false };
|
var clock = new DecoupleableInterpolatingFramedClock { IsCoupled = false };
|
||||||
dependencies.CacheAs<IAdjustableClock>(clock);
|
Dependencies.CacheAs<IAdjustableClock>(clock);
|
||||||
dependencies.CacheAs<IFrameBasedClock>(clock);
|
Dependencies.CacheAs<IFrameBasedClock>(clock);
|
||||||
|
|
||||||
var playback = new PlaybackControl
|
var playback = new PlaybackControl
|
||||||
{
|
{
|
||||||
@ -34,7 +29,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Size = new Vector2(200,100)
|
Size = new Vector2(200,100)
|
||||||
};
|
};
|
||||||
|
|
||||||
playback.Beatmap.Value = new TestWorkingBeatmap(new Beatmap());
|
Beatmap.Value = new TestWorkingBeatmap(new Beatmap());
|
||||||
|
|
||||||
Child = playback;
|
Child = playback;
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase game)
|
private void load(OsuGameBase game)
|
||||||
{
|
{
|
||||||
|
Beatmap.Value = new DummyWorkingBeatmap(game);
|
||||||
|
|
||||||
AddStep("load dummy beatmap", () => Add(new PlayerLoader(new Player
|
AddStep("load dummy beatmap", () => Add(new PlayerLoader(new Player
|
||||||
{
|
{
|
||||||
InitialBeatmap = new DummyWorkingBeatmap(game),
|
|
||||||
AllowPause = false,
|
AllowPause = false,
|
||||||
AllowLeadIn = false,
|
AllowLeadIn = false,
|
||||||
AllowResults = false,
|
AllowResults = false,
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
@ -13,23 +12,20 @@ namespace osu.Game.Tests.Visual
|
|||||||
[Description("Player instantiated with a replay.")]
|
[Description("Player instantiated with a replay.")]
|
||||||
public class TestCaseReplay : TestCasePlayer
|
public class TestCaseReplay : TestCasePlayer
|
||||||
{
|
{
|
||||||
protected override Player CreatePlayer(WorkingBeatmap beatmap, Ruleset ruleset)
|
protected override Player CreatePlayer(Ruleset ruleset)
|
||||||
{
|
{
|
||||||
// We create a dummy RulesetContainer just to get the replay - we don't want to use mods here
|
// We create a dummy RulesetContainer just to get the replay - we don't want to use mods here
|
||||||
// to simulate setting a replay rather than having the replay already set for us
|
// to simulate setting a replay rather than having the replay already set for us
|
||||||
beatmap.Mods.Value = beatmap.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
Beatmap.Value.Mods.Value = Beatmap.Value.Mods.Value.Concat(new[] { ruleset.GetAutoplayMod() });
|
||||||
var dummyRulesetContainer = ruleset.CreateRulesetContainerWith(beatmap);
|
var dummyRulesetContainer = ruleset.CreateRulesetContainerWith(Beatmap.Value);
|
||||||
|
|
||||||
// We have the replay
|
// We have the replay
|
||||||
var replay = dummyRulesetContainer.Replay;
|
var replay = dummyRulesetContainer.Replay;
|
||||||
|
|
||||||
// Reset the mods
|
// Reset the mods
|
||||||
beatmap.Mods.Value = beatmap.Mods.Value.Where(m => !(m is ModAutoplay));
|
Beatmap.Value.Mods.Value = Beatmap.Value.Mods.Value.Where(m => !(m is ModAutoplay));
|
||||||
|
|
||||||
return new ReplayPlayer(replay)
|
return new ReplayPlayer(replay);
|
||||||
{
|
|
||||||
InitialBeatmap = beatmap
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,18 +32,13 @@ namespace osu.Game.Tests.Visual
|
|||||||
this.beatmaps = beatmaps;
|
this.beatmaps = beatmaps;
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorkingBeatmap beatmap;
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
if (beatmap == null)
|
var beatmapInfo = beatmaps.QueryBeatmap(b => b.RulesetID == 0);
|
||||||
{
|
if (beatmapInfo != null)
|
||||||
var beatmapInfo = beatmaps.QueryBeatmap(b => b.RulesetID == 0);
|
Beatmap.Value = beatmaps.GetWorkingBeatmap(beatmapInfo);
|
||||||
if (beatmapInfo != null)
|
|
||||||
beatmap = beatmaps.GetWorkingBeatmap(beatmapInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
Add(new Results(new Score
|
Add(new Results(new Score
|
||||||
{
|
{
|
||||||
@ -63,10 +58,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
Username = "peppy",
|
Username = "peppy",
|
||||||
}
|
}
|
||||||
})
|
}));
|
||||||
{
|
|
||||||
InitialBeatmap = beatmap
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
private readonly SettingsOverlay settings;
|
private readonly SettingsOverlay settings;
|
||||||
private readonly DialogOverlay dialogOverlay;
|
private readonly DialogOverlay dialogOverlay;
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateLocalDependencies(IReadOnlyDependencyContainer parent) => dependencies = new DependencyContainer(parent);
|
|
||||||
|
|
||||||
public TestCaseSettings()
|
public TestCaseSettings()
|
||||||
{
|
{
|
||||||
settings = new MainSettings
|
settings = new MainSettings
|
||||||
@ -33,7 +29,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
dependencies.Cache(dialogOverlay);
|
Dependencies.Cache(dialogOverlay);
|
||||||
|
|
||||||
Add(settings);
|
Add(settings);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
@ -18,8 +17,6 @@ namespace osu.Game.Tests.Visual
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestCaseStoryboard : OsuTestCase
|
public class TestCaseStoryboard : OsuTestCase
|
||||||
{
|
{
|
||||||
private readonly Bindable<WorkingBeatmap> beatmapBacking = new Bindable<WorkingBeatmap>();
|
|
||||||
|
|
||||||
private readonly Container<DrawableStoryboard> storyboardContainer;
|
private readonly Container<DrawableStoryboard> storyboardContainer;
|
||||||
private DrawableStoryboard storyboard;
|
private DrawableStoryboard storyboard;
|
||||||
|
|
||||||
@ -43,6 +40,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
Add(new MusicController
|
Add(new MusicController
|
||||||
{
|
{
|
||||||
Origin = Anchor.TopRight,
|
Origin = Anchor.TopRight,
|
||||||
@ -55,10 +53,9 @@ namespace osu.Game.Tests.Visual
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase game)
|
private void load()
|
||||||
{
|
{
|
||||||
beatmapBacking.BindTo(game.Beatmap);
|
Beatmap.ValueChanged += beatmapChanged;
|
||||||
beatmapBacking.ValueChanged += beatmapChanged;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void beatmapChanged(WorkingBeatmap working)
|
private void beatmapChanged(WorkingBeatmap working)
|
||||||
@ -66,10 +63,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
private void restart()
|
private void restart()
|
||||||
{
|
{
|
||||||
var track = beatmapBacking.Value.Track;
|
var track = Beatmap.Value.Track;
|
||||||
|
|
||||||
track.Reset();
|
track.Reset();
|
||||||
loadStoryboard(beatmapBacking.Value);
|
loadStoryboard(Beatmap);
|
||||||
track.Start();
|
track.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +78,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
var decoupledClock = new DecoupleableInterpolatingFramedClock { IsCoupled = true };
|
var decoupledClock = new DecoupleableInterpolatingFramedClock { IsCoupled = true };
|
||||||
storyboardContainer.Clock = decoupledClock;
|
storyboardContainer.Clock = decoupledClock;
|
||||||
|
|
||||||
storyboard = working.Storyboard.CreateDrawable(beatmapBacking);
|
storyboard = working.Storyboard.CreateDrawable(Beatmap);
|
||||||
storyboard.Passing = false;
|
storyboard.Passing = false;
|
||||||
|
|
||||||
storyboardContainer.Add(storyboard);
|
storyboardContainer.Add(storyboard);
|
||||||
|
@ -12,6 +12,7 @@ using osu.Game.Overlays.Profile.Sections.Recent;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
{
|
{
|
||||||
@ -49,15 +50,15 @@ namespace osu.Game.Tests.Visual
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<RecentActivity> createDummyActivities()
|
private IEnumerable<APIRecentActivity> createDummyActivities()
|
||||||
{
|
{
|
||||||
var dummyBeatmap = new RecentActivity.RecentActivityBeatmap
|
var dummyBeatmap = new APIRecentActivity.RecentActivityBeatmap
|
||||||
{
|
{
|
||||||
Title = @"Dummy beatmap",
|
Title = @"Dummy beatmap",
|
||||||
Url = "/b/1337",
|
Url = "/b/1337",
|
||||||
};
|
};
|
||||||
|
|
||||||
var dummyUser = new RecentActivity.RecentActivityUser
|
var dummyUser = new APIRecentActivity.RecentActivityUser
|
||||||
{
|
{
|
||||||
Username = "DummyReborn",
|
Username = "DummyReborn",
|
||||||
Url = "/u/666",
|
Url = "/u/666",
|
||||||
@ -66,61 +67,61 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.Achievement,
|
Type = RecentActivityType.Achievement,
|
||||||
Achievement = new RecentActivity.RecentActivityAchievement
|
Achievement = new APIRecentActivity.RecentActivityAchievement
|
||||||
{
|
{
|
||||||
Name = @"Feelin' It",
|
Name = @"Feelin' It",
|
||||||
Slug = @"all-secret-feelinit",
|
Slug = @"all-secret-feelinit",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapPlaycount,
|
Type = RecentActivityType.BeatmapPlaycount,
|
||||||
Count = 1337,
|
Count = 1337,
|
||||||
Beatmap = dummyBeatmap,
|
Beatmap = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetApprove,
|
Type = RecentActivityType.BeatmapsetApprove,
|
||||||
Approval = BeatmapApproval.Qualified,
|
Approval = BeatmapApproval.Qualified,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetDelete,
|
Type = RecentActivityType.BeatmapsetDelete,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetRevive,
|
Type = RecentActivityType.BeatmapsetRevive,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetRevive,
|
Type = RecentActivityType.BeatmapsetRevive,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetUpdate,
|
Type = RecentActivityType.BeatmapsetUpdate,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.BeatmapsetUpload,
|
Type = RecentActivityType.BeatmapsetUpload,
|
||||||
Beatmapset = dummyBeatmap,
|
Beatmapset = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.Rank,
|
Type = RecentActivityType.Rank,
|
||||||
@ -128,29 +129,29 @@ namespace osu.Game.Tests.Visual
|
|||||||
Mode = "osu!",
|
Mode = "osu!",
|
||||||
Beatmap = dummyBeatmap,
|
Beatmap = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.RankLost,
|
Type = RecentActivityType.RankLost,
|
||||||
Mode = "osu!",
|
Mode = "osu!",
|
||||||
Beatmap = dummyBeatmap,
|
Beatmap = dummyBeatmap,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.UsernameChange,
|
Type = RecentActivityType.UsernameChange,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.UserSupportAgain,
|
Type = RecentActivityType.UserSupportAgain,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.UserSupportFirst,
|
Type = RecentActivityType.UserSupportFirst,
|
||||||
},
|
},
|
||||||
new RecentActivity
|
new APIRecentActivity
|
||||||
{
|
{
|
||||||
User = dummyUser,
|
User = dummyUser,
|
||||||
Type = RecentActivityType.UserSupportGift,
|
Type = RecentActivityType.UserSupportGift,
|
||||||
|
@ -5,23 +5,20 @@ using NUnit.Framework;
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Audio;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Screens.Edit.Screens.Compose.Timeline;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestCaseWaveform : OsuTestCase
|
public class TestCaseWaveform : OsuTestCase
|
||||||
{
|
{
|
||||||
private readonly Bindable<WorkingBeatmap> beatmapBacking = new Bindable<WorkingBeatmap>();
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
public TestCaseWaveform()
|
|
||||||
{
|
{
|
||||||
FillFlowContainer flow;
|
FillFlowContainer flow;
|
||||||
Child = flow = new FillFlowContainer
|
Child = flow = new FillFlowContainer
|
||||||
@ -43,13 +40,13 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
for (int i = 1; i <= 16; i *= 2)
|
for (int i = 1; i <= 16; i *= 2)
|
||||||
{
|
{
|
||||||
var newDisplay = new BeatmapWaveformGraph
|
var newDisplay = new WaveformGraph
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Resolution = 1f / i
|
Resolution = 1f / i,
|
||||||
};
|
};
|
||||||
|
|
||||||
newDisplay.Beatmap.BindTo(beatmapBacking);
|
Beatmap.ValueChanged += b => newDisplay.Waveform = b.Waveform;
|
||||||
|
|
||||||
flow.Add(new Container
|
flow.Add(new Container
|
||||||
{
|
{
|
||||||
@ -83,8 +80,5 @@ namespace osu.Game.Tests.Visual
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuGameBase osuGame) => beatmapBacking.BindTo(osuGame.Beatmap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
142
osu.Game.Tests/Visual/TestCaseZoomableScrollContainer.cs
Normal file
142
osu.Game.Tests/Visual/TestCaseZoomableScrollContainer.cs
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Colour;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Primitives;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.MathUtils;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.Cursor;
|
||||||
|
using osu.Game.Screens.Edit.Screens.Compose.Timeline;
|
||||||
|
using OpenTK;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
using OpenTK.Input;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Visual
|
||||||
|
{
|
||||||
|
public class TestCaseZoomableScrollContainer : ManualInputManagerTestCase
|
||||||
|
{
|
||||||
|
private readonly ZoomableScrollContainer scrollContainer;
|
||||||
|
private readonly Drawable innerBox;
|
||||||
|
|
||||||
|
public TestCaseZoomableScrollContainer()
|
||||||
|
{
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = 250,
|
||||||
|
Width = 0.75f,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = OsuColour.Gray(30)
|
||||||
|
},
|
||||||
|
scrollContainer = new ZoomableScrollContainer { RelativeSizeAxes = Axes.Both }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new MenuCursor()
|
||||||
|
};
|
||||||
|
|
||||||
|
scrollContainer.Add(innerBox = new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = ColourInfo.GradientHorizontal(new Color4(0.8f, 0.6f, 0.4f, 1f), new Color4(0.4f, 0.6f, 0.8f, 1f))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestZoom0()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
AddAssert("Box at 0", () => Precision.AlmostEquals(boxQuad.TopLeft, scrollQuad.TopLeft));
|
||||||
|
AddAssert("Box width = 1x", () => Precision.AlmostEquals(boxQuad.Size, scrollQuad.Size));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestZoom10()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
AddStep("Set zoom = 10", () => scrollContainer.Zoom = 10);
|
||||||
|
AddAssert("Box at 1/2", () => Precision.AlmostEquals(boxQuad.Centre, scrollQuad.Centre));
|
||||||
|
AddAssert("Box width = 10x", () => Precision.AlmostEquals(boxQuad.Size.X, 10 * scrollQuad.Size.X));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestMouseZoomInOnceOutOnce()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
|
||||||
|
// Scroll in at 0.25
|
||||||
|
AddStep("Move mouse to 0.25x", () => InputManager.MoveMouseTo(new Vector2(scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X, scrollQuad.Centre.Y)));
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by 3", () => InputManager.ScrollBy(new Vector2(3, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
AddAssert("Box not at 0", () => !Precision.AlmostEquals(boxQuad.TopLeft, scrollQuad.TopLeft));
|
||||||
|
AddAssert("Box 1/4 at 1/4", () => Precision.AlmostEquals(boxQuad.TopLeft.X + 0.25f * boxQuad.Size.X, scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X));
|
||||||
|
|
||||||
|
// Scroll out at 0.25
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by -3", () => InputManager.ScrollBy(new Vector2(-3, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
AddAssert("Box at 0", () => Precision.AlmostEquals(boxQuad.TopLeft, scrollQuad.TopLeft));
|
||||||
|
AddAssert("Box 1/4 at 1/4", () => Precision.AlmostEquals(boxQuad.TopLeft.X + 0.25f * boxQuad.Size.X, scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestMouseZoomInTwiceOutTwice()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
|
||||||
|
// Scroll in at 0.25
|
||||||
|
AddStep("Move mouse to 0.25x", () => InputManager.MoveMouseTo(new Vector2(scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X, scrollQuad.Centre.Y)));
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by 1", () => InputManager.ScrollBy(new Vector2(1, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
|
||||||
|
// Scroll in at 0.6
|
||||||
|
AddStep("Move mouse to 0.75x", () => InputManager.MoveMouseTo(new Vector2(scrollQuad.TopLeft.X + 0.75f * scrollQuad.Size.X, scrollQuad.Centre.Y)));
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by 1", () => InputManager.ScrollBy(new Vector2(1, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
AddAssert("Box not at 0", () => !Precision.AlmostEquals(boxQuad.TopLeft, scrollQuad.TopLeft));
|
||||||
|
|
||||||
|
// Very hard to determine actual position, so approximate
|
||||||
|
AddAssert("Box at correct position (1)", () => Precision.DefinitelyBigger(scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X, boxQuad.TopLeft.X + 0.25f * boxQuad.Size.X));
|
||||||
|
AddAssert("Box at correct position (2)", () => Precision.DefinitelyBigger(scrollQuad.TopLeft.X + 0.6f * scrollQuad.Size.X, boxQuad.TopLeft.X + 0.3f * boxQuad.Size.X));
|
||||||
|
AddAssert("Box at correct position (3)", () => Precision.DefinitelyBigger(boxQuad.TopLeft.X + 0.6f * boxQuad.Size.X, scrollQuad.TopLeft.X + 0.6f * scrollQuad.Size.X));
|
||||||
|
|
||||||
|
// Scroll out at 0.6
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by -1", () => InputManager.ScrollBy(new Vector2(-1, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
|
||||||
|
// Scroll out at 0.25
|
||||||
|
AddStep("Move mouse to 0.25x", () => InputManager.MoveMouseTo(new Vector2(scrollQuad.TopLeft.X + 0.25f * scrollQuad.Size.X, scrollQuad.Centre.Y)));
|
||||||
|
AddStep("Press ctrl", () => InputManager.PressKey(Key.LControl));
|
||||||
|
AddStep("Scroll by -1", () => InputManager.ScrollBy(new Vector2(-1, 0)));
|
||||||
|
AddStep("Release ctrl", () => InputManager.ReleaseKey(Key.LControl));
|
||||||
|
AddAssert("Box at 0", () => Precision.AlmostEquals(boxQuad.TopLeft, scrollQuad.TopLeft));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reset()
|
||||||
|
{
|
||||||
|
AddStep("Reset", () =>
|
||||||
|
{
|
||||||
|
scrollContainer.Zoom = 0;
|
||||||
|
scrollContainer.ScrollTo(0, false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Quad scrollQuad => scrollContainer.ScreenSpaceDrawQuad;
|
||||||
|
private Quad boxQuad => innerBox.ScreenSpaceDrawQuad;
|
||||||
|
}
|
||||||
|
}
|
@ -23,7 +23,6 @@ namespace osu.Game.Beatmaps
|
|||||||
public int BeatmapVersion;
|
public int BeatmapVersion;
|
||||||
|
|
||||||
private int? onlineBeatmapID;
|
private int? onlineBeatmapID;
|
||||||
private int? onlineBeatmapSetID;
|
|
||||||
|
|
||||||
[JsonProperty("id")]
|
[JsonProperty("id")]
|
||||||
public int? OnlineBeatmapID
|
public int? OnlineBeatmapID
|
||||||
@ -32,19 +31,10 @@ namespace osu.Game.Beatmaps
|
|||||||
set { onlineBeatmapID = value > 0 ? value : null; }
|
set { onlineBeatmapID = value > 0 ? value : null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonProperty("beatmapset_id")]
|
|
||||||
[NotMapped]
|
|
||||||
public int? OnlineBeatmapSetID
|
|
||||||
{
|
|
||||||
get { return onlineBeatmapSetID; }
|
|
||||||
set { onlineBeatmapSetID = value > 0 ? value : null; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public int BeatmapSetInfoID { get; set; }
|
public int BeatmapSetInfoID { get; set; }
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
[JsonIgnore]
|
|
||||||
public BeatmapSetInfo BeatmapSet { get; set; }
|
public BeatmapSetInfo BeatmapSet { get; set; }
|
||||||
|
|
||||||
public BeatmapMetadata Metadata { get; set; }
|
public BeatmapMetadata Metadata { get; set; }
|
||||||
@ -141,8 +131,8 @@ namespace osu.Game.Beatmaps
|
|||||||
(Metadata ?? BeatmapSet.Metadata).AudioFile == (other.Metadata ?? other.BeatmapSet.Metadata).AudioFile;
|
(Metadata ?? BeatmapSet.Metadata).AudioFile == (other.Metadata ?? other.BeatmapSet.Metadata).AudioFile;
|
||||||
|
|
||||||
public bool BackgroundEquals(BeatmapInfo other) => other != null && BeatmapSet != null && other.BeatmapSet != null &&
|
public bool BackgroundEquals(BeatmapInfo other) => other != null && BeatmapSet != null && other.BeatmapSet != null &&
|
||||||
BeatmapSet.Hash == other.BeatmapSet.Hash &&
|
BeatmapSet.Hash == other.BeatmapSet.Hash &&
|
||||||
(Metadata ?? BeatmapSet.Metadata).BackgroundFile == (other.Metadata ?? other.BeatmapSet.Metadata).BackgroundFile;
|
(Metadata ?? BeatmapSet.Metadata).BackgroundFile == (other.Metadata ?? other.BeatmapSet.Metadata).BackgroundFile;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a shallow-clone of this <see cref="BeatmapInfo"/>.
|
/// Returns a shallow-clone of this <see cref="BeatmapInfo"/>.
|
||||||
|
@ -81,12 +81,31 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
protected override void Populate(BeatmapSetInfo model, ArchiveReader archive)
|
protected override void Populate(BeatmapSetInfo model, ArchiveReader archive)
|
||||||
{
|
{
|
||||||
model.Beatmaps = createBeatmapDifficulties(model, archive);
|
model.Beatmaps = createBeatmapDifficulties(archive);
|
||||||
|
|
||||||
// remove metadata from difficulties where it matches the set
|
|
||||||
foreach (BeatmapInfo b in model.Beatmaps)
|
foreach (BeatmapInfo b in model.Beatmaps)
|
||||||
|
{
|
||||||
|
// remove metadata from difficulties where it matches the set
|
||||||
if (model.Metadata.Equals(b.Metadata))
|
if (model.Metadata.Equals(b.Metadata))
|
||||||
b.Metadata = null;
|
b.Metadata = null;
|
||||||
|
|
||||||
|
// by setting the model here, we can update the noline set id below.
|
||||||
|
b.BeatmapSet = model;
|
||||||
|
|
||||||
|
fetchAndPopulateOnlineIDs(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if a set already exists with the same online id, delete if it does.
|
||||||
|
if (model.OnlineBeatmapSetID != null)
|
||||||
|
{
|
||||||
|
var existingOnlineId = beatmaps.ConsumableItems.FirstOrDefault(b => b.OnlineBeatmapSetID == model.OnlineBeatmapSetID);
|
||||||
|
if (existingOnlineId != null)
|
||||||
|
{
|
||||||
|
Delete(existingOnlineId);
|
||||||
|
beatmaps.PurgeDeletable(s => s.ID == existingOnlineId.ID);
|
||||||
|
Logger.Log($"Found existing beatmap set with same OnlineBeatmapSetID ({model.OnlineBeatmapSetID}). It has been purged.", LoggingTarget.Database);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override BeatmapSetInfo CheckForExisting(BeatmapSetInfo model)
|
protected override BeatmapSetInfo CheckForExisting(BeatmapSetInfo model)
|
||||||
@ -99,18 +118,6 @@ namespace osu.Game.Beatmaps
|
|||||||
return existingHashMatch;
|
return existingHashMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if a set already exists with the same online id
|
|
||||||
if (model.OnlineBeatmapSetID != null)
|
|
||||||
{
|
|
||||||
var existingOnlineId = beatmaps.ConsumableItems.FirstOrDefault(b => b.OnlineBeatmapSetID == model.OnlineBeatmapSetID);
|
|
||||||
if (existingOnlineId != null)
|
|
||||||
{
|
|
||||||
Delete(existingOnlineId);
|
|
||||||
beatmaps.PurgeDeletable(s => s.ID == existingOnlineId.ID);
|
|
||||||
Logger.Log($"Found existing beatmap set with same OnlineBeatmapSetID ({model.OnlineBeatmapSetID}). It has been purged.", LoggingTarget.Database);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,29 +313,29 @@ namespace osu.Game.Beatmaps
|
|||||||
return hashable.ComputeSHA2Hash();
|
return hashable.ComputeSHA2Hash();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override BeatmapSetInfo CreateModel(ArchiveReader reader)
|
protected override BeatmapSetInfo CreateModel(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"));
|
||||||
if (string.IsNullOrEmpty(mapName)) throw new InvalidOperationException("No beatmap files found in this beatmap archive.");
|
if (string.IsNullOrEmpty(mapName)) throw new InvalidOperationException("No beatmap files found in this beatmap archive.");
|
||||||
|
|
||||||
BeatmapMetadata metadata;
|
Beatmap beatmap;
|
||||||
using (var stream = new StreamReader(reader.GetStream(mapName)))
|
using (var stream = new StreamReader(reader.GetStream(mapName)))
|
||||||
metadata = Decoder.GetDecoder<Beatmap>(stream).Decode(stream).Metadata;
|
beatmap = Decoder.GetDecoder<Beatmap>(stream).Decode(stream);
|
||||||
|
|
||||||
return new BeatmapSetInfo
|
return new BeatmapSetInfo
|
||||||
{
|
{
|
||||||
OnlineBeatmapSetID = metadata.OnlineBeatmapSetID,
|
OnlineBeatmapSetID = beatmap.BeatmapInfo.BeatmapSet?.OnlineBeatmapSetID,
|
||||||
Beatmaps = new List<BeatmapInfo>(),
|
Beatmaps = new List<BeatmapInfo>(),
|
||||||
Hash = computeBeatmapSetHash(reader),
|
Hash = computeBeatmapSetHash(reader),
|
||||||
Metadata = metadata
|
Metadata = beatmap.Metadata
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create all required <see cref="BeatmapInfo"/>s for the provided archive.
|
/// Create all required <see cref="BeatmapInfo"/>s for the provided archive.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<BeatmapInfo> createBeatmapDifficulties(BeatmapSetInfo model, ArchiveReader reader)
|
private List<BeatmapInfo> createBeatmapDifficulties(ArchiveReader reader)
|
||||||
{
|
{
|
||||||
var beatmapInfos = new List<BeatmapInfo>();
|
var beatmapInfos = new List<BeatmapInfo>();
|
||||||
|
|
||||||
@ -348,10 +355,6 @@ namespace osu.Game.Beatmaps
|
|||||||
beatmap.BeatmapInfo.Hash = ms.ComputeSHA2Hash();
|
beatmap.BeatmapInfo.Hash = ms.ComputeSHA2Hash();
|
||||||
beatmap.BeatmapInfo.MD5Hash = ms.ComputeMD5Hash();
|
beatmap.BeatmapInfo.MD5Hash = ms.ComputeMD5Hash();
|
||||||
|
|
||||||
// ensure we have the same online set ID as the set itself.
|
|
||||||
beatmap.BeatmapInfo.OnlineBeatmapSetID = model.OnlineBeatmapSetID;
|
|
||||||
beatmap.BeatmapInfo.Metadata.OnlineBeatmapSetID = model.OnlineBeatmapSetID;
|
|
||||||
|
|
||||||
// check that no existing beatmap exists that is imported with the same online beatmap ID. if so, give it precedence.
|
// check that no existing beatmap exists that is imported with the same online beatmap ID. if so, give it precedence.
|
||||||
if (beatmap.BeatmapInfo.OnlineBeatmapID.HasValue && QueryBeatmap(b => b.OnlineBeatmapID.Value == beatmap.BeatmapInfo.OnlineBeatmapID.Value) != null)
|
if (beatmap.BeatmapInfo.OnlineBeatmapID.HasValue && QueryBeatmap(b => b.OnlineBeatmapID.Value == beatmap.BeatmapInfo.OnlineBeatmapID.Value) != null)
|
||||||
beatmap.BeatmapInfo.OnlineBeatmapID = null;
|
beatmap.BeatmapInfo.OnlineBeatmapID = null;
|
||||||
@ -376,6 +379,40 @@ namespace osu.Game.Beatmaps
|
|||||||
return beatmapInfos;
|
return beatmapInfos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Query the API to populate mising OnlineBeatmapID / OnlineBeatmapSetID properties.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmap">The beatmap to populate.</param>
|
||||||
|
/// <param name="force">Whether to re-query if the provided beatmap already has populated values.</param>
|
||||||
|
/// <returns>True if population was successful.</returns>
|
||||||
|
private bool fetchAndPopulateOnlineIDs(BeatmapInfo beatmap, bool force = false)
|
||||||
|
{
|
||||||
|
if (!force && beatmap.OnlineBeatmapID != null && beatmap.BeatmapSet.OnlineBeatmapSetID != null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Logger.Log("Attempting online lookup for IDs...", LoggingTarget.Database);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var req = new GetBeatmapRequest(beatmap);
|
||||||
|
|
||||||
|
req.Perform(api);
|
||||||
|
|
||||||
|
var res = req.Result;
|
||||||
|
|
||||||
|
Logger.Log($"Successfully mapped to {res.OnlineBeatmapSetID} / {res.OnlineBeatmapID}.", LoggingTarget.Database);
|
||||||
|
|
||||||
|
beatmap.BeatmapSet.OnlineBeatmapSetID = res.OnlineBeatmapSetID;
|
||||||
|
beatmap.OnlineBeatmapID = res.OnlineBeatmapID;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Logger.Log($"Failed ({e})", LoggingTarget.Database);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A dummy WorkingBeatmap for the purpose of retrieving a beatmap for star difficulty calculation.
|
/// A dummy WorkingBeatmap for the purpose of retrieving a beatmap for star difficulty calculation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -17,16 +17,6 @@ namespace osu.Game.Beatmaps
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public int ID { get; set; }
|
public int ID { 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; }
|
||||||
@ -82,8 +72,7 @@ namespace osu.Game.Beatmaps
|
|||||||
if (other == null)
|
if (other == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return onlineBeatmapSetID == other.onlineBeatmapSetID
|
return Title == other.Title
|
||||||
&& Title == other.Title
|
|
||||||
&& TitleUnicode == other.TitleUnicode
|
&& TitleUnicode == other.TitleUnicode
|
||||||
&& Artist == other.Artist
|
&& Artist == other.Artist
|
||||||
&& ArtistUnicode == other.ArtistUnicode
|
&& ArtistUnicode == other.ArtistUnicode
|
||||||
|
@ -22,18 +22,18 @@ namespace osu.Game.Beatmaps
|
|||||||
[NotMapped]
|
[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) ?? 0;
|
||||||
|
|
||||||
[NotMapped]
|
[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;
|
||||||
|
|
||||||
public List<BeatmapSetFileInfo> Files { get; set; }
|
public List<BeatmapSetFileInfo> Files { get; set; }
|
||||||
|
|
||||||
public override string ToString() => Metadata.ToString();
|
public override string ToString() => Metadata?.ToString() ?? base.ToString();
|
||||||
|
|
||||||
public bool Protected { get; set; }
|
public bool Protected { get; set; }
|
||||||
}
|
}
|
||||||
|
75
osu.Game/Beatmaps/BindableBeatmap.cs
Normal file
75
osu.Game/Beatmaps/BindableBeatmap.cs
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using osu.Framework.Audio;
|
||||||
|
using osu.Framework.Audio.Track;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A <see cref="Bindable{WorkingBeatmap}"/> for the <see cref="OsuGame"/> beatmap.
|
||||||
|
/// This should be used sparingly in-favour of <see cref="IBindableBeatmap"/>.
|
||||||
|
/// </summary>
|
||||||
|
public abstract class BindableBeatmap : NonNullableBindable<WorkingBeatmap>, IBindableBeatmap
|
||||||
|
{
|
||||||
|
private AudioManager audioManager;
|
||||||
|
private WorkingBeatmap lastBeatmap;
|
||||||
|
|
||||||
|
protected BindableBeatmap(WorkingBeatmap defaultValue)
|
||||||
|
: base(defaultValue)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registers an <see cref="AudioManager"/> for <see cref="Track"/>s to be added to.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="audioManager">The <see cref="AudioManager"/> to register.</param>
|
||||||
|
protected void RegisterAudioManager([NotNull] AudioManager audioManager)
|
||||||
|
{
|
||||||
|
if (this.audioManager != null) throw new InvalidOperationException($"Cannot register multiple {nameof(AudioManager)}s.");
|
||||||
|
|
||||||
|
this.audioManager = audioManager;
|
||||||
|
|
||||||
|
ValueChanged += registerAudioTrack;
|
||||||
|
|
||||||
|
// If the track has changed prior to this being called, let's register it
|
||||||
|
if (Value != Default)
|
||||||
|
registerAudioTrack(Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerAudioTrack(WorkingBeatmap beatmap)
|
||||||
|
{
|
||||||
|
var trackLoaded = lastBeatmap?.TrackLoaded ?? false;
|
||||||
|
|
||||||
|
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
||||||
|
if (!trackLoaded || lastBeatmap?.Track != beatmap.Track)
|
||||||
|
{
|
||||||
|
if (trackLoaded)
|
||||||
|
{
|
||||||
|
Debug.Assert(lastBeatmap != null);
|
||||||
|
Debug.Assert(lastBeatmap.Track != null);
|
||||||
|
|
||||||
|
lastBeatmap.RecycleTrack();
|
||||||
|
}
|
||||||
|
|
||||||
|
audioManager.Track.AddItem(beatmap.Track);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastBeatmap = beatmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[NotNull]
|
||||||
|
IBindableBeatmap IBindableBeatmap.GetBoundCopy() => GetBoundCopy();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve a new <see cref="BindableBeatmap"/> instance weakly bound to this <see cref="BindableBeatmap"/>.
|
||||||
|
/// If you are further binding to events of the retrieved <see cref="BindableBeatmap"/>, ensure a local reference is held.
|
||||||
|
/// </summary>
|
||||||
|
[NotNull]
|
||||||
|
public abstract BindableBeatmap GetBoundCopy();
|
||||||
|
}
|
||||||
|
}
|
84
osu.Game/Beatmaps/Drawables/BeatmapSetDownloader.cs
Normal file
84
osu.Game/Beatmaps/Drawables/BeatmapSetDownloader.cs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps.Drawables
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A component to allow downloading of a beatmap set. Automatically handles state syncing between other instances.
|
||||||
|
/// </summary>
|
||||||
|
public class BeatmapSetDownloader : Component
|
||||||
|
{
|
||||||
|
private readonly BeatmapSetInfo set;
|
||||||
|
private readonly bool noVideo;
|
||||||
|
|
||||||
|
private BeatmapManager beatmaps;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the associated beatmap set has been downloading (by this instance or any other instance).
|
||||||
|
/// </summary>
|
||||||
|
public readonly BindableBool Downloaded = new BindableBool();
|
||||||
|
|
||||||
|
public BeatmapSetDownloader(BeatmapSetInfo set, bool noVideo = false)
|
||||||
|
{
|
||||||
|
this.set = set;
|
||||||
|
this.noVideo = noVideo;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(BeatmapManager beatmaps)
|
||||||
|
{
|
||||||
|
this.beatmaps = beatmaps;
|
||||||
|
|
||||||
|
beatmaps.ItemAdded += setAdded;
|
||||||
|
beatmaps.ItemRemoved += setRemoved;
|
||||||
|
|
||||||
|
// initial value
|
||||||
|
if (set.OnlineBeatmapSetID != null)
|
||||||
|
Downloaded.Value = beatmaps.QueryBeatmapSets(s => s.OnlineBeatmapSetID == set.OnlineBeatmapSetID && !s.DeletePending).Any();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool isDisposing)
|
||||||
|
{
|
||||||
|
base.Dispose(isDisposing);
|
||||||
|
|
||||||
|
if (beatmaps != null)
|
||||||
|
{
|
||||||
|
beatmaps.ItemAdded -= setAdded;
|
||||||
|
beatmaps.ItemRemoved -= setRemoved;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Begin downloading the associated beatmap set.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if downloading began. False if an existing download is active or completed.</returns>
|
||||||
|
public bool Download()
|
||||||
|
{
|
||||||
|
if (Downloaded.Value)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (beatmaps.GetExistingDownload(set) != null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
beatmaps.Download(set, noVideo);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setAdded(BeatmapSetInfo s)
|
||||||
|
{
|
||||||
|
if (s.OnlineBeatmapSetID == set.OnlineBeatmapSetID)
|
||||||
|
Downloaded.Value = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setRemoved(BeatmapSetInfo s)
|
||||||
|
{
|
||||||
|
if (s.OnlineBeatmapSetID == set.OnlineBeatmapSetID)
|
||||||
|
Downloaded.Value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,7 +17,7 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
private readonly OsuGameBase game;
|
private readonly OsuGameBase game;
|
||||||
|
|
||||||
public DummyWorkingBeatmap(OsuGameBase game)
|
public DummyWorkingBeatmap(OsuGameBase game = null)
|
||||||
: base(new BeatmapInfo
|
: base(new BeatmapInfo
|
||||||
{
|
{
|
||||||
Metadata = new BeatmapMetadata
|
Metadata = new BeatmapMetadata
|
||||||
@ -43,7 +43,7 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
protected override IBeatmap GetBeatmap() => new Beatmap();
|
protected override IBeatmap GetBeatmap() => new Beatmap();
|
||||||
|
|
||||||
protected override Texture GetBackground() => game.Textures.Get(@"Backgrounds/bg4");
|
protected override Texture GetBackground() => game?.Textures.Get(@"Backgrounds/bg4");
|
||||||
|
|
||||||
protected override Track GetTrack() => new TrackVirtual();
|
protected override Track GetTrack() => new TrackVirtual();
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ using System.Linq;
|
|||||||
using osu.Game.Beatmaps.Timing;
|
using osu.Game.Beatmaps.Timing;
|
||||||
using osu.Game.Rulesets.Objects.Legacy;
|
using osu.Game.Rulesets.Objects.Legacy;
|
||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Framework;
|
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps.Formats
|
namespace osu.Game.Beatmaps.Formats
|
||||||
{
|
{
|
||||||
@ -28,23 +27,18 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
AddDecoder<Beatmap>(@"osu file format v", m => new LegacyBeatmapDecoder(int.Parse(m.Split('v').Last())));
|
AddDecoder<Beatmap>(@"osu file format v", m => new LegacyBeatmapDecoder(int.Parse(m.Split('v').Last())));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// lazer's audio timings in general doesn't match stable. this is the result of user testing, albeit limited.
|
|
||||||
/// This only seems to be required on windows. We need to eventually figure out why, with a bit of luck.
|
|
||||||
/// </summary>
|
|
||||||
public static int UniversalOffset => RuntimeInfo.OS == RuntimeInfo.Platform.Windows ? -22 : 0;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether or not beatmap or runtime offsets should be applied. Defaults on; only disable for testing purposes.
|
/// Whether or not beatmap or runtime offsets should be applied. Defaults on; only disable for testing purposes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ApplyOffsets = true;
|
public bool ApplyOffsets = true;
|
||||||
|
|
||||||
private readonly int offset = UniversalOffset;
|
private readonly int offset;
|
||||||
|
|
||||||
public LegacyBeatmapDecoder(int version = LATEST_VERSION) : base(version)
|
public LegacyBeatmapDecoder(int version = LATEST_VERSION)
|
||||||
|
: base(version)
|
||||||
{
|
{
|
||||||
// BeatmapVersion 4 and lower had an incorrect offset (stable has this set as 24ms off)
|
// BeatmapVersion 4 and lower had an incorrect offset (stable has this set as 24ms off)
|
||||||
offset += FormatVersion < 5 ? 24 : 0;
|
offset = FormatVersion < 5 ? 24 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ParseStreamInto(StreamReader stream, Beatmap beatmap)
|
protected override void ParseStreamInto(StreamReader stream, Beatmap beatmap)
|
||||||
@ -142,6 +136,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
parser = new Rulesets.Objects.Legacy.Mania.ConvertHitObjectParser();
|
parser = new Rulesets.Objects.Legacy.Mania.ConvertHitObjectParser();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case @"LetterboxInBreaks":
|
case @"LetterboxInBreaks":
|
||||||
beatmap.BeatmapInfo.LetterboxInBreaks = int.Parse(pair.Value) == 1;
|
beatmap.BeatmapInfo.LetterboxInBreaks = int.Parse(pair.Value) == 1;
|
||||||
@ -214,8 +209,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
beatmap.BeatmapInfo.OnlineBeatmapID = int.Parse(pair.Value);
|
beatmap.BeatmapInfo.OnlineBeatmapID = int.Parse(pair.Value);
|
||||||
break;
|
break;
|
||||||
case @"BeatmapSetID":
|
case @"BeatmapSetID":
|
||||||
beatmap.BeatmapInfo.OnlineBeatmapSetID = int.Parse(pair.Value);
|
beatmap.BeatmapInfo.BeatmapSet = new BeatmapSetInfo { OnlineBeatmapSetID = int.Parse(pair.Value) };
|
||||||
metadata.OnlineBeatmapSetID = int.Parse(pair.Value);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
19
osu.Game/Beatmaps/IBindableBeatmap.cs
Normal file
19
osu.Game/Beatmaps/IBindableBeatmap.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Read-only interface for the <see cref="OsuGame"/> beatmap.
|
||||||
|
/// </summary>
|
||||||
|
public interface IBindableBeatmap : IBindable<WorkingBeatmap>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieve a new <see cref="IBindableBeatmap"/> instance weakly bound to this <see cref="IBindableBeatmap"/>.
|
||||||
|
/// If you are further binding to events of the retrieved <see cref="IBindableBeatmap"/>, ensure a local reference is held.
|
||||||
|
/// </summary>
|
||||||
|
IBindableBeatmap GetBoundCopy();
|
||||||
|
}
|
||||||
|
}
|
@ -13,13 +13,13 @@ namespace osu.Game.Configuration
|
|||||||
{
|
{
|
||||||
private readonly SettingsStore settings;
|
private readonly SettingsStore settings;
|
||||||
|
|
||||||
private readonly int variant;
|
private readonly int? variant;
|
||||||
|
|
||||||
private readonly List<DatabasedSetting> databasedSettings;
|
private readonly List<DatabasedSetting> databasedSettings;
|
||||||
|
|
||||||
private readonly RulesetInfo ruleset;
|
private readonly RulesetInfo ruleset;
|
||||||
|
|
||||||
protected DatabasedConfigManager(SettingsStore settings, RulesetInfo ruleset = null, int variant = 0)
|
protected DatabasedConfigManager(SettingsStore settings, RulesetInfo ruleset = null, int? variant = null)
|
||||||
{
|
{
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.ruleset = ruleset;
|
this.ruleset = ruleset;
|
||||||
|
@ -5,6 +5,7 @@ using osu.Framework.Configuration;
|
|||||||
using osu.Framework.Configuration.Tracking;
|
using osu.Framework.Configuration.Tracking;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
|
|
||||||
namespace osu.Game.Configuration
|
namespace osu.Game.Configuration
|
||||||
@ -80,6 +81,8 @@ namespace osu.Game.Configuration
|
|||||||
|
|
||||||
Set(OsuSetting.FloatingComments, false);
|
Set(OsuSetting.FloatingComments, false);
|
||||||
|
|
||||||
|
Set(OsuSetting.ScoreDisplayMode, ScoringMode.Standardised);
|
||||||
|
|
||||||
Set(OsuSetting.SpeedChangeVisualisation, SpeedChangeVisualisationMethod.Sequential);
|
Set(OsuSetting.SpeedChangeVisualisation, SpeedChangeVisualisationMethod.Sequential);
|
||||||
|
|
||||||
Set(OsuSetting.IncreaseFirstObjectVisibility, true);
|
Set(OsuSetting.IncreaseFirstObjectVisibility, true);
|
||||||
@ -147,6 +150,7 @@ namespace osu.Game.Configuration
|
|||||||
SongSelectRightMouseScroll,
|
SongSelectRightMouseScroll,
|
||||||
BeatmapSkins,
|
BeatmapSkins,
|
||||||
BeatmapHitsounds,
|
BeatmapHitsounds,
|
||||||
IncreaseFirstObjectVisibility
|
IncreaseFirstObjectVisibility,
|
||||||
|
ScoreDisplayMode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ namespace osu.Game.Graphics.Containers
|
|||||||
{
|
{
|
||||||
public class BeatSyncedContainer : Container
|
public class BeatSyncedContainer : Container
|
||||||
{
|
{
|
||||||
protected readonly Bindable<WorkingBeatmap> Beatmap = new Bindable<WorkingBeatmap>();
|
protected readonly IBindable<WorkingBeatmap> Beatmap = new Bindable<WorkingBeatmap>();
|
||||||
|
|
||||||
private int lastBeat;
|
private int lastBeat;
|
||||||
private TimingControlPoint lastTimingPoint;
|
private TimingControlPoint lastTimingPoint;
|
||||||
@ -74,9 +74,9 @@ namespace osu.Game.Graphics.Containers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGameBase game)
|
private void load(IBindableBeatmap beatmap)
|
||||||
{
|
{
|
||||||
Beatmap.BindTo(game.Beatmap);
|
Beatmap.BindTo(beatmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, TrackAmplitudes amplitudes)
|
protected virtual void OnNewBeat(int beatIndex, TimingControlPoint timingPoint, EffectControlPoint effectPoint, TrackAmplitudes amplitudes)
|
||||||
|
@ -14,16 +14,19 @@ namespace osu.Game.Online.API
|
|||||||
{
|
{
|
||||||
protected override WebRequest CreateWebRequest() => new JsonWebRequest<T>(Uri);
|
protected override WebRequest CreateWebRequest() => new JsonWebRequest<T>(Uri);
|
||||||
|
|
||||||
|
public T Result => ((JsonWebRequest<T>)WebRequest).ResponseObject;
|
||||||
|
|
||||||
protected APIRequest()
|
protected APIRequest()
|
||||||
{
|
{
|
||||||
base.Success += onSuccess;
|
base.Success += onSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onSuccess()
|
private void onSuccess() => Success?.Invoke(Result);
|
||||||
{
|
|
||||||
Success?.Invoke(((JsonWebRequest<T>)WebRequest).ResponseObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked on successful completion of an API request.
|
||||||
|
/// This will be scheduled to the API's internal scheduler (run on update thread automatically).
|
||||||
|
/// </summary>
|
||||||
public new event APISuccessHandler<T> Success;
|
public new event APISuccessHandler<T> Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +55,16 @@ namespace osu.Game.Online.API
|
|||||||
protected APIAccess API;
|
protected APIAccess API;
|
||||||
protected WebRequest WebRequest;
|
protected WebRequest WebRequest;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked on successful completion of an API request.
|
||||||
|
/// This will be scheduled to the API's internal scheduler (run on update thread automatically).
|
||||||
|
/// </summary>
|
||||||
public event APISuccessHandler Success;
|
public event APISuccessHandler Success;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Invoked on failure to complete an API request.
|
||||||
|
/// This will be scheduled to the API's internal scheduler (run on update thread automatically).
|
||||||
|
/// </summary>
|
||||||
public event APIFailureHandler Failure;
|
public event APIFailureHandler Failure;
|
||||||
|
|
||||||
private bool cancelled;
|
private bool cancelled;
|
||||||
|
@ -1,149 +0,0 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Rulesets;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
|
||||||
{
|
|
||||||
public class APIResponseBeatmapSet : BeatmapMetadata // todo: this is a bit wrong...
|
|
||||||
{
|
|
||||||
[JsonProperty(@"covers")]
|
|
||||||
private BeatmapSetOnlineCovers covers { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"preview_url")]
|
|
||||||
private string preview { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"play_count")]
|
|
||||||
private int playCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"favourite_count")]
|
|
||||||
private int favouriteCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"bpm")]
|
|
||||||
private double bpm { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"video")]
|
|
||||||
private bool hasVideo { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"storyboard")]
|
|
||||||
private bool hasStoryboard { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"status")]
|
|
||||||
private BeatmapSetOnlineStatus status { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"submitted_date")]
|
|
||||||
private DateTimeOffset submitted { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"ranked_date")]
|
|
||||||
private DateTimeOffset ranked { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"last_updated")]
|
|
||||||
private DateTimeOffset lastUpdated { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"user_id")]
|
|
||||||
private long creatorId {
|
|
||||||
set { Author.Id = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"beatmaps")]
|
|
||||||
private IEnumerable<APIResponseBeatmap> beatmaps { get; set; }
|
|
||||||
|
|
||||||
public BeatmapSetInfo ToBeatmapSet(RulesetStore rulesets)
|
|
||||||
{
|
|
||||||
return new BeatmapSetInfo
|
|
||||||
{
|
|
||||||
OnlineBeatmapSetID = OnlineBeatmapSetID,
|
|
||||||
Metadata = this,
|
|
||||||
OnlineInfo = new BeatmapSetOnlineInfo
|
|
||||||
{
|
|
||||||
Covers = covers,
|
|
||||||
Preview = preview,
|
|
||||||
PlayCount = playCount,
|
|
||||||
FavouriteCount = favouriteCount,
|
|
||||||
BPM = bpm,
|
|
||||||
Status = status,
|
|
||||||
HasVideo = hasVideo,
|
|
||||||
HasStoryboard = hasStoryboard,
|
|
||||||
Submitted = submitted,
|
|
||||||
Ranked = ranked,
|
|
||||||
LastUpdated = lastUpdated,
|
|
||||||
},
|
|
||||||
Beatmaps = beatmaps?.Select(b => b.ToBeatmap(rulesets)).ToList(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private class APIResponseBeatmap : BeatmapMetadata
|
|
||||||
{
|
|
||||||
[JsonProperty(@"id")]
|
|
||||||
private int onlineBeatmapID { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"playcount")]
|
|
||||||
private int playCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"passcount")]
|
|
||||||
private int passCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"mode_int")]
|
|
||||||
private int ruleset { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"difficulty_rating")]
|
|
||||||
private double starDifficulty { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"drain")]
|
|
||||||
private float drainRate { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"cs")]
|
|
||||||
private float circleSize { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"ar")]
|
|
||||||
private float approachRate { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"accuracy")]
|
|
||||||
private float overallDifficulty { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"total_length")]
|
|
||||||
private double length { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"count_circles")]
|
|
||||||
private int circleCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"count_sliders")]
|
|
||||||
private int sliderCount { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"version")]
|
|
||||||
private string version { get; set; }
|
|
||||||
|
|
||||||
public BeatmapInfo ToBeatmap(RulesetStore rulesets)
|
|
||||||
{
|
|
||||||
return new BeatmapInfo
|
|
||||||
{
|
|
||||||
Metadata = this,
|
|
||||||
Ruleset = rulesets.GetRuleset(ruleset),
|
|
||||||
StarDifficulty = starDifficulty,
|
|
||||||
OnlineBeatmapID = onlineBeatmapID,
|
|
||||||
Version = version,
|
|
||||||
BaseDifficulty = new BeatmapDifficulty
|
|
||||||
{
|
|
||||||
DrainRate = drainRate,
|
|
||||||
CircleSize = circleSize,
|
|
||||||
ApproachRate = approachRate,
|
|
||||||
OverallDifficulty = overallDifficulty,
|
|
||||||
},
|
|
||||||
OnlineInfo = new BeatmapOnlineInfo
|
|
||||||
{
|
|
||||||
PlayCount = playCount,
|
|
||||||
PassCount = passCount,
|
|
||||||
Length = length,
|
|
||||||
CircleCount = circleCount,
|
|
||||||
SliderCount = sliderCount,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +1,20 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 Newtonsoft.Json;
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetBeatmapDetailsRequest : APIRequest<GetBeatmapDetailsResponse>
|
public class GetBeatmapDetailsRequest : APIRequest<APIBeatmapMetrics>
|
||||||
{
|
{
|
||||||
private readonly BeatmapInfo beatmap;
|
private readonly BeatmapInfo beatmap;
|
||||||
|
|
||||||
private string lookupString => beatmap.OnlineBeatmapID > 0 ? beatmap.OnlineBeatmapID.ToString() : $@"lookup?checksum={beatmap.Hash}&filename={System.Uri.EscapeUriString(beatmap.Path)}";
|
|
||||||
|
|
||||||
public GetBeatmapDetailsRequest(BeatmapInfo beatmap)
|
public GetBeatmapDetailsRequest(BeatmapInfo beatmap)
|
||||||
{
|
{
|
||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string Target => $@"beatmaps/{lookupString}";
|
protected override string Target => $@"beatmaps/{beatmap.OnlineBeatmapID}";
|
||||||
}
|
|
||||||
|
|
||||||
public class GetBeatmapDetailsResponse : BeatmapMetrics
|
|
||||||
{
|
|
||||||
//the online API returns some metrics as a nested object.
|
|
||||||
[JsonProperty(@"failtimes")]
|
|
||||||
private BeatmapMetrics failTimes
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Fails = value.Fails;
|
|
||||||
Retries = value.Retries;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//and other metrics in the beatmap set.
|
|
||||||
[JsonProperty(@"beatmapset")]
|
|
||||||
private BeatmapMetrics beatmapSet
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Ratings = value.Ratings;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
22
osu.Game/Online/API/Requests/GetBeatmapRequest.cs
Normal file
22
osu.Game/Online/API/Requests/GetBeatmapRequest.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetBeatmapRequest : APIRequest<APIBeatmap>
|
||||||
|
{
|
||||||
|
private readonly BeatmapInfo beatmap;
|
||||||
|
|
||||||
|
private string lookupString => beatmap.OnlineBeatmapID > 0 ? beatmap.OnlineBeatmapID.ToString() : $@"lookup?checksum={beatmap.MD5Hash}&filename={System.Uri.EscapeUriString(beatmap.Path)}";
|
||||||
|
|
||||||
|
public GetBeatmapRequest(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
this.beatmap = beatmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => $@"beatmaps/{lookupString}";
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,11 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetBeatmapSetRequest : APIRequest<APIResponseBeatmapSet>
|
public class GetBeatmapSetRequest : APIRequest<APIBeatmapSet>
|
||||||
{
|
{
|
||||||
private readonly int id;
|
private readonly int id;
|
||||||
private readonly BeatmapSetLookupType type;
|
private readonly BeatmapSetLookupType type;
|
||||||
|
@ -2,20 +2,15 @@
|
|||||||
// 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.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Users;
|
|
||||||
using osu.Game.Rulesets.Replays;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
using osu.Game.Screens.Select.Leaderboards;
|
using osu.Game.Screens.Select.Leaderboards;
|
||||||
using osu.Framework.IO.Network;
|
using osu.Framework.IO.Network;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetScoresRequest : APIRequest<GetScoresResponse>
|
public class GetScoresRequest : APIRequest<APIScores>
|
||||||
{
|
{
|
||||||
private readonly BeatmapInfo beatmap;
|
private readonly BeatmapInfo beatmap;
|
||||||
private readonly LeaderboardScope scope;
|
private readonly LeaderboardScope scope;
|
||||||
@ -36,9 +31,9 @@ namespace osu.Game.Online.API.Requests
|
|||||||
Success += onSuccess;
|
Success += onSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onSuccess(GetScoresResponse r)
|
private void onSuccess(APIScores r)
|
||||||
{
|
{
|
||||||
foreach (OnlineScore score in r.Scores)
|
foreach (APIScore score in r.Scores)
|
||||||
score.ApplyBeatmap(beatmap);
|
score.ApplyBeatmap(beatmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,112 +50,4 @@ namespace osu.Game.Online.API.Requests
|
|||||||
|
|
||||||
protected override string Target => $@"beatmaps/{beatmap.OnlineBeatmapID}/scores";
|
protected override string Target => $@"beatmaps/{beatmap.OnlineBeatmapID}/scores";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GetScoresResponse
|
|
||||||
{
|
|
||||||
[JsonProperty(@"scores")]
|
|
||||||
public IEnumerable<OnlineScore> Scores;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class OnlineScore : Score
|
|
||||||
{
|
|
||||||
[JsonProperty(@"score")]
|
|
||||||
private double totalScore
|
|
||||||
{
|
|
||||||
set { TotalScore = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"max_combo")]
|
|
||||||
private int maxCombo
|
|
||||||
{
|
|
||||||
set { MaxCombo = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"user")]
|
|
||||||
private User user
|
|
||||||
{
|
|
||||||
set { User = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"replay_data")]
|
|
||||||
private Replay replay
|
|
||||||
{
|
|
||||||
set { Replay = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"mode_int")]
|
|
||||||
public int OnlineRulesetID { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty(@"score_id")]
|
|
||||||
private long onlineScoreID
|
|
||||||
{
|
|
||||||
set { OnlineScoreID = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"created_at")]
|
|
||||||
private DateTimeOffset date
|
|
||||||
{
|
|
||||||
set { Date = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"beatmap")]
|
|
||||||
private BeatmapInfo beatmap
|
|
||||||
{
|
|
||||||
set { Beatmap = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"beatmapset")]
|
|
||||||
private BeatmapMetadata metadata
|
|
||||||
{
|
|
||||||
set { Beatmap.Metadata = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"statistics")]
|
|
||||||
private Dictionary<string, object> jsonStats
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
foreach (var kvp in value)
|
|
||||||
{
|
|
||||||
HitResult newKey;
|
|
||||||
switch (kvp.Key)
|
|
||||||
{
|
|
||||||
case @"count_300":
|
|
||||||
newKey = HitResult.Great;
|
|
||||||
break;
|
|
||||||
case @"count_100":
|
|
||||||
newKey = HitResult.Good;
|
|
||||||
break;
|
|
||||||
case @"count_50":
|
|
||||||
newKey = HitResult.Meh;
|
|
||||||
break;
|
|
||||||
case @"count_miss":
|
|
||||||
newKey = HitResult.Miss;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Statistics.Add(newKey, kvp.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[JsonProperty(@"mods")]
|
|
||||||
private string[] modStrings { get; set; }
|
|
||||||
|
|
||||||
public void ApplyBeatmap(BeatmapInfo beatmap)
|
|
||||||
{
|
|
||||||
Beatmap = beatmap;
|
|
||||||
ApplyRuleset(beatmap.Ruleset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ApplyRuleset(RulesetInfo ruleset)
|
|
||||||
{
|
|
||||||
Ruleset = ruleset;
|
|
||||||
|
|
||||||
// Evaluate the mod string
|
|
||||||
Mods = Ruleset.CreateInstance().GetAllMods().Where(mod => modStrings.Contains(mod.ShortenedName)).ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,11 @@
|
|||||||
|
|
||||||
using Humanizer;
|
using Humanizer;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetUserBeatmapsRequest : APIRequest<List<APIResponseBeatmapSet>>
|
public class GetUserBeatmapsRequest : APIRequest<List<APIBeatmapSet>>
|
||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
private readonly int offset;
|
private readonly int offset;
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 Newtonsoft.Json;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Rulesets;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetUserMostPlayedBeatmapsRequest : APIRequest<List<MostPlayedBeatmap>>
|
public class GetUserMostPlayedBeatmapsRequest : APIRequest<List<APIUserMostPlayedBeatmap>>
|
||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
private readonly int offset;
|
private readonly int offset;
|
||||||
@ -21,28 +19,4 @@ namespace osu.Game.Online.API.Requests
|
|||||||
|
|
||||||
protected override string Target => $@"users/{userId}/beatmapsets/most_played?offset={offset}";
|
protected override string Target => $@"users/{userId}/beatmapsets/most_played?offset={offset}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MostPlayedBeatmap
|
|
||||||
{
|
|
||||||
[JsonProperty("beatmap_id")]
|
|
||||||
public int BeatmapID;
|
|
||||||
|
|
||||||
[JsonProperty("count")]
|
|
||||||
public int PlayCount;
|
|
||||||
|
|
||||||
[JsonProperty]
|
|
||||||
private BeatmapInfo beatmap;
|
|
||||||
|
|
||||||
[JsonProperty]
|
|
||||||
private APIResponseBeatmapSet beatmapSet;
|
|
||||||
|
|
||||||
public BeatmapInfo GetBeatmapInfo(RulesetStore rulesets)
|
|
||||||
{
|
|
||||||
BeatmapSetInfo setInfo = beatmapSet.ToBeatmapSet(rulesets);
|
|
||||||
beatmap.BeatmapSet = setInfo;
|
|
||||||
beatmap.OnlineBeatmapSetID = setInfo.OnlineBeatmapSetID;
|
|
||||||
beatmap.Metadata = setInfo.Metadata;
|
|
||||||
return beatmap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 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 Newtonsoft.Json;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
using Humanizer;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetUserRecentActivitiesRequest : APIRequest<List<RecentActivity>>
|
public class GetUserRecentActivitiesRequest : APIRequest<List<APIRecentActivity>>
|
||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
private readonly int offset;
|
private readonly int offset;
|
||||||
@ -23,86 +20,6 @@ namespace osu.Game.Online.API.Requests
|
|||||||
protected override string Target => $"users/{userId}/recent_activity?offset={offset}";
|
protected override string Target => $"users/{userId}/recent_activity?offset={offset}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RecentActivity
|
|
||||||
{
|
|
||||||
[JsonProperty("id")]
|
|
||||||
public int ID;
|
|
||||||
|
|
||||||
[JsonProperty("createdAt")]
|
|
||||||
public DateTimeOffset CreatedAt;
|
|
||||||
|
|
||||||
[JsonProperty]
|
|
||||||
private string type
|
|
||||||
{
|
|
||||||
set => Type = (RecentActivityType)Enum.Parse(typeof(RecentActivityType), value.Pascalize());
|
|
||||||
}
|
|
||||||
|
|
||||||
public RecentActivityType Type;
|
|
||||||
|
|
||||||
[JsonProperty]
|
|
||||||
private string scoreRank
|
|
||||||
{
|
|
||||||
set => ScoreRank = (ScoreRank)Enum.Parse(typeof(ScoreRank), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ScoreRank ScoreRank;
|
|
||||||
|
|
||||||
[JsonProperty("rank")]
|
|
||||||
public int Rank;
|
|
||||||
|
|
||||||
[JsonProperty("approval")]
|
|
||||||
public BeatmapApproval Approval;
|
|
||||||
|
|
||||||
[JsonProperty("count")]
|
|
||||||
public int Count;
|
|
||||||
|
|
||||||
[JsonProperty("mode")]
|
|
||||||
public string Mode;
|
|
||||||
|
|
||||||
[JsonProperty("beatmap")]
|
|
||||||
public RecentActivityBeatmap Beatmap;
|
|
||||||
|
|
||||||
[JsonProperty("beatmapset")]
|
|
||||||
public RecentActivityBeatmap Beatmapset;
|
|
||||||
|
|
||||||
[JsonProperty("user")]
|
|
||||||
public RecentActivityUser User;
|
|
||||||
|
|
||||||
[JsonProperty("achievement")]
|
|
||||||
public RecentActivityAchievement Achievement;
|
|
||||||
|
|
||||||
public class RecentActivityBeatmap
|
|
||||||
{
|
|
||||||
[JsonProperty("title")]
|
|
||||||
public string Title;
|
|
||||||
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RecentActivityUser
|
|
||||||
{
|
|
||||||
[JsonProperty("username")]
|
|
||||||
public string Username;
|
|
||||||
|
|
||||||
[JsonProperty("url")]
|
|
||||||
public string Url;
|
|
||||||
|
|
||||||
[JsonProperty("previousUsername")]
|
|
||||||
public string PreviousUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class RecentActivityAchievement
|
|
||||||
{
|
|
||||||
[JsonProperty("slug")]
|
|
||||||
public string Slug;
|
|
||||||
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum RecentActivityType
|
public enum RecentActivityType
|
||||||
{
|
{
|
||||||
Achievement,
|
Achievement,
|
||||||
|
@ -2,10 +2,11 @@
|
|||||||
// 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 osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetUserScoresRequest : APIRequest<List<OnlineScore>>
|
public class GetUserScoresRequest : APIRequest<List<APIScore>>
|
||||||
{
|
{
|
||||||
private readonly long userId;
|
private readonly long userId;
|
||||||
private readonly ScoreType type;
|
private readonly ScoreType type;
|
||||||
|
@ -2,19 +2,12 @@
|
|||||||
// 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 Newtonsoft.Json;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Users;
|
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class GetUsersRequest : APIRequest<List<RankingEntry>>
|
public class GetUsersRequest : APIRequest<List<APIUser>>
|
||||||
{
|
{
|
||||||
protected override string Target => @"rankings/osu/performance";
|
protected override string Target => @"rankings/osu/performance";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RankingEntry
|
|
||||||
{
|
|
||||||
[JsonProperty]
|
|
||||||
public User User;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
85
osu.Game/Online/API/Requests/Responses/APIBeatmap.cs
Normal file
85
osu.Game/Online/API/Requests/Responses/APIBeatmap.cs
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIBeatmap : BeatmapMetadata
|
||||||
|
{
|
||||||
|
[JsonProperty(@"id")]
|
||||||
|
public int OnlineBeatmapID { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"beatmapset_id")]
|
||||||
|
public int OnlineBeatmapSetID { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"playcount")]
|
||||||
|
private int playCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"passcount")]
|
||||||
|
private int passCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"mode_int")]
|
||||||
|
private int ruleset { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"difficulty_rating")]
|
||||||
|
private double starDifficulty { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"drain")]
|
||||||
|
private float drainRate { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"cs")]
|
||||||
|
private float circleSize { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"ar")]
|
||||||
|
private float approachRate { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"accuracy")]
|
||||||
|
private float overallDifficulty { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"total_length")]
|
||||||
|
private double length { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"count_circles")]
|
||||||
|
private int circleCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"count_sliders")]
|
||||||
|
private int sliderCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"version")]
|
||||||
|
private string version { get; set; }
|
||||||
|
|
||||||
|
public BeatmapInfo ToBeatmap(RulesetStore rulesets)
|
||||||
|
{
|
||||||
|
return new BeatmapInfo
|
||||||
|
{
|
||||||
|
Metadata = this,
|
||||||
|
Ruleset = rulesets.GetRuleset(ruleset),
|
||||||
|
StarDifficulty = starDifficulty,
|
||||||
|
OnlineBeatmapID = OnlineBeatmapID,
|
||||||
|
BeatmapSet = new BeatmapSetInfo
|
||||||
|
{
|
||||||
|
OnlineBeatmapSetID = OnlineBeatmapSetID,
|
||||||
|
},
|
||||||
|
Version = version,
|
||||||
|
BaseDifficulty = new BeatmapDifficulty
|
||||||
|
{
|
||||||
|
DrainRate = drainRate,
|
||||||
|
CircleSize = circleSize,
|
||||||
|
ApproachRate = approachRate,
|
||||||
|
OverallDifficulty = overallDifficulty,
|
||||||
|
},
|
||||||
|
OnlineInfo = new BeatmapOnlineInfo
|
||||||
|
{
|
||||||
|
PlayCount = playCount,
|
||||||
|
PassCount = passCount,
|
||||||
|
Length = length,
|
||||||
|
CircleCount = circleCount,
|
||||||
|
SliderCount = sliderCount,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
osu.Game/Online/API/Requests/Responses/APIBeatmapMetrics.cs
Normal file
29
osu.Game/Online/API/Requests/Responses/APIBeatmapMetrics.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIBeatmapMetrics : BeatmapMetrics
|
||||||
|
{
|
||||||
|
//the online API returns some metrics as a nested object.
|
||||||
|
[JsonProperty(@"failtimes")]
|
||||||
|
private BeatmapMetrics failTimes
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Fails = value.Fails;
|
||||||
|
Retries = value.Retries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//and other metrics in the beatmap set.
|
||||||
|
[JsonProperty(@"beatmapset")]
|
||||||
|
private BeatmapMetrics beatmapSet
|
||||||
|
{
|
||||||
|
set => Ratings = value.Ratings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
90
osu.Game/Online/API/Requests/Responses/APIBeatmapSet.cs
Normal file
90
osu.Game/Online/API/Requests/Responses/APIBeatmapSet.cs
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIBeatmapSet : BeatmapMetadata // todo: this is a bit wrong...
|
||||||
|
{
|
||||||
|
[JsonProperty(@"covers")]
|
||||||
|
private BeatmapSetOnlineCovers covers { get; set; }
|
||||||
|
|
||||||
|
private int? onlineBeatmapSetID;
|
||||||
|
|
||||||
|
[JsonProperty(@"id")]
|
||||||
|
public int? OnlineBeatmapSetID
|
||||||
|
{
|
||||||
|
get { return onlineBeatmapSetID; }
|
||||||
|
set { onlineBeatmapSetID = value > 0 ? value : null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"preview_url")]
|
||||||
|
private string preview { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"play_count")]
|
||||||
|
private int playCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"favourite_count")]
|
||||||
|
private int favouriteCount { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"bpm")]
|
||||||
|
private double bpm { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"video")]
|
||||||
|
private bool hasVideo { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"storyboard")]
|
||||||
|
private bool hasStoryboard { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"status")]
|
||||||
|
private BeatmapSetOnlineStatus status { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"submitted_date")]
|
||||||
|
private DateTimeOffset submitted { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"ranked_date")]
|
||||||
|
private DateTimeOffset ranked { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"last_updated")]
|
||||||
|
private DateTimeOffset lastUpdated { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"user_id")]
|
||||||
|
private long creatorId
|
||||||
|
{
|
||||||
|
set { Author.Id = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"beatmaps")]
|
||||||
|
private IEnumerable<APIBeatmap> beatmaps { get; set; }
|
||||||
|
|
||||||
|
public BeatmapSetInfo ToBeatmapSet(RulesetStore rulesets)
|
||||||
|
{
|
||||||
|
return new BeatmapSetInfo
|
||||||
|
{
|
||||||
|
OnlineBeatmapSetID = OnlineBeatmapSetID,
|
||||||
|
Metadata = this,
|
||||||
|
OnlineInfo = new BeatmapSetOnlineInfo
|
||||||
|
{
|
||||||
|
Covers = covers,
|
||||||
|
Preview = preview,
|
||||||
|
PlayCount = playCount,
|
||||||
|
FavouriteCount = favouriteCount,
|
||||||
|
BPM = bpm,
|
||||||
|
Status = status,
|
||||||
|
HasVideo = hasVideo,
|
||||||
|
HasStoryboard = hasStoryboard,
|
||||||
|
Submitted = submitted,
|
||||||
|
Ranked = ranked,
|
||||||
|
LastUpdated = lastUpdated,
|
||||||
|
},
|
||||||
|
Beatmaps = beatmaps?.Select(b => b.ToBeatmap(rulesets)).ToList(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
osu.Game/Online/API/Requests/Responses/APIRecentActivity.cs
Normal file
89
osu.Game/Online/API/Requests/Responses/APIRecentActivity.cs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using Humanizer;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIRecentActivity
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public int ID;
|
||||||
|
|
||||||
|
[JsonProperty("createdAt")]
|
||||||
|
public DateTimeOffset CreatedAt;
|
||||||
|
|
||||||
|
[JsonProperty]
|
||||||
|
private string type
|
||||||
|
{
|
||||||
|
set => Type = (RecentActivityType)Enum.Parse(typeof(RecentActivityType), value.Pascalize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public RecentActivityType Type;
|
||||||
|
|
||||||
|
[JsonProperty]
|
||||||
|
private string scoreRank
|
||||||
|
{
|
||||||
|
set => ScoreRank = (ScoreRank)Enum.Parse(typeof(ScoreRank), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScoreRank ScoreRank;
|
||||||
|
|
||||||
|
[JsonProperty("rank")]
|
||||||
|
public int Rank;
|
||||||
|
|
||||||
|
[JsonProperty("approval")]
|
||||||
|
public BeatmapApproval Approval;
|
||||||
|
|
||||||
|
[JsonProperty("count")]
|
||||||
|
public int Count;
|
||||||
|
|
||||||
|
[JsonProperty("mode")]
|
||||||
|
public string Mode;
|
||||||
|
|
||||||
|
[JsonProperty("beatmap")]
|
||||||
|
public RecentActivityBeatmap Beatmap;
|
||||||
|
|
||||||
|
[JsonProperty("beatmapset")]
|
||||||
|
public RecentActivityBeatmap Beatmapset;
|
||||||
|
|
||||||
|
[JsonProperty("user")]
|
||||||
|
public RecentActivityUser User;
|
||||||
|
|
||||||
|
[JsonProperty("achievement")]
|
||||||
|
public RecentActivityAchievement Achievement;
|
||||||
|
|
||||||
|
public class RecentActivityBeatmap
|
||||||
|
{
|
||||||
|
[JsonProperty("title")]
|
||||||
|
public string Title;
|
||||||
|
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RecentActivityUser
|
||||||
|
{
|
||||||
|
[JsonProperty("username")]
|
||||||
|
public string Username;
|
||||||
|
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url;
|
||||||
|
|
||||||
|
[JsonProperty("previousUsername")]
|
||||||
|
public string PreviousUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RecentActivityAchievement
|
||||||
|
{
|
||||||
|
[JsonProperty("slug")]
|
||||||
|
public string Slug;
|
||||||
|
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
117
osu.Game/Online/API/Requests/Responses/APIScore.cs
Normal file
117
osu.Game/Online/API/Requests/Responses/APIScore.cs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIScore : Score
|
||||||
|
{
|
||||||
|
[JsonProperty(@"score")]
|
||||||
|
private double totalScore
|
||||||
|
{
|
||||||
|
set => TotalScore = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"max_combo")]
|
||||||
|
private int maxCombo
|
||||||
|
{
|
||||||
|
set => MaxCombo = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"user")]
|
||||||
|
private User user
|
||||||
|
{
|
||||||
|
set => User = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"replay_data")]
|
||||||
|
private Replay replay
|
||||||
|
{
|
||||||
|
set => Replay = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"mode_int")]
|
||||||
|
public int OnlineRulesetID { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty(@"score_id")]
|
||||||
|
private long onlineScoreID
|
||||||
|
{
|
||||||
|
set => OnlineScoreID = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"created_at")]
|
||||||
|
private DateTimeOffset date
|
||||||
|
{
|
||||||
|
set => Date = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"beatmap")]
|
||||||
|
private BeatmapInfo beatmap
|
||||||
|
{
|
||||||
|
set => Beatmap = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"beatmapset")]
|
||||||
|
private BeatmapMetadata metadata
|
||||||
|
{
|
||||||
|
set => Beatmap.Metadata = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"statistics")]
|
||||||
|
private Dictionary<string, object> jsonStats
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
foreach (var kvp in value)
|
||||||
|
{
|
||||||
|
HitResult newKey;
|
||||||
|
switch (kvp.Key)
|
||||||
|
{
|
||||||
|
case @"count_300":
|
||||||
|
newKey = HitResult.Great;
|
||||||
|
break;
|
||||||
|
case @"count_100":
|
||||||
|
newKey = HitResult.Good;
|
||||||
|
break;
|
||||||
|
case @"count_50":
|
||||||
|
newKey = HitResult.Meh;
|
||||||
|
break;
|
||||||
|
case @"count_miss":
|
||||||
|
newKey = HitResult.Miss;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Statistics.Add(newKey, kvp.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty(@"mods")]
|
||||||
|
private string[] modStrings { get; set; }
|
||||||
|
|
||||||
|
public void ApplyBeatmap(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
Beatmap = beatmap;
|
||||||
|
ApplyRuleset(beatmap.Ruleset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ApplyRuleset(RulesetInfo ruleset)
|
||||||
|
{
|
||||||
|
Ruleset = ruleset;
|
||||||
|
|
||||||
|
// Evaluate the mod string
|
||||||
|
Mods = Ruleset.CreateInstance().GetAllMods().Where(mod => modStrings.Contains(mod.ShortenedName)).ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
osu.Game/Online/API/Requests/Responses/APIScores.cs
Normal file
14
osu.Game/Online/API/Requests/Responses/APIScores.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIScores
|
||||||
|
{
|
||||||
|
[JsonProperty(@"scores")]
|
||||||
|
public IEnumerable<APIScore> Scores;
|
||||||
|
}
|
||||||
|
}
|
14
osu.Game/Online/API/Requests/Responses/APIUser.cs
Normal file
14
osu.Game/Online/API/Requests/Responses/APIUser.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIUser
|
||||||
|
{
|
||||||
|
[JsonProperty]
|
||||||
|
public User User;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests.Responses
|
||||||
|
{
|
||||||
|
public class APIUserMostPlayedBeatmap
|
||||||
|
{
|
||||||
|
[JsonProperty("beatmap_id")]
|
||||||
|
public int BeatmapID;
|
||||||
|
|
||||||
|
[JsonProperty("count")]
|
||||||
|
public int PlayCount;
|
||||||
|
|
||||||
|
[JsonProperty]
|
||||||
|
private BeatmapInfo beatmap;
|
||||||
|
|
||||||
|
[JsonProperty]
|
||||||
|
private APIBeatmapSet beatmapSet;
|
||||||
|
|
||||||
|
public BeatmapInfo GetBeatmapInfo(RulesetStore rulesets)
|
||||||
|
{
|
||||||
|
BeatmapSetInfo setInfo = beatmapSet.ToBeatmapSet(rulesets);
|
||||||
|
beatmap.BeatmapSet = setInfo;
|
||||||
|
beatmap.Metadata = setInfo.Metadata;
|
||||||
|
return beatmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,13 +3,14 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Direct;
|
using osu.Game.Overlays.Direct;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
public class SearchBeatmapSetsRequest : APIRequest<IEnumerable<APIResponseBeatmapSet>>
|
public class SearchBeatmapSetsRequest : APIRequest<IEnumerable<APIBeatmapSet>>
|
||||||
{
|
{
|
||||||
private readonly string query;
|
private readonly string query;
|
||||||
private readonly RulesetInfo ruleset;
|
private readonly RulesetInfo ruleset;
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
@ -57,13 +56,16 @@ namespace osu.Game
|
|||||||
|
|
||||||
protected SettingsStore SettingsStore;
|
protected SettingsStore SettingsStore;
|
||||||
|
|
||||||
|
protected RulesetConfigCache RulesetConfigCache;
|
||||||
|
|
||||||
protected MenuCursorContainer MenuCursorContainer;
|
protected MenuCursorContainer MenuCursorContainer;
|
||||||
|
|
||||||
private Container content;
|
private Container content;
|
||||||
|
|
||||||
protected override Container<Drawable> Content => content;
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
public Bindable<WorkingBeatmap> Beatmap { get; private set; }
|
private OsuBindableBeatmap beatmap;
|
||||||
|
protected BindableBeatmap Beatmap => beatmap;
|
||||||
|
|
||||||
private Bindable<bool> fpsDisplayVisible;
|
private Bindable<bool> fpsDisplayVisible;
|
||||||
|
|
||||||
@ -123,6 +125,7 @@ namespace osu.Game
|
|||||||
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, contextFactory, Host, BeatmapManager, RulesetStore));
|
dependencies.Cache(ScoreStore = new ScoreStore(Host.Storage, contextFactory, Host, BeatmapManager, RulesetStore));
|
||||||
dependencies.Cache(KeyBindingStore = new KeyBindingStore(contextFactory, RulesetStore));
|
dependencies.Cache(KeyBindingStore = new KeyBindingStore(contextFactory, RulesetStore));
|
||||||
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
|
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
|
||||||
|
dependencies.Cache(RulesetConfigCache = new RulesetConfigCache(SettingsStore));
|
||||||
dependencies.Cache(new OsuColour());
|
dependencies.Cache(new OsuColour());
|
||||||
|
|
||||||
fileImporters.Add(BeatmapManager);
|
fileImporters.Add(BeatmapManager);
|
||||||
@ -157,33 +160,15 @@ namespace osu.Game
|
|||||||
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Venera-Light"));
|
Fonts.AddStore(new GlyphStore(Resources, @"Fonts/Venera-Light"));
|
||||||
|
|
||||||
var defaultBeatmap = new DummyWorkingBeatmap(this);
|
var defaultBeatmap = new DummyWorkingBeatmap(this);
|
||||||
Beatmap = new NonNullableBindable<WorkingBeatmap>(defaultBeatmap);
|
beatmap = new OsuBindableBeatmap(defaultBeatmap, Audio);
|
||||||
BeatmapManager.DefaultBeatmap = defaultBeatmap;
|
BeatmapManager.DefaultBeatmap = defaultBeatmap;
|
||||||
|
|
||||||
// tracks play so loud our samples can't keep up.
|
// tracks play so loud our samples can't keep up.
|
||||||
// this adds a global reduction of track volume for the time being.
|
// this adds a global reduction of track volume for the time being.
|
||||||
Audio.Track.AddAdjustment(AdjustableProperty.Volume, new BindableDouble(0.8));
|
Audio.Track.AddAdjustment(AdjustableProperty.Volume, new BindableDouble(0.8));
|
||||||
|
|
||||||
Beatmap.ValueChanged += b =>
|
dependencies.CacheAs<BindableBeatmap>(beatmap);
|
||||||
{
|
dependencies.CacheAs<IBindableBeatmap>(beatmap);
|
||||||
var trackLoaded = lastBeatmap?.TrackLoaded ?? false;
|
|
||||||
|
|
||||||
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
|
||||||
if (!trackLoaded || lastBeatmap?.Track != b.Track)
|
|
||||||
{
|
|
||||||
if (trackLoaded)
|
|
||||||
{
|
|
||||||
Debug.Assert(lastBeatmap != null);
|
|
||||||
Debug.Assert(lastBeatmap.Track != null);
|
|
||||||
|
|
||||||
lastBeatmap.RecycleTrack();
|
|
||||||
}
|
|
||||||
|
|
||||||
Audio.Track.AddItem(b.Track);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastBeatmap = b;
|
|
||||||
};
|
|
||||||
|
|
||||||
FileStore.Cleanup();
|
FileStore.Cleanup();
|
||||||
|
|
||||||
@ -204,6 +189,17 @@ namespace osu.Game
|
|||||||
dependencies.Cache(globalBinding);
|
dependencies.Cache(globalBinding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
// TODO: This is temporary until we reimplement the local FPS display.
|
||||||
|
// It's just to allow end-users to access the framework FPS display without knowing the shortcut key.
|
||||||
|
fpsDisplayVisible = LocalConfig.GetBindable<bool>(OsuSetting.ShowFpsDisplay);
|
||||||
|
fpsDisplayVisible.ValueChanged += val => { FrameStatisticsMode = val ? FrameStatisticsMode.Minimal : FrameStatisticsMode.None; };
|
||||||
|
fpsDisplayVisible.TriggerChange();
|
||||||
|
}
|
||||||
|
|
||||||
private void runMigrations()
|
private void runMigrations()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -227,19 +223,6 @@ namespace osu.Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorkingBeatmap lastBeatmap;
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
|
|
||||||
// TODO: This is temporary until we reimplement the local FPS display.
|
|
||||||
// It's just to allow end-users to access the framework FPS display without knowing the shortcut key.
|
|
||||||
fpsDisplayVisible = LocalConfig.GetBindable<bool>(OsuSetting.ShowFpsDisplay);
|
|
||||||
fpsDisplayVisible.ValueChanged += val => { FrameStatisticsMode = val ? FrameStatisticsMode.Minimal : FrameStatisticsMode.None; };
|
|
||||||
fpsDisplayVisible.TriggerChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetHost(GameHost host)
|
public override void SetHost(GameHost host)
|
||||||
{
|
{
|
||||||
if (LocalConfig == null)
|
if (LocalConfig == null)
|
||||||
@ -258,5 +241,26 @@ namespace osu.Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
public string[] HandledExtensions => fileImporters.SelectMany(i => i.HandledExtensions).ToArray();
|
public string[] HandledExtensions => fileImporters.SelectMany(i => i.HandledExtensions).ToArray();
|
||||||
|
|
||||||
|
private class OsuBindableBeatmap : BindableBeatmap
|
||||||
|
{
|
||||||
|
public OsuBindableBeatmap(WorkingBeatmap defaultValue, AudioManager audioManager)
|
||||||
|
: this(defaultValue)
|
||||||
|
{
|
||||||
|
RegisterAudioManager(audioManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
private OsuBindableBeatmap(WorkingBeatmap defaultValue)
|
||||||
|
: base(defaultValue)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BindableBeatmap GetBoundCopy()
|
||||||
|
{
|
||||||
|
var copy = new OsuBindableBeatmap(Default);
|
||||||
|
copy.BindTo(this);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Beatmaps.Drawables;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
@ -11,10 +13,11 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
{
|
{
|
||||||
public class DownloadButton : HeaderButton
|
public class DownloadButton : HeaderButton
|
||||||
{
|
{
|
||||||
public DownloadButton(string title, string subtitle)
|
public DownloadButton(BeatmapSetInfo set, bool noVideo = false)
|
||||||
{
|
{
|
||||||
Width = 120;
|
Width = 120;
|
||||||
|
|
||||||
|
BeatmapSetDownloader downloader;
|
||||||
Add(new Container
|
Add(new Container
|
||||||
{
|
{
|
||||||
Depth = -1,
|
Depth = -1,
|
||||||
@ -22,6 +25,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
Padding = new MarginPadding { Horizontal = 10 },
|
Padding = new MarginPadding { Horizontal = 10 },
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
|
downloader = new BeatmapSetDownloader(set, noVideo),
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
@ -32,13 +36,13 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
{
|
{
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = title,
|
Text = "Download",
|
||||||
TextSize = 13,
|
TextSize = 13,
|
||||||
Font = @"Exo2.0-Bold",
|
Font = @"Exo2.0-Bold",
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = subtitle,
|
Text = set.OnlineInfo.HasVideo && noVideo ? "without Video" : string.Empty,
|
||||||
TextSize = 11,
|
TextSize = 11,
|
||||||
Font = @"Exo2.0-Bold",
|
Font = @"Exo2.0-Bold",
|
||||||
},
|
},
|
||||||
@ -54,6 +58,25 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Action = () =>
|
||||||
|
{
|
||||||
|
if (!downloader.Download())
|
||||||
|
{
|
||||||
|
Content.MoveToX(-5, 50, Easing.OutSine).Then()
|
||||||
|
.MoveToX(5, 100, Easing.InOutSine).Then()
|
||||||
|
.MoveToX(-5, 100, Easing.InOutSine).Then()
|
||||||
|
.MoveToX(0, 50, Easing.InSine);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
downloader.Downloaded.ValueChanged += d =>
|
||||||
|
{
|
||||||
|
if (d)
|
||||||
|
this.FadeOut(200);
|
||||||
|
else
|
||||||
|
this.FadeIn(200);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,8 +35,6 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
private readonly BeatmapSetOnlineStatusPill onlineStatusPill;
|
private readonly BeatmapSetOnlineStatusPill onlineStatusPill;
|
||||||
public Details Details;
|
public Details Details;
|
||||||
|
|
||||||
private BeatmapManager beatmaps;
|
|
||||||
|
|
||||||
public readonly BeatmapPicker Picker;
|
public readonly BeatmapPicker Picker;
|
||||||
|
|
||||||
private BeatmapSetInfo beatmapSet;
|
private BeatmapSetInfo beatmapSet;
|
||||||
@ -68,8 +66,24 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
downloadButtonsContainer.FadeIn(transition_duration);
|
downloadButtonsContainer.FadeIn(transition_duration);
|
||||||
favouriteButton.FadeIn(transition_duration);
|
favouriteButton.FadeIn(transition_duration);
|
||||||
|
|
||||||
noVideoButtons.FadeTo(BeatmapSet.OnlineInfo.HasVideo ? 0 : 1, transition_duration);
|
if (BeatmapSet.OnlineInfo.HasVideo)
|
||||||
videoButtons.FadeTo(BeatmapSet.OnlineInfo.HasVideo ? 1 : 0, transition_duration);
|
{
|
||||||
|
videoButtons.Children = new[]
|
||||||
|
{
|
||||||
|
new DownloadButton(BeatmapSet),
|
||||||
|
new DownloadButton(BeatmapSet, true),
|
||||||
|
};
|
||||||
|
|
||||||
|
videoButtons.FadeIn(transition_duration);
|
||||||
|
noVideoButtons.FadeOut(transition_duration);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
noVideoButtons.Child = new DownloadButton(BeatmapSet);
|
||||||
|
|
||||||
|
noVideoButtons.FadeIn(transition_duration);
|
||||||
|
videoButtons.FadeOut(transition_duration);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -192,27 +206,12 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Alpha = 0f,
|
Alpha = 0f,
|
||||||
Child = new DownloadButton("Download", @"")
|
|
||||||
{
|
|
||||||
Action = () => download(false),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
videoButtons = new FillFlowContainer
|
videoButtons = new FillFlowContainer
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Spacing = new Vector2(buttons_spacing),
|
Spacing = new Vector2(buttons_spacing),
|
||||||
Alpha = 0f,
|
Alpha = 0f,
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
new DownloadButton("Download", "with Video")
|
|
||||||
{
|
|
||||||
Action = () => download(false),
|
|
||||||
},
|
|
||||||
new DownloadButton("Download", "without Video")
|
|
||||||
{
|
|
||||||
Action = () => download(true),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -248,41 +247,10 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colours, BeatmapManager beatmaps)
|
private void load(OsuColour colours)
|
||||||
{
|
{
|
||||||
tabsBg.Colour = colours.Gray3;
|
tabsBg.Colour = colours.Gray3;
|
||||||
this.beatmaps = beatmaps;
|
|
||||||
|
|
||||||
beatmaps.ItemAdded += handleBeatmapAdd;
|
|
||||||
|
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
|
||||||
{
|
|
||||||
base.Dispose(isDisposing);
|
|
||||||
if (beatmaps != null) beatmaps.ItemAdded -= handleBeatmapAdd;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleBeatmapAdd(BeatmapSetInfo beatmap) => Schedule(() =>
|
|
||||||
{
|
|
||||||
if (beatmap.OnlineBeatmapSetID == BeatmapSet?.OnlineBeatmapSetID)
|
|
||||||
downloadButtonsContainer.FadeOut(transition_duration);
|
|
||||||
});
|
|
||||||
|
|
||||||
private void download(bool noVideo)
|
|
||||||
{
|
|
||||||
if (beatmaps.GetExistingDownload(BeatmapSet) != null)
|
|
||||||
{
|
|
||||||
downloadButtonsContainer.MoveToX(-5, 50, Easing.OutSine).Then()
|
|
||||||
.MoveToX(5, 100, Easing.InOutSine).Then()
|
|
||||||
.MoveToX(-5, 100, Easing.InOutSine).Then()
|
|
||||||
.MoveToX(0, 50, Easing.InSine).Then();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
beatmaps.Download(BeatmapSet, noVideo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ using osu.Framework.Graphics.Shapes;
|
|||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Overlays.Profile.Sections.Ranks;
|
using osu.Game.Overlays.Profile.Sections.Ranks;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
@ -26,7 +26,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
|
|||||||
|
|
||||||
private readonly Box background;
|
private readonly Box background;
|
||||||
|
|
||||||
public DrawableScore(int index, OnlineScore score)
|
public DrawableScore(int index, APIScore score)
|
||||||
{
|
{
|
||||||
ScoreModsContainer modsContainer;
|
ScoreModsContainer modsContainer;
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ using osu.Framework.Graphics.Shapes;
|
|||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
using osu.Game.Overlays.Profile.Sections.Ranks;
|
using osu.Game.Overlays.Profile.Sections.Ranks;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
@ -42,8 +42,8 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
|
|||||||
private readonly InfoColumn statistics;
|
private readonly InfoColumn statistics;
|
||||||
private readonly ScoreModsContainer modsContainer;
|
private readonly ScoreModsContainer modsContainer;
|
||||||
|
|
||||||
private OnlineScore score;
|
private APIScore score;
|
||||||
public OnlineScore Score
|
public APIScore Score
|
||||||
{
|
{
|
||||||
get { return score; }
|
get { return score; }
|
||||||
set
|
set
|
||||||
|
@ -11,6 +11,7 @@ using System.Linq;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests.Responses;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.BeatmapSet.Scores
|
namespace osu.Game.Overlays.BeatmapSet.Scores
|
||||||
{
|
{
|
||||||
@ -28,10 +29,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
|
|||||||
set => loadingAnimation.FadeTo(value ? 1 : 0, fade_duration);
|
set => loadingAnimation.FadeTo(value ? 1 : 0, fade_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<OnlineScore> scores;
|
private IEnumerable<APIScore> scores;
|
||||||
private BeatmapInfo beatmap;
|
private BeatmapInfo beatmap;
|
||||||
|
|
||||||
public IEnumerable<OnlineScore> Scores
|
public IEnumerable<APIScore> Scores
|
||||||
{
|
{
|
||||||
get { return scores; }
|
get { return scores; }
|
||||||
set
|
set
|
||||||
|
@ -166,14 +166,13 @@ namespace osu.Game.Overlays.Direct
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
new DownloadButton
|
new DownloadButton(SetInfo)
|
||||||
{
|
{
|
||||||
Size = new Vector2(30),
|
Size = new Vector2(30),
|
||||||
Margin = new MarginPadding(horizontal_padding),
|
Margin = new MarginPadding(horizontal_padding),
|
||||||
Anchor = Anchor.CentreRight,
|
Anchor = Anchor.CentreRight,
|
||||||
Origin = Anchor.CentreRight,
|
Origin = Anchor.CentreRight,
|
||||||
Colour = colours.Gray5,
|
Colour = colours.Gray5,
|
||||||
Action = StartDownload
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user