Skip to content
Merged
Show file tree
Hide file tree
Changes from 47 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
b08a86f
Remove left over DI usage
peppy Apr 5, 2026
9a56aed
Add current stage overlay to ranked play (#37202)
LiquidPL Apr 5, 2026
dfeb9d8
Remove unused lookup component
peppy Apr 5, 2026
db92681
Ignore one more false positive rider issue
peppy Apr 6, 2026
809298d
Turn tests green, for a short while, maybe (#37218)
bdach Apr 6, 2026
0f40d61
Fix skin editor origin dropdown options applying origin in wrong coor…
bdach Apr 6, 2026
ea0c04a
Ranked Play: fix cards not going all the way off-screen (#37222)
minetoblend Apr 6, 2026
e80e5f3
Ranked play general UI/UX fixes (#37220)
peppy Apr 7, 2026
a3a530c
Add method for silently dismissing progress notifications without com…
peppy Apr 7, 2026
c570db6
Add ability to search for users (#37225)
peppy Apr 7, 2026
84cce2f
Improve efficiency of tag population (#37228)
peppy Apr 7, 2026
ed84dd4
Tidy up track switching handling (#37230)
peppy Apr 7, 2026
97ddc8e
Fix footer buttons still being able to fire their action when tempora…
bdach Apr 7, 2026
2058297
Localise tabs on `DashboardOverlay` (#37236)
diquoks Apr 8, 2026
8c6818e
Add models for improvements to matchmaking lobby (#37226)
smoogipoo Apr 8, 2026
ca44d82
Do not send replay frames to spectator server if initial begin play i…
bdach Apr 8, 2026
b838564
Make `RankedPlayColourScheme` properly static (#37244)
peppy Apr 9, 2026
93b7c33
Add matchmaking profile badge (#37241)
smoogipoo Apr 9, 2026
9c43739
Improvements to discard screen UX (#37245)
peppy Apr 10, 2026
4b8fa89
Tidy up `ResultsScreen` (#37242)
peppy Apr 10, 2026
3e62330
Update editor icons (#37201)
LiquidPL Apr 10, 2026
6231e06
Fix lack of encode-decode stability when writing out mania beatmaps w…
bdach Apr 10, 2026
e36f9b2
Add more ranked play SFX (#37258)
nekodex Apr 11, 2026
bcc36b4
Fix missing null check
smoogipoo Apr 12, 2026
0e9664b
Fix multiple issues with ranked play card audio previews (#37262)
peppy Apr 12, 2026
ac620ee
Add additional information to the matchmaking queue screen (#37229)
smoogipoo Apr 14, 2026
16a2a96
Add bottom 'ornament' overlay to ranked play (#37288)
LiquidPL Apr 14, 2026
ca40749
Ranked Play: Fix chat temporarily appearing during intro (#37294)
smoogipoo Apr 14, 2026
daff79b
Ranked Play: Fix stutter when entering queue screen (#37295)
smoogipoo Apr 14, 2026
7c114cd
Update CodeFileSanity (#37293)
smoogipoo Apr 14, 2026
16882c6
Fix `KeyboardStep` precision in Accuracy Challenge (#37299)
diquoks Apr 15, 2026
4fd4544
Replicate osu!web logic in display of matchmaking badge (#37303)
smoogipoo Apr 15, 2026
bcf3712
Safeguard rating distribution graph against null InputManager (#37304)
smoogipoo Apr 15, 2026
8050ee3
Add support for grouping by keys in song select for osu!mania (#37285)
bdach Apr 15, 2026
e6a74fd
Ranked Play: Work around rating data not always including user (#37310)
smoogipoo Apr 16, 2026
96513ce
Add note on AI usage in contributions
peppy Apr 16, 2026
c2ed2f7
Update framework (#37315)
peppy Apr 16, 2026
9ac1ad2
Reduce log spam from spectator client when playing offline (#37316)
bdach Apr 16, 2026
964d3fb
Avoid moving auth files during storage migration
smoogipoo Apr 17, 2026
cb843b1
Limit maximum password length for multiplayer lobbies to conformant v…
peppy Apr 17, 2026
9bea319
Fix failing test
smoogipoo Apr 17, 2026
b36f8f9
Avoid recomputing full path vertices in `SliderPath` when possible (#…
EVAST9919 Apr 17, 2026
9189f36
Merge upstream ppy/osu master (42 commits: framework v2026.416.0, ran…
Copilot Apr 17, 2026
9fd3008
Fix APK signing: narrow FixRuntimePackAssetTypes to .so files only, a…
Copilot Apr 17, 2026
cb6202b
Optimize APK size: arm64-only, remove extractNativeLibs=false, add An…
Copilot Apr 17, 2026
9b8de5a
Fix all CI errors: remove unused SliderPath.optimiseCatmull, fix IDE0…
Copilot Apr 17, 2026
c01a9e8
Fix license header placement in OboeAudioBridge.cs and OsuGameActivit…
Copilot Apr 17, 2026
5b9faf6
Fix Android build error, input double-processing, refresh rate displa…
Copilot Apr 18, 2026
9cf4b0c
Fix Oboe audio pipeline, optimize all Android features for low latency
Copilot Apr 18, 2026
bad38da
Rewrite S Pen handler as true tablet with area mapping, fix thread sa…
Copilot Apr 18, 2026
2c94767
Performance optimizations: input hot-path inlining, Vulkan dropdown f…
Copilot Apr 18, 2026
e14baf6
Max FPS: thread priority, sustained perf always-on, hardwareAccelerat…
Copilot Apr 18, 2026
793a587
Fix 3 CI build errors, re-enable Vulkan on all Android GPUs
Copilot Apr 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"rollForward": false
},
"codefilesanity": {
"version": "0.0.37",
"version": "0.0.41",
"commands": [
"CodeFileSanity"
],
Expand All @@ -24,4 +24,4 @@
"rollForward": false
}
}
}
}
54 changes: 51 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ jobs:
NDK_HOME="$ANDROID_HOME/ndk/29.0.14206865"
CMAKE_BIN="$ANDROID_HOME/cmake/3.22.1/bin/cmake"

# Only build arm64 and arm32. x86 removed to reduce APK size —
# modern emulators use x86_64 or ARM translation.
for ABI in arm64-v8a armeabi-v7a; do
# arm64 only — matches RuntimeIdentifiers in osu.Android.props.
for ABI in arm64-v8a; do
echo "::group::Building osu_native for $ABI"
"$CMAKE_BIN" -B "build-native/$ABI" -S osu.Android/Native \
-DCMAKE_TOOLCHAIN_FILE="$NDK_HOME/build/cmake/android.toolchain.cmake" \
Expand Down Expand Up @@ -148,6 +147,55 @@ jobs:
echo "Found APK: $APK ($APK_SIZE_MB MB)"
echo "apk_path=$APK" >> "$GITHUB_OUTPUT"

# .NET 10 Android SDK may skip debug-signing for Release publish builds.
# Verify the APK is signed; if not, sign it with apksigner using the debug
# keystore so the APK can be sideloaded without INSTALL_PARSE_FAILED_NO_CERTIFICATES.
- name: Verify and sign APK if needed
run: |
APK="${{ steps.find_apk.outputs.apk_path }}"
APKSIGNER="$ANDROID_HOME/build-tools/$(ls "$ANDROID_HOME/build-tools" | sort -V | tail -1)/apksigner"
ZIPALIGN="$ANDROID_HOME/build-tools/$(ls "$ANDROID_HOME/build-tools" | sort -V | tail -1)/zipalign"

if "$APKSIGNER" verify "$APK" 2>/dev/null; then
echo "APK is already signed ✓"
else
echo "::warning::APK is not signed. Signing with debug keystore..."

# Generate debug keystore if it doesn't exist
DEBUG_KS="$HOME/.android/debug.keystore"
if [ ! -f "$DEBUG_KS" ]; then
mkdir -p "$HOME/.android"
keytool -genkeypair -v \
-keystore "$DEBUG_KS" \
-storepass android \
-keypass android \
-alias androiddebugkey \
-keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=Android Debug,O=Android,C=US"
fi

# Zipalign first (required before apksigner v2 signing)
ALIGNED_APK="${APK%.apk}-aligned.apk"
"$ZIPALIGN" -f -p 4 "$APK" "$ALIGNED_APK"
mv "$ALIGNED_APK" "$APK"

# Sign with debug keystore (v1 + v2 + v3 schemes)
"$APKSIGNER" sign \
--ks "$DEBUG_KS" \
--ks-pass pass:android \
--key-pass pass:android \
--ks-key-alias androiddebugkey \
"$APK"

# Verify signature
if "$APKSIGNER" verify --print-certs "$APK"; then
echo "APK signed successfully ✓"
else
echo "::error::APK signing failed"
exit 1
fi
fi

- name: Upload APK artifact
uses: actions/upload-artifact@v7
with:
Expand Down
4 changes: 4 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

Thank you for showing interest in the development of osu!. We aim to provide a good collaborating environment for everyone involved, and as such have decided to list some of the most important things to keep in mind in the process. The guidelines below have been chosen based on past experience.

## Foreword on AI usage

Our team believes in **human contributions**. Any contribution – be it an issue report or a pull request – which is created by, documented by, or aided by AI/LLM usage will typically be **closed and locked without further discussion**.

## Table of contents

1. [Reporting bugs](#reporting-bugs)
Expand Down
66 changes: 65 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ You can see some examples of custom rulesets by visiting the [custom ruleset dir

Please make sure you have the following prerequisites:

- A desktop platform with the [.NET 8.0 SDK](https://dotnet.microsoft.com/download) installed.
- A desktop platform with the [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) installed (this fork targets .NET 10; upstream ppy/osu uses .NET 8).

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.

Expand Down Expand Up @@ -96,6 +96,68 @@ When running locally to do any kind of performance testing, make sure to add `-c

If the build fails, try to restore NuGet packages with `dotnet restore`.

#### Building for Android

**Prerequisites:**
- [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) (this fork targets .NET 10)
- JDK 17 (`sudo apt install openjdk-17-jdk` or use [Microsoft's JDK](https://learn.microsoft.com/en-us/java/openjdk/download))
- Android workload: `dotnet workload install android`

**Debug build** (auto-signed with debug keystore, suitable for local testing):

```shell
dotnet build -c Debug osu.Android/osu.Android.csproj
```

The APK will be at `osu.Android/bin/Debug/net10.0-android/sh.ppy.osulazer.apk`. Debug builds are always signed with the Android debug keystore and can be installed directly via `adb install`.

**Release build** (optimised with AOT, trimming, and compression):

```shell
dotnet publish -c Release osu.Android/osu.Android.csproj -f net10.0-android
```

The APK will be at `osu.Android/bin/Release/net10.0-android/publish/sh.ppy.osulazer.apk`.

**Signing the Release APK:**

Release APKs may not be automatically signed by the .NET SDK. If you get `INSTALL_PARSE_FAILED_NO_CERTIFICATES` when installing, sign the APK manually:

```shell
# Find your build-tools (adjust version as needed)
BUILD_TOOLS="$ANDROID_HOME/build-tools/$(ls $ANDROID_HOME/build-tools | sort -V | tail -1)"

# Zipalign (required before signing)
"$BUILD_TOOLS/zipalign" -f -p 4 sh.ppy.osulazer.apk sh.ppy.osulazer-aligned.apk
mv sh.ppy.osulazer-aligned.apk sh.ppy.osulazer.apk

# Sign with debug keystore (or your own release keystore)
"$BUILD_TOOLS/apksigner" sign \
--ks ~/.android/debug.keystore \
--ks-pass pass:android \
--key-pass pass:android \
--ks-key-alias androiddebugkey \
sh.ppy.osulazer.apk

# Verify
"$BUILD_TOOLS/apksigner" verify sh.ppy.osulazer.apk
```

If `~/.android/debug.keystore` does not exist, generate it:

```shell
keytool -genkeypair -v -keystore ~/.android/debug.keystore \
-storepass android -keypass android -alias androiddebugkey \
-keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=Android Debug,O=Android,C=US"
```

**Install via ADB:**

```shell
adb install sh.ppy.osulazer.apk
```

### 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:
Expand Down Expand Up @@ -138,6 +200,8 @@ If you wish to help with localisation efforts, head over to [crowdin](https://cr

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.

Our team believes in **human contributions**. Any contribution – be it an issue report or a pull request – which is created by, documented by, or aided by AI/LLM usage will typically be **closed and locked without further discussion**.

## 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.
Expand Down
31 changes: 12 additions & 19 deletions osu.Android.props
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
<Project>
<PropertyGroup>
<SupportedOSPlatformVersion>33.0</SupportedOSPlatformVersion>
<!-- arm64-v8a covers 99%+ of modern Android devices.
armeabi-v7a is kept for older 32-bit devices.
x86 removed — only used by legacy emulators; modern x86_64 emulators
run arm64 binaries via native translation (no dedicated x86 build needed). -->
<RuntimeIdentifiers>android-arm;android-arm64</RuntimeIdentifiers>
<!-- arm64-v8a only. Modern Android devices are 99%+ arm64; 32-bit arm32 (armeabi-v7a)
adds ~200 MB of duplicate native libraries for negligible device coverage.
x86 was already removed — modern x86_64 emulators run arm64 via translation. -->
<RuntimeIdentifiers>android-arm64</RuntimeIdentifiers>
<AndroidPackageFormat>apk</AndroidPackageFormat>
<!-- CJK and Mideast encodings are needed for song metadata display.
Rare covers supplementary Unicode blocks. West is the default Latin set. -->
Expand Down Expand Up @@ -68,12 +67,7 @@
</ItemGroup>

<ItemGroup>
<!-- IMPORTANT: ppy.osu.Framework.Android v2026.318.0 only ships net8.0-android34.0 assets.
NuGet silently falls back to those assets when the app targets net10.0-android (API 36).
This is safe because .NET guarantees backward compatibility for loading net8.0 assemblies
in a net10.0 runtime, and Android API changes between 34→36 are additive.
TODO: Remove this comment once ppy.osu.Framework.Android ships net10.0-android assets. -->
<PackageReference Include="ppy.osu.Framework.Android" Version="2026.318.0" />
<PackageReference Include="ppy.osu.Framework.Android" Version="2026.416.0" />
</ItemGroup>

<PropertyGroup>
Expand All @@ -82,19 +76,18 @@
<DisableFody>true</DisableFody>
</PropertyGroup>

<!-- Fix for .NET 10 Android AOT misclassifying non-managed assets in runtime pack.
This is critical for Android 16 (API 36) Release/AOT builds where the linker expects
all non-managed assets to be marked as native before the optimization/signing phases.
Scoped to Release only — running this during Debug builds can interfere with how the
Android SDK classifies signing-related items, leading to APKs with null certificate
arrays (INSTALL_PARSE_FAILED_NO_CERTIFICATES). -->
<!-- Fix for .NET 10 Android AOT misclassifying native .so assets in runtime pack.
Only .so files need the AssetType override — the previous broader filter
(all non-DLL, non-PDB) incorrectly reclassified signing metadata and config
files, which corrupted the APK signature (INSTALL_PARSE_FAILED_NO_CERTIFICATES).
Scoped to Release only to avoid interfering with Debug builds. -->
<Target Name="FixRuntimePackAssetTypes" AfterTargets="ResolveRuntimePackAssets;ComputeFilesToPublish;ComputeResolvedFilesToPublishList"
Condition="'$(Configuration)' == 'Release'">
<ItemGroup>
<RuntimePackAsset Update="@(RuntimePackAsset)" Condition="'%(Extension)' != '.dll' AND '%(Extension)' != '.pdb'">
<RuntimePackAsset Update="@(RuntimePackAsset)" Condition="'%(Extension)' == '.so'">
<AssetType>native</AssetType>
</RuntimePackAsset>
<ResolvedFileToPublish Update="@(ResolvedFileToPublish)" Condition="'%(Extension)' != '.dll' AND '%(Extension)' != '.pdb'">
<ResolvedFileToPublish Update="@(ResolvedFileToPublish)" Condition="'%(Extension)' == '.so'">
<AssetType>native</AssetType>
</ResolvedFileToPublish>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion osu.Android/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sh.ppy.osulazer" android:installLocation="auto">
<uses-sdk android:minSdkVersion="33" android:targetSdkVersion="36" />
<application android:extractNativeLibs="false" android:allowBackup="true" android:supportsRtl="true" android:label="osu!" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher" android:largeHeap="true">
<application android:allowBackup="true" android:supportsRtl="true" android:label="osu!" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher" android:largeHeap="true">
<provider android:name="androidx.core.content.FileProvider" android:authorities="sh.ppy.osulazer.fileprovider" android:grantUriPermissions="true" android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" />
</provider>
Expand Down
2 changes: 1 addition & 1 deletion osu.Android/Native/OboeAudioBridge.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System.Runtime.CompilerServices;
// 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.

using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Debug = System.Diagnostics.Debug;

Expand Down
1 change: 0 additions & 1 deletion osu.Android/OsuGameActivity.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using osu.Android.Input;
// 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.

Expand Down Expand Up @@ -53,9 +52,9 @@

public new bool IsTablet { get; private set; }
public bool IsDeX { get; private set; }
internal AndroidStylusHandler? StylusHandler;

Check failure on line 55 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidStylusHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 55 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidStylusHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 55 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidStylusHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 55 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidStylusHandler' could not be found (are you missing a using directive or an assembly reference?)
internal AndroidKeyboardHandler? KeyboardHandler;

Check failure on line 56 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidKeyboardHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 56 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidKeyboardHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 56 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidKeyboardHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 56 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidKeyboardHandler' could not be found (are you missing a using directive or an assembly reference?)
internal AndroidMouseHandler? MouseHandler;

Check failure on line 57 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidMouseHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 57 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidMouseHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 57 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidMouseHandler' could not be found (are you missing a using directive or an assembly reference?)

Check failure on line 57 in osu.Android/OsuGameActivity.cs

View workflow job for this annotation

GitHub Actions / Build only (Android)

The type or namespace name 'AndroidMouseHandler' could not be found (are you missing a using directive or an assembly reference?)

private OsuGameAndroid? game;

Expand Down
4 changes: 1 addition & 3 deletions osu.Android/osu.Android.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,8 @@
<None Remove="Native\CMakeLists.txt" />
</ItemGroup>
<!-- Include pre-built native libraries when present (built by the release workflow or local NDK build).
When absent, native features (Oboe audio, Vulkan probe) are gracefully disabled at runtime.
x86 removed — only arm64 and arm32 are shipped (see RuntimeIdentifiers in osu.Android.props). -->
When absent, native features (Oboe audio, Vulkan probe) are gracefully disabled at runtime. -->
<ItemGroup>
<AndroidNativeLibrary Include="libs\arm64-v8a\libosu_native.so" Condition="Exists('libs\arm64-v8a\libosu_native.so')" Abi="arm64-v8a" />
<AndroidNativeLibrary Include="libs\armeabi-v7a\libosu_native.so" Condition="Exists('libs\armeabi-v7a\libosu_native.so')" Abi="armeabi-v7a" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public partial class ScrollingPath : CompositeDrawable
private readonly Path drawablePath;

private readonly List<(double Time, float X)> vertices = new List<(double, float)>();
private readonly List<Vector2> sliderVertices = new List<Vector2>();

public ScrollingPath()
{
Expand Down Expand Up @@ -47,9 +48,8 @@ public void UpdatePathFrom(ScrollingHitObjectContainer hitObjectContainer, Juice
private void computeTimeXs(JuiceStream hitObject)
{
vertices.Clear();

var sliderVertices = new List<Vector2>();
hitObject.Path.GetPathToProgress(sliderVertices, 0, 1);
sliderVertices.Clear();
sliderVertices.AddRange(hitObject.Path.CalculatedPath);

if (sliderVertices.Count == 0)
return;
Expand Down
3 changes: 1 addition & 2 deletions osu.Game.Rulesets.Catch/Objects/JuiceStreamPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,7 @@ public void ResampleVertices(IEnumerable<double> sampleTimes)
/// </remarks>
public void ConvertFromSliderPath(SliderPath sliderPath, double velocity)
{
var sliderPathVertices = new List<Vector2>();
sliderPath.GetPathToProgress(sliderPathVertices, 0, 1);
var sliderPathVertices = sliderPath.CalculatedPath;

double time = 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj" />
<ProjectReference Include="..\osu.Game.Tests\osu.Game.Tests.csproj" />
<ProjectReference Include="..\osu.Game\osu.Game.csproj" />
</ItemGroup>
<!-- Workaround for CS0433: NotNullAttribute conflict between JetBrains.Annotations and Xamarin.Jetbrains.Annotations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
</Compile>
</ItemGroup>
<ItemGroup Label="Project References">
<ProjectReference Include="..\osu.Game.Tests\osu.Game.Tests.csproj" />
<ProjectReference Include="..\osu.Game\osu.Game.csproj" />
<ProjectReference Include="..\osu.Game.Rulesets.Mania\osu.Game.Rulesets.Mania.csproj" />
</ItemGroup>
Expand Down
18 changes: 18 additions & 0 deletions osu.Game.Rulesets.Mania.Tests/ManiaBeatmapConversionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,24 @@ public class ManiaBeatmapConversionTest : BeatmapConversionTest<ManiaConvertMapp
[TestCase("100374")]
[TestCase("1450162")]
[TestCase("4869637")]
[TestCase("1K")]
[TestCase("2K")]
[TestCase("3K")]
[TestCase("4K")]
[TestCase("5K")]
[TestCase("6K")]
[TestCase("7K")]
[TestCase("8K")]
[TestCase("9K")]
[TestCase("10K")]
// [TestCase("11K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("12K")]
// [TestCase("13K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("14K")]
// [TestCase("15K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("16K")]
// [TestCase("17K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("18K")]
public void Test(string name) => base.Test(name);

protected override IEnumerable<ConvertValue> CreateConvertValue(HitObject hitObject)
Expand Down
45 changes: 45 additions & 0 deletions osu.Game.Rulesets.Mania.Tests/ManiaLegacyBeatmapEncoderTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// 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.

using NUnit.Framework;
using osu.Framework.IO.Stores;
using static osu.Game.Tests.Beatmaps.Formats.LegacyBeatmapEncoderTest;

namespace osu.Game.Rulesets.Mania.Tests
{
[TestFixture]
public class ManiaLegacyBeatmapEncoderTest
{
private static readonly DllResourceStore beatmaps_resource_store = new DllResourceStore(typeof(ManiaLegacyBeatmapEncoderTest).Assembly);

[TestCase("1K")]
[TestCase("2K")]
[TestCase("3K")]
[TestCase("4K")]
[TestCase("5K")]
[TestCase("6K")]
[TestCase("7K")]
[TestCase("8K")]
[TestCase("9K")]
[TestCase("10K")]
// [TestCase("11K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("12K")]
// [TestCase("13K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("14K")]
// [TestCase("15K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("16K")]
// [TestCase("17K")] <- See comment in `ManiaBeatmapConverter` ctor for disable reason.
[TestCase("18K")]
[TestCase("7K+1")]
public void TestEncodeDecodeStability(string name)
{
var decoded = DecodeFromLegacy(beatmaps_resource_store.GetStream($"Resources/Testing/Beatmaps/{name}.osu"), beatmaps_resource_store, name);
var decodedAfterEncode = DecodeFromLegacy(EncodeToLegacy(decoded), beatmaps_resource_store, name);

Sort(decoded.beatmap);
Sort(decodedAfterEncode.beatmap);

CompareBeatmaps(decoded, decodedAfterEncode);
}
}
}
Loading
Loading