mirror of
https://github.com/osukey/osukey.git
synced 2025-08-06 08:03:52 +09:00
Merge branch 'master' into unified-hitwindows
This commit is contained in:
Submodule osu-framework updated: d89e6cd631...1440ae8538
@ -136,7 +136,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="SharpCompress, Version=0.18.1.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
|
<Reference Include="SharpCompress, Version=0.18.1.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
|
||||||
|
@ -6,7 +6,7 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
|
|||||||
<packages>
|
<packages>
|
||||||
<package id="DeltaCompressionDotNet" version="1.1.0" targetFramework="net45" />
|
<package id="DeltaCompressionDotNet" version="1.1.0" targetFramework="net45" />
|
||||||
<package id="Mono.Cecil" version="0.9.6.4" targetFramework="net45" />
|
<package id="Mono.Cecil" version="0.9.6.4" targetFramework="net45" />
|
||||||
<package id="ppy.OpenTK" version="3.0.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
||||||
<package id="Splat" version="2.0.0" targetFramework="net45" />
|
<package id="Splat" version="2.0.0" targetFramework="net45" />
|
||||||
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
|
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="System" />
|
<Reference Include="System" />
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<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.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@ -41,7 +41,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<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.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="System" />
|
<Reference Include="System" />
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<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.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@ -41,7 +41,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="System" />
|
<Reference Include="System" />
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<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.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@ -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 } } },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 } } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -42,9 +42,21 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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>
|
@ -7,6 +7,12 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
|
|||||||
<package id="DeepEqual" version="1.6.0.0" targetFramework="net461" />
|
<package id="DeepEqual" version="1.6.0.0" targetFramework="net461" />
|
||||||
<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.11" 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>
|
@ -20,6 +20,11 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
public class OsuSliderBar<T> : SliderBar<T>, IHasTooltip, IHasAccentColour
|
public class OsuSliderBar<T> : SliderBar<T>, IHasTooltip, IHasAccentColour
|
||||||
where T : struct, IEquatable<T>, IComparable, IConvertible
|
where T : struct, IEquatable<T>, IComparable, IConvertible
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Maximum number of decimal digits to be displayed in the tooltip.
|
||||||
|
/// </summary>
|
||||||
|
private const int max_decimal_digits = 5;
|
||||||
|
|
||||||
private SampleChannel sample;
|
private SampleChannel sample;
|
||||||
private double lastSampleTime;
|
private double lastSampleTime;
|
||||||
private T lastSampleValue;
|
private T lastSampleValue;
|
||||||
@ -35,6 +40,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
var bindableDouble = CurrentNumber as BindableNumber<double>;
|
var bindableDouble = CurrentNumber as BindableNumber<double>;
|
||||||
var bindableFloat = CurrentNumber as BindableNumber<float>;
|
var bindableFloat = CurrentNumber as BindableNumber<float>;
|
||||||
var floatValue = bindableDouble?.Value ?? bindableFloat?.Value;
|
var floatValue = bindableDouble?.Value ?? bindableFloat?.Value;
|
||||||
|
var floatPrecision = bindableDouble?.Precision ?? bindableFloat?.Precision;
|
||||||
|
|
||||||
if (floatValue != null)
|
if (floatValue != null)
|
||||||
{
|
{
|
||||||
@ -44,7 +50,12 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
if (floatMaxValue == 1 && (floatMinValue == 0 || floatMinValue == -1))
|
if (floatMaxValue == 1 && (floatMinValue == 0 || floatMinValue == -1))
|
||||||
return floatValue.Value.ToString("P0");
|
return floatValue.Value.ToString("P0");
|
||||||
|
|
||||||
return floatValue.Value.ToString("N1");
|
var decimalPrecision = normalise((decimal)floatPrecision, max_decimal_digits);
|
||||||
|
|
||||||
|
// Find the number of significant digits (we could have less than 5 after normalize())
|
||||||
|
var significantDigits = findPrecision(decimalPrecision);
|
||||||
|
|
||||||
|
return floatValue.Value.ToString($"N{significantDigits}");
|
||||||
}
|
}
|
||||||
|
|
||||||
var bindableInt = CurrentNumber as BindableNumber<int>;
|
var bindableInt = CurrentNumber as BindableNumber<int>;
|
||||||
@ -177,5 +188,31 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
{
|
{
|
||||||
Nub.MoveToX(RangePadding + UsableWidth * value, 250, Easing.OutQuint);
|
Nub.MoveToX(RangePadding + UsableWidth * value, 250, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes all non-significant digits, keeping at most a requested number of decimal digits.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="d">The decimal to normalize.</param>
|
||||||
|
/// <param name="sd">The maximum number of decimal digits to keep. The final result may have fewer decimal digits than this value.</param>
|
||||||
|
/// <returns>The normalised decimal.</returns>
|
||||||
|
private decimal normalise(decimal d, int sd)
|
||||||
|
=> decimal.Parse(Math.Round(d, sd).ToString(string.Concat("0.", new string('#', sd)), CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds the number of digits after the decimal.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="d">The value to find the number of decimal digits for.</param>
|
||||||
|
/// <returns>The number decimal digits.</returns>
|
||||||
|
private int findPrecision(decimal d)
|
||||||
|
{
|
||||||
|
int precision = 0;
|
||||||
|
while (d != Math.Round(d))
|
||||||
|
{
|
||||||
|
d *= 10;
|
||||||
|
precision++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return precision;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -433,7 +433,13 @@ namespace osu.Game.Overlays.Profile
|
|||||||
if (string.IsNullOrEmpty(str)) return;
|
if (string.IsNullOrEmpty(str)) return;
|
||||||
|
|
||||||
infoTextRight.AddIcon(icon);
|
infoTextRight.AddIcon(icon);
|
||||||
infoTextRight.AddLink(" " + str, url);
|
if (url != null)
|
||||||
|
{
|
||||||
|
infoTextRight.AddLink(" " + str, url);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
infoTextRight.AddText(" " + str);
|
||||||
|
}
|
||||||
infoTextRight.NewLine();
|
infoTextRight.NewLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -33,6 +33,11 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
LabelText = "Cursor Sensitivity",
|
LabelText = "Cursor Sensitivity",
|
||||||
Bindable = config.GetBindable<double>(FrameworkSetting.CursorSensitivity)
|
Bindable = config.GetBindable<double>(FrameworkSetting.CursorSensitivity)
|
||||||
},
|
},
|
||||||
|
new SettingsCheckbox
|
||||||
|
{
|
||||||
|
LabelText = "Map absolute input to window",
|
||||||
|
Bindable = config.GetBindable<bool>(FrameworkSetting.MapAbsoluteInputToWindow)
|
||||||
|
},
|
||||||
new SettingsEnumDropdown<ConfineMouseMode>
|
new SettingsEnumDropdown<ConfineMouseMode>
|
||||||
{
|
{
|
||||||
LabelText = "Confine mouse cursor to window",
|
LabelText = "Confine mouse cursor to window",
|
||||||
@ -88,6 +93,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
|
|||||||
// this bindable will still act as the "interactive" bindable displayed during a drag.
|
// this bindable will still act as the "interactive" bindable displayed during a drag.
|
||||||
base.Bindable = new BindableDouble(doubleValue.Value)
|
base.Bindable = new BindableDouble(doubleValue.Value)
|
||||||
{
|
{
|
||||||
|
Default = doubleValue.Default,
|
||||||
MinValue = doubleValue.MinValue,
|
MinValue = doubleValue.MinValue,
|
||||||
MaxValue = doubleValue.MaxValue
|
MaxValue = doubleValue.MaxValue
|
||||||
};
|
};
|
||||||
|
@ -7,7 +7,6 @@ using OpenTK.Graphics;
|
|||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Colour;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Cursor;
|
using osu.Framework.Graphics.Cursor;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
@ -16,6 +15,7 @@ using osu.Framework.Graphics.UserInterface;
|
|||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Settings
|
namespace osu.Game.Overlays.Settings
|
||||||
{
|
{
|
||||||
@ -33,22 +33,10 @@ namespace osu.Game.Overlays.Settings
|
|||||||
|
|
||||||
private SpriteText text;
|
private SpriteText text;
|
||||||
|
|
||||||
private readonly RestoreDefaultValueButton restoreDefaultValueButton = new RestoreDefaultValueButton();
|
private readonly RestoreDefaultValueButton restoreDefaultButton;
|
||||||
|
|
||||||
public bool ShowsDefaultIndicator = true;
|
public bool ShowsDefaultIndicator = true;
|
||||||
|
|
||||||
private Color4? restoreDefaultValueColour;
|
|
||||||
|
|
||||||
public Color4 RestoreDefaultValueColour
|
|
||||||
{
|
|
||||||
get { return restoreDefaultValueColour ?? Color4.White; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
restoreDefaultValueColour = value;
|
|
||||||
restoreDefaultValueButton?.SetButtonColour(RestoreDefaultValueColour);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual string LabelText
|
public virtual string LabelText
|
||||||
{
|
{
|
||||||
get { return text?.Text ?? string.Empty; }
|
get { return text?.Text ?? string.Empty; }
|
||||||
@ -69,10 +57,7 @@ namespace osu.Game.Overlays.Settings
|
|||||||
|
|
||||||
public virtual Bindable<T> Bindable
|
public virtual Bindable<T> Bindable
|
||||||
{
|
{
|
||||||
get
|
get { return bindable; }
|
||||||
{
|
|
||||||
return bindable;
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
@ -80,8 +65,8 @@ namespace osu.Game.Overlays.Settings
|
|||||||
controlWithCurrent?.Current.BindTo(bindable);
|
controlWithCurrent?.Current.BindTo(bindable);
|
||||||
if (ShowsDefaultIndicator)
|
if (ShowsDefaultIndicator)
|
||||||
{
|
{
|
||||||
restoreDefaultValueButton.Bindable = bindable.GetBoundCopy();
|
restoreDefaultButton.Bindable = bindable.GetBoundCopy();
|
||||||
restoreDefaultValueButton.Bindable.TriggerChange();
|
restoreDefaultButton.Bindable.TriggerChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,38 +88,30 @@ namespace osu.Game.Overlays.Settings
|
|||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
Padding = new MarginPadding { Right = SettingsOverlay.CONTENT_MARGINS };
|
Padding = new MarginPadding { Right = SettingsOverlay.CONTENT_MARGINS };
|
||||||
|
|
||||||
FlowContent = new FillFlowContainer
|
InternalChildren = new Drawable[]
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
restoreDefaultButton = new RestoreDefaultValueButton(),
|
||||||
AutoSizeAxes = Axes.Y,
|
FlowContent = new FillFlowContainer
|
||||||
Padding = new MarginPadding { Left = SettingsOverlay.CONTENT_MARGINS, Right = 5 },
|
{
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
|
Padding = new MarginPadding { Left = SettingsOverlay.CONTENT_MARGINS },
|
||||||
|
Child = Control = CreateControl()
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if ((Control = CreateControl()) != null)
|
|
||||||
{
|
|
||||||
if (controlWithCurrent != null)
|
|
||||||
controlWithCurrent.Current.DisabledChanged += disabled => { Colour = disabled ? Color4.Gray : Color4.White; };
|
|
||||||
FlowContent.Add(Control);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colours)
|
private void load()
|
||||||
{
|
{
|
||||||
AddInternal(FlowContent);
|
if (controlWithCurrent != null)
|
||||||
|
controlWithCurrent.Current.DisabledChanged += disabled => { Colour = disabled ? Color4.Gray : Color4.White; };
|
||||||
if (restoreDefaultValueButton != null)
|
|
||||||
{
|
|
||||||
if (!restoreDefaultValueColour.HasValue)
|
|
||||||
restoreDefaultValueColour = colours.Yellow;
|
|
||||||
restoreDefaultValueButton.SetButtonColour(RestoreDefaultValueColour);
|
|
||||||
AddInternal(restoreDefaultValueButton);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class RestoreDefaultValueButton : Box, IHasTooltip
|
private class RestoreDefaultValueButton : Container, IHasTooltip
|
||||||
{
|
{
|
||||||
private Bindable<T> bindable;
|
private Bindable<T> bindable;
|
||||||
|
|
||||||
public Bindable<T> Bindable
|
public Bindable<T> Bindable
|
||||||
{
|
{
|
||||||
get { return bindable; }
|
get { return bindable; }
|
||||||
@ -157,6 +134,36 @@ namespace osu.Game.Overlays.Settings
|
|||||||
Alpha = 0f;
|
Alpha = 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour colour)
|
||||||
|
{
|
||||||
|
buttonColour = colour.Yellow;
|
||||||
|
|
||||||
|
Child = new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
CornerRadius = 3,
|
||||||
|
Masking = true,
|
||||||
|
Colour = buttonColour,
|
||||||
|
EdgeEffect = new EdgeEffectParameters
|
||||||
|
{
|
||||||
|
Colour = buttonColour.Opacity(0.1f),
|
||||||
|
Type = EdgeEffectType.Glow,
|
||||||
|
Radius = 2,
|
||||||
|
},
|
||||||
|
Size = new Vector2(0.33f, 0.8f),
|
||||||
|
Child = new Box { RelativeSizeAxes = Axes.Both },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
UpdateState();
|
||||||
|
}
|
||||||
|
|
||||||
public string TooltipText => "Revert to default";
|
public string TooltipText => "Revert to default";
|
||||||
|
|
||||||
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
|
protected override bool OnMouseDown(InputState state, MouseDownEventArgs args) => true;
|
||||||
@ -174,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)
|
||||||
@ -193,9 +200,10 @@ namespace osu.Game.Overlays.Settings
|
|||||||
{
|
{
|
||||||
if (bindable == null)
|
if (bindable == null)
|
||||||
return;
|
return;
|
||||||
var colour = bindable.Disabled ? Color4.Gray : buttonColour;
|
|
||||||
this.FadeTo(bindable.IsDefault ? 0f : hovering && !bindable.Disabled ? 1f : 0.5f, 200, Easing.OutQuint);
|
this.FadeTo(bindable.IsDefault ? 0f :
|
||||||
this.FadeColour(ColourInfo.GradientHorizontal(colour.Opacity(0.8f), colour.Opacity(0)), 200, Easing.OutQuint);
|
hovering && !bindable.Disabled ? 1f : 0.65f, 200, Easing.OutQuint);
|
||||||
|
this.FadeColour(bindable.Disabled ? Color4.Gray : buttonColour, 200, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ namespace osu.Game.Overlays
|
|||||||
{
|
{
|
||||||
public abstract class SettingsOverlay : OsuFocusedOverlayContainer
|
public abstract class SettingsOverlay : OsuFocusedOverlayContainer
|
||||||
{
|
{
|
||||||
public const float CONTENT_MARGINS = 10;
|
public const float CONTENT_MARGINS = 15;
|
||||||
|
|
||||||
public const float TRANSITION_LENGTH = 600;
|
public const float TRANSITION_LENGTH = 600;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,6 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.CentreRight,
|
Anchor = Anchor.CentreRight,
|
||||||
Origin = Anchor.CentreRight,
|
Origin = Anchor.CentreRight,
|
||||||
Text = "1x",
|
|
||||||
Font = @"Exo2.0-Bold",
|
Font = @"Exo2.0-Bold",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -54,12 +53,13 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
Default = 1,
|
Default = 1,
|
||||||
MinValue = 0.5,
|
MinValue = 0.5,
|
||||||
MaxValue = 2,
|
MaxValue = 2,
|
||||||
Precision = 0.01,
|
Precision = 0.1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
sliderbar.Bindable.ValueChanged += rateMultiplier => multiplierText.Text = $"{rateMultiplier}x";
|
sliderbar.Bindable.ValueChanged += rateMultiplier => multiplierText.Text = $"{sliderbar.Bar.TooltipText}x";
|
||||||
|
sliderbar.Bindable.TriggerChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
|
@ -13,6 +13,8 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
public class PlayerSliderBar<T> : SettingsSlider<T>
|
public class PlayerSliderBar<T> : SettingsSlider<T>
|
||||||
where T : struct, IEquatable<T>, IComparable, IConvertible
|
where T : struct, IEquatable<T>, IComparable, IConvertible
|
||||||
{
|
{
|
||||||
|
public OsuSliderBar<T> Bar => (OsuSliderBar<T>)Control;
|
||||||
|
|
||||||
protected override Drawable CreateControl() => new Sliderbar
|
protected override Drawable CreateControl() => new Sliderbar
|
||||||
{
|
{
|
||||||
Margin = new MarginPadding { Top = 5, Bottom = 5 },
|
Margin = new MarginPadding { Top = 5, Bottom = 5 },
|
||||||
@ -21,8 +23,6 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
|
|
||||||
private class Sliderbar : OsuSliderBar<T>
|
private class Sliderbar : OsuSliderBar<T>
|
||||||
{
|
{
|
||||||
public override string TooltipText => $"{CurrentNumber.Value}";
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colours)
|
private void load(OsuColour colours)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
@ -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")]
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@
|
|||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
<HintPath>$(SolutionDir)\packages\ppy.OpenTK.3.0.11\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="Remotion.Linq, Version=2.1.0.0, Culture=neutral, PublicKeyToken=fee00910d6e5f53b, processorArchitecture=MSIL">
|
<Reference Include="Remotion.Linq, Version=2.1.0.0, Culture=neutral, PublicKeyToken=fee00910d6e5f53b, processorArchitecture=MSIL">
|
||||||
|
@ -67,7 +67,7 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
|
|||||||
<package id="Microsoft.Extensions.Primitives" version="2.0.0" targetFramework="net461" />
|
<package id="Microsoft.Extensions.Primitives" version="2.0.0" targetFramework="net461" />
|
||||||
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net461" />
|
<package id="Newtonsoft.Json" version="10.0.3" 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.11" targetFramework="net461" />
|
<package id="ppy.OpenTK" version="3.0.13" targetFramework="net461" />
|
||||||
<package id="Remotion.Linq" version="2.1.2" targetFramework="net461" />
|
<package id="Remotion.Linq" version="2.1.2" targetFramework="net461" />
|
||||||
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
<package id="SharpCompress" version="0.18.1" targetFramework="net461" />
|
||||||
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
|
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="net461" />
|
||||||
|
Reference in New Issue
Block a user