From a2b3bc2848676eb02617a879087406172c04c008 Mon Sep 17 00:00:00 2001 From: iiSaLMaN Date: Sat, 7 Sep 2019 05:58:22 +0300 Subject: [PATCH 1/5] Add positional pippidon ruleset --- templates/ruleset-example/.editorconfig | 27 + templates/ruleset-example/.gitignore | 288 ++++++ .../.vscode/launch.json | 31 + .../.vscode/tasks.json | 47 + .../TestSceneOsuGame.cs | 32 + .../TestSceneOsuPlayer.cs | 17 + .../VisualTestRunner.cs | 23 + .../osu.Game.Rulesets.Pippidon.Tests.csproj | 26 + .../osu.Game.Rulesets.Pippidon.sln | 96 ++ ...osu.Game.Rulesets.Pippidon.sln.DotSettings | 877 ++++++++++++++++++ .../Beatmaps/PippidonBeatmapConverter.cs | 38 + .../Mods/PippidonModAutoplay.cs | 24 + .../Drawables/DrawablePippidonHitObject.cs | 83 ++ .../Objects/PippidonHitObject.cs | 20 + .../PippidonDifficultyCalculator.cs | 30 + .../PippidonInputManager.cs | 26 + .../PippidonRuleset.cs | 62 ++ .../Replays/PippidonAutoGenerator.cs | 41 + .../PippidonFramedReplayInputHandler.cs | 49 + .../Replays/PippidonReplayFrame.cs | 13 + .../Samples/Gameplay/normal-hitnormal.mp3 | Bin 0 -> 8022 bytes .../Resources/Textures/character.png | Bin 0 -> 78937 bytes .../Resources/Textures/coin.png | Bin 0 -> 3141 bytes .../Scoring/PippidonScoreProcessor.cs | 25 + .../UI/PippidonCursorContainer.cs | 34 + .../UI/PippidonDrawableRuleset.cs | 41 + .../UI/PippidonPlayfield.cs | 24 + .../PippidonPlayfieldAdjustmentContainer.cs | 20 + .../osu.Game.Rulesets.Pippidon.csproj | 20 + 29 files changed, 2014 insertions(+) create mode 100644 templates/ruleset-example/.editorconfig create mode 100644 templates/ruleset-example/.gitignore create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/tasks.json create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuPlayer.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln.DotSettings create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Mods/PippidonModAutoplay.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonReplayFrame.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Resources/Samples/Gameplay/normal-hitnormal.mp3 create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Resources/Textures/character.png create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Resources/Textures/coin.png create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonCursorContainer.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonDrawableRuleset.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfieldAdjustmentContainer.cs create mode 100644 templates/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj diff --git a/templates/ruleset-example/.editorconfig b/templates/ruleset-example/.editorconfig new file mode 100644 index 0000000..24825b7 --- /dev/null +++ b/templates/ruleset-example/.editorconfig @@ -0,0 +1,27 @@ +# EditorConfig is awesome: http://editorconfig.org +root = true + +[*.cs] +end_of_line = crlf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +#Roslyn naming styles + +#PascalCase for public and protected members +dotnet_naming_style.pascalcase.capitalization = pascal_case +dotnet_naming_symbols.public_members.applicable_accessibilities = public,internal,protected,protected_internal +dotnet_naming_symbols.public_members.applicable_kinds = property,method,field,event,delegate +dotnet_naming_rule.public_members_pascalcase.severity = suggestion +dotnet_naming_rule.public_members_pascalcase.symbols = public_members +dotnet_naming_rule.public_members_pascalcase.style = pascalcase + +#camelCase for private members +dotnet_naming_style.camelcase.capitalization = camel_case +dotnet_naming_symbols.private_members.applicable_accessibilities = private +dotnet_naming_symbols.private_members.applicable_kinds = property,method,field,event,delegate +dotnet_naming_rule.private_members_camelcase.severity = suggestion +dotnet_naming_rule.private_members_camelcase.symbols = private_members +dotnet_naming_rule.private_members_camelcase.style = camelcase \ No newline at end of file diff --git a/templates/ruleset-example/.gitignore b/templates/ruleset-example/.gitignore new file mode 100644 index 0000000..940794e --- /dev/null +++ b/templates/ruleset-example/.gitignore @@ -0,0 +1,288 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json new file mode 100644 index 0000000..b8ce6b2 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/launch.json @@ -0,0 +1,31 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "VisualTests (Debug)", + "type": "coreclr", + "request": "launch", + "program": "dotnet", + "args": [ + "${workspaceRoot}/bin/Debug/netcoreapp2.2/osu.Game.Rulesets.Pippidon.Tests.dll" + ], + "cwd": "${workspaceRoot}", + "preLaunchTask": "Build (Debug)", + "env": {}, + "console": "internalConsole" + }, + { + "name": "VisualTests (Release)", + "type": "coreclr", + "request": "launch", + "program": "dotnet", + "args": [ + "${workspaceRoot}/bin/Release/netcoreapp2.2/osu.Game.Rulesets.Pippidon.Tests.dll" + ], + "cwd": "${workspaceRoot}", + "preLaunchTask": "Build (Release)", + "env": {}, + "console": "internalConsole" + } + ] +} \ No newline at end of file diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/tasks.json b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/tasks.json new file mode 100644 index 0000000..86c72b0 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/.vscode/tasks.json @@ -0,0 +1,47 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Build (Debug)", + "type": "shell", + "command": "dotnet", + "args": [ + "build", + "--no-restore", + "osu.Game.Rulesets.Pippidon.Tests.csproj", + "/p:GenerateFullPaths=true", + "/m", + "/verbosity:m" + ], + "group": "build", + "problemMatcher": "$msCompile" + }, + { + "label": "Build (Release)", + "type": "shell", + "command": "dotnet", + "args": [ + "build", + "--no-restore", + "osu.Game.Rulesets.Pippidon.Tests.csproj", + "/p:Configuration=Release", + "/p:GenerateFullPaths=true", + "/m", + "/verbosity:m" + ], + "group": "build", + "problemMatcher": "$msCompile" + }, + { + "label": "Restore", + "type": "shell", + "command": "dotnet", + "args": [ + "restore" + ], + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs new file mode 100644 index 0000000..1d71b40 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs @@ -0,0 +1,32 @@ +// Copyright (c) 2007-2019 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Platform; +using osu.Game.Tests.Visual; +using osuTK.Graphics; + +namespace osu.Game.Rulesets.Pippidon.Tests +{ + public class TestSceneOsuGame : OsuTestScene + { + [BackgroundDependencyLoader] + private void load(GameHost host, OsuGameBase gameBase) + { + OsuGame game = new OsuGame(); + game.SetHost(host); + + Children = new Drawable[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + Colour = Color4.Black, + }, + game + }; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuPlayer.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuPlayer.cs new file mode 100644 index 0000000..f34a705 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuPlayer.cs @@ -0,0 +1,17 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using NUnit.Framework; +using osu.Game.Tests.Visual; + +namespace osu.Game.Rulesets.Pippidon.Tests +{ + [TestFixture] + public class TestSceneOsuPlayer : PlayerTestScene + { + public TestSceneOsuPlayer() + : base(new PippidonRuleset()) + { + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs new file mode 100644 index 0000000..fd6bd9b --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/VisualTestRunner.cs @@ -0,0 +1,23 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using osu.Framework; +using osu.Framework.Platform; +using osu.Game.Tests; + +namespace osu.Game.Rulesets.Pippidon.Tests +{ + public static class VisualTestRunner + { + [STAThread] + public static int Main(string[] args) + { + using (DesktopGameHost host = Host.GetSuitableHost(@"osu", true)) + { + host.Run(new OsuTestBrowser()); + return 0; + } + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj new file mode 100644 index 0000000..a6cf766 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj @@ -0,0 +1,26 @@ + + + osu.Game.Rulesets.Pippidon.Tests.VisualTestRunner + + + + + + false + + + + + + + + + + + + + WinExe + netcoreapp2.2 + osu.Game.Rulesets.Pippidon.Tests + + \ No newline at end of file diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln new file mode 100644 index 0000000..bccffcd --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln @@ -0,0 +1,96 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29123.88 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "osu.Game.Rulesets.Pippidon", "osu.Game.Rulesets.Pippidon\osu.Game.Rulesets.Pippidon.csproj", "{5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osu.Game.Rulesets.Pippidon.Tests", "osu.Game.Rulesets.Pippidon.Tests\osu.Game.Rulesets.Pippidon.Tests.csproj", "{B4577C85-CB83-462A-BCE3-22FFEB16311D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + VisualTests|Any CPU = VisualTests|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.Release|Any CPU.Build.0 = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.VisualTests|Any CPU.ActiveCfg = Release|Any CPU + {5AE1F0F1-DAFA-46E7-959C-DA233B7C87E9}.VisualTests|Any CPU.Build.0 = Release|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.Release|Any CPU.Build.0 = Release|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.VisualTests|Any CPU.ActiveCfg = Debug|Any CPU + {B4577C85-CB83-462A-BCE3-22FFEB16311D}.VisualTests|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {671B0BEC-2403-45B0-9357-2C97CC517668} + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + Policies = $0 + $0.TextStylePolicy = $1 + $1.EolMarker = Windows + $1.inheritsSet = VisualStudio + $1.inheritsScope = text/plain + $1.scope = text/x-csharp + $0.CSharpFormattingPolicy = $2 + $2.IndentSwitchSection = True + $2.NewLinesForBracesInProperties = True + $2.NewLinesForBracesInAccessors = True + $2.NewLinesForBracesInAnonymousMethods = True + $2.NewLinesForBracesInControlBlocks = True + $2.NewLinesForBracesInAnonymousTypes = True + $2.NewLinesForBracesInObjectCollectionArrayInitializers = True + $2.NewLinesForBracesInLambdaExpressionBody = True + $2.NewLineForElse = True + $2.NewLineForCatch = True + $2.NewLineForFinally = True + $2.NewLineForMembersInObjectInit = True + $2.NewLineForMembersInAnonymousTypes = True + $2.NewLineForClausesInQuery = True + $2.SpacingAfterMethodDeclarationName = False + $2.SpaceAfterMethodCallName = False + $2.SpaceBeforeOpenSquareBracket = False + $2.inheritsSet = Mono + $2.inheritsScope = text/x-csharp + $2.scope = text/x-csharp + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + Policies = $0 + $0.TextStylePolicy = $1 + $1.EolMarker = Windows + $1.inheritsSet = VisualStudio + $1.inheritsScope = text/plain + $1.scope = text/x-csharp + $0.CSharpFormattingPolicy = $2 + $2.IndentSwitchSection = True + $2.NewLinesForBracesInProperties = True + $2.NewLinesForBracesInAccessors = True + $2.NewLinesForBracesInAnonymousMethods = True + $2.NewLinesForBracesInControlBlocks = True + $2.NewLinesForBracesInAnonymousTypes = True + $2.NewLinesForBracesInObjectCollectionArrayInitializers = True + $2.NewLinesForBracesInLambdaExpressionBody = True + $2.NewLineForElse = True + $2.NewLineForCatch = True + $2.NewLineForFinally = True + $2.NewLineForMembersInObjectInit = True + $2.NewLineForMembersInAnonymousTypes = True + $2.NewLineForClausesInQuery = True + $2.SpacingAfterMethodDeclarationName = False + $2.SpaceAfterMethodCallName = False + $2.SpaceBeforeOpenSquareBracket = False + $2.inheritsSet = Mono + $2.inheritsScope = text/x-csharp + $2.scope = text/x-csharp + EndGlobalSection +EndGlobal diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln.DotSettings b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln.DotSettings new file mode 100644 index 0000000..190a104 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.sln.DotSettings @@ -0,0 +1,877 @@ + + True + True + True + True + ExplicitlyExcluded + ExplicitlyExcluded + SOLUTION + WARNING + WARNING + WARNING + HINT + HINT + WARNING + + True + WARNING + WARNING + HINT + HINT + HINT + HINT + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + WARNING + HINT + SUGGESTION + HINT + HINT + HINT + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + WARNING + WARNING + HINT + WARNING + WARNING + DO_NOT_SHOW + HINT + WARNING + DO_NOT_SHOW + WARNING + HINT + HINT + HINT + ERROR + WARNING + HINT + HINT + HINT + WARNING + WARNING + HINT + DO_NOT_SHOW + HINT + HINT + HINT + HINT + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + WARNING + HINT + HINT + HINT + HINT + HINT + WARNING + WARNING + HINT + WARNING + WARNING + WARNING + WARNING + HINT + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + WARNING + + WARNING + WARNING + WARNING + WARNING + WARNING + ERROR + WARNING + WARNING + HINT + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + WARNING + HINT + HINT + HINT + HINT + HINT + HINT + HINT + + HINT + WARNING + WARNING + WARNING + WARNING + + True + WARNING + WARNING + WARNING + WARNING + WARNING + HINT + HINT + WARNING + WARNING + <?xml version="1.0" encoding="utf-16"?><Profile name="Code Cleanup (peppy)"><CSArrangeThisQualifier>True</CSArrangeThisQualifier><CSUseVar><BehavourStyle>CAN_CHANGE_TO_EXPLICIT</BehavourStyle><LocalVariableStyle>ALWAYS_EXPLICIT</LocalVariableStyle><ForeachVariableStyle>ALWAYS_EXPLICIT</ForeachVariableStyle></CSUseVar><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><CSUpdateFileHeader>True</CSUpdateFileHeader><CSCodeStyleAttributes ArrangeTypeAccessModifier="False" ArrangeTypeMemberAccessModifier="False" SortModifiers="True" RemoveRedundantParentheses="True" AddMissingParentheses="False" ArrangeBraces="False" ArrangeAttributes="False" ArrangeArgumentsStyle="False" /><XAMLCollapsePippidonScrollingTags>False</XAMLCollapsePippidonScrollingTags><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CSArrangeQualifiers>True</CSArrangeQualifiers></Profile> + Code Cleanup (peppy) + ExpressionBody + ExpressionBody + True + True + True + True + True + True + True + True + True + NEXT_LINE + 1 + 1 + NEXT_LINE + 1 + 1 + True + NEVER + NEVER + False + NEVER + False + True + False + False + True + True + False + CHOP_IF_LONG + True + 200 + CHOP_IF_LONG + False + False + AABB + API + BPM + GC + GL + GLSL + HID + HUD + ID + IL + IP + IPC + JIT + LTRB + MD5 + NS + OS + PM + RGB + RNG + SHA + SRGB + TK + SS + PP + GMT + QAT + BNG + UI + False + HINT + <?xml version="1.0" encoding="utf-16"?> +<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> + <TypePattern DisplayName="COM interfaces or structs"> + <TypePattern.Match> + <Or> + <And> + <Kind Is="Interface" /> + <Or> + <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" /> + <HasAttribute Name="System.Runtime.InteropServices.ComImport" /> + </Or> + </And> + <Kind Is="Struct" /> + </Or> + </TypePattern.Match> + </TypePattern> + <TypePattern DisplayName="NUnit Test Fixtures" RemoveRegions="All"> + <TypePattern.Match> + <And> + <Kind Is="Class" /> + <HasAttribute Name="NUnit.Framework.TestFixtureAttribute" Inherited="True" /> + </And> + </TypePattern.Match> + <Entry DisplayName="Setup/Teardown Methods"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <Or> + <HasAttribute Name="NUnit.Framework.SetUpAttribute" Inherited="True" /> + <HasAttribute Name="NUnit.Framework.TearDownAttribute" Inherited="True" /> + <HasAttribute Name="NUnit.Framework.FixtureSetUpAttribute" Inherited="True" /> + <HasAttribute Name="NUnit.Framework.FixtureTearDownAttribute" Inherited="True" /> + </Or> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="All other members" /> + <Entry Priority="100" DisplayName="Test Methods"> + <Entry.Match> + <And> + <Kind Is="Method" /> + <HasAttribute Name="NUnit.Framework.TestAttribute" /> + </And> + </Entry.Match> + <Entry.SortBy> + <Name /> + </Entry.SortBy> + </Entry> + </TypePattern> + <TypePattern DisplayName="Default Pattern"> + <Group DisplayName="Fields/Properties"> + <Group DisplayName="Public Fields"> + <Entry DisplayName="Constant Fields"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Or> + <Kind Is="Constant" /> + <Readonly /> + <And> + <Static /> + <Readonly /> + </And> + </Or> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Static Fields"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Static /> + <Not> + <Readonly /> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Normal Fields"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Not> + <Or> + <Static /> + <Readonly /> + </Or> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Entry DisplayName="Public Properties"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Kind Is="Property" /> + </And> + </Entry.Match> + </Entry> + <Group DisplayName="Internal Fields"> + <Entry DisplayName="Constant Fields"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Or> + <Kind Is="Constant" /> + <Readonly /> + <And> + <Static /> + <Readonly /> + </And> + </Or> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Static Fields"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Static /> + <Not> + <Readonly /> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Normal Fields"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Not> + <Or> + <Static /> + <Readonly /> + </Or> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Entry DisplayName="Internal Properties"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Kind Is="Property" /> + </And> + </Entry.Match> + </Entry> + <Group DisplayName="Protected Fields"> + <Entry DisplayName="Constant Fields"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Or> + <Kind Is="Constant" /> + <Readonly /> + <And> + <Static /> + <Readonly /> + </And> + </Or> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Static Fields"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Static /> + <Not> + <Readonly /> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Normal Fields"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Not> + <Or> + <Static /> + <Readonly /> + </Or> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Entry DisplayName="Protected Properties"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Kind Is="Property" /> + </And> + </Entry.Match> + </Entry> + <Group DisplayName="Private Fields"> + <Entry DisplayName="Constant Fields"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Or> + <Kind Is="Constant" /> + <Readonly /> + <And> + <Static /> + <Readonly /> + </And> + </Or> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Static Fields"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Static /> + <Not> + <Readonly /> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Normal Fields"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Not> + <Or> + <Static /> + <Readonly /> + </Or> + </Not> + <Kind Is="Field" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Entry DisplayName="Private Properties"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Kind Is="Property" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Group DisplayName="Constructor/Destructor"> + <Entry DisplayName="Ctor"> + <Entry.Match> + <Kind Is="Constructor" /> + </Entry.Match> + </Entry> + <Region Name="Disposal"> + <Entry DisplayName="Dtor"> + <Entry.Match> + <Kind Is="Destructor" /> + </Entry.Match> + </Entry> + <Entry DisplayName="Dispose()"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Kind Is="Method" /> + <Name Is="Dispose" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Dispose(true)"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Or> + <Virtual /> + <Override /> + </Or> + <Kind Is="Method" /> + <Name Is="Dispose" /> + </And> + </Entry.Match> + </Entry> + </Region> + </Group> + <Group DisplayName="Methods"> + <Group DisplayName="Public"> + <Entry DisplayName="Static Methods"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Static /> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Methods"> + <Entry.Match> + <And> + <Access Is="Public" /> + <Not> + <Static /> + </Not> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Group DisplayName="Internal"> + <Entry DisplayName="Static Methods"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Static /> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Methods"> + <Entry.Match> + <And> + <Access Is="Internal" /> + <Not> + <Static /> + </Not> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Group DisplayName="Protected"> + <Entry DisplayName="Static Methods"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Static /> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Methods"> + <Entry.Match> + <And> + <Access Is="Protected" /> + <Not> + <Static /> + </Not> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + </Group> + <Group DisplayName="Private"> + <Entry DisplayName="Static Methods"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Static /> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + <Entry DisplayName="Methods"> + <Entry.Match> + <And> + <Access Is="Private" /> + <Not> + <Static /> + </Not> + <Kind Is="Method" /> + </And> + </Entry.Match> + </Entry> + </Group> + </Group> + </TypePattern> +</Patterns> + Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. +See the LICENCE file in the repository root for full licence text. + + <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> + <Policy Inspect="False" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb"><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="private methods"><ElementKinds><Kind Name="ASYNC_METHOD" /><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Protected, ProtectedInternal, Internal, Public" Description="internal/protected/public methods"><ElementKinds><Kind Name="ASYNC_METHOD" /><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="private properties"><ElementKinds><Kind Name="PROPERTY" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Protected, ProtectedInternal, Internal, Public" Description="internal/protected/public properties"><ElementKinds><Kind Name="PROPERTY" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + True + True + True + True + True + True + True + True + True + True + True + True + o!f – Object Initializer: Anchor&Origin + True + constant("Centre") + 0 + True + True + 2.0 + InCSharpFile + ofao + True + Anchor = Anchor.$anchor$, +Origin = Anchor.$anchor$, + True + True + o!f – InternalChildren = [] + True + True + 2.0 + InCSharpFile + ofic + True + InternalChildren = new Drawable[] +{ + $END$ +}; + True + True + o!f – new GridContainer { .. } + True + True + 2.0 + InCSharpFile + ofgc + True + new GridContainer +{ + RelativeSizeAxes = Axes.Both, + Content = new[] + { + new Drawable[] { $END$ }, + new Drawable[] { } + } +}; + True + True + o!f – new FillFlowContainer { .. } + True + True + 2.0 + InCSharpFile + offf + True + new FillFlowContainer +{ + RelativeSizeAxes = Axes.Both, + Direction = FillDirection.Vertical, + Children = new Drawable[] + { + $END$ + } +}, + True + True + o!f – new Container { .. } + True + True + 2.0 + InCSharpFile + ofcont + True + new Container +{ + RelativeSizeAxes = Axes.Both, + Children = new Drawable[] + { + $END$ + } +}, + True + True + o!f – BackgroundDependencyLoader load() + True + True + 2.0 + InCSharpFile + ofbdl + True + [BackgroundDependencyLoader] +private void load() +{ + $END$ +} + True + True + o!f – new Box { .. } + True + True + 2.0 + InCSharpFile + ofbox + True + new Box +{ + Colour = Color4.Black, + RelativeSizeAxes = Axes.Both, +}, + True + True + o!f – Children = [] + True + True + 2.0 + InCSharpFile + ofc + True + Children = new Drawable[] +{ + $END$ +}; + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs new file mode 100644 index 0000000..2879582 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs @@ -0,0 +1,38 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Objects.Types; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.Beatmaps +{ + public class PippidonBeatmapConverter : BeatmapConverter + { + protected override IEnumerable ValidConversionTypes { get; } = new[] + { + // todo: Populate with conversion types that should be supported other than position (ie. typeof(IHasCurve)) + // https://github.com/ppy/osu/tree/master/osu.Game/Rulesets/Objects/Types + typeof(IHasPosition) + }; + + public PippidonBeatmapConverter(IBeatmap beatmap) + : base(beatmap) + { + } + + protected override IEnumerable ConvertHitObject(HitObject original, IBeatmap beatmap) + { + yield return new PippidonHitObject + { + Samples = original.Samples, + StartTime = original.StartTime, + Position = (original as IHasPosition)?.Position ?? Vector2.Zero, + }; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Mods/PippidonModAutoplay.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Mods/PippidonModAutoplay.cs new file mode 100644 index 0000000..8acff8d --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Mods/PippidonModAutoplay.cs @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Pippidon.Replays; +using osu.Game.Scoring; +using osu.Game.Users; + +namespace osu.Game.Rulesets.Pippidon.Mods +{ + public class PippidonModAutoplay : ModAutoplay + { + public override Score CreateReplayScore(IBeatmap beatmap) => new Score + { + ScoreInfo = new ScoreInfo + { + User = new User { Username = "sample" }, + }, + Replay = new PippidonAutoGenerator(beatmap).Generate(), + }; + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs new file mode 100644 index 0000000..32de496 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -0,0 +1,83 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Game.Audio; +using osu.Game.Beatmaps.ControlPoints; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; +using osuTK; +using osuTK.Graphics; + +namespace osu.Game.Rulesets.Pippidon.Objects.Drawables +{ + public class DrawablePippidonHitObject : DrawableHitObject + { + private const double time_preempt = 600; + private const double time_fadein = 400; + + public override bool HandlePositionalInput => true; + + public DrawablePippidonHitObject(PippidonHitObject hitObject) + : base(hitObject) + { + Size = new Vector2(80); + + Origin = Anchor.Centre; + Position = hitObject.Position; + } + + [BackgroundDependencyLoader] + private void load(TextureStore textures) + { + AddInternal(new Sprite + { + RelativeSizeAxes = Axes.Both, + Texture = textures.Get("coin"), + }); + } + + protected override IEnumerable GetSamples() => new[] + { + new HitSampleInfo + { + Bank = SampleControlPoint.DEFAULT_BANK, + Name = HitSampleInfo.HIT_NORMAL, + } + }; + + protected override void CheckForResult(bool userTriggered, double timeOffset) + { + if (timeOffset >= 0) + ApplyResult(r => r.Type = IsHovered ? HitResult.Perfect : HitResult.Miss); + } + + protected override double InitialLifetimeOffset => time_preempt; + + protected override void UpdateInitialTransforms() => this.FadeInFromZero(time_fadein); + + protected override void UpdateStateTransforms(ArmedState state) + { + switch (state) + { + case ArmedState.Hit: + this.ScaleTo(5, 1500, Easing.OutQuint).FadeOut(1500, Easing.OutQuint).Expire(); + break; + + case ArmedState.Miss: + + const double duration = 1000; + + this.ScaleTo(0.8f, duration, Easing.OutQuint); + this.MoveToOffset(new Vector2(0, 10), duration, Easing.In); + this.FadeColour(Color4.Red.Opacity(0.5f), duration / 2, Easing.OutQuint).Then().FadeOut(duration / 2, Easing.InQuint).Expire(); + break; + } + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs new file mode 100644 index 0000000..0c22554 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/PippidonHitObject.cs @@ -0,0 +1,20 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Types; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.Objects +{ + public class PippidonHitObject : HitObject, IHasPosition + { + public override Judgement CreateJudgement() => new Judgement(); + + public Vector2 Position { get; set; } + + public float X => Position.X; + public float Y => Position.Y; + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs new file mode 100644 index 0000000..37be56f --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonDifficultyCalculator.cs @@ -0,0 +1,30 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using System.Linq; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Difficulty; +using osu.Game.Rulesets.Difficulty.Preprocessing; +using osu.Game.Rulesets.Difficulty.Skills; +using osu.Game.Rulesets.Mods; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonDifficultyCalculator : DifficultyCalculator + { + public PippidonDifficultyCalculator(Ruleset ruleset, WorkingBeatmap beatmap) + : base(ruleset, beatmap) + { + } + + protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beatmap, Mod[] mods, Skill[] skills, double clockRate) + { + return new DifficultyAttributes(mods, skills, 0); + } + + protected override IEnumerable CreateDifficultyHitObjects(IBeatmap beatmap, double clockRate) => Enumerable.Empty(); + + protected override Skill[] CreateSkills(IBeatmap beatmap) => new Skill[0]; + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs new file mode 100644 index 0000000..aa7fa31 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonInputManager.cs @@ -0,0 +1,26 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.ComponentModel; +using osu.Framework.Input.Bindings; +using osu.Game.Rulesets.UI; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonInputManager : RulesetInputManager + { + public PippidonInputManager(RulesetInfo ruleset) + : base(ruleset, 0, SimultaneousBindingMode.Unique) + { + } + } + + public enum PippidonAction + { + [Description("Button 1")] + Button1, + + [Description("Button 2")] + Button2, + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs new file mode 100644 index 0000000..2735e96 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/PippidonRuleset.cs @@ -0,0 +1,62 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Framework.Input.Bindings; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Difficulty; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Pippidon.Beatmaps; +using osu.Game.Rulesets.Pippidon.Mods; +using osu.Game.Rulesets.Pippidon.UI; +using osu.Game.Rulesets.UI; + +namespace osu.Game.Rulesets.Pippidon +{ + public class PippidonRuleset : Ruleset + { + public PippidonRuleset(RulesetInfo rulesetInfo = null) + : base(rulesetInfo) + { + } + + public override string Description => "gather the osu!coins"; + + public override DrawableRuleset CreateDrawableRulesetWith(IWorkingBeatmap beatmap, IReadOnlyList mods) => + new DrawablePippidonRuleset(this, beatmap, mods); + + public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => + new PippidonBeatmapConverter(beatmap); + + public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => + new PippidonDifficultyCalculator(this, beatmap); + + public override IEnumerable GetModsFor(ModType type) + { + switch (type) + { + case ModType.Automation: + return new[] { new PippidonModAutoplay() }; + + default: + return new Mod[] { null }; + } + } + + public override string ShortName => "pippidon"; + + public override IEnumerable GetDefaultKeyBindings(int variant = 0) => new[] + { + new KeyBinding(InputKey.Z, PippidonAction.Button1), + new KeyBinding(InputKey.X, PippidonAction.Button2), + }; + + public override Drawable CreateIcon() => new Sprite + { + Texture = new TextureStore(new TextureLoaderStore(CreateReourceStore()), false).Get("Textures/coin"), + }; + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs new file mode 100644 index 0000000..d8b5229 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs @@ -0,0 +1,41 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using osu.Game.Beatmaps; +using osu.Game.Replays; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Replays; + +namespace osu.Game.Rulesets.Pippidon.Replays +{ + public class PippidonAutoGenerator : AutoGenerator + { + protected Replay Replay; + protected List Frames => Replay.Frames; + + public new Beatmap Beatmap => (Beatmap) base.Beatmap; + + public PippidonAutoGenerator(IBeatmap beatmap) + : base(beatmap) + { + Replay = new Replay(); + } + + public override Replay Generate() + { + Frames.Add(new PippidonReplayFrame()); + + foreach (PippidonHitObject hitObject in Beatmap.HitObjects) + { + Frames.Add(new PippidonReplayFrame + { + Time = hitObject.StartTime, + Position = hitObject.Position, + }); + } + + return Replay; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs new file mode 100644 index 0000000..3907927 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonFramedReplayInputHandler.cs @@ -0,0 +1,49 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using System.Diagnostics; +using osu.Framework.Input.StateChanges; +using osu.Framework.MathUtils; +using osu.Game.Replays; +using osu.Game.Rulesets.Replays; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.Replays +{ + public class PippidonFramedReplayInputHandler : FramedReplayInputHandler + { + public PippidonFramedReplayInputHandler(Replay replay) + : base(replay) + { + } + + protected override bool IsImportant(PippidonReplayFrame frame) => true; + + protected Vector2 Position + { + get + { + var frame = CurrentFrame; + + if (frame == null) + return Vector2.Zero; + + Debug.Assert(CurrentTime != null); + + return NextFrame != null ? Interpolation.ValueAt(CurrentTime.Value, frame.Position, NextFrame.Position, frame.Time, NextFrame.Time) : frame.Position; + } + } + + public override List GetPendingInputs() + { + return new List + { + new MousePositionAbsoluteInput + { + Position = GamefieldToScreenSpace(Position) + } + }; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonReplayFrame.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonReplayFrame.cs new file mode 100644 index 0000000..949ca16 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonReplayFrame.cs @@ -0,0 +1,13 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Rulesets.Replays; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.Replays +{ + public class PippidonReplayFrame : ReplayFrame + { + public Vector2 Position; + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Resources/Samples/Gameplay/normal-hitnormal.mp3 b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Resources/Samples/Gameplay/normal-hitnormal.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..90b13d1f734a4020945bed6706f6a86228b87938 GIT binary patch literal 8022 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 literal 0 HcmV?d00001 diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs new file mode 100644 index 0000000..82ddc88 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs @@ -0,0 +1,25 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; + +namespace osu.Game.Rulesets.Pippidon.Scoring +{ + public class PippidonScoreProcessor : ScoreProcessor + { + public PippidonScoreProcessor(DrawableRuleset ruleset) + : base(ruleset) + { + } + + protected override void Reset(bool storeResults) + { + base.Reset(storeResults); + + Health.Value = 1; + Accuracy.Value = 1; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonCursorContainer.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonCursorContainer.cs new file mode 100644 index 0000000..9de3f4b --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonCursorContainer.cs @@ -0,0 +1,34 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Game.Rulesets.UI; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + public class PippidonCursorContainer : GameplayCursorContainer + { + private Sprite cursorSprite; + private Texture cursorTexture; + + protected override Drawable CreateCursor() => cursorSprite = new Sprite + { + Scale = new Vector2(0.5f), + Origin = Anchor.Centre, + Texture = cursorTexture, + }; + + [BackgroundDependencyLoader] + private void load(TextureStore textures) + { + cursorTexture = textures.Get("character"); + + if (cursorSprite != null) + cursorSprite.Texture = cursorTexture; + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonDrawableRuleset.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonDrawableRuleset.cs new file mode 100644 index 0000000..3043386 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonDrawableRuleset.cs @@ -0,0 +1,41 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using osu.Framework.Allocation; +using osu.Framework.Input; +using osu.Game.Beatmaps; +using osu.Game.Input.Handlers; +using osu.Game.Replays; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Pippidon.Objects; +using osu.Game.Rulesets.Pippidon.Objects.Drawables; +using osu.Game.Rulesets.Pippidon.Replays; +using osu.Game.Rulesets.Pippidon.Scoring; +using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.UI; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + [Cached] + public class DrawablePippidonRuleset : DrawableRuleset + { + public DrawablePippidonRuleset(PippidonRuleset ruleset, IWorkingBeatmap beatmap, IReadOnlyList mods) + : base(ruleset, beatmap, mods) + { + } + + public override ScoreProcessor CreateScoreProcessor() => new PippidonScoreProcessor(this); + + public override PlayfieldAdjustmentContainer CreatePlayfieldAdjustmentContainer() => new PippidonPlayfieldAdjustmentContainer(); + + protected override Playfield CreatePlayfield() => new PippidonPlayfield(); + + protected override ReplayInputHandler CreateReplayInputHandler(Replay replay) => new PippidonFramedReplayInputHandler(replay); + + public override DrawableHitObject CreateDrawableRepresentation(PippidonHitObject h) => new DrawablePippidonHitObject(h); + + protected override PassThroughInputManager CreateInputManager() => new PippidonInputManager(Ruleset?.RulesetInfo); + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs new file mode 100644 index 0000000..b5a97c5 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfield.cs @@ -0,0 +1,24 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Game.Rulesets.UI; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + [Cached] + public class PippidonPlayfield : Playfield + { + protected override GameplayCursorContainer CreateCursor() => new PippidonCursorContainer(); + + [BackgroundDependencyLoader] + private void load() + { + AddRangeInternal(new Drawable[] + { + HitObjectContainer, + }); + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfieldAdjustmentContainer.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfieldAdjustmentContainer.cs new file mode 100644 index 0000000..9236683 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/UI/PippidonPlayfieldAdjustmentContainer.cs @@ -0,0 +1,20 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Graphics; +using osu.Game.Rulesets.UI; +using osuTK; + +namespace osu.Game.Rulesets.Pippidon.UI +{ + public class PippidonPlayfieldAdjustmentContainer : PlayfieldAdjustmentContainer + { + public PippidonPlayfieldAdjustmentContainer() + { + Anchor = Anchor.Centre; + Origin = Anchor.Centre; + + Size = new Vector2(0.8f); + } + } +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj new file mode 100644 index 0000000..1dc8606 --- /dev/null +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/osu.Game.Rulesets.Pippidon.csproj @@ -0,0 +1,20 @@ + + + netstandard2.0 + osu.Game.Rulesets.Sample + Library + AnyCPU + osu.Game.Rulesets.Pippidon + + + + + + + + + + + + + \ No newline at end of file From 5c35d414ba145ec3291be67a65ef06db611502a3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 19 Sep 2019 11:21:27 +0900 Subject: [PATCH 2/5] Remove todo comments --- .../Beatmaps/PippidonBeatmapConverter.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs index 2879582..293ed5a 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs @@ -13,12 +13,7 @@ namespace osu.Game.Rulesets.Pippidon.Beatmaps { public class PippidonBeatmapConverter : BeatmapConverter { - protected override IEnumerable ValidConversionTypes { get; } = new[] - { - // todo: Populate with conversion types that should be supported other than position (ie. typeof(IHasCurve)) - // https://github.com/ppy/osu/tree/master/osu.Game/Rulesets/Objects/Types - typeof(IHasPosition) - }; + protected override IEnumerable ValidConversionTypes { get; } = new[] { typeof(IHasPosition) }; public PippidonBeatmapConverter(IBeatmap beatmap) : base(beatmap) From 37aa63252cded98f8c4f3142fadfe6f8a1691b7f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 19 Sep 2019 11:25:02 +0900 Subject: [PATCH 3/5] Fix formatting issues --- .../Objects/Drawables/DrawablePippidonHitObject.cs | 1 - .../osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs index 32de496..d2a7215 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Objects/Drawables/DrawablePippidonHitObject.cs @@ -70,7 +70,6 @@ protected override void UpdateStateTransforms(ArmedState state) break; case ArmedState.Miss: - const double duration = 1000; this.ScaleTo(0.8f, duration, Easing.OutQuint); diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs index d8b5229..9c54b82 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Replays/PippidonAutoGenerator.cs @@ -14,7 +14,7 @@ public class PippidonAutoGenerator : AutoGenerator protected Replay Replay; protected List Frames => Replay.Frames; - public new Beatmap Beatmap => (Beatmap) base.Beatmap; + public new Beatmap Beatmap => (Beatmap)base.Beatmap; public PippidonAutoGenerator(IBeatmap beatmap) : base(beatmap) From cab8d950eddda54d3b199d9f942878d9d798e216 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 19 Sep 2019 11:25:41 +0900 Subject: [PATCH 4/5] Remove unnecessary reset method This is already done int he base score process --- .../Scoring/PippidonScoreProcessor.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs index 82ddc88..a8c8b4d 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Scoring/PippidonScoreProcessor.cs @@ -13,13 +13,5 @@ public PippidonScoreProcessor(DrawableRuleset ruleset) : base(ruleset) { } - - protected override void Reset(bool storeResults) - { - base.Reset(storeResults); - - Health.Value = 1; - Accuracy.Value = 1; - } } } From ce307eaf1002cfe12a505b692dadd3089dd1257c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 19 Sep 2019 11:27:55 +0900 Subject: [PATCH 5/5] Fix incorrect header --- .../TestSceneOsuGame.cs | 6 +++--- .../osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs | 4 ++-- .../Beatmaps/PippidonBeatmapConverter.cs | 2 +- .../TestSceneOsuGame.cs | 4 ++-- .../osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/templates/ruleset-empty/osu.Game.Rulesets.EmptyFreeformRuleset.Tests/TestSceneOsuGame.cs b/templates/ruleset-empty/osu.Game.Rulesets.EmptyFreeformRuleset.Tests/TestSceneOsuGame.cs index 2426ad8..10b02ca 100644 --- a/templates/ruleset-empty/osu.Game.Rulesets.EmptyFreeformRuleset.Tests/TestSceneOsuGame.cs +++ b/templates/ruleset-empty/osu.Game.Rulesets.EmptyFreeformRuleset.Tests/TestSceneOsuGame.cs @@ -1,5 +1,5 @@ -// Copyright (c) 2007-2019 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -29,4 +29,4 @@ private void load(GameHost host, OsuGameBase gameBase) }; } } -} \ No newline at end of file +} diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs index 1d71b40..270d906 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs @@ -1,5 +1,5 @@ -// Copyright (c) 2007-2019 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; diff --git a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs index 293ed5a..617f6af 100644 --- a/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs +++ b/templates/ruleset-example/osu.Game.Rulesets.Pippidon/Beatmaps/PippidonBeatmapConverter.cs @@ -5,8 +5,8 @@ using System.Collections.Generic; using osu.Game.Beatmaps; using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Pippidon.Objects; using osu.Game.Rulesets.Objects.Types; +using osu.Game.Rulesets.Pippidon.Objects; using osuTK; namespace osu.Game.Rulesets.Pippidon.Beatmaps diff --git a/templates/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/TestSceneOsuGame.cs b/templates/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/TestSceneOsuGame.cs index a83f463..aed6abb 100644 --- a/templates/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/TestSceneOsuGame.cs +++ b/templates/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/TestSceneOsuGame.cs @@ -1,5 +1,5 @@ -// Copyright (c) 2007-2019 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; diff --git a/templates/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs b/templates/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs index 1d71b40..270d906 100644 --- a/templates/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs +++ b/templates/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/TestSceneOsuGame.cs @@ -1,5 +1,5 @@ -// Copyright (c) 2007-2019 ppy Pty Ltd . -// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu-framework/master/LICENCE +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics;