mirror of
https://github.com/osukey/osukey.git
synced 2025-06-21 19:27:58 +09:00
Merge remote-tracking branch 'origin/master' into osu-fontusage
This commit is contained in:
commit
cc33f230b4
@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Catch.Tests
|
|||||||
{
|
{
|
||||||
protected override string ResourceAssembly => "osu.Game.Rulesets.Catch";
|
protected override string ResourceAssembly => "osu.Game.Rulesets.Catch";
|
||||||
|
|
||||||
[TestCase(3.8701854263563118d, "diffcalc-test")]
|
[TestCase(4.2038001515546597d, "diffcalc-test")]
|
||||||
public void Test(double expected, string name)
|
public void Test(double expected, string name)
|
||||||
=> base.Test(expected, name);
|
=> base.Test(expected, name);
|
||||||
|
|
||||||
|
@ -29,6 +29,9 @@ namespace osu.Game.Rulesets.Catch.Difficulty
|
|||||||
{
|
{
|
||||||
var catcher = new CatcherArea.Catcher(beatmap.BeatmapInfo.BaseDifficulty);
|
var catcher = new CatcherArea.Catcher(beatmap.BeatmapInfo.BaseDifficulty);
|
||||||
halfCatchWidth = catcher.CatchWidth * 0.5f;
|
halfCatchWidth = catcher.CatchWidth * 0.5f;
|
||||||
|
|
||||||
|
// We're only using 80% of the catcher's width to simulate imperfect gameplay.
|
||||||
|
halfCatchWidth *= 0.8f;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beatmap, Mod[] mods, Skill[] skills, double clockRate)
|
protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beatmap, Mod[] mods, Skill[] skills, double clockRate)
|
||||||
|
@ -18,6 +18,7 @@ namespace osu.Game.Rulesets.Catch.Difficulty.Preprocessing
|
|||||||
public new CatchHitObject LastObject => (CatchHitObject)base.LastObject;
|
public new CatchHitObject LastObject => (CatchHitObject)base.LastObject;
|
||||||
|
|
||||||
public readonly float NormalizedPosition;
|
public readonly float NormalizedPosition;
|
||||||
|
public readonly float LastNormalizedPosition;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Milliseconds elapsed since the start time of the previous <see cref="CatchDifficultyHitObject"/>, with a minimum of 25ms.
|
/// Milliseconds elapsed since the start time of the previous <see cref="CatchDifficultyHitObject"/>, with a minimum of 25ms.
|
||||||
@ -31,6 +32,7 @@ namespace osu.Game.Rulesets.Catch.Difficulty.Preprocessing
|
|||||||
var scalingFactor = normalized_hitobject_radius / halfCatcherWidth;
|
var scalingFactor = normalized_hitobject_radius / halfCatcherWidth;
|
||||||
|
|
||||||
NormalizedPosition = BaseObject.X * CatchPlayfield.BASE_WIDTH * scalingFactor;
|
NormalizedPosition = BaseObject.X * CatchPlayfield.BASE_WIDTH * scalingFactor;
|
||||||
|
LastNormalizedPosition = LastObject.X * CatchPlayfield.BASE_WIDTH * scalingFactor;
|
||||||
|
|
||||||
// Every strain interval is hard capped at the equivalent of 600 BPM streaming speed as a safety measure
|
// Every strain interval is hard capped at the equivalent of 600 BPM streaming speed as a safety measure
|
||||||
StrainTime = Math.Max(25, DeltaTime);
|
StrainTime = Math.Max(25, DeltaTime);
|
||||||
|
@ -21,20 +21,23 @@ namespace osu.Game.Rulesets.Catch.Difficulty.Skills
|
|||||||
|
|
||||||
protected override double DecayWeight => 0.94;
|
protected override double DecayWeight => 0.94;
|
||||||
|
|
||||||
private float lastPlayerPosition;
|
private float? lastPlayerPosition;
|
||||||
private float lastDistanceMoved;
|
private float lastDistanceMoved;
|
||||||
|
|
||||||
protected override double StrainValueOf(DifficultyHitObject current)
|
protected override double StrainValueOf(DifficultyHitObject current)
|
||||||
{
|
{
|
||||||
var catchCurrent = (CatchDifficultyHitObject)current;
|
var catchCurrent = (CatchDifficultyHitObject)current;
|
||||||
|
|
||||||
|
if (lastPlayerPosition == null)
|
||||||
|
lastPlayerPosition = catchCurrent.LastNormalizedPosition;
|
||||||
|
|
||||||
float playerPosition = MathHelper.Clamp(
|
float playerPosition = MathHelper.Clamp(
|
||||||
lastPlayerPosition,
|
lastPlayerPosition.Value,
|
||||||
catchCurrent.NormalizedPosition - (normalized_hitobject_radius - absolute_player_positioning_error),
|
catchCurrent.NormalizedPosition - (normalized_hitobject_radius - absolute_player_positioning_error),
|
||||||
catchCurrent.NormalizedPosition + (normalized_hitobject_radius - absolute_player_positioning_error)
|
catchCurrent.NormalizedPosition + (normalized_hitobject_radius - absolute_player_positioning_error)
|
||||||
);
|
);
|
||||||
|
|
||||||
float distanceMoved = playerPosition - lastPlayerPosition;
|
float distanceMoved = playerPosition - lastPlayerPosition.Value;
|
||||||
|
|
||||||
double distanceAddition = Math.Pow(Math.Abs(distanceMoved), 1.3) / 500;
|
double distanceAddition = Math.Pow(Math.Abs(distanceMoved), 1.3) / 500;
|
||||||
double sqrtStrain = Math.Sqrt(catchCurrent.StrainTime);
|
double sqrtStrain = Math.Sqrt(catchCurrent.StrainTime);
|
||||||
|
@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Catch.UI
|
|||||||
{
|
{
|
||||||
public class CatcherArea : Container
|
public class CatcherArea : Container
|
||||||
{
|
{
|
||||||
public const float CATCHER_SIZE = 100;
|
public const float CATCHER_SIZE = 106.75f;
|
||||||
|
|
||||||
protected internal readonly Catcher MovableCatcher;
|
protected internal readonly Catcher MovableCatcher;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ namespace osu.Game.Rulesets.Taiko.Tests
|
|||||||
Ruleset = new TaikoRuleset().RulesetInfo
|
Ruleset = new TaikoRuleset().RulesetInfo
|
||||||
},
|
},
|
||||||
ControlPointInfo = controlPointInfo
|
ControlPointInfo = controlPointInfo
|
||||||
});
|
}, Clock);
|
||||||
|
|
||||||
Add(playfieldContainer = new Container
|
Add(playfieldContainer = new Container
|
||||||
{
|
{
|
||||||
|
@ -19,7 +19,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo, Clock);
|
||||||
Child = new ComposeScreen();
|
Child = new ComposeScreen();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Beatmap.Value = new TestWorkingBeatmap(testBeatmap);
|
Beatmap.Value = new TestWorkingBeatmap(testBeatmap, Clock);
|
||||||
|
|
||||||
Child = new TimingPointVisualiser(testBeatmap, 5000) { Clock = Clock };
|
Child = new TimingPointVisualiser(testBeatmap, 5000) { Clock = Clock };
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo);
|
Beatmap.Value = new TestWorkingBeatmap(new OsuRuleset().RulesetInfo, null);
|
||||||
|
|
||||||
Add(new SummaryTimeline
|
Add(new SummaryTimeline
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Size = new Vector2(200,100)
|
Size = new Vector2(200,100)
|
||||||
};
|
};
|
||||||
|
|
||||||
Beatmap.Value = new TestWorkingBeatmap(new Beatmap());
|
Beatmap.Value = new TestWorkingBeatmap(new Beatmap(), Clock);
|
||||||
|
|
||||||
Child = playback;
|
Child = playback;
|
||||||
}
|
}
|
||||||
|
@ -183,6 +183,8 @@ namespace osu.Game
|
|||||||
configSkin.TriggerChange();
|
configSkin.TriggerChange();
|
||||||
|
|
||||||
LocalConfig.BindWith(OsuSetting.VolumeInactive, inactiveVolumeAdjust);
|
LocalConfig.BindWith(OsuSetting.VolumeInactive, inactiveVolumeAdjust);
|
||||||
|
|
||||||
|
IsActive.BindValueChanged(updateActiveState, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ExternalLinkOpener externalLinkOpener;
|
private ExternalLinkOpener externalLinkOpener;
|
||||||
@ -674,16 +676,12 @@ namespace osu.Game
|
|||||||
|
|
||||||
private readonly BindableDouble inactiveVolumeAdjust = new BindableDouble();
|
private readonly BindableDouble inactiveVolumeAdjust = new BindableDouble();
|
||||||
|
|
||||||
protected override void OnDeactivated()
|
private void updateActiveState(bool isActive)
|
||||||
{
|
{
|
||||||
base.OnDeactivated();
|
if (isActive)
|
||||||
Audio.AddAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust);
|
Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust);
|
||||||
}
|
else
|
||||||
|
Audio.AddAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust);
|
||||||
protected override void OnActivated()
|
|
||||||
{
|
|
||||||
base.OnActivated();
|
|
||||||
Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool OnReleased(GlobalAction action) => false;
|
public bool OnReleased(GlobalAction action) => false;
|
||||||
|
@ -116,7 +116,7 @@ namespace osu.Game.Screens.Play
|
|||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
// eagerly pause when we lose window focus (if we are locally playing).
|
// eagerly pause when we lose window focus (if we are locally playing).
|
||||||
if (!game.IsActive && CanPause)
|
if (!game.IsActive.Value && CanPause)
|
||||||
Pause();
|
Pause();
|
||||||
|
|
||||||
if (!IsPaused)
|
if (!IsPaused)
|
||||||
|
@ -1,29 +1,133 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework.Audio.Track;
|
using osu.Framework.Audio.Track;
|
||||||
using osu.Framework.Graphics.Textures;
|
using osu.Framework.Graphics.Textures;
|
||||||
|
using osu.Framework.Timing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Beatmaps
|
namespace osu.Game.Tests.Beatmaps
|
||||||
{
|
{
|
||||||
public class TestWorkingBeatmap : WorkingBeatmap
|
public class TestWorkingBeatmap : WorkingBeatmap
|
||||||
{
|
{
|
||||||
public TestWorkingBeatmap(RulesetInfo ruleset)
|
private readonly TrackVirtualManual track;
|
||||||
: this(new TestBeatmap(ruleset))
|
private readonly IBeatmap beatmap;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance which creates a <see cref="TestBeatmap"/> for the provided ruleset when requested.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ruleset">The target ruleset.</param>
|
||||||
|
/// <param name="referenceClock">A clock which should be used instead of a stopwatch for virtual time progression.</param>
|
||||||
|
public TestWorkingBeatmap(RulesetInfo ruleset, IFrameBasedClock referenceClock)
|
||||||
|
: this(new TestBeatmap(ruleset), referenceClock)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestWorkingBeatmap(IBeatmap beatmap)
|
/// <summary>
|
||||||
|
/// Create an instance which provides the <see cref="IBeatmap"/> when requested.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="beatmap">The beatmap</param>
|
||||||
|
/// <param name="referenceClock">An optional clock which should be used instead of a stopwatch for virtual time progression.</param>
|
||||||
|
public TestWorkingBeatmap(IBeatmap beatmap, IFrameBasedClock referenceClock = null)
|
||||||
: base(beatmap.BeatmapInfo)
|
: base(beatmap.BeatmapInfo)
|
||||||
{
|
{
|
||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
|
|
||||||
|
if (referenceClock != null)
|
||||||
|
track = new TrackVirtualManual(referenceClock);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly IBeatmap beatmap;
|
|
||||||
protected override IBeatmap GetBeatmap() => beatmap;
|
protected override IBeatmap GetBeatmap() => beatmap;
|
||||||
protected override Texture GetBackground() => null;
|
protected override Texture GetBackground() => null;
|
||||||
protected override Track GetTrack() => null;
|
protected override Track GetTrack() => track;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A virtual track which tracks a reference clock.
|
||||||
|
/// </summary>
|
||||||
|
public class TrackVirtualManual : Track
|
||||||
|
{
|
||||||
|
private readonly IFrameBasedClock referenceClock;
|
||||||
|
|
||||||
|
private readonly ManualClock clock = new ManualClock();
|
||||||
|
|
||||||
|
private bool running;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Local offset added to the reference clock to resolve correct time.
|
||||||
|
/// </summary>
|
||||||
|
private double offset;
|
||||||
|
|
||||||
|
public TrackVirtualManual(IFrameBasedClock referenceClock)
|
||||||
|
{
|
||||||
|
this.referenceClock = referenceClock;
|
||||||
|
Length = double.PositiveInfinity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Seek(double seek)
|
||||||
|
{
|
||||||
|
offset = MathHelper.Clamp(seek, 0, Length);
|
||||||
|
lastReferenceTime = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Start()
|
||||||
|
{
|
||||||
|
running = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Reset()
|
||||||
|
{
|
||||||
|
Seek(0);
|
||||||
|
base.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Stop()
|
||||||
|
{
|
||||||
|
if (running)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
// on stopping, the current value should be transferred out of the clock, as we can no longer rely on
|
||||||
|
// the referenceClock (which will still be counting time).
|
||||||
|
offset = clock.CurrentTime;
|
||||||
|
lastReferenceTime = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsRunning => running;
|
||||||
|
|
||||||
|
private double? lastReferenceTime;
|
||||||
|
|
||||||
|
public override double CurrentTime => clock.CurrentTime;
|
||||||
|
|
||||||
|
protected override void UpdateState()
|
||||||
|
{
|
||||||
|
base.UpdateState();
|
||||||
|
|
||||||
|
if (running)
|
||||||
|
{
|
||||||
|
double refTime = referenceClock.CurrentTime;
|
||||||
|
|
||||||
|
if (!lastReferenceTime.HasValue)
|
||||||
|
{
|
||||||
|
// if the clock just started running, the current value should be transferred to the offset
|
||||||
|
// (to zero the progression of time).
|
||||||
|
offset -= refTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastReferenceTime = refTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
clock.CurrentTime = Math.Min((lastReferenceTime ?? 0) + offset, Length);
|
||||||
|
|
||||||
|
if (CurrentTime >= Length)
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
RaiseCompleted();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
Beatmap.Value = new TestWorkingBeatmap(ruleset.RulesetInfo);
|
Beatmap.Value = new TestWorkingBeatmap(ruleset.RulesetInfo, null);
|
||||||
|
|
||||||
LoadComponentAsync(new Editor(), LoadScreen);
|
LoadComponentAsync(new Editor(), LoadScreen);
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
private Player loadPlayerFor(Ruleset r)
|
private Player loadPlayerFor(Ruleset r)
|
||||||
{
|
{
|
||||||
var beatmap = CreateBeatmap(r);
|
var beatmap = CreateBeatmap(r);
|
||||||
var working = new TestWorkingBeatmap(beatmap);
|
var working = new TestWorkingBeatmap(beatmap, Clock);
|
||||||
|
|
||||||
workingWeakReferences.Add(working);
|
workingWeakReferences.Add(working);
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2019.128.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2019.128.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2019.215.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2019.220.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.11.0" />
|
<PackageReference Include="NUnit" Version="3.11.0" />
|
||||||
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
||||||
|
@ -105,8 +105,8 @@
|
|||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2019.128.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2019.128.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2019.215.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2019.220.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework.iOS" Version="2019.215.0" />
|
<PackageReference Include="ppy.osu.Framework.iOS" Version="2019.220.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.11.0" />
|
<PackageReference Include="NUnit" Version="3.11.0" />
|
||||||
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user