mirror of
https://github.com/osukey/osukey.git
synced 2025-08-08 00:53:56 +09:00
Merge branch 'master' into user-class-cleanup
This commit is contained in:
@ -52,7 +52,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2021.1104.0" />
|
<PackageReference Include="ppy.osu.Framework.Android" Version="2021.1106.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Transitive Dependencies">
|
<ItemGroup Label="Transitive Dependencies">
|
||||||
<!-- Realm needs to be directly referenced in all Xamarin projects, as it will not pull in its transitive dependencies otherwise. -->
|
<!-- Realm needs to be directly referenced in all Xamarin projects, as it will not pull in its transitive dependencies otherwise. -->
|
||||||
|
@ -86,20 +86,18 @@ namespace osu.Game.Rulesets.Mania.Skinning.Default
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
InternalChild = foregroundBuffer = new BufferedContainer
|
InternalChild = foregroundBuffer = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
Blending = BlendingParameters.Additive,
|
Blending = BlendingParameters.Additive,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new Box { RelativeSizeAxes = Axes.Both },
|
new Box { RelativeSizeAxes = Axes.Both },
|
||||||
subtractionBuffer = new BufferedContainer
|
subtractionBuffer = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
// This is needed because we're blending with another object
|
// This is needed because we're blending with another object
|
||||||
BackgroundColour = Color4.White.Opacity(0),
|
BackgroundColour = Color4.White.Opacity(0),
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
// The 'hole' is achieved by subtracting the result of this container with the parent
|
// The 'hole' is achieved by subtracting the result of this container with the parent
|
||||||
Blending = new BlendingParameters { AlphaEquation = BlendingEquation.ReverseSubtract },
|
Blending = new BlendingParameters { AlphaEquation = BlendingEquation.ReverseSubtract },
|
||||||
Child = subtractionLayer = new CircularContainer
|
Child = subtractionLayer = new CircularContainer
|
||||||
|
@ -15,13 +15,13 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
{
|
{
|
||||||
protected override string ResourceAssembly => "osu.Game.Rulesets.Osu";
|
protected override string ResourceAssembly => "osu.Game.Rulesets.Osu";
|
||||||
|
|
||||||
[TestCase(6.5295339534769958d, "diffcalc-test")]
|
[TestCase(6.6975550434910005d, "diffcalc-test")]
|
||||||
[TestCase(1.1514260533755143d, "zero-length-sliders")]
|
[TestCase(1.4673500058356748d, "zero-length-sliders")]
|
||||||
public void Test(double expected, string name)
|
public void Test(double expected, string name)
|
||||||
=> base.Test(expected, name);
|
=> base.Test(expected, name);
|
||||||
|
|
||||||
[TestCase(9.047752485219954d, "diffcalc-test")]
|
[TestCase(8.938989502378238d, "diffcalc-test")]
|
||||||
[TestCase(1.3985711787077566d, "zero-length-sliders")]
|
[TestCase(1.779323508403831d, "zero-length-sliders")]
|
||||||
public void TestClockRateAdjusted(double expected, string name)
|
public void TestClockRateAdjusted(double expected, string name)
|
||||||
=> Test(expected, name, new OsuModDoubleTime());
|
=> Test(expected, name, new OsuModDoubleTime());
|
||||||
|
|
||||||
|
@ -54,7 +54,9 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
|
|
||||||
if (mods.Any(h => h is OsuModRelax))
|
if (mods.Any(h => h is OsuModRelax))
|
||||||
{
|
{
|
||||||
effectiveMissCount += countOk + countMeh;
|
// As we're adding Oks and Mehs to an approximated number of combo breaks the result can be higher than total hits in specific scenarios (which breaks some calculations) so we need to clamp it.
|
||||||
|
effectiveMissCount = Math.Min(effectiveMissCount + countOk + countMeh, totalHits);
|
||||||
|
|
||||||
multiplier *= 0.6;
|
multiplier *= 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,13 +111,11 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
|
|
||||||
double approachRateFactor = 0.0;
|
double approachRateFactor = 0.0;
|
||||||
if (Attributes.ApproachRate > 10.33)
|
if (Attributes.ApproachRate > 10.33)
|
||||||
approachRateFactor = Attributes.ApproachRate - 10.33;
|
approachRateFactor = 0.3 * (Attributes.ApproachRate - 10.33);
|
||||||
else if (Attributes.ApproachRate < 8.0)
|
else if (Attributes.ApproachRate < 8.0)
|
||||||
approachRateFactor = 0.025 * (8.0 - Attributes.ApproachRate);
|
approachRateFactor = 0.1 * (8.0 - Attributes.ApproachRate);
|
||||||
|
|
||||||
double approachRateTotalHitsFactor = 1.0 / (1.0 + Math.Exp(-(0.007 * (totalHits - 400))));
|
aimValue *= 1.0 + approachRateFactor * lengthBonus; // Buff for longer maps with high AR.
|
||||||
|
|
||||||
double approachRateBonus = 1.0 + (0.03 + 0.37 * approachRateTotalHitsFactor) * approachRateFactor;
|
|
||||||
|
|
||||||
if (mods.Any(m => m is OsuModBlinds))
|
if (mods.Any(m => m is OsuModBlinds))
|
||||||
aimValue *= 1.3 + (totalHits * (0.0016 / (1 + 2 * effectiveMissCount)) * Math.Pow(accuracy, 16)) * (1 - 0.003 * Attributes.DrainRate * Attributes.DrainRate);
|
aimValue *= 1.3 + (totalHits * (0.0016 / (1 + 2 * effectiveMissCount)) * Math.Pow(accuracy, 16)) * (1 - 0.003 * Attributes.DrainRate * Attributes.DrainRate);
|
||||||
@ -125,10 +125,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
aimValue *= 1.0 + 0.04 * (12.0 - Attributes.ApproachRate);
|
aimValue *= 1.0 + 0.04 * (12.0 - Attributes.ApproachRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
aimValue *= approachRateBonus;
|
aimValue *= accuracy;
|
||||||
|
|
||||||
// Scale the aim value with accuracy _slightly_.
|
|
||||||
aimValue *= 0.5 + accuracy / 2.0;
|
|
||||||
// It is important to also consider accuracy difficulty when doing that.
|
// It is important to also consider accuracy difficulty when doing that.
|
||||||
aimValue *= 0.98 + Math.Pow(Attributes.OverallDifficulty, 2) / 2500;
|
aimValue *= 0.98 + Math.Pow(Attributes.OverallDifficulty, 2) / 2500;
|
||||||
|
|
||||||
@ -154,11 +151,9 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
|
|
||||||
double approachRateFactor = 0.0;
|
double approachRateFactor = 0.0;
|
||||||
if (Attributes.ApproachRate > 10.33)
|
if (Attributes.ApproachRate > 10.33)
|
||||||
approachRateFactor = Attributes.ApproachRate - 10.33;
|
approachRateFactor = 0.3 * (Attributes.ApproachRate - 10.33);
|
||||||
|
|
||||||
double approachRateTotalHitsFactor = 1.0 / (1.0 + Math.Exp(-(0.007 * (totalHits - 400))));
|
speedValue *= 1.0 + approachRateFactor * lengthBonus; // Buff for longer maps with high AR.
|
||||||
|
|
||||||
speedValue *= 1.0 + (0.03 + 0.37 * approachRateTotalHitsFactor) * approachRateFactor;
|
|
||||||
|
|
||||||
if (mods.Any(m => m is OsuModBlinds))
|
if (mods.Any(m => m is OsuModBlinds))
|
||||||
{
|
{
|
||||||
@ -255,7 +250,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
|
|
||||||
private int calculateEffectiveMissCount()
|
private int calculateEffectiveMissCount()
|
||||||
{
|
{
|
||||||
// guess the number of misses + slider breaks from combo
|
// Guess the number of misses + slider breaks from combo
|
||||||
double comboBasedMissCount = 0.0;
|
double comboBasedMissCount = 0.0;
|
||||||
|
|
||||||
if (Attributes.SliderCount > 0)
|
if (Attributes.SliderCount > 0)
|
||||||
@ -265,7 +260,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty
|
|||||||
comboBasedMissCount = fullComboThreshold / Math.Max(1.0, scoreMaxCombo);
|
comboBasedMissCount = fullComboThreshold / Math.Max(1.0, scoreMaxCombo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// we're clamping misscount because since its derived from combo it can be higher than total hits and that breaks some calculations
|
// Clamp misscount since it's derived from combo and can be higher than total hits and that breaks some calculations
|
||||||
comboBasedMissCount = Math.Min(comboBasedMissCount, totalHits);
|
comboBasedMissCount = Math.Min(comboBasedMissCount, totalHits);
|
||||||
|
|
||||||
return Math.Max(countMiss, (int)Math.Floor(comboBasedMissCount));
|
return Math.Max(countMiss, (int)Math.Floor(comboBasedMissCount));
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using osu.Game.Rulesets.Difficulty.Preprocessing;
|
using osu.Game.Rulesets.Difficulty.Preprocessing;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
@ -14,6 +13,8 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
|
|||||||
{
|
{
|
||||||
private const int normalized_radius = 50; // Change radius to 50 to make 100 the diameter. Easier for mental maths.
|
private const int normalized_radius = 50; // Change radius to 50 to make 100 the diameter. Easier for mental maths.
|
||||||
private const int min_delta_time = 25;
|
private const int min_delta_time = 25;
|
||||||
|
private const float maximum_slider_radius = normalized_radius * 2.4f;
|
||||||
|
private const float assumed_slider_radius = normalized_radius * 1.65f;
|
||||||
|
|
||||||
protected new OsuHitObject BaseObject => (OsuHitObject)base.BaseObject;
|
protected new OsuHitObject BaseObject => (OsuHitObject)base.BaseObject;
|
||||||
|
|
||||||
@ -89,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
|
|||||||
if (lastObject is Slider lastSlider)
|
if (lastObject is Slider lastSlider)
|
||||||
{
|
{
|
||||||
computeSliderCursorPosition(lastSlider);
|
computeSliderCursorPosition(lastSlider);
|
||||||
TravelDistance = lastSlider.LazyTravelDistance * scalingFactor;
|
TravelDistance = lastSlider.LazyTravelDistance;
|
||||||
TravelTime = Math.Max(lastSlider.LazyTravelTime / clockRate, min_delta_time);
|
TravelTime = Math.Max(lastSlider.LazyTravelTime / clockRate, min_delta_time);
|
||||||
MovementTime = Math.Max(StrainTime - TravelTime, min_delta_time);
|
MovementTime = Math.Max(StrainTime - TravelTime, min_delta_time);
|
||||||
|
|
||||||
@ -99,7 +100,9 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
|
|||||||
// For hitobjects which continue in the direction of the slider, the player will normally follow through the slider,
|
// For hitobjects which continue in the direction of the slider, the player will normally follow through the slider,
|
||||||
// such that they're not jumping from the lazy position but rather from very close to (or the end of) the slider.
|
// such that they're not jumping from the lazy position but rather from very close to (or the end of) the slider.
|
||||||
// In such cases, a leniency is applied by also considering the jump distance from the tail of the slider, and taking the minimum jump distance.
|
// In such cases, a leniency is applied by also considering the jump distance from the tail of the slider, and taking the minimum jump distance.
|
||||||
MovementDistance = Math.Min(JumpDistance, tailJumpDistance);
|
// Additional distance is removed based on position of jump relative to slider follow circle radius.
|
||||||
|
// JumpDistance is the leniency distance beyond the assumed_slider_radius. tailJumpDistance is maximum_slider_radius since the full distance of radial leniency is still possible.
|
||||||
|
MovementDistance = Math.Max(0, Math.Min(JumpDistance - (maximum_slider_radius - assumed_slider_radius), tailJumpDistance - maximum_slider_radius));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -126,37 +129,60 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
|
|||||||
if (slider.LazyEndPosition != null)
|
if (slider.LazyEndPosition != null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
slider.LazyEndPosition = slider.StackedPosition;
|
slider.LazyTravelTime = slider.NestedHitObjects[^1].StartTime - slider.StartTime;
|
||||||
|
|
||||||
float followCircleRadius = (float)(slider.Radius * 2.4);
|
double endTimeMin = slider.LazyTravelTime / slider.SpanDuration;
|
||||||
var computeVertex = new Action<double>(t =>
|
if (endTimeMin % 2 >= 1)
|
||||||
|
endTimeMin = 1 - endTimeMin % 1;
|
||||||
|
else
|
||||||
|
endTimeMin %= 1;
|
||||||
|
|
||||||
|
slider.LazyEndPosition = slider.StackedPosition + slider.Path.PositionAt(endTimeMin); // temporary lazy end position until a real result can be derived.
|
||||||
|
var currCursorPosition = slider.StackedPosition;
|
||||||
|
double scalingFactor = normalized_radius / slider.Radius; // lazySliderDistance is coded to be sensitive to scaling, this makes the maths easier with the thresholds being used.
|
||||||
|
|
||||||
|
for (int i = 1; i < slider.NestedHitObjects.Count; i++)
|
||||||
{
|
{
|
||||||
double progress = (t - slider.StartTime) / slider.SpanDuration;
|
var currMovementObj = (OsuHitObject)slider.NestedHitObjects[i];
|
||||||
if (progress % 2 >= 1)
|
|
||||||
progress = 1 - progress % 1;
|
|
||||||
else
|
|
||||||
progress %= 1;
|
|
||||||
|
|
||||||
// ReSharper disable once PossibleInvalidOperationException (bugged in current r# version)
|
Vector2 currMovement = Vector2.Subtract(currMovementObj.StackedPosition, currCursorPosition);
|
||||||
var diff = slider.StackedPosition + slider.Path.PositionAt(progress) - slider.LazyEndPosition.Value;
|
double currMovementLength = scalingFactor * currMovement.Length;
|
||||||
float dist = diff.Length;
|
|
||||||
|
|
||||||
slider.LazyTravelTime = t - slider.StartTime;
|
// Amount of movement required so that the cursor position needs to be updated.
|
||||||
|
double requiredMovement = assumed_slider_radius;
|
||||||
|
|
||||||
if (dist > followCircleRadius)
|
if (i == slider.NestedHitObjects.Count - 1)
|
||||||
{
|
{
|
||||||
// The cursor would be outside the follow circle, we need to move it
|
// The end of a slider has special aim rules due to the relaxed time constraint on position.
|
||||||
diff.Normalize(); // Obtain direction of diff
|
// There is both a lazy end position as well as the actual end slider position. We assume the player takes the simpler movement.
|
||||||
dist -= followCircleRadius;
|
// For sliders that are circular, the lazy end position may actually be farther away than the sliders true end.
|
||||||
slider.LazyEndPosition += diff * dist;
|
// This code is designed to prevent buffing situations where lazy end is actually a less efficient movement.
|
||||||
slider.LazyTravelDistance += dist;
|
Vector2 lazyMovement = Vector2.Subtract((Vector2)slider.LazyEndPosition, currCursorPosition);
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Skip the head circle
|
if (lazyMovement.Length < currMovement.Length)
|
||||||
var scoringTimes = slider.NestedHitObjects.Skip(1).Select(t => t.StartTime);
|
currMovement = lazyMovement;
|
||||||
foreach (double time in scoringTimes)
|
|
||||||
computeVertex(time);
|
currMovementLength = scalingFactor * currMovement.Length;
|
||||||
|
}
|
||||||
|
else if (currMovementObj is SliderRepeat)
|
||||||
|
{
|
||||||
|
// For a slider repeat, assume a tighter movement threshold to better assess repeat sliders.
|
||||||
|
requiredMovement = normalized_radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currMovementLength > requiredMovement)
|
||||||
|
{
|
||||||
|
// this finds the positional delta from the required radius and the current position, and updates the currCursorPosition accordingly, as well as rewarding distance.
|
||||||
|
currCursorPosition = Vector2.Add(currCursorPosition, Vector2.Multiply(currMovement, (float)((currMovementLength - requiredMovement) / currMovementLength)));
|
||||||
|
currMovementLength *= (currMovementLength - requiredMovement) / currMovementLength;
|
||||||
|
slider.LazyTravelDistance += (float)currMovementLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == slider.NestedHitObjects.Count - 1)
|
||||||
|
slider.LazyEndPosition = currCursorPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
slider.LazyTravelDistance *= (float)Math.Pow(1 + slider.RepeatCount / 2.5, 1.0 / 2.5); // Bonus for repeat sliders until a better per nested object strain system can be achieved.
|
||||||
}
|
}
|
||||||
|
|
||||||
private Vector2 getEndCursorPosition(OsuHitObject hitObject)
|
private Vector2 getEndCursorPosition(OsuHitObject hitObject)
|
||||||
|
@ -23,6 +23,8 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
|
|||||||
|
|
||||||
private const double wide_angle_multiplier = 1.5;
|
private const double wide_angle_multiplier = 1.5;
|
||||||
private const double acute_angle_multiplier = 2.0;
|
private const double acute_angle_multiplier = 2.0;
|
||||||
|
private const double slider_multiplier = 1.5;
|
||||||
|
private const double velocity_change_multiplier = 0.75;
|
||||||
|
|
||||||
private double currentStrain = 1;
|
private double currentStrain = 1;
|
||||||
|
|
||||||
@ -61,7 +63,11 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
|
|||||||
prevVelocity = Math.Max(prevVelocity, movementVelocity + travelVelocity);
|
prevVelocity = Math.Max(prevVelocity, movementVelocity + travelVelocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
double angleBonus = 0;
|
double wideAngleBonus = 0;
|
||||||
|
double acuteAngleBonus = 0;
|
||||||
|
double sliderBonus = 0;
|
||||||
|
double velocityChangeBonus = 0;
|
||||||
|
|
||||||
double aimStrain = currVelocity; // Start strain with regular velocity.
|
double aimStrain = currVelocity; // Start strain with regular velocity.
|
||||||
|
|
||||||
if (Math.Max(osuCurrObj.StrainTime, osuLastObj.StrainTime) < 1.25 * Math.Min(osuCurrObj.StrainTime, osuLastObj.StrainTime)) // If rhythms are the same.
|
if (Math.Max(osuCurrObj.StrainTime, osuLastObj.StrainTime) < 1.25 * Math.Min(osuCurrObj.StrainTime, osuLastObj.StrainTime)) // If rhythms are the same.
|
||||||
@ -73,10 +79,10 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
|
|||||||
double lastLastAngle = osuLastLastObj.Angle.Value;
|
double lastLastAngle = osuLastLastObj.Angle.Value;
|
||||||
|
|
||||||
// Rewarding angles, take the smaller velocity as base.
|
// Rewarding angles, take the smaller velocity as base.
|
||||||
angleBonus = Math.Min(currVelocity, prevVelocity);
|
double angleBonus = Math.Min(currVelocity, prevVelocity);
|
||||||
|
|
||||||
double wideAngleBonus = calcWideAngleBonus(currAngle);
|
wideAngleBonus = calcWideAngleBonus(currAngle);
|
||||||
double acuteAngleBonus = calcAcuteAngleBonus(currAngle);
|
acuteAngleBonus = calcAcuteAngleBonus(currAngle);
|
||||||
|
|
||||||
if (osuCurrObj.StrainTime > 100) // Only buff deltaTime exceeding 300 bpm 1/2.
|
if (osuCurrObj.StrainTime > 100) // Only buff deltaTime exceeding 300 bpm 1/2.
|
||||||
acuteAngleBonus = 0;
|
acuteAngleBonus = 0;
|
||||||
@ -88,14 +94,48 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
|
|||||||
* Math.Pow(Math.Sin(Math.PI / 2 * (Math.Clamp(osuCurrObj.JumpDistance, 50, 100) - 50) / 50), 2); // Buff distance exceeding 50 (radius) up to 100 (diameter).
|
* Math.Pow(Math.Sin(Math.PI / 2 * (Math.Clamp(osuCurrObj.JumpDistance, 50, 100) - 50) / 50), 2); // Buff distance exceeding 50 (radius) up to 100 (diameter).
|
||||||
}
|
}
|
||||||
|
|
||||||
wideAngleBonus *= angleBonus * (1 - Math.Min(wideAngleBonus, Math.Pow(calcWideAngleBonus(lastAngle), 3))); // Penalize wide angles if they're repeated, reducing the penalty as the lastAngle gets more acute.
|
// Penalize wide angles if they're repeated, reducing the penalty as the lastAngle gets more acute.
|
||||||
acuteAngleBonus *= 0.5 + 0.5 * (1 - Math.Min(acuteAngleBonus, Math.Pow(calcAcuteAngleBonus(lastLastAngle), 3))); // Penalize acute angles if they're repeated, reducing the penalty as the lastLastAngle gets more obtuse.
|
wideAngleBonus *= angleBonus * (1 - Math.Min(wideAngleBonus, Math.Pow(calcWideAngleBonus(lastAngle), 3)));
|
||||||
|
// Penalize acute angles if they're repeated, reducing the penalty as the lastLastAngle gets more obtuse.
|
||||||
angleBonus = acuteAngleBonus * acute_angle_multiplier + wideAngleBonus * wide_angle_multiplier; // add the angle buffs together.
|
acuteAngleBonus *= 0.5 + 0.5 * (1 - Math.Min(acuteAngleBonus, Math.Pow(calcAcuteAngleBonus(lastLastAngle), 3)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
aimStrain += angleBonus; // Add in angle bonus.
|
if (Math.Max(prevVelocity, currVelocity) != 0)
|
||||||
|
{
|
||||||
|
// We want to use the average velocity over the whole object when awarding differences, not the individual jump and slider path velocities.
|
||||||
|
prevVelocity = (osuLastObj.JumpDistance + osuLastObj.TravelDistance) / osuLastObj.StrainTime;
|
||||||
|
currVelocity = (osuCurrObj.JumpDistance + osuCurrObj.TravelDistance) / osuCurrObj.StrainTime;
|
||||||
|
|
||||||
|
// Scale with ratio of difference compared to 0.5 * max dist.
|
||||||
|
double distRatio = Math.Pow(Math.Sin(Math.PI / 2 * Math.Abs(prevVelocity - currVelocity) / Math.Max(prevVelocity, currVelocity)), 2);
|
||||||
|
|
||||||
|
// Reward for % distance up to 125 / strainTime for overlaps where velocity is still changing.
|
||||||
|
double overlapVelocityBuff = Math.Min(125 / Math.Min(osuCurrObj.StrainTime, osuLastObj.StrainTime), Math.Abs(prevVelocity - currVelocity));
|
||||||
|
|
||||||
|
// Reward for % distance slowed down compared to previous, paying attention to not award overlap
|
||||||
|
double nonOverlapVelocityBuff = Math.Abs(prevVelocity - currVelocity)
|
||||||
|
// do not award overlap
|
||||||
|
* Math.Pow(Math.Sin(Math.PI / 2 * Math.Min(1, Math.Min(osuCurrObj.JumpDistance, osuLastObj.JumpDistance) / 100)), 2);
|
||||||
|
|
||||||
|
// Choose the largest bonus, multiplied by ratio.
|
||||||
|
velocityChangeBonus = Math.Max(overlapVelocityBuff, nonOverlapVelocityBuff) * distRatio;
|
||||||
|
|
||||||
|
// Penalize for rhythm changes.
|
||||||
|
velocityChangeBonus *= Math.Pow(Math.Min(osuCurrObj.StrainTime, osuLastObj.StrainTime) / Math.Max(osuCurrObj.StrainTime, osuLastObj.StrainTime), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (osuCurrObj.TravelTime != 0)
|
||||||
|
{
|
||||||
|
// Reward sliders based on velocity.
|
||||||
|
sliderBonus = osuCurrObj.TravelDistance / osuCurrObj.TravelTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add in acute angle bonus or wide angle bonus + velocity change bonus, whichever is larger.
|
||||||
|
aimStrain += Math.Max(acuteAngleBonus * acute_angle_multiplier, wideAngleBonus * wide_angle_multiplier + velocityChangeBonus * velocity_change_multiplier);
|
||||||
|
|
||||||
|
// Add in additional slider velocity bonus.
|
||||||
|
aimStrain += sliderBonus * slider_multiplier;
|
||||||
|
|
||||||
return aimStrain;
|
return aimStrain;
|
||||||
}
|
}
|
||||||
|
@ -136,10 +136,9 @@ namespace osu.Game.Rulesets.Osu.Statistics
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
bufferedGrid = new BufferedContainer
|
bufferedGrid = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
BackgroundColour = Color4Extensions.FromHex("#202624").Opacity(0),
|
BackgroundColour = Color4Extensions.FromHex("#202624").Opacity(0),
|
||||||
Child = pointGrid = new GridContainer
|
Child = pointGrid = new GridContainer
|
||||||
{
|
{
|
||||||
|
@ -105,6 +105,9 @@ namespace osu.Game.Tests.Mods
|
|||||||
testMod.ResetSettingsToDefaults();
|
testMod.ResetSettingsToDefaults();
|
||||||
|
|
||||||
Assert.That(testMod.DrainRate.Value, Is.Null);
|
Assert.That(testMod.DrainRate.Value, Is.Null);
|
||||||
|
|
||||||
|
// ReSharper disable once HeuristicUnreachableCode
|
||||||
|
// see https://youtrack.jetbrains.com/issue/RIDER-70159.
|
||||||
Assert.That(testMod.OverallDifficulty.Value, Is.Null);
|
Assert.That(testMod.OverallDifficulty.Value, Is.Null);
|
||||||
|
|
||||||
var applied = applyDifficulty(new BeatmapDifficulty
|
var applied = applyDifficulty(new BeatmapDifficulty
|
||||||
|
@ -79,8 +79,17 @@ namespace osu.Game.Tests.NonVisual
|
|||||||
public List<HitObject> HitObjects;
|
public List<HitObject> HitObjects;
|
||||||
public override IEnumerable<HitObject> Objects => HitObjects;
|
public override IEnumerable<HitObject> Objects => HitObjects;
|
||||||
|
|
||||||
public override event Action<JudgementResult> NewResult;
|
public override event Action<JudgementResult> NewResult
|
||||||
public override event Action<JudgementResult> RevertResult;
|
{
|
||||||
|
add => throw new InvalidOperationException();
|
||||||
|
remove => throw new InvalidOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override event Action<JudgementResult> RevertResult
|
||||||
|
{
|
||||||
|
add => throw new InvalidOperationException();
|
||||||
|
remove => throw new InvalidOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
public override Playfield Playfield { get; }
|
public override Playfield Playfield { get; }
|
||||||
public override Container Overlays { get; }
|
public override Container Overlays { get; }
|
||||||
@ -95,9 +104,6 @@ namespace osu.Game.Tests.NonVisual
|
|||||||
public TestDrawableRuleset()
|
public TestDrawableRuleset()
|
||||||
: base(new OsuRuleset())
|
: base(new OsuRuleset())
|
||||||
{
|
{
|
||||||
// won't compile without this.
|
|
||||||
NewResult?.Invoke(null);
|
|
||||||
RevertResult?.Invoke(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetReplayScore(Score replayScore) => throw new NotImplementedException();
|
public override void SetReplayScore(Score replayScore) => throw new NotImplementedException();
|
||||||
|
@ -235,8 +235,17 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
|
|
||||||
public override IEnumerable<HitObject> Objects => new[] { new HitCircle { HitWindows = HitWindows } };
|
public override IEnumerable<HitObject> Objects => new[] { new HitCircle { HitWindows = HitWindows } };
|
||||||
|
|
||||||
public override event Action<JudgementResult> NewResult;
|
public override event Action<JudgementResult> NewResult
|
||||||
public override event Action<JudgementResult> RevertResult;
|
{
|
||||||
|
add => throw new InvalidOperationException();
|
||||||
|
remove => throw new InvalidOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override event Action<JudgementResult> RevertResult
|
||||||
|
{
|
||||||
|
add => throw new InvalidOperationException();
|
||||||
|
remove => throw new InvalidOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
public override Playfield Playfield { get; }
|
public override Playfield Playfield { get; }
|
||||||
public override Container Overlays { get; }
|
public override Container Overlays { get; }
|
||||||
@ -251,9 +260,6 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
public TestDrawableRuleset()
|
public TestDrawableRuleset()
|
||||||
: base(new OsuRuleset())
|
: base(new OsuRuleset())
|
||||||
{
|
{
|
||||||
// won't compile without this.
|
|
||||||
NewResult?.Invoke(null);
|
|
||||||
RevertResult?.Invoke(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetReplayScore(Score replayScore) => throw new NotImplementedException();
|
public override void SetReplayScore(Score replayScore) => throw new NotImplementedException();
|
||||||
|
@ -58,10 +58,9 @@ namespace osu.Game.Graphics.Backgrounds
|
|||||||
{
|
{
|
||||||
RemoveInternal(Sprite);
|
RemoveInternal(Sprite);
|
||||||
|
|
||||||
AddInternal(bufferedContainer = new BufferedContainer
|
AddInternal(bufferedContainer = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
RedrawOnScale = false,
|
RedrawOnScale = false,
|
||||||
Child = Sprite
|
Child = Sprite
|
||||||
});
|
});
|
||||||
|
@ -69,12 +69,11 @@ namespace osu.Game.Graphics.Sprites
|
|||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new BufferedContainer
|
new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
BlurSigma = new Vector2(4),
|
BlurSigma = new Vector2(4),
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
RedrawOnScale = false,
|
RedrawOnScale = false,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Blending = BlendingParameters.Additive,
|
Blending = BlendingParameters.Additive,
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
@ -22,15 +24,9 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
Enabled.Value = !isLoading;
|
Enabled.Value = !isLoading;
|
||||||
|
|
||||||
if (value)
|
if (value)
|
||||||
{
|
|
||||||
loading.Show();
|
loading.Show();
|
||||||
OnLoadStarted();
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
loading.Hide();
|
loading.Hide();
|
||||||
OnLoadFinished();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,18 +40,34 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
protected LoadingButton()
|
protected LoadingButton()
|
||||||
{
|
{
|
||||||
AddRange(new[]
|
Add(loading = new LoadingSpinner
|
||||||
{
|
{
|
||||||
CreateContent(),
|
Anchor = Anchor.Centre,
|
||||||
loading = new LoadingSpinner
|
Origin = Anchor.Centre,
|
||||||
{
|
Size = new Vector2(12),
|
||||||
Anchor = Anchor.Centre,
|
Depth = -1,
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Size = new Vector2(12)
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
Add(CreateContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
loading.State.BindValueChanged(s =>
|
||||||
|
{
|
||||||
|
if (s.NewValue == Visibility.Visible)
|
||||||
|
OnLoadStarted();
|
||||||
|
else
|
||||||
|
OnLoadFinished();
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
|
||||||
protected override bool OnClick(ClickEvent e)
|
protected override bool OnClick(ClickEvent e)
|
||||||
{
|
{
|
||||||
if (!Enabled.Value)
|
if (!Enabled.Value)
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using JetBrains.Annotations;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
@ -22,6 +23,11 @@ namespace osu.Game.Overlays.BeatmapListing
|
|||||||
|
|
||||||
public BeatmapSearchMultipleSelectionFilterRow(LocalisableString header)
|
public BeatmapSearchMultipleSelectionFilterRow(LocalisableString header)
|
||||||
: base(header)
|
: base(header)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
{
|
{
|
||||||
Current.BindTo(filter.Current);
|
Current.BindTo(filter.Current);
|
||||||
}
|
}
|
||||||
@ -31,6 +37,7 @@ namespace osu.Game.Overlays.BeatmapListing
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a filter control that can be used to simultaneously select multiple values of type <typeparamref name="T"/>.
|
/// Creates a filter control that can be used to simultaneously select multiple values of type <typeparamref name="T"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[NotNull]
|
||||||
protected virtual MultipleSelectionFilter CreateMultipleSelectionFilter() => new MultipleSelectionFilter();
|
protected virtual MultipleSelectionFilter CreateMultipleSelectionFilter() => new MultipleSelectionFilter();
|
||||||
|
|
||||||
protected class MultipleSelectionFilter : FillFlowContainer<MultipleSelectionFilterTabItem>
|
protected class MultipleSelectionFilter : FillFlowContainer<MultipleSelectionFilterTabItem>
|
||||||
|
@ -26,6 +26,8 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
|
|
||||||
public static LocalisableString ListingString => LayoutStrings.HeaderChangelogIndex;
|
public static LocalisableString ListingString => LayoutStrings.HeaderChangelogIndex;
|
||||||
|
|
||||||
|
private readonly Bindable<APIUpdateStream> currentStream = new Bindable<APIUpdateStream>();
|
||||||
|
|
||||||
private Box streamsBackground;
|
private Box streamsBackground;
|
||||||
|
|
||||||
public ChangelogHeader()
|
public ChangelogHeader()
|
||||||
@ -39,7 +41,7 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
|
|
||||||
Build.ValueChanged += showBuild;
|
Build.ValueChanged += showBuild;
|
||||||
|
|
||||||
Streams.Current.ValueChanged += e =>
|
currentStream.ValueChanged += e =>
|
||||||
{
|
{
|
||||||
if (e.NewValue?.LatestBuild != null && !e.NewValue.Equals(Build.Value?.UpdateStream))
|
if (e.NewValue?.LatestBuild != null && !e.NewValue.Equals(Build.Value?.UpdateStream))
|
||||||
Build.Value = e.NewValue.LatestBuild;
|
Build.Value = e.NewValue.LatestBuild;
|
||||||
@ -67,7 +69,7 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Current.Value = ListingString;
|
Current.Value = ListingString;
|
||||||
Streams.Current.Value = null;
|
currentStream.Value = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +94,7 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
Horizontal = 65,
|
Horizontal = 65,
|
||||||
Vertical = 20
|
Vertical = 20
|
||||||
},
|
},
|
||||||
Child = Streams = new ChangelogUpdateStreamControl()
|
Child = Streams = new ChangelogUpdateStreamControl { Current = currentStream },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -110,7 +112,7 @@ namespace osu.Game.Overlays.Changelog
|
|||||||
if (Build.Value == null)
|
if (Build.Value == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Streams.Current.Value = Streams.Items.FirstOrDefault(s => s.Name == Build.Value.UpdateStream.Name);
|
currentStream.Value = Streams.Items.FirstOrDefault(s => s.Name == Build.Value.UpdateStream.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ChangelogHeaderTitle : OverlayTitle
|
private class ChangelogHeaderTitle : OverlayTitle
|
||||||
|
@ -175,6 +175,8 @@ namespace osu.Game.Overlays.Comments
|
|||||||
|
|
||||||
protected override IEnumerable<Drawable> EffectTargets => new[] { background };
|
protected override IEnumerable<Drawable> EffectTargets => new[] { background };
|
||||||
|
|
||||||
|
private readonly string text;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private OverlayColourProvider colourProvider { get; set; }
|
private OverlayColourProvider colourProvider { get; set; }
|
||||||
|
|
||||||
@ -184,10 +186,10 @@ namespace osu.Game.Overlays.Comments
|
|||||||
|
|
||||||
public CommitButton(string text)
|
public CommitButton(string text)
|
||||||
{
|
{
|
||||||
|
this.text = text;
|
||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
AutoSizeAxes = Axes.Both;
|
||||||
LoadingAnimationSize = new Vector2(10);
|
LoadingAnimationSize = new Vector2(10);
|
||||||
|
|
||||||
drawableText.Text = text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -232,7 +234,8 @@ namespace osu.Game.Overlays.Comments
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
Font = OsuFont.GetFont(size: 12, weight: FontWeight.Bold),
|
||||||
Margin = new MarginPadding { Horizontal = 20 }
|
Margin = new MarginPadding { Horizontal = 20 },
|
||||||
|
Text = text,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -366,14 +366,13 @@ namespace osu.Game.Overlays
|
|||||||
private readonly WorkingBeatmap beatmap;
|
private readonly WorkingBeatmap beatmap;
|
||||||
|
|
||||||
public Background(WorkingBeatmap beatmap = null)
|
public Background(WorkingBeatmap beatmap = null)
|
||||||
|
: base(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
|
|
||||||
Depth = float.MaxValue;
|
Depth = float.MaxValue;
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
CacheDrawnFrameBuffer = true;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
sprite = new Sprite
|
sprite = new Sprite
|
||||||
|
@ -37,11 +37,7 @@ namespace osu.Game.Overlays
|
|||||||
Anchor = Anchor.BottomRight,
|
Anchor = Anchor.BottomRight,
|
||||||
Origin = Anchor.BottomRight,
|
Origin = Anchor.BottomRight,
|
||||||
Margin = new MarginPadding(20),
|
Margin = new MarginPadding(20),
|
||||||
Action = () =>
|
Action = scrollToTop
|
||||||
{
|
|
||||||
ScrollToStart();
|
|
||||||
Button.State = Visibility.Hidden;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,6 +54,12 @@ namespace osu.Game.Overlays
|
|||||||
Button.State = Target > button_scroll_position ? Visibility.Visible : Visibility.Hidden;
|
Button.State = Target > button_scroll_position ? Visibility.Visible : Visibility.Hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void scrollToTop()
|
||||||
|
{
|
||||||
|
ScrollToStart();
|
||||||
|
Button.State = Visibility.Hidden;
|
||||||
|
}
|
||||||
|
|
||||||
public class ScrollToTopButton : OsuHoverContainer
|
public class ScrollToTopButton : OsuHoverContainer
|
||||||
{
|
{
|
||||||
private const int fade_duration = 500;
|
private const int fade_duration = 500;
|
||||||
|
@ -30,11 +30,6 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
|
|
||||||
public override bool HasImplementation => GetType().GenericTypeArguments.Length == 0;
|
public override bool HasImplementation => GetType().GenericTypeArguments.Length == 0;
|
||||||
|
|
||||||
[Obsolete("Use the mod-supporting override")] // can be removed 20210731
|
public virtual Score CreateReplayScore(IBeatmap beatmap, IReadOnlyList<Mod> mods) => new Score { Replay = new Replay() };
|
||||||
public virtual Score CreateReplayScore(IBeatmap beatmap) => new Score { Replay = new Replay() };
|
|
||||||
|
|
||||||
#pragma warning disable 618
|
|
||||||
public virtual Score CreateReplayScore(IBeatmap beatmap, IReadOnlyList<Mod> mods) => CreateReplayScore(beatmap);
|
|
||||||
#pragma warning restore 618
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -393,6 +393,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
public class OutlineTriangle : BufferedContainer
|
public class OutlineTriangle : BufferedContainer
|
||||||
{
|
{
|
||||||
public OutlineTriangle(bool outlineOnly, float size)
|
public OutlineTriangle(bool outlineOnly, float size)
|
||||||
|
: base(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
Size = new Vector2(size);
|
Size = new Vector2(size);
|
||||||
|
|
||||||
@ -414,7 +415,6 @@ namespace osu.Game.Screens.Menu
|
|||||||
}
|
}
|
||||||
|
|
||||||
Blending = BlendingParameters.Additive;
|
Blending = BlendingParameters.Additive;
|
||||||
CacheDrawnFrameBuffer = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,9 +32,9 @@ namespace osu.Game.Screens.Play.Break
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BlurredIcon()
|
public BlurredIcon()
|
||||||
|
: base(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
RelativePositionAxes = Axes.X;
|
RelativePositionAxes = Axes.X;
|
||||||
CacheDrawnFrameBuffer = true;
|
|
||||||
Child = icon = new SpriteIcon
|
Child = icon = new SpriteIcon
|
||||||
{
|
{
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
|
@ -98,9 +98,8 @@ namespace osu.Game.Screens.Play
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual void RecreateGraph()
|
protected virtual void RecreateGraph()
|
||||||
{
|
{
|
||||||
var newColumns = new BufferedContainer<Column>
|
var newColumns = new BufferedContainer<Column>(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
RedrawOnScale = false,
|
RedrawOnScale = false,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
};
|
};
|
||||||
|
@ -51,13 +51,12 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
|||||||
Font = OsuFont.Numeric.With(size: 76),
|
Font = OsuFont.Numeric.With(size: 76),
|
||||||
UseFullGlyphHeight = false
|
UseFullGlyphHeight = false
|
||||||
},
|
},
|
||||||
superFlash = new BufferedContainer
|
superFlash = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
BlurSigma = new Vector2(85),
|
BlurSigma = new Vector2(85),
|
||||||
Size = new Vector2(600),
|
Size = new Vector2(600),
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
Blending = BlendingParameters.Additive,
|
Blending = BlendingParameters.Additive,
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
Children = new[]
|
Children = new[]
|
||||||
@ -71,14 +70,13 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
flash = new BufferedContainer
|
flash = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
BlurSigma = new Vector2(35),
|
BlurSigma = new Vector2(35),
|
||||||
BypassAutoSizeAxes = Axes.Both,
|
BypassAutoSizeAxes = Axes.Both,
|
||||||
Size = new Vector2(200),
|
Size = new Vector2(200),
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
Blending = BlendingParameters.Additive,
|
Blending = BlendingParameters.Additive,
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
Scale = new Vector2(1.8f),
|
Scale = new Vector2(1.8f),
|
||||||
|
@ -27,9 +27,8 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
InternalChild = new BufferedContainer
|
InternalChild = new BufferedContainer(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
CacheDrawnFrameBuffer = true,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
|
@ -15,8 +15,8 @@ namespace osu.Game.Screens.Select.Carousel
|
|||||||
public class SetPanelBackground : BufferedContainer
|
public class SetPanelBackground : BufferedContainer
|
||||||
{
|
{
|
||||||
public SetPanelBackground(WorkingBeatmap working)
|
public SetPanelBackground(WorkingBeatmap working)
|
||||||
|
: base(cachedFrameBuffer: true)
|
||||||
{
|
{
|
||||||
CacheDrawnFrameBuffer = true;
|
|
||||||
RedrawOnScale = false;
|
RedrawOnScale = false;
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Realm" Version="10.6.0" />
|
<PackageReference Include="Realm" Version="10.6.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2021.1104.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2021.1106.0" />
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
||||||
<PackageReference Include="Sentry" Version="3.10.0" />
|
<PackageReference Include="Sentry" Version="3.10.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.30.0" />
|
<PackageReference Include="SharpCompress" Version="0.30.0" />
|
||||||
|
@ -70,7 +70,7 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Package References">
|
<ItemGroup Label="Package References">
|
||||||
<PackageReference Include="ppy.osu.Framework.iOS" Version="2021.1104.0" />
|
<PackageReference Include="ppy.osu.Framework.iOS" Version="2021.1106.0" />
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2021.1026.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- See https://github.com/dotnet/runtime/issues/35988 (can be removed after Xamarin uses net5.0 / net6.0) -->
|
<!-- See https://github.com/dotnet/runtime/issues/35988 (can be removed after Xamarin uses net5.0 / net6.0) -->
|
||||||
@ -93,7 +93,7 @@
|
|||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.6" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2021.1104.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2021.1106.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.30.0" />
|
<PackageReference Include="SharpCompress" Version="0.30.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.2" />
|
<PackageReference Include="NUnit" Version="3.13.2" />
|
||||||
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
||||||
|
Reference in New Issue
Block a user