1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 12:33:01 +08:00

Merge remote-tracking branch 'upstream/master' into raw-input-fixes

This commit is contained in:
Dean Herbert 2018-02-07 22:05:44 +09:00
commit 67bd375bfa
17 changed files with 231 additions and 73 deletions

View File

@ -2,6 +2,7 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System; using System;
using System.Collections.Generic;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Drawables;
using OpenTK; using OpenTK;
@ -24,7 +25,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
this.repeatPoint = repeatPoint; this.repeatPoint = repeatPoint;
this.drawableSlider = drawableSlider; this.drawableSlider = drawableSlider;
Size = new Vector2(32 * repeatPoint.Scale); Size = new Vector2(45 * repeatPoint.Scale);
Blending = BlendingMode.Additive; Blending = BlendingMode.Additive;
Origin = Anchor.Centre; Origin = Anchor.Centre;
@ -34,7 +35,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
new SpriteIcon new SpriteIcon
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Icon = FontAwesome.fa_eercast Icon = FontAwesome.fa_chevron_right
} }
}; };
} }
@ -49,9 +50,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{ {
animDuration = Math.Min(150, repeatPoint.SpanDuration / 2); animDuration = Math.Min(150, repeatPoint.SpanDuration / 2);
this.FadeIn(animDuration).ScaleTo(1.2f, animDuration / 2) this.Animate(
.Then() d => d.FadeIn(animDuration),
.ScaleTo(1, animDuration / 2, Easing.Out); d => d.ScaleTo(0.5f).ScaleTo(1f, animDuration * 4, Easing.OutElasticHalf)
);
} }
protected override void UpdateCurrentState(ArmedState state) protected override void UpdateCurrentState(ArmedState state)
@ -66,11 +68,33 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
break; break;
case ArmedState.Hit: case ArmedState.Hit:
this.FadeOut(animDuration, Easing.OutQuint) this.FadeOut(animDuration, Easing.OutQuint)
.ScaleTo(Scale * 1.5f, animDuration, Easing.OutQuint); .ScaleTo(Scale * 1.5f, animDuration, Easing.Out);
break; break;
} }
} }
public void UpdateSnakingPosition(Vector2 start, Vector2 end) => Position = repeatPoint.RepeatIndex % 2 == 0 ? end : start; public void UpdateSnakingPosition(Vector2 start, Vector2 end)
{
bool isRepeatAtEnd = repeatPoint.RepeatIndex % 2 == 0;
List<Vector2> curve = drawableSlider.Body.CurrentCurve;
Position = isRepeatAtEnd ? end : start;
if (curve.Count < 2)
return;
int searchStart = isRepeatAtEnd ? curve.Count - 1 : 0;
int direction = isRepeatAtEnd ? -1 : 1;
// find the next vector2 in the curve which is not equal to our current position to infer a rotation.
for (int i = searchStart; i >= 0 && i < curve.Count; i += direction)
{
if (curve[i] == Position)
continue;
Rotation = MathHelper.RadiansToDegrees((float)Math.Atan2(curve[i].Y - Position.Y, curve[i].X - Position.X));
break;
}
}
} }
} }

View File

@ -52,9 +52,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
{ {
this.Animate( this.Animate(
d => d.FadeIn(anim_duration), d => d.FadeIn(anim_duration),
d => d.ScaleTo(0.5f).ScaleTo(1.2f, anim_duration / 2) d => d.ScaleTo(0.5f).ScaleTo(1f, anim_duration * 4, Easing.OutElasticHalf)
).Then(
d => d.ScaleTo(1, anim_duration / 2, Easing.Out)
); );
} }
@ -71,7 +69,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
break; break;
case ArmedState.Hit: case ArmedState.Hit:
this.FadeOut(anim_duration, Easing.OutQuint) this.FadeOut(anim_duration, Easing.OutQuint)
.ScaleTo(Scale * 1.5f, anim_duration, Easing.OutQuint); .ScaleTo(Scale * 1.5f, anim_duration, Easing.Out);
break; break;
} }
} }

View File

@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
// We want the container to have the same size as the slider, // We want the container to have the same size as the slider,
// and to be positioned such that the slider head is at (0,0). // and to be positioned such that the slider head is at (0,0).
container.Size = path.Size; container.Size = path.Size;
container.Position = -path.PositionInBoundingBox(slider.Curve.PositionAt(0) - currentCurve[0]); container.Position = -path.PositionInBoundingBox(slider.Curve.PositionAt(0) - CurrentCurve[0]);
container.ForceRedraw(); container.ForceRedraw();
} }
@ -148,7 +148,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
path.Texture = texture; path.Texture = texture;
} }
private readonly List<Vector2> currentCurve = new List<Vector2>(); public readonly List<Vector2> CurrentCurve = new List<Vector2>();
private bool updateSnaking(double p0, double p1) private bool updateSnaking(double p0, double p1)
{ {
if (SnakedStart == p0 && SnakedEnd == p1) return false; if (SnakedStart == p0 && SnakedEnd == p1) return false;
@ -156,11 +156,11 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces
SnakedStart = p0; SnakedStart = p0;
SnakedEnd = p1; SnakedEnd = p1;
slider.Curve.GetPathToProgress(currentCurve, p0, p1); slider.Curve.GetPathToProgress(CurrentCurve, p0, p1);
path.ClearVertices(); path.ClearVertices();
foreach (Vector2 p in currentCurve) foreach (Vector2 p in CurrentCurve)
path.AddVertex(p - currentCurve[0]); path.AddVertex(p - CurrentCurve[0]);
return true; return true;
} }

View File

@ -71,12 +71,25 @@ namespace osu.Game.Rulesets.Osu.Tests
AddStep("Fast Short Slider 2 Repeats", () => testShortHighSpeed(2)); AddStep("Fast Short Slider 2 Repeats", () => testShortHighSpeed(2));
AddStep("Fast Short Slider 6 Repeats", () => testShortHighSpeed(6)); AddStep("Fast Short Slider 6 Repeats", () => testShortHighSpeed(6));
AddStep("Perfect Curve", testCurve); AddStep("Perfect Curve", () => testPerfect());
AddStep("Perfect Curve 1 Repeat", () => testPerfect(1));
AddStep("Perfect Curve 2 Repeats", () => testPerfect(2));
AddStep("Catmull", () => testCatmull()); AddStep("Linear Slider", () => testLinear());
AddStep("Catmull 1 Repeat", () => testCatmull(1)); AddStep("Linear Slider 1 Repeat", () => testLinear(1));
AddStep("Linear Slider 2 Repeats", () => testLinear(2));
// TODO more curve types? AddStep("Bezier Slider", () => testBezier());
AddStep("Bezier Slider 1 Repeat", () => testBezier(1));
AddStep("Bezier Slider 2 Repeats", () => testBezier(2));
AddStep("Linear Overlapping", () => testLinearOverlapping());
AddStep("Linear Overlapping 1 Repeat", () => testLinearOverlapping(1));
AddStep("Linear Overlapping 2 Repeats", () => testLinearOverlapping(2));
AddStep("Catmull Slider", () => testCatmull());
AddStep("Catmull Slider 1 Repeat", () => testCatmull(1));
AddStep("Catmull Slider 2 Repeats", () => testCatmull(2));
} }
private void testSimpleBig(int repeats = 0) => createSlider(2, repeats: repeats); private void testSimpleBig(int repeats = 0) => createSlider(2, repeats: repeats);
@ -95,10 +108,6 @@ namespace osu.Game.Rulesets.Osu.Tests
private void createSlider(float circleSize = 2, float distance = 400, int repeats = 0, double speedMultiplier = 2) private void createSlider(float circleSize = 2, float distance = 400, int repeats = 0, double speedMultiplier = 2)
{ {
var repeatSamples = new List<List<SampleInfo>>();
for (int i = 0; i < repeats; i++)
repeatSamples.Add(new List<SampleInfo>());
var slider = new Slider var slider = new Slider
{ {
StartTime = Time.Current + 1000, StartTime = Time.Current + 1000,
@ -111,13 +120,13 @@ namespace osu.Game.Rulesets.Osu.Tests
}, },
Distance = distance, Distance = distance,
RepeatCount = repeats, RepeatCount = repeats,
RepeatSamples = repeatSamples RepeatSamples = createEmptySamples(repeats)
}; };
addSlider(slider, circleSize, speedMultiplier); addSlider(slider, circleSize, speedMultiplier);
} }
private void testCurve() private void testPerfect(int repeats = 0)
{ {
var slider = new Slider var slider = new Slider
{ {
@ -130,7 +139,89 @@ namespace osu.Game.Rulesets.Osu.Tests
new Vector2(0, 200), new Vector2(0, 200),
new Vector2(200, 0) new Vector2(200, 0)
}, },
Distance = 600 Distance = 600,
RepeatCount = repeats,
RepeatSamples = createEmptySamples(repeats)
};
addSlider(slider, 2, 3);
}
private void testLinear(int repeats = 0) => createLinear(repeats);
private void createLinear(int repeats)
{
var slider = new Slider
{
CurveType = CurveType.Linear,
StartTime = Time.Current + 1000,
Position = new Vector2(-200, 0),
ComboColour = Color4.LightSeaGreen,
ControlPoints = new List<Vector2>
{
new Vector2(-200, 0),
new Vector2(-50, 75),
new Vector2(0, 100),
new Vector2(100, -200),
new Vector2(200, 0),
new Vector2(230, 0)
},
Distance = 793.4417,
RepeatCount = repeats,
RepeatSamples = createEmptySamples(repeats)
};
addSlider(slider, 2, 3);
}
private void testBezier(int repeats = 0) => createBezier(repeats);
private void createBezier(int repeats)
{
var slider = new Slider
{
CurveType = CurveType.Bezier,
StartTime = Time.Current + 1000,
Position = new Vector2(-200, 0),
ComboColour = Color4.LightSeaGreen,
ControlPoints = new List<Vector2>
{
new Vector2(-200, 0),
new Vector2(-50, 75),
new Vector2(0, 100),
new Vector2(100, -200),
new Vector2(230, 0)
},
Distance = 480,
RepeatCount = repeats,
RepeatSamples = createEmptySamples(repeats)
};
addSlider(slider, 2, 3);
}
private void testLinearOverlapping(int repeats = 0) => createOverlapping(repeats);
private void createOverlapping(int repeats)
{
var slider = new Slider
{
CurveType = CurveType.Linear,
StartTime = Time.Current + 1000,
Position = new Vector2(0, 0),
ComboColour = Color4.LightSeaGreen,
ControlPoints = new List<Vector2>
{
new Vector2(0, 0),
new Vector2(-200, 0),
new Vector2(0, 0),
new Vector2(0, -200),
new Vector2(-200, -200),
new Vector2(0, -200)
},
Distance = 1000,
RepeatCount = repeats,
RepeatSamples = createEmptySamples(repeats)
}; };
addSlider(slider, 2, 3); addSlider(slider, 2, 3);
@ -165,6 +256,14 @@ namespace osu.Game.Rulesets.Osu.Tests
addSlider(slider, 3, 1); addSlider(slider, 3, 1);
} }
private List<List<SampleInfo>> createEmptySamples(int repeats)
{
var repeatSamples = new List<List<SampleInfo>>();
for (int i = 0; i < repeats; i++)
repeatSamples.Add(new List<SampleInfo>());
return repeatSamples;
}
private void addSlider(Slider slider, float circleSize, double speedMultiplier) private void addSlider(Slider slider, float circleSize, double speedMultiplier)
{ {
var cpi = new ControlPointInfo(); var cpi = new ControlPointInfo();

View File

@ -63,8 +63,8 @@ namespace osu.Game.Tests.Visual
{ {
Value = new[] Value = new[]
{ {
new User { GlobalRank = 1355 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 1355 } } },
new User { GlobalRank = 8756 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 8756 } } },
}, },
}, },
}), }),
@ -99,10 +99,10 @@ namespace osu.Game.Tests.Visual
}, },
Participants = Participants =
{ {
Value = new[] Value = new[]
{ {
new User { GlobalRank = 578975 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 578975 } } },
new User { GlobalRank = 24554 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 24554 } } },
}, },
}, },
}), }),
@ -116,8 +116,8 @@ namespace osu.Game.Tests.Visual
AddStep(@"change beatmap", () => first.Room.Beatmap.Value = null); AddStep(@"change beatmap", () => first.Room.Beatmap.Value = null);
AddStep(@"change participants", () => first.Room.Participants.Value = new[] AddStep(@"change participants", () => first.Room.Participants.Value = new[]
{ {
new User { GlobalRank = 1254 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 1254 } } },
new User { GlobalRank = 123189 }, new User { Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 123189 } } },
}); });
} }

View File

@ -65,7 +65,7 @@ namespace osu.Game.Tests.Visual
{ {
Statistics = new UserStatistics Statistics = new UserStatistics
{ {
Rank = 123456, Ranks = new UserStatistics.UserRanks { Global = 123456 },
PP = 12345, PP = 12345,
} }
}; };
@ -77,7 +77,7 @@ namespace osu.Game.Tests.Visual
{ {
Statistics = new UserStatistics Statistics = new UserStatistics
{ {
Rank = 89000, Ranks = new UserStatistics.UserRanks { Global = 89000 },
PP = 12345, PP = 12345,
}, },
RankHistory = new User.RankHistoryData RankHistory = new User.RankHistoryData
@ -93,7 +93,7 @@ namespace osu.Game.Tests.Visual
{ {
Statistics = new UserStatistics Statistics = new UserStatistics
{ {
Rank = 89000, Ranks = new UserStatistics.UserRanks { Global = 89000 },
PP = 12345, PP = 12345,
}, },
RankHistory = new User.RankHistoryData RankHistory = new User.RankHistoryData
@ -109,7 +109,7 @@ namespace osu.Game.Tests.Visual
{ {
Statistics = new UserStatistics Statistics = new UserStatistics
{ {
Rank = 12000, Ranks = new UserStatistics.UserRanks { Global = 12000 },
PP = 12345, PP = 12345,
}, },
RankHistory = new User.RankHistoryData RankHistory = new User.RankHistoryData

View File

@ -54,12 +54,12 @@ namespace osu.Game.Tests.Visual
{ {
Value = new[] Value = new[]
{ {
new User { Username = @"flyte", Id = 3103765, GlobalRank = 1425 }, new User { Username = @"flyte", Id = 3103765, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 142 } } },
new User { Username = @"Cookiezi", Id = 124493, GlobalRank = 5466 }, new User { Username = @"Cookiezi", Id = 124493, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 546 } } },
new User { Username = @"Angelsim", Id = 1777162, GlobalRank = 2873 }, new User { Username = @"Angelsim", Id = 1777162, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 287 } } },
new User { Username = @"Rafis", Id = 2558286, GlobalRank = 4687 }, new User { Username = @"Rafis", Id = 2558286, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 468 } } },
new User { Username = @"hvick225", Id = 50265, GlobalRank = 3258 }, new User { Username = @"hvick225", Id = 50265, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 325 } } },
new User { Username = @"peppy", Id = 2, GlobalRank = 6251 } new User { Username = @"peppy", Id = 2, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 625 } } },
} }
} }
}; };
@ -80,8 +80,8 @@ namespace osu.Game.Tests.Visual
AddStep(@"change max participants", () => room.MaxParticipants.Value = null); AddStep(@"change max participants", () => room.MaxParticipants.Value = null);
AddStep(@"change participants", () => room.Participants.Value = new[] AddStep(@"change participants", () => room.Participants.Value = new[]
{ {
new User { Username = @"filsdelama", Id = 2831793, GlobalRank = 8542 }, new User { Username = @"filsdelama", Id = 2831793, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 854 } } },
new User { Username = @"_index", Id = 652457, GlobalRank = 15024 } new User { Username = @"_index", Id = 652457, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 150 } } }
}); });
AddStep(@"change room", () => AddStep(@"change room", () =>
@ -121,9 +121,9 @@ namespace osu.Game.Tests.Visual
{ {
Value = new[] Value = new[]
{ {
new User { Username = @"Angelsim", Id = 1777162, GlobalRank = 4 }, new User { Username = @"Angelsim", Id = 1777162, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 4 } } },
new User { Username = @"HappyStick", Id = 256802, GlobalRank = 752 }, new User { Username = @"HappyStick", Id = 256802, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 752 } } },
new User { Username = @"-Konpaku-", Id = 2258797, GlobalRank = 571 } new User { Username = @"-Konpaku-", Id = 2258797, Statistics = new UserStatistics { Ranks = new UserStatistics.UserRanks { Global = 571 } } }
} }
} }
}; };

View File

@ -42,11 +42,10 @@ namespace osu.Game.Tests.Visual
LastVisit = DateTimeOffset.Now, LastVisit = DateTimeOffset.Now,
Age = 1, Age = 1,
ProfileOrder = new[] { "me" }, ProfileOrder = new[] { "me" },
CountryRank = 1,
Statistics = new UserStatistics Statistics = new UserStatistics
{ {
Rank = 2148, Ranks = new UserStatistics.UserRanks { Global = 2148, Country = 1 },
PP = 4567.89m PP = 4567.89m,
}, },
RankHistory = new User.RankHistoryData RankHistory = new User.RankHistoryData
{ {

View File

@ -45,6 +45,18 @@
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.13\lib\net45\OpenTK.dll</HintPath> <HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.13\lib\net45\OpenTK.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="SQLitePCLRaw.batteries_green, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a84b7dcfb1391f7f, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\net45\SQLitePCLRaw.batteries_green.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.batteries_v2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8226ea5df37bcae9, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.bundle_green.1.1.8\lib\net45\SQLitePCLRaw.batteries_v2.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.provider.e_sqlite3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9c301db686d0bd12, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.8\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"> <Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
<HintPath>$(SolutionDir)\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll</HintPath> <HintPath>$(SolutionDir)\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll</HintPath>
@ -171,4 +183,15 @@
<EmbeddedResource Include="Resources\Kozato snow - Rengetsu Ouka %28_Kiva%29 [Yuki YukI].osu" /> <EmbeddedResource Include="Resources\Kozato snow - Rengetsu Ouka %28_Kiva%29 [Yuki YukI].osu" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.linux.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.linux.targets'))" />
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets'))" />
<Error Condition="!Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets'))" />
</Target>
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.osx.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.osx.targets')" />
<Import Project="$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets" Condition="Exists('$(SolutionDir)\packages\SQLitePCLRaw.lib.e_sqlite3.v110_xp.1.1.8\build\net35\SQLitePCLRaw.lib.e_sqlite3.v110_xp.targets')" />
</Project> </Project>

View File

@ -8,5 +8,11 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
<package id="JetBrains.Annotations" version="11.1.0" targetFramework="net461" /> <package id="JetBrains.Annotations" version="11.1.0" targetFramework="net461" />
<package id="NUnit" version="3.8.1" targetFramework="net461" /> <package id="NUnit" version="3.8.1" targetFramework="net461" />
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" /> <package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net461" />
<package id="SQLitePCLRaw.lib.e_sqlite3.linux" version="1.1.8" targetFramework="net461" />
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.8" targetFramework="net461" />
<package id="SQLitePCLRaw.lib.e_sqlite3.v110_xp" version="1.1.8" targetFramework="net461" />
<package id="SQLitePCLRaw.provider.e_sqlite3.net45" version="1.1.8" targetFramework="net461" />
<package id="System.ValueTuple" version="4.4.0" targetFramework="net461" /> <package id="System.ValueTuple" version="4.4.0" targetFramework="net461" />
</packages> </packages>

View File

@ -105,7 +105,7 @@ namespace osu.Game.Overlays.Profile
return; return;
} }
int[] userRanks = user.RankHistory?.Data ?? new[] { user.Statistics.Rank }; int[] userRanks = user.RankHistory?.Data ?? new[] { user.Statistics.Ranks.Global };
ranks = userRanks.Select((x, index) => new KeyValuePair<int, int>(index, x)).Where(x => x.Value != 0).ToArray(); ranks = userRanks.Select((x, index) => new KeyValuePair<int, int>(index, x)).Where(x => x.Value != 0).ToArray();
if (ranks.Length > 1) if (ranks.Length > 1)
@ -124,9 +124,11 @@ namespace osu.Game.Overlays.Profile
private void updateRankTexts() private void updateRankTexts()
{ {
rankText.Text = User.Value.Statistics.Rank > 0 ? $"#{User.Value.Statistics.Rank:#,0}" : "no rank"; var user = User.Value;
performanceText.Text = User.Value.Statistics.PP != null ? $"{User.Value.Statistics.PP:#,0}pp" : string.Empty;
relativeText.Text = $"{User.Value.Country?.FullName} #{User.Value.CountryRank:#,0}"; performanceText.Text = user.Statistics.PP != null ? $"{user.Statistics.PP:#,0}pp" : string.Empty;
rankText.Text = user.Statistics.Ranks.Global > 0 ? $"#{user.Statistics.Ranks.Global:#,0}" : "no rank";
relativeText.Text = user.Country != null && user.Statistics.Ranks.Country > 0 ? $"{user.Country.FullName} #{user.Statistics.Ranks.Country:#,0}" : "no rank";
} }
private void showHistoryRankTexts(int dayIndex) private void showHistoryRankTexts(int dayIndex)

View File

@ -181,7 +181,7 @@ namespace osu.Game.Overlays.Settings
{ {
hovering = true; hovering = true;
UpdateState(); UpdateState();
return true; return false;
} }
protected override void OnHoverLost(InputState state) protected override void OnHoverLost(InputState state)

View File

@ -140,7 +140,7 @@ namespace osu.Game.Rulesets.UI
if (!base.UpdateSubTree()) if (!base.UpdateSubTree())
return false; return false;
UpdateSubTreeMasking(ScreenSpaceDrawQuad.AABBFloat); UpdateSubTreeMasking(this, ScreenSpaceDrawQuad.AABBFloat);
if (isAttached) if (isAttached)
{ {

View File

@ -35,7 +35,7 @@ namespace osu.Game.Screens.Multiplayer
{ {
set set
{ {
var ranks = value.Select(u => u.GlobalRank); var ranks = value.Select(u => u.Statistics.Ranks.Global);
levelRangeLower.Text = ranks.Min().ToString(); levelRangeLower.Text = ranks.Min().ToString();
levelRangeHigher.Text = ranks.Max().ToString(); levelRangeHigher.Text = ranks.Max().ToString();
} }

View File

@ -32,6 +32,8 @@ namespace osu.Game.Screens.Play
private FadeContainer fadeContainer; private FadeContainer fadeContainer;
private double displayTime; private double displayTime;
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
public SkipButton(double startTime) public SkipButton(double startTime)
{ {
this.startTime = startTime; this.startTime = startTime;
@ -153,16 +155,11 @@ namespace osu.Game.Screens.Play
public Visibility State public Visibility State
{ {
get get { return state; }
{
return state;
}
set set
{ {
if (state == value) bool stateChanged = value != state;
return;
var lastState = state;
state = value; state = value;
scheduledHide?.Cancel(); scheduledHide?.Cancel();
@ -170,7 +167,8 @@ namespace osu.Game.Screens.Play
switch (state) switch (state)
{ {
case Visibility.Visible: case Visibility.Visible:
if (lastState == Visibility.Hidden) // we may be triggered to become visible mnultiple times but we only want to transform once.
if (stateChanged)
this.FadeIn(500, Easing.OutExpo); this.FadeIn(500, Easing.OutExpo);
if (!IsHovered) if (!IsHovered)

View File

@ -26,10 +26,6 @@ namespace osu.Game.Users
[JsonProperty(@"age")] [JsonProperty(@"age")]
public int? Age; public int? Age;
public int GlobalRank;
public int CountryRank;
//public Team Team; //public Team Team;
[JsonProperty(@"profile_colour")] [JsonProperty(@"profile_colour")]

View File

@ -22,8 +22,11 @@ namespace osu.Game.Users
[JsonProperty(@"pp")] [JsonProperty(@"pp")]
public decimal? PP; public decimal? PP;
[JsonProperty(@"pp_rank")] [JsonProperty(@"pp_rank")] // the API sometimes only returns this value in condensed user responses
public int Rank; private int rank { set => Ranks.Global = value; }
[JsonProperty(@"rank")]
public UserRanks Ranks;
[JsonProperty(@"ranked_score")] [JsonProperty(@"ranked_score")]
public long RankedScore; public long RankedScore;
@ -66,5 +69,15 @@ namespace osu.Game.Users
[JsonProperty(@"a")] [JsonProperty(@"a")]
public int A; public int A;
} }
public struct UserRanks
{
[JsonProperty(@"global")]
public int Global;
[JsonProperty(@"country")]
public int Country;
}
} }
} }