Compare commits
274 Commits
2025.822.0
...
2025.913.0
| Author | SHA1 | Date | |
|---|---|---|---|
| d47e26f1ae | |||
| b0e5ae1109 | |||
| 47b859ab17 | |||
| 5e523eb0b1 | |||
|
|
d912f8c3b9 | ||
|
|
83c6e57984 | ||
|
|
1ea17129cc | ||
|
|
1f4f6ce4fe | ||
|
|
231b366e5e | ||
|
|
762fee91ed | ||
|
|
4d76c467f8 | ||
|
|
699892c6a2 | ||
|
|
fa6b830a13 | ||
|
|
278b232318 | ||
|
|
6660406ee9 | ||
|
|
482b7b6d3f | ||
|
|
c8c87089e5 | ||
|
|
b3abd09517 | ||
|
|
014b55602d | ||
|
|
0cd3894fa6 | ||
|
|
a6e42fb0cb | ||
|
|
2bd734918a | ||
|
|
6362fed097 | ||
|
|
16594f2986 | ||
|
|
68e7af0c02 | ||
|
|
caad065433 | ||
|
|
11696a7a3c | ||
|
|
f94d5004ea | ||
|
|
335bc6cdf6 | ||
|
|
eb24e02c38 | ||
|
|
06c1b81c1b | ||
|
|
35885a17b4 | ||
|
|
c2bc67d083 | ||
|
|
645518f5bd | ||
|
|
18b5c652a3 | ||
|
|
3c1c537b1b | ||
|
|
6af48975b0 | ||
|
|
058835440d | ||
|
|
ea79422b60 | ||
|
|
543d21a0ce | ||
|
|
ab7985f31e | ||
|
|
52c10a42be | ||
|
|
912c0a39cf | ||
|
|
45ef97c92c | ||
|
|
54d4b16a01 | ||
|
|
54a0c7af23 | ||
|
|
891b717b3d | ||
|
|
11e1c2d73f | ||
|
|
4475bcafa9 | ||
|
|
32576ff249 | ||
|
|
134f854d7b | ||
|
|
bae288859b | ||
|
|
6e5bf57fe7 | ||
|
|
0027b9846d | ||
|
|
1627f67ada | ||
|
|
ae0f9619b9 | ||
|
|
815bf9c37b | ||
|
|
b0c7b6c700 | ||
|
|
3fcc8d45cb | ||
|
|
f1d06f796a | ||
|
|
be365dfdc5 | ||
|
|
1c608e779d | ||
|
|
b2501ae58f | ||
|
|
23d10ccdeb | ||
|
|
98c3437174 | ||
|
|
a56f81a731 | ||
|
|
dac534e22a | ||
|
|
1ba403753c | ||
|
|
f1a020d2c6 | ||
|
|
15d73ce07e | ||
|
|
0bbad3e1cd | ||
|
|
4ec620c4a9 | ||
|
|
6ce76786ed | ||
|
|
b97cb65444 | ||
|
|
3e8775051e | ||
|
|
0ab3b593e7 | ||
|
|
71d0afd4c2 | ||
|
|
19d194476f | ||
|
|
546113451b | ||
|
|
4a7ee6fafc | ||
|
|
eb1263aa32 | ||
|
|
a840e55977 | ||
|
|
315eea8d9a | ||
|
|
aa847c5833 | ||
|
|
5c66998c57 | ||
|
|
51e7593446 | ||
|
|
6399f7e3db | ||
|
|
1e50e36a64 | ||
|
|
48e4844fbb | ||
|
|
566562240e | ||
|
|
19361666a1 | ||
|
|
dc5794dceb | ||
|
|
f414dd70f5 | ||
|
|
69bcef8339 | ||
|
|
c29217240e | ||
|
|
4a193e96e0 | ||
|
|
79f7f0ecad | ||
|
|
95c7252467 | ||
|
|
a1105ba16f | ||
|
|
bee6c32b83 | ||
|
|
6c82f543e6 | ||
|
|
4ed72efeae | ||
|
|
5c6bbfcc6a | ||
|
|
9354547e15 | ||
|
|
a799720232 | ||
|
|
89aea73495 | ||
|
|
1519084f72 | ||
|
|
677beb4251 | ||
|
|
a8ef57ad0a | ||
|
|
903d91b697 | ||
|
|
b0dcd06b38 | ||
|
|
9422fe52d1 | ||
|
|
f9e89afe03 | ||
|
|
cac136d3c6 | ||
|
|
63ab11ac16 | ||
|
|
a008a66fb2 | ||
|
|
eb392c47e9 | ||
|
|
ffb6ae2066 | ||
|
|
385529ec78 | ||
|
|
cf471066bf | ||
|
|
659480fa3f | ||
|
|
209ba76b21 | ||
|
|
5079a53cca | ||
|
|
060854f23a | ||
|
|
e2d661736e | ||
|
|
82a135af19 | ||
|
|
689cc27e68 | ||
|
|
da7e256302 | ||
|
|
9827f9f189 | ||
|
|
9d0043d03b | ||
|
|
0021434a62 | ||
|
|
677c008b4d | ||
|
|
12430ce464 | ||
|
|
5de7cc3efb | ||
|
|
4e976cff6a | ||
| 65f275106e | |||
|
|
c7f1210281 | ||
| 6e374762fd | |||
| 80646a166c | |||
|
|
b02093505d | ||
| 8f0510d903 | |||
| 02e7000ee4 | |||
|
|
08ad27459e | ||
|
|
2fb481e2ee | ||
|
|
d6b4c2958d | ||
|
|
c26e669fc5 | ||
| 081355864e | |||
| 6435a835d1 | |||
|
|
e621eed0ba | ||
|
|
4ffc262073 | ||
|
|
41b8033ebd | ||
|
|
1d9de88aaa | ||
|
|
a27fef2437 | ||
|
|
2b52c1de0b | ||
|
|
89492cbd81 | ||
|
|
1bb24c923d | ||
|
|
dfed564bda | ||
|
|
3cf0a9b9c0 | ||
|
|
107e103825 | ||
|
|
3f637db391 | ||
|
|
d4b357dfa0 | ||
|
|
e98579d3af | ||
|
|
a84c364e44 | ||
|
|
2ed79d354c | ||
|
|
d304a31757 | ||
|
|
3ca5e20e70 | ||
|
|
404044e8d7 | ||
|
|
d5575b4037 | ||
|
|
04ba5aa575 | ||
|
|
51ed19cb99 | ||
|
|
0a408a3ac4 | ||
|
|
22ba956f25 | ||
|
|
526ee32268 | ||
|
|
df6d6edaca | ||
|
|
24ec43b3b6 | ||
|
|
9e77a5b050 | ||
|
|
12832e9fef | ||
|
|
e83f3d5e77 | ||
|
|
f2f5cf19a2 | ||
|
|
bb9f9e4d35 | ||
|
|
6e1316241a | ||
|
|
3eaa5314ac | ||
|
|
6ba72fa481 | ||
|
|
8dd131f17e | ||
|
|
7e109add96 | ||
|
|
f953d58922 | ||
|
|
47164c61b4 | ||
|
|
311c75aa53 | ||
|
|
0b40f1d0db | ||
|
|
9ae6e509b7 | ||
|
|
b95573f97d | ||
|
|
e831d1b6fa | ||
|
|
ed15e1fb88 | ||
|
|
33b99a51b1 | ||
|
|
8a6c857719 | ||
|
|
5abd93eda7 | ||
|
|
4030383276 | ||
|
|
f9c1b24df4 | ||
|
|
197c318180 | ||
|
|
fda40d7fd5 | ||
|
|
be6fb9aa77 | ||
|
|
0e57ee9ba6 | ||
|
|
043235fed2 | ||
|
|
ec21685c25 | ||
| 628181a883 | |||
| 835329efd3 | |||
| 5399943118 | |||
| d07f82f6f4 | |||
|
|
244bad07c7 | ||
|
|
149f18c3f5 | ||
|
|
6a82b7331f | ||
|
|
65253708d8 | ||
|
|
556c2469bf | ||
|
|
f7b0e114a9 | ||
|
|
68677200f3 | ||
|
|
2bea59e65f | ||
|
|
c0fd5637de | ||
|
|
5e7a99c97f | ||
|
|
8f628d16ae | ||
|
|
2ccb65aa65 | ||
|
|
4d851f2527 | ||
|
|
4bafbfb9e4 | ||
|
|
3f179e3903 | ||
|
|
196b28115e | ||
|
|
7660a9ba8e | ||
|
|
e908b80359 | ||
|
|
a2bf8e3988 | ||
| 5b186bb740 | |||
|
|
6e8246b539 | ||
| 6cb99c13c2 | |||
|
|
3cca458c21 | ||
|
|
bc59270f3e | ||
| 96008e06ab | |||
| 590b0a8028 | |||
| 70f7f09a83 | |||
|
|
16343fd7d6 | ||
|
|
acafc06bcc | ||
|
|
c0c3690908 | ||
|
|
5292d4a04e | ||
|
|
d3ae20dd88 | ||
|
|
c852e5854c | ||
|
|
03e7e2b0d8 | ||
|
|
20b316d32d | ||
|
|
0756c45d70 | ||
|
|
73624e4e25 | ||
|
|
f374af7ce7 | ||
|
|
7530ad1a7b | ||
|
|
a049f5065d | ||
|
|
4627c8a859 | ||
|
|
a6f823e5bc | ||
|
|
30f7da8f71 | ||
|
|
4b8ff481fd | ||
|
|
a7f1795f98 | ||
|
|
c053cfbf9b | ||
|
|
e47a60f303 | ||
|
|
92016a7d9b | ||
|
|
41885c0fc0 | ||
|
|
e75a6b4010 | ||
|
|
ddce11fbc8 | ||
|
|
c894969d17 | ||
|
|
ad6c0c272d | ||
|
|
083365f332 | ||
|
|
62b4999184 | ||
|
|
bb5933ef80 | ||
|
|
62548244bc | ||
|
|
a393b3c6b1 | ||
|
|
a3443f76be | ||
|
|
d998847271 | ||
|
|
62803af1de | ||
|
|
1e2468d2bb | ||
|
|
cc7e60daab | ||
|
|
bb588566e6 | ||
|
|
cbab183ea1 | ||
|
|
b1e0cf8532 |
4
.github/workflows/ci.yml
vendored
@@ -148,9 +148,7 @@ jobs:
|
|||||||
# https://github.com/dotnet/macios/issues/19157
|
# https://github.com/dotnet/macios/issues/19157
|
||||||
# https://github.com/actions/runner-images/issues/12758
|
# https://github.com/actions/runner-images/issues/12758
|
||||||
- name: Use Xcode 16.4
|
- name: Use Xcode 16.4
|
||||||
run: |
|
run: sudo xcode-select -switch /Applications/Xcode_16.4.app
|
||||||
sudo xcode-select -switch /Applications/Xcode_16.4.app
|
|
||||||
xcodebuild -downloadPlatform iOS
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dotnet build -c Debug osu.iOS.slnf
|
run: dotnet build -c Debug osu.iOS.slnf
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"dotnet.defaultSolution": "osu.Desktop.slnf"
|
||||||
|
}
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
<PackageProjectUrl>https://github.com/ppy/osu</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/ppy/osu</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/ppy/osu</RepositoryUrl>
|
<RepositoryUrl>https://github.com/ppy/osu</RepositoryUrl>
|
||||||
<PackageReleaseNotes>Automated release.</PackageReleaseNotes>
|
<PackageReleaseNotes>Automated release.</PackageReleaseNotes>
|
||||||
<Company>ppy Pty Ltd</Company>
|
<Company>ppy Pty Ltd, jvnkosu! team</Company>
|
||||||
<Copyright>Copyright (c) 2025 ppy Pty Ltd</Copyright>
|
<Copyright>Copyright (c) 2025 ppy Pty Ltd</Copyright>
|
||||||
<PackageTags>osu game</PackageTags>
|
<PackageTags>osu game</PackageTags>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
149
README.md
@@ -1,147 +1,40 @@
|
|||||||
<p align="center">
|
# jvnkosu! client
|
||||||
<img width="500" alt="osu! logo" src="assets/lazer.png">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# osu!
|
A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!
|
||||||
|
|
||||||
[](https://github.com/ppy/osu/actions/workflows/ci.yml)
|
## Disclaimer
|
||||||
[](https://github.com/ppy/osu/releases/latest)
|
|
||||||
[](https://www.codefactor.io/repository/github/ppy/osu)
|
|
||||||
[](https://discord.gg/ppy)
|
|
||||||
[](https://crowdin.com/project/osu-web)
|
|
||||||
|
|
||||||
A free-to-win rhythm game. Rhythm is just a *click* away!
|
*osu!* is a registered trademark of ppy Pty Ltd.
|
||||||
|
jvnkosu! is not affiliated with, or endorsed by ppy Pty Ltd., but makes use of its open-source components and resources.
|
||||||
|
|
||||||
This is the future – and final – iteration of the [osu!](https://osu.ppy.sh) game client which marks the beginning of an open era! Currently known by and released under the release codename "*lazer*". As in sharper than cutting-edge.
|
## License
|
||||||
|
Client source code is licensed under the MIT license, see the [LICENCE](LICENCE) file in repository root for more info.
|
||||||
|
|
||||||
## Status
|
Game assets are included as a NuGet package and licensed under the CC BY-NC 4.0, which prohibits commercial use. See [ppy/osu-resources](https://github.com/ppy/osu-resources) for more info.
|
||||||
|
|
||||||
This project is under constant development, but we do our best to keep things in a stable state. Players are encouraged to install from a release alongside their stable *osu!* client. This project will continue to evolve until we eventually reach the point where most users prefer it over the previous "osu!stable" release.
|
Registered trademarks "osu!" and "ppy" are property of ppy Pty Ltd., and protected by trademark law.
|
||||||
|
|
||||||
A few resources are available as starting points to getting involved and understanding the project:
|
## Compiling from source
|
||||||
|
Building jvnkosu! from source is pretty much possible (and welcome here).
|
||||||
|
|
||||||
- Detailed release changelogs are available on the [official osu! site](https://osu.ppy.sh/home/changelog/lazer).
|
First, you must have a desktop platform with [.NET Core SDK 8](https://dotnet.microsoft.com/download) installed. Windows, Linux, macOS should work well. You can check if you have the SDK installed by running `dotnet --version` in your command prompt/terminal.
|
||||||
- You can learn more about our approach to [project management](https://github.com/ppy/osu/wiki/Project-management).
|
|
||||||
- Track our current efforts [towards improving the game](https://github.com/orgs/ppy/projects/7/views/6).
|
|
||||||
|
|
||||||
## Running osu!
|
Then, download the source code. You may download it as an archive and unzip it, but using [Git](https://git-scm.com/) instead is recommended:
|
||||||
|
```
|
||||||
If you are just looking to give the game a whirl, you can grab the latest release for your platform:
|
git clone https://gitea.jvnko.boats/jvnkosu/client
|
||||||
|
|
||||||
### Latest release:
|
|
||||||
|
|
||||||
| [Windows 10+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 12+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) |
|
|
||||||
|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- | ------------- | ------------- |
|
|
||||||
|
|
||||||
You can also generally download a version for your current device from the [osu! site](https://osu.ppy.sh/home/download).
|
|
||||||
|
|
||||||
If your platform is unsupported or not listed above, there is still a chance you can run the release or manually build it by following the instructions below.
|
|
||||||
|
|
||||||
**For iOS/iPadOS users**: The iOS testflight link fills up very fast (Apple has a hard limit of 10,000 users). We reset it occasionally. Please do not ask about this. Check back regularly for link resets or follow [peppy](https://twitter.com/ppy) on twitter for announcements. Our goal is to get the game on mobile app stores very soon so we don't have to live with this limitation.
|
|
||||||
|
|
||||||
## Developing a custom ruleset
|
|
||||||
|
|
||||||
osu! is designed to allow user-created gameplay variations, called "rulesets". Building one of these allows a developer to harness the power of the osu! beatmap library, game engine, and general UX for a new style of gameplay. To get started working on a ruleset, we have some templates available [here](https://github.com/ppy/osu/tree/master/Templates).
|
|
||||||
|
|
||||||
You can see some examples of custom rulesets by visiting the [custom ruleset directory](https://github.com/ppy/osu/discussions/13096).
|
|
||||||
|
|
||||||
## Developing osu!
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
Please make sure you have the following prerequisites:
|
|
||||||
|
|
||||||
- A desktop platform with the [.NET 8.0 SDK](https://dotnet.microsoft.com/download) installed.
|
|
||||||
|
|
||||||
When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/), or [Visual Studio Code](https://code.visualstudio.com/) with the [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) and [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) plugin installed.
|
|
||||||
|
|
||||||
### Downloading the source code
|
|
||||||
|
|
||||||
Clone the repository:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git clone https://github.com/ppy/osu
|
|
||||||
cd osu
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To update the source code to the latest commit, run the following command inside the `osu` directory:
|
|
||||||
|
|
||||||
```shell
|
To **run** the project, switch to project's directory and run the following:
|
||||||
git pull
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Building
|
|
||||||
|
|
||||||
#### From an IDE
|
|
||||||
|
|
||||||
You should load the solution via one of the platform-specific `.slnf` files, rather than the main `.sln`. This will reduce dependencies and hide platforms that you don't care about. Valid `.slnf` files are:
|
|
||||||
|
|
||||||
- `osu.Desktop.slnf` (most common)
|
|
||||||
- `osu.Android.slnf`
|
|
||||||
- `osu.iOS.slnf`
|
|
||||||
|
|
||||||
Run configurations for the recommended IDEs (listed above) are included. You should use the provided Build/Run functionality of your IDE to get things going. When testing or building new components, it's highly encouraged you use the `osu! (Tests)` project/configuration. More information on this is provided [below](#contributing).
|
|
||||||
|
|
||||||
To build for mobile platforms, you will likely need to run `sudo dotnet workload restore` if you haven't done so previously. This will install Android/iOS tooling required to complete the build.
|
|
||||||
|
|
||||||
#### From CLI
|
|
||||||
|
|
||||||
You can also build and run *osu!* from the command-line with a single command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
dotnet run --project osu.Desktop
|
dotnet run --project osu.Desktop
|
||||||
```
|
```
|
||||||
|
|
||||||
When running locally to do any kind of performance testing, make sure to add `-c Release` to the build command, as the overhead of running with the default `Debug` configuration can be large (especially when testing with local framework modifications as below).
|
To **compile**:
|
||||||
|
```
|
||||||
If the build fails, try to restore NuGet packages with `dotnet restore`.
|
dotnet build osu.Desktop
|
||||||
|
|
||||||
### Testing with resource/framework modifications
|
|
||||||
|
|
||||||
Sometimes it may be necessary to cross-test changes in [osu-resources](https://github.com/ppy/osu-resources) or [osu-framework](https://github.com/ppy/osu-framework). This can be quickly achieved using included commands:
|
|
||||||
|
|
||||||
Windows:
|
|
||||||
|
|
||||||
```ps
|
|
||||||
UseLocalFramework.ps1
|
|
||||||
UseLocalResources.ps1
|
|
||||||
```
|
```
|
||||||
|
|
||||||
macOS / Linux:
|
To reduce performance overhead in custom builds, it's recommended to build with the `-c Release` flag, that will use the release profile and remove possibly unneeded debugging code.
|
||||||
|
|
||||||
```ps
|
### See the [original readme](README.original.md) for more info.
|
||||||
UseLocalFramework.sh
|
|
||||||
UseLocalResources.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that these commands assume you have the relevant project(s) checked out in adjacent directories:
|
|
||||||
|
|
||||||
```
|
|
||||||
|- osu // this repository
|
|
||||||
|- osu-framework
|
|
||||||
|- osu-resources
|
|
||||||
```
|
|
||||||
|
|
||||||
### Code analysis
|
|
||||||
|
|
||||||
Before committing your code, please run a code formatter. This can be achieved by running `dotnet format` in the command line, or using the `Format code` command in your IDE.
|
|
||||||
|
|
||||||
We have adopted some cross-platform, compiler integrated analyzers. They can provide warnings when you are editing, building inside IDE or from command line, as-if they are provided by the compiler itself.
|
|
||||||
|
|
||||||
JetBrains ReSharper InspectCode is also used for wider rule sets. You can run it from PowerShell with `.\InspectCode.ps1`. Alternatively, you can install ReSharper or use Rider to get inline support in your IDE of choice.
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
When it comes to contributing to the project, the two main things you can do to help out are reporting issues and submitting pull requests. Please refer to the [contributing guidelines](CONTRIBUTING.md) to understand how to help in the most effective way possible.
|
|
||||||
|
|
||||||
If you wish to help with localisation efforts, head over to [crowdin](https://crowdin.com/project/osu-web).
|
|
||||||
|
|
||||||
We love to reward quality contributions. If you have made a large contribution, or are a regular contributor, you are welcome to [submit an expense via opencollective](https://opencollective.com/ppy/expenses/new). If you have any questions, feel free to [reach out to peppy](mailto:pe@ppy.sh) before doing so.
|
|
||||||
|
|
||||||
## Licence
|
|
||||||
|
|
||||||
*osu!*'s code and framework are licensed under the [MIT licence](https://opensource.org/licenses/MIT). Please see [the licence file](LICENCE) for more information. [tl;dr](https://tldrlegal.com/license/mit-license) you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source.
|
|
||||||
|
|
||||||
Please note that this *does not cover* the usage of the "osu!" or "ppy" branding in any software, resources, advertising or promotion, as this is protected by trademark law.
|
|
||||||
|
|
||||||
Please also note that game resources are covered by a separate licence. Please see the [ppy/osu-resources](https://github.com/ppy/osu-resources) repository for clarifications.
|
|
||||||
147
README.original.md
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<p align="center">
|
||||||
|
<img width="500" alt="osu! logo" src="assets/lazer.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# osu!
|
||||||
|
|
||||||
|
[](https://github.com/ppy/osu/actions/workflows/ci.yml)
|
||||||
|
[](https://github.com/ppy/osu/releases/latest)
|
||||||
|
[](https://www.codefactor.io/repository/github/ppy/osu)
|
||||||
|
[](https://discord.gg/ppy)
|
||||||
|
[](https://crowdin.com/project/osu-web)
|
||||||
|
|
||||||
|
A free-to-win rhythm game. Rhythm is just a *click* away!
|
||||||
|
|
||||||
|
This is the future – and final – iteration of the [osu!](https://osu.ppy.sh) game client which marks the beginning of an open era! Currently known by and released under the release codename "*lazer*". As in sharper than cutting-edge.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
This project is under constant development, but we do our best to keep things in a stable state. Players are encouraged to install from a release alongside their stable *osu!* client. This project will continue to evolve until we eventually reach the point where most users prefer it over the previous "osu!stable" release.
|
||||||
|
|
||||||
|
A few resources are available as starting points to getting involved and understanding the project:
|
||||||
|
|
||||||
|
- Detailed release changelogs are available on the [official osu! site](https://osu.ppy.sh/home/changelog/lazer).
|
||||||
|
- You can learn more about our approach to [project management](https://github.com/ppy/osu/wiki/Project-management).
|
||||||
|
- Track our current efforts [towards improving the game](https://github.com/orgs/ppy/projects/7/views/6).
|
||||||
|
|
||||||
|
## Running osu!
|
||||||
|
|
||||||
|
If you are just looking to give the game a whirl, you can grab the latest release for your platform:
|
||||||
|
|
||||||
|
### Latest release:
|
||||||
|
|
||||||
|
| [Windows 10+ (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | macOS 12+ ([Intel](https://github.com/ppy/osu/releases/latest/download/osu.app.Intel.zip), [Apple Silicon](https://github.com/ppy/osu/releases/latest/download/osu.app.Apple.Silicon.zip)) | [Linux (x64)](https://github.com/ppy/osu/releases/latest/download/osu.AppImage) | [iOS 13.4+](https://osu.ppy.sh/home/testflight) | [Android 5+](https://github.com/ppy/osu/releases/latest/download/sh.ppy.osulazer.apk) |
|
||||||
|
|--------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- | ------------- | ------------- |
|
||||||
|
|
||||||
|
You can also generally download a version for your current device from the [osu! site](https://osu.ppy.sh/home/download).
|
||||||
|
|
||||||
|
If your platform is unsupported or not listed above, there is still a chance you can run the release or manually build it by following the instructions below.
|
||||||
|
|
||||||
|
**For iOS/iPadOS users**: The iOS testflight link fills up very fast (Apple has a hard limit of 10,000 users). We reset it occasionally. Please do not ask about this. Check back regularly for link resets or follow [peppy](https://twitter.com/ppy) on twitter for announcements. Our goal is to get the game on mobile app stores very soon so we don't have to live with this limitation.
|
||||||
|
|
||||||
|
## Developing a custom ruleset
|
||||||
|
|
||||||
|
osu! is designed to allow user-created gameplay variations, called "rulesets". Building one of these allows a developer to harness the power of the osu! beatmap library, game engine, and general UX for a new style of gameplay. To get started working on a ruleset, we have some templates available [here](https://github.com/ppy/osu/tree/master/Templates).
|
||||||
|
|
||||||
|
You can see some examples of custom rulesets by visiting the [custom ruleset directory](https://github.com/ppy/osu/discussions/13096).
|
||||||
|
|
||||||
|
## Developing osu!
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
Please make sure you have the following prerequisites:
|
||||||
|
|
||||||
|
- A desktop platform with the [.NET 8.0 SDK](https://dotnet.microsoft.com/download) installed.
|
||||||
|
|
||||||
|
When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as the latest version of [Visual Studio](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/), or [Visual Studio Code](https://code.visualstudio.com/) with the [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) and [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) plugin installed.
|
||||||
|
|
||||||
|
### Downloading the source code
|
||||||
|
|
||||||
|
Clone the repository:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://github.com/ppy/osu
|
||||||
|
cd osu
|
||||||
|
```
|
||||||
|
|
||||||
|
To update the source code to the latest commit, run the following command inside the `osu` directory:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building
|
||||||
|
|
||||||
|
#### From an IDE
|
||||||
|
|
||||||
|
You should load the solution via one of the platform-specific `.slnf` files, rather than the main `.sln`. This will reduce dependencies and hide platforms that you don't care about. Valid `.slnf` files are:
|
||||||
|
|
||||||
|
- `osu.Desktop.slnf` (most common)
|
||||||
|
- `osu.Android.slnf`
|
||||||
|
- `osu.iOS.slnf`
|
||||||
|
|
||||||
|
Run configurations for the recommended IDEs (listed above) are included. You should use the provided Build/Run functionality of your IDE to get things going. When testing or building new components, it's highly encouraged you use the `osu! (Tests)` project/configuration. More information on this is provided [below](#contributing).
|
||||||
|
|
||||||
|
To build for mobile platforms, you will likely need to run `sudo dotnet workload restore` if you haven't done so previously. This will install Android/iOS tooling required to complete the build.
|
||||||
|
|
||||||
|
#### From CLI
|
||||||
|
|
||||||
|
You can also build and run *osu!* from the command-line with a single command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dotnet run --project osu.Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
When running locally to do any kind of performance testing, make sure to add `-c Release` to the build command, as the overhead of running with the default `Debug` configuration can be large (especially when testing with local framework modifications as below).
|
||||||
|
|
||||||
|
If the build fails, try to restore NuGet packages with `dotnet restore`.
|
||||||
|
|
||||||
|
### Testing with resource/framework modifications
|
||||||
|
|
||||||
|
Sometimes it may be necessary to cross-test changes in [osu-resources](https://github.com/ppy/osu-resources) or [osu-framework](https://github.com/ppy/osu-framework). This can be quickly achieved using included commands:
|
||||||
|
|
||||||
|
Windows:
|
||||||
|
|
||||||
|
```ps
|
||||||
|
UseLocalFramework.ps1
|
||||||
|
UseLocalResources.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
macOS / Linux:
|
||||||
|
|
||||||
|
```ps
|
||||||
|
UseLocalFramework.sh
|
||||||
|
UseLocalResources.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that these commands assume you have the relevant project(s) checked out in adjacent directories:
|
||||||
|
|
||||||
|
```
|
||||||
|
|- osu // this repository
|
||||||
|
|- osu-framework
|
||||||
|
|- osu-resources
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code analysis
|
||||||
|
|
||||||
|
Before committing your code, please run a code formatter. This can be achieved by running `dotnet format` in the command line, or using the `Format code` command in your IDE.
|
||||||
|
|
||||||
|
We have adopted some cross-platform, compiler integrated analyzers. They can provide warnings when you are editing, building inside IDE or from command line, as-if they are provided by the compiler itself.
|
||||||
|
|
||||||
|
JetBrains ReSharper InspectCode is also used for wider rule sets. You can run it from PowerShell with `.\InspectCode.ps1`. Alternatively, you can install ReSharper or use Rider to get inline support in your IDE of choice.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
When it comes to contributing to the project, the two main things you can do to help out are reporting issues and submitting pull requests. Please refer to the [contributing guidelines](CONTRIBUTING.md) to understand how to help in the most effective way possible.
|
||||||
|
|
||||||
|
If you wish to help with localisation efforts, head over to [crowdin](https://crowdin.com/project/osu-web).
|
||||||
|
|
||||||
|
We love to reward quality contributions. If you have made a large contribution, or are a regular contributor, you are welcome to [submit an expense via opencollective](https://opencollective.com/ppy/expenses/new). If you have any questions, feel free to [reach out to peppy](mailto:pe@ppy.sh) before doing so.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
*osu!*'s code and framework are licensed under the [MIT licence](https://opensource.org/licenses/MIT). Please see [the licence file](LICENCE) for more information. [tl;dr](https://tldrlegal.com/license/mit-license) you can do whatever you want as long as you include the original copyright and license notice in any copy of the software/source.
|
||||||
|
|
||||||
|
Please note that this *does not cover* the usage of the "osu!" or "ppy" branding in any software, resources, advertising or promotion, as this is protected by trademark law.
|
||||||
|
|
||||||
|
Please also note that game resources are covered by a separate licence. Please see the [ppy/osu-resources](https://github.com/ppy/osu-resources) repository for clarifications.
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
|
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.808.0" />
|
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.908.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- Fody does not handle Android build well, and warns when unchanged.
|
<!-- Fody does not handle Android build well, and warns when unchanged.
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
<Description>A free-to-win rhythm game. Rhythm is just a *click* away!</Description>
|
<Description>A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!</Description>
|
||||||
<AssemblyName>osu!</AssemblyName>
|
<AssemblyName>osu!</AssemblyName>
|
||||||
<AssemblyTitle>osu!(lazer)</AssemblyTitle>
|
<AssemblyTitle>jvnkosu!</AssemblyTitle>
|
||||||
<Title>osu!</Title>
|
<Title>jvnkosu!</Title>
|
||||||
<Product>osu!(lazer)</Product>
|
<Product>jvnkosu!</Product>
|
||||||
<ApplicationIcon>lazer.ico</ApplicationIcon>
|
<ApplicationIcon>lazer.ico</ApplicationIcon>
|
||||||
<Version>0.0.0</Version>
|
<Version>0.0.0</Version>
|
||||||
<FileVersion>0.0.0</FileVersion>
|
<FileVersion>0.0.0</FileVersion>
|
||||||
|
|||||||
@@ -3,16 +3,19 @@
|
|||||||
<metadata>
|
<metadata>
|
||||||
<id>osulazer</id>
|
<id>osulazer</id>
|
||||||
<version>0.0.0</version>
|
<version>0.0.0</version>
|
||||||
<title>osu!</title>
|
<title>jvnkosu!</title>
|
||||||
<authors>ppy Pty Ltd</authors>
|
<authors>ppy Pty Ltd., jvnkosu! team</authors>
|
||||||
<owners>Dean Herbert</owners>
|
<owners>Dean Herbert</owners>
|
||||||
<projectUrl>https://osu.ppy.sh/</projectUrl>
|
<projectUrl>https://osu.jvnko.boats/</projectUrl>
|
||||||
<iconUrl>https://github.com/ppy/osu/blob/master/assets/lazer-nuget.png?raw=true</iconUrl>
|
<iconUrl>https://github.com/ppy/osu/blob/master/assets/lazer-nuget.png?raw=true</iconUrl>
|
||||||
<icon>icon.png</icon>
|
<icon>icon.png</icon>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<description>A free-to-win rhythm game. Rhythm is just a *click* away!</description>
|
<description>A free-to-win rhythm game based on osu!(lazer). Click is just a *rhythm* away!</description>
|
||||||
<releaseNotes>testing</releaseNotes>
|
<releaseNotes>testing</releaseNotes>
|
||||||
<copyright>Copyright (c) 2025 ppy Pty Ltd</copyright>
|
<copyright>
|
||||||
|
Copyright (c) 2025 ppy Pty Ltd
|
||||||
|
Copyright (c) 2025 jvnkosu! team
|
||||||
|
</copyright>
|
||||||
<language>en-AU</language>
|
<language>en-AU</language>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -1,2 +0,0 @@
|
|||||||
[General]
|
|
||||||
// no version specified means v1
|
|
||||||
@@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.Catch.Mods
|
|||||||
|
|
||||||
public override BindableBool ComboBasedSize { get; } = new BindableBool(true);
|
public override BindableBool ComboBasedSize { get; } = new BindableBool(true);
|
||||||
|
|
||||||
public override float DefaultFlashlightSize => 325;
|
public override float DefaultFlashlightSize => 203.125f;
|
||||||
|
|
||||||
protected override Flashlight CreateFlashlight() => new CatchFlashlight(this, playfield);
|
protected override Flashlight CreateFlashlight() => new CatchFlashlight(this, playfield);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
@@ -16,7 +17,7 @@ namespace osu.Game.Rulesets.Catch.Mods
|
|||||||
public override string Acronym => "FF";
|
public override string Acronym => "FF";
|
||||||
public override LocalisableString Description => "The fruits are... floating?";
|
public override LocalisableString Description => "The fruits are... floating?";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override IconUsage? Icon => FontAwesome.Solid.Cloud;
|
public override IconUsage? Icon => OsuIcon.ModFloatingFruits;
|
||||||
|
|
||||||
public void ApplyToDrawableRuleset(DrawableRuleset<CatchHitObject> drawableRuleset)
|
public void ApplyToDrawableRuleset(DrawableRuleset<CatchHitObject> drawableRuleset)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
using osu.Game.Rulesets.Catch.Objects;
|
||||||
using osu.Game.Rulesets.Catch.UI;
|
using osu.Game.Rulesets.Catch.UI;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Catch.Mods
|
|||||||
public override LocalisableString Description => "Dashing by default, slow down!";
|
public override LocalisableString Description => "Dashing by default, slow down!";
|
||||||
public override ModType Type => ModType.Fun;
|
public override ModType Type => ModType.Fun;
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override IconUsage? Icon => FontAwesome.Solid.Running;
|
public override IconUsage? Icon => OsuIcon.ModMovingFast;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax) };
|
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax) };
|
||||||
|
|
||||||
private DrawableCatchRuleset drawableRuleset = null!;
|
private DrawableCatchRuleset drawableRuleset = null!;
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[TestCase]
|
[TestCase]
|
||||||
public void TestFilterIntersection()
|
public void TestKeysFilterIntersection()
|
||||||
{
|
{
|
||||||
var criteria = new ManiaFilterCriteria();
|
var criteria = new ManiaFilterCriteria();
|
||||||
criteria.TryParseCustomKeywordCriteria("keys", Operator.Greater, "4");
|
criteria.TryParseCustomKeywordCriteria("keys", Operator.Greater, "4");
|
||||||
@@ -175,7 +175,7 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[TestCase]
|
[TestCase]
|
||||||
public void TestInvalidFilters()
|
public void TestInvalidKeysFilters()
|
||||||
{
|
{
|
||||||
var criteria = new ManiaFilterCriteria();
|
var criteria = new ManiaFilterCriteria();
|
||||||
|
|
||||||
@@ -183,5 +183,132 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.NotEqual, "4,some text"));
|
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.NotEqual, "4,some text"));
|
||||||
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.GreaterOrEqual, "4,5,6"));
|
Assert.False(criteria.TryParseCustomKeywordCriteria("keys", Operator.GreaterOrEqual, "4,5,6"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase]
|
||||||
|
public void TestLnsEqual()
|
||||||
|
{
|
||||||
|
var criteria = new ManiaFilterCriteria();
|
||||||
|
var filterCriteria = new FilterCriteria
|
||||||
|
{
|
||||||
|
Ruleset = new ManiaRuleset().RulesetInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0");
|
||||||
|
BeatmapInfo beatmapInfo1 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 0,
|
||||||
|
EndTimeObjectCount = 0
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo1, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0");
|
||||||
|
BeatmapInfo beatmapInfo2 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 0
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo2, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "100");
|
||||||
|
BeatmapInfo beatmapInfo3 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 100
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo3, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "1");
|
||||||
|
BeatmapInfo beatmapInfo4 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 1
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo4, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "0.1");
|
||||||
|
BeatmapInfo beatmapInfo5 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 1000,
|
||||||
|
EndTimeObjectCount = 1
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo5, filterCriteria));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase]
|
||||||
|
public void TestLnsGreaterOrEqual()
|
||||||
|
{
|
||||||
|
var criteria = new ManiaFilterCriteria();
|
||||||
|
var filterCriteria = new FilterCriteria
|
||||||
|
{
|
||||||
|
Ruleset = new ManiaRuleset().RulesetInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0");
|
||||||
|
BeatmapInfo beatmapInfo1 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 0,
|
||||||
|
EndTimeObjectCount = 0
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo1, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0");
|
||||||
|
BeatmapInfo beatmapInfo2 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 0
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo2, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "100");
|
||||||
|
BeatmapInfo beatmapInfo3 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 100
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo3, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "1");
|
||||||
|
BeatmapInfo beatmapInfo4 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 1
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo4, filterCriteria));
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "0.1");
|
||||||
|
BeatmapInfo beatmapInfo5 = new BeatmapInfo(new ManiaRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
TotalObjectCount = 1000,
|
||||||
|
EndTimeObjectCount = 1
|
||||||
|
};
|
||||||
|
Assert.True(criteria.Matches(beatmapInfo5, filterCriteria));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase]
|
||||||
|
public void TestLnsNotManiaRuleset()
|
||||||
|
{
|
||||||
|
var criteria = new ManiaFilterCriteria();
|
||||||
|
var filterCriteria = new FilterCriteria
|
||||||
|
{
|
||||||
|
Ruleset = new ManiaRuleset().RulesetInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
criteria.TryParseCustomKeywordCriteria("lns", Operator.LessOrEqual, "100");
|
||||||
|
BeatmapInfo beatmapInfo = new BeatmapInfo
|
||||||
|
{
|
||||||
|
TotalObjectCount = 100,
|
||||||
|
EndTimeObjectCount = 50
|
||||||
|
};
|
||||||
|
Assert.False(criteria.Matches(beatmapInfo, filterCriteria));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase]
|
||||||
|
public void TestInvalidLnsFilters()
|
||||||
|
{
|
||||||
|
var criteria = new ManiaFilterCriteria();
|
||||||
|
|
||||||
|
Assert.False(criteria.TryParseCustomKeywordCriteria("lns", Operator.Equal, "some text"));
|
||||||
|
Assert.False(criteria.TryParseCustomKeywordCriteria("lns", Operator.GreaterOrEqual, "1some text"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
@@ -19,12 +20,16 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
public class ManiaFilterCriteria : IRulesetFilterCriteria
|
public class ManiaFilterCriteria : IRulesetFilterCriteria
|
||||||
{
|
{
|
||||||
private readonly HashSet<int> includedKeyCounts = Enumerable.Range(1, LegacyBeatmapDecoder.MAX_MANIA_KEY_COUNT).ToHashSet();
|
private readonly HashSet<int> includedKeyCounts = Enumerable.Range(1, LegacyBeatmapDecoder.MAX_MANIA_KEY_COUNT).ToHashSet();
|
||||||
|
private FilterCriteria.OptionalRange<float> longNotePercentage;
|
||||||
|
|
||||||
public bool Matches(BeatmapInfo beatmapInfo, FilterCriteria criteria)
|
public bool Matches(BeatmapInfo beatmapInfo, FilterCriteria criteria)
|
||||||
{
|
{
|
||||||
int keyCount = ManiaBeatmapConverter.GetColumnCount(LegacyBeatmapConversionDifficultyInfo.FromBeatmapInfo(beatmapInfo), criteria.Mods);
|
int keyCount = ManiaBeatmapConverter.GetColumnCount(LegacyBeatmapConversionDifficultyInfo.FromBeatmapInfo(beatmapInfo), criteria.Mods);
|
||||||
|
|
||||||
return includedKeyCounts.Contains(keyCount);
|
bool keyCountMatch = includedKeyCounts.Contains(keyCount);
|
||||||
|
bool longNotePercentageMatch = !longNotePercentage.HasFilter || (!isConvertedBeatmap(beatmapInfo) && longNotePercentage.IsInRange(calculateLongNotePercentage(beatmapInfo)));
|
||||||
|
|
||||||
|
return keyCountMatch && longNotePercentageMatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryParseCustomKeywordCriteria(string key, Operator op, string strValues)
|
public bool TryParseCustomKeywordCriteria(string key, Operator op, string strValues)
|
||||||
@@ -84,6 +89,10 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "ln":
|
||||||
|
case "lns":
|
||||||
|
return FilterQueryParser.TryUpdateCriteriaRange(ref longNotePercentage, op, strValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -103,5 +112,18 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool isConvertedBeatmap(BeatmapInfo beatmapInfo)
|
||||||
|
{
|
||||||
|
return !beatmapInfo.Ruleset.Equals(new ManiaRuleset().RulesetInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static float calculateLongNotePercentage(BeatmapInfo beatmapInfo)
|
||||||
|
{
|
||||||
|
int holdNotes = beatmapInfo.EndTimeObjectCount;
|
||||||
|
int totalNotes = Math.Max(1, beatmapInfo.TotalObjectCount);
|
||||||
|
|
||||||
|
return holdNotes / (float)totalNotes * 100;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
return new ManiaArgonSkinTransformer(skin, beatmap);
|
return new ManiaArgonSkinTransformer(skin, beatmap);
|
||||||
|
|
||||||
case DefaultLegacySkin:
|
case DefaultLegacySkin:
|
||||||
|
case RetroSkin:
|
||||||
return new ManiaClassicSkinTransformer(skin, beatmap);
|
return new ManiaClassicSkinTransformer(skin, beatmap);
|
||||||
|
|
||||||
case LegacySkin:
|
case LegacySkin:
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Mania.UI;
|
using osu.Game.Rulesets.Mania.UI;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
@@ -21,7 +22,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
|
|
||||||
public override LocalisableString Description => "No more tricky speed changes!";
|
public override LocalisableString Description => "No more tricky speed changes!";
|
||||||
|
|
||||||
public override IconUsage? Icon => FontAwesome.Solid.Equals;
|
public override IconUsage? Icon => OsuIcon.ModConstantSpeed;
|
||||||
|
|
||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.UI;
|
using osu.Game.Rulesets.Mania.UI;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
@@ -14,6 +16,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
{
|
{
|
||||||
public override string Name => "Cover";
|
public override string Name => "Cover";
|
||||||
public override string Acronym => "CO";
|
public override string Acronym => "CO";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModCover;
|
||||||
|
|
||||||
public override LocalisableString Description => @"Decrease the playfield's viewing area.";
|
public override LocalisableString Description => @"Decrease the playfield's viewing area.";
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
|
|
||||||
@@ -13,6 +15,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override string Name => "Dual Stages";
|
public override string Name => "Dual Stages";
|
||||||
public override string Acronym => "DS";
|
public override string Acronym => "DS";
|
||||||
public override LocalisableString Description => @"Double the stages, double the fun!";
|
public override LocalisableString Description => @"Double the stages, double the fun!";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModDualStages;
|
||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.UI;
|
using osu.Game.Rulesets.Mania.UI;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
@@ -12,6 +14,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
{
|
{
|
||||||
public override string Name => "Fade In";
|
public override string Name => "Fade In";
|
||||||
public override string Acronym => "FI";
|
public override string Acronym => "FI";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModFadeIn;
|
||||||
public override LocalisableString Description => @"Keys appear out of nowhere!";
|
public override LocalisableString Description => @"Keys appear out of nowhere!";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override bool ValidForFreestyleAsRequiredMod => false;
|
public override bool ValidForFreestyleAsRequiredMod => false;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Mods;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
|
|
||||||
public override LocalisableString Description => @"Replaces all hold notes with normal notes.";
|
public override LocalisableString Description => @"Replaces all hold notes with normal notes.";
|
||||||
|
|
||||||
public override IconUsage? Icon => FontAwesome.Solid.DotCircle;
|
public override IconUsage? Icon => OsuIcon.ModHoldOff;
|
||||||
|
|
||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Audio;
|
using osu.Game.Audio;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
@@ -23,7 +24,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
|
|
||||||
public override LocalisableString Description => "Hold the keys. To the beat.";
|
public override LocalisableString Description => "Hold the keys. To the beat.";
|
||||||
|
|
||||||
public override IconUsage? Icon => FontAwesome.Solid.YinYang;
|
public override IconUsage? Icon => OsuIcon.ModInvert;
|
||||||
|
|
||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 1;
|
public override int KeyCount => 1;
|
||||||
public override string Name => "One Key";
|
public override string Name => "One Key";
|
||||||
public override string Acronym => "1K";
|
public override string Acronym => "1K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModOneKey;
|
||||||
public override LocalisableString Description => @"Play with one key.";
|
public override LocalisableString Description => @"Play with one key.";
|
||||||
public override bool Ranked => false;
|
public override bool Ranked => false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 10;
|
public override int KeyCount => 10;
|
||||||
public override string Name => "Ten Keys";
|
public override string Name => "Ten Keys";
|
||||||
public override string Acronym => "10K";
|
public override string Acronym => "10K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModTenKeys;
|
||||||
public override LocalisableString Description => @"Play with ten keys.";
|
public override LocalisableString Description => @"Play with ten keys.";
|
||||||
public override bool Ranked => false;
|
public override bool Ranked => false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 2;
|
public override int KeyCount => 2;
|
||||||
public override string Name => "Two Keys";
|
public override string Name => "Two Keys";
|
||||||
public override string Acronym => "2K";
|
public override string Acronym => "2K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModTwoKeys;
|
||||||
public override LocalisableString Description => @"Play with two keys.";
|
public override LocalisableString Description => @"Play with two keys.";
|
||||||
public override bool Ranked => false;
|
public override bool Ranked => false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 3;
|
public override int KeyCount => 3;
|
||||||
public override string Name => "Three Keys";
|
public override string Name => "Three Keys";
|
||||||
public override string Acronym => "3K";
|
public override string Acronym => "3K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModThreeKeys;
|
||||||
public override LocalisableString Description => @"Play with three keys.";
|
public override LocalisableString Description => @"Play with three keys.";
|
||||||
public override bool Ranked => false;
|
public override bool Ranked => false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 4;
|
public override int KeyCount => 4;
|
||||||
public override string Name => "Four Keys";
|
public override string Name => "Four Keys";
|
||||||
public override string Acronym => "4K";
|
public override string Acronym => "4K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModFourKeys;
|
||||||
public override LocalisableString Description => @"Play with four keys.";
|
public override LocalisableString Description => @"Play with four keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 5;
|
public override int KeyCount => 5;
|
||||||
public override string Name => "Five Keys";
|
public override string Name => "Five Keys";
|
||||||
public override string Acronym => "5K";
|
public override string Acronym => "5K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModFiveKeys;
|
||||||
public override LocalisableString Description => @"Play with five keys.";
|
public override LocalisableString Description => @"Play with five keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 6;
|
public override int KeyCount => 6;
|
||||||
public override string Name => "Six Keys";
|
public override string Name => "Six Keys";
|
||||||
public override string Acronym => "6K";
|
public override string Acronym => "6K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModSixKeys;
|
||||||
public override LocalisableString Description => @"Play with six keys.";
|
public override LocalisableString Description => @"Play with six keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 7;
|
public override int KeyCount => 7;
|
||||||
public override string Name => "Seven Keys";
|
public override string Name => "Seven Keys";
|
||||||
public override string Acronym => "7K";
|
public override string Acronym => "7K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModSevenKeys;
|
||||||
public override LocalisableString Description => @"Play with seven keys.";
|
public override LocalisableString Description => @"Play with seven keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 8;
|
public override int KeyCount => 8;
|
||||||
public override string Name => "Eight Keys";
|
public override string Name => "Eight Keys";
|
||||||
public override string Acronym => "8K";
|
public override string Acronym => "8K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModEightKeys;
|
||||||
public override LocalisableString Description => @"Play with eight keys.";
|
public override LocalisableString Description => @"Play with eight keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
@@ -10,6 +12,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override int KeyCount => 9;
|
public override int KeyCount => 9;
|
||||||
public override string Name => "Nine Keys";
|
public override string Name => "Nine Keys";
|
||||||
public override string Acronym => "9K";
|
public override string Acronym => "9K";
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModNineKeys;
|
||||||
public override LocalisableString Description => @"Play with nine keys.";
|
public override LocalisableString Description => @"Play with nine keys.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
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;
|
||||||
@@ -26,6 +28,8 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
|
|
||||||
public override double ScoreMultiplier => 0.9;
|
public override double ScoreMultiplier => 0.9;
|
||||||
|
|
||||||
|
public override IconUsage? Icon => OsuIcon.ModNoRelease;
|
||||||
|
|
||||||
public override ModType Type => ModType.DifficultyReduction;
|
public override ModType Type => ModType.DifficultyReduction;
|
||||||
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ManiaModHoldOff) };
|
public override Type[] IncompatibleMods => new[] { typeof(ManiaModHoldOff) };
|
||||||
|
|||||||
@@ -42,13 +42,22 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
var bindings = new List<KeyBinding>();
|
var bindings = new List<KeyBinding>();
|
||||||
|
|
||||||
for (int i = LeftKeys.Length - columns / 2; i < LeftKeys.Length; i++)
|
for (int i = LeftKeys.Length - columns / 2; i < LeftKeys.Length; i++)
|
||||||
bindings.Add(new KeyBinding(LeftKeys[i], currentAction++));
|
{
|
||||||
|
bindings.Add(new KeyBinding(LeftKeys[i], currentAction));
|
||||||
|
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||||
|
}
|
||||||
|
|
||||||
if (columns % 2 == 1)
|
if (columns % 2 == 1)
|
||||||
bindings.Add(new KeyBinding(SpecialKey, currentAction++));
|
{
|
||||||
|
bindings.Add(new KeyBinding(SpecialKey, currentAction));
|
||||||
|
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < columns / 2; i++)
|
for (int i = 0; i < columns / 2; i++)
|
||||||
bindings.Add(new KeyBinding(RightKeys[i], currentAction++));
|
{
|
||||||
|
bindings.Add(new KeyBinding(RightKeys[i], currentAction));
|
||||||
|
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||||
|
}
|
||||||
|
|
||||||
return bindings;
|
return bindings;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,26 +32,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestComboBasedSize([Values] bool comboBasedSize) => CreateModTest(new ModTestData { Mod = new OsuModFlashlight { ComboBasedSize = { Value = comboBasedSize } }, PassCondition = () => true });
|
public void TestComboBasedSize([Values] bool comboBasedSize) => CreateModTest(new ModTestData { Mod = new OsuModFlashlight { ComboBasedSize = { Value = comboBasedSize } }, PassCondition = () => true });
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void TestPlayfieldBasedSize()
|
|
||||||
{
|
|
||||||
OsuModFlashlight flashlight;
|
|
||||||
CreateModTest(new ModTestData
|
|
||||||
{
|
|
||||||
Mods = [flashlight = new OsuModFlashlight(), new OsuModBarrelRoll()],
|
|
||||||
PassCondition = () =>
|
|
||||||
{
|
|
||||||
var flashlightOverlay = Player.DrawableRuleset.Overlays
|
|
||||||
.ChildrenOfType<ModFlashlight<OsuHitObject>.Flashlight>()
|
|
||||||
.First();
|
|
||||||
|
|
||||||
// the combo check is here because the flashlight radius decreases for the first time at 100 combo
|
|
||||||
// and hardcoding it here eliminates the need to meddle in flashlight internals further by e.g. exposing `GetComboScaleFor()`
|
|
||||||
return flashlightOverlay.GetSize() < flashlight.DefaultFlashlightSize && Player.GameplayState.ScoreProcessor.Combo.Value < 100;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestSliderDimsOnlyAfterStartTime()
|
public void TestSliderDimsOnlyAfterStartTime()
|
||||||
{
|
{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 865 B |
|
Before Width: | Height: | Size: 771 B |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,6 +0,0 @@
|
|||||||
[General]
|
|
||||||
// no version specified means v1
|
|
||||||
|
|
||||||
[Fonts]
|
|
||||||
HitCircleOverlap: 3
|
|
||||||
ScoreOverlap: 3
|
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 26 KiB |