mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 20:43:21 +08:00
Mark the property as nullable and add some assert check.
This commit is contained in:
parent
deb39bd330
commit
9134525111
@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input.StateChanges;
|
using osu.Framework.Input.StateChanges;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
@ -28,16 +30,20 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public bool RestartOnFail => false;
|
public bool RestartOnFail => false;
|
||||||
|
|
||||||
private OsuInputManager inputManager;
|
private OsuInputManager? inputManager;
|
||||||
|
|
||||||
private IFrameStableClock gameplayClock;
|
private IFrameStableClock? gameplayClock;
|
||||||
|
|
||||||
private List<OsuReplayFrame> replayFrames;
|
private List<OsuReplayFrame>? replayFrames;
|
||||||
|
|
||||||
private int currentFrame;
|
private int currentFrame;
|
||||||
|
|
||||||
public void Update(Playfield playfield)
|
public void Update(Playfield playfield)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(inputManager != null);
|
||||||
|
Debug.Assert(gameplayClock != null);
|
||||||
|
Debug.Assert(replayFrames != null);
|
||||||
|
|
||||||
if (currentFrame == replayFrames.Count - 1) return;
|
if (currentFrame == replayFrames.Count - 1) return;
|
||||||
|
|
||||||
double time = gameplayClock.CurrentTime;
|
double time = gameplayClock.CurrentTime;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// 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.Diagnostics;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
@ -31,7 +32,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.12 : 1;
|
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.12 : 1;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(OsuModFlashlight) };
|
public override Type[] IncompatibleMods => new[] { typeof(OsuModFlashlight) };
|
||||||
|
|
||||||
private DrawableOsuBlinds blinds;
|
private DrawableOsuBlinds? blinds;
|
||||||
|
|
||||||
public void ApplyToDrawableRuleset(DrawableRuleset<OsuHitObject> drawableRuleset)
|
public void ApplyToDrawableRuleset(DrawableRuleset<OsuHitObject> drawableRuleset)
|
||||||
{
|
{
|
||||||
@ -40,6 +41,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public void ApplyToHealthProcessor(HealthProcessor healthProcessor)
|
public void ApplyToHealthProcessor(HealthProcessor healthProcessor)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(blinds != null);
|
||||||
|
|
||||||
healthProcessor.Health.ValueChanged += health => { blinds.AnimateClosedness((float)health.NewValue); };
|
healthProcessor.Health.ValueChanged += health => { blinds.AnimateClosedness((float)health.NewValue); };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
@ -51,14 +52,14 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public override float DefaultFlashlightSize => 180;
|
public override float DefaultFlashlightSize => 180;
|
||||||
|
|
||||||
private OsuFlashlight flashlight;
|
private OsuFlashlight? flashlight;
|
||||||
|
|
||||||
protected override Flashlight CreateFlashlight() => flashlight = new OsuFlashlight(this);
|
protected override Flashlight CreateFlashlight() => flashlight = new OsuFlashlight(this);
|
||||||
|
|
||||||
public void ApplyToDrawableHitObject(DrawableHitObject drawable)
|
public void ApplyToDrawableHitObject(DrawableHitObject drawable)
|
||||||
{
|
{
|
||||||
if (drawable is DrawableSlider s)
|
if (drawable is DrawableSlider s)
|
||||||
s.Tracking.ValueChanged += flashlight.OnSliderTrackingChange;
|
s.Tracking.ValueChanged += flashlight.AsNonNull().OnSliderTrackingChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class OsuFlashlight : Flashlight, IRequireHighFrequencyMousePosition
|
private class OsuFlashlight : Flashlight, IRequireHighFrequencyMousePosition
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// 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.Diagnostics;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
@ -26,7 +27,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(OsuModAutopilot), typeof(OsuModWiggle), typeof(OsuModTransform), typeof(ModAutoplay), typeof(OsuModRelax), typeof(OsuModRepel) };
|
public override Type[] IncompatibleMods => new[] { typeof(OsuModAutopilot), typeof(OsuModWiggle), typeof(OsuModTransform), typeof(ModAutoplay), typeof(OsuModRelax), typeof(OsuModRepel) };
|
||||||
|
|
||||||
private IFrameStableClock gameplayClock;
|
private IFrameStableClock? gameplayClock;
|
||||||
|
|
||||||
[SettingSource("Attraction strength", "How strong the pull is.", 0)]
|
[SettingSource("Attraction strength", "How strong the pull is.", 0)]
|
||||||
public BindableFloat AttractionStrength { get; } = new BindableFloat(0.5f)
|
public BindableFloat AttractionStrength { get; } = new BindableFloat(0.5f)
|
||||||
@ -74,6 +75,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
{
|
{
|
||||||
double dampLength = Interpolation.Lerp(3000, 40, AttractionStrength.Value);
|
double dampLength = Interpolation.Lerp(3000, 40, AttractionStrength.Value);
|
||||||
|
|
||||||
|
Debug.Assert(gameplayClock != null);
|
||||||
|
|
||||||
float x = (float)Interpolation.DampContinuously(hitObject.X, destination.X, dampLength, gameplayClock.ElapsedFrameTime);
|
float x = (float)Interpolation.DampContinuously(hitObject.X, destination.X, dampLength, gameplayClock.ElapsedFrameTime);
|
||||||
float y = (float)Interpolation.DampContinuously(hitObject.Y, destination.Y, dampLength, gameplayClock.ElapsedFrameTime);
|
float y = (float)Interpolation.DampContinuously(hitObject.Y, destination.Y, dampLength, gameplayClock.ElapsedFrameTime);
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
@ -19,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
{
|
{
|
||||||
public override string Description => "Where's the cursor?";
|
public override string Description => "Where's the cursor?";
|
||||||
|
|
||||||
private PeriodTracker spinnerPeriods;
|
private PeriodTracker? spinnerPeriods;
|
||||||
|
|
||||||
[SettingSource(
|
[SettingSource(
|
||||||
"Hidden at combo",
|
"Hidden at combo",
|
||||||
@ -41,7 +42,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public void Update(Playfield playfield)
|
public void Update(Playfield playfield)
|
||||||
{
|
{
|
||||||
bool shouldAlwaysShowCursor = IsBreakTime.Value || spinnerPeriods.IsInAny(playfield.Clock.CurrentTime);
|
bool shouldAlwaysShowCursor = IsBreakTime.Value || spinnerPeriods.AsNonNull().IsInAny(playfield.Clock.CurrentTime);
|
||||||
float targetAlpha = shouldAlwaysShowCursor ? 1 : ComboBasedAlpha;
|
float targetAlpha = shouldAlwaysShowCursor ? 1 : ComboBasedAlpha;
|
||||||
playfield.Cursor.Alpha = (float)Interpolation.Lerp(playfield.Cursor.Alpha, targetAlpha, Math.Clamp(playfield.Time.Elapsed / TRANSITION_DURATION, 0, 1));
|
playfield.Cursor.Alpha = (float)Interpolation.Lerp(playfield.Cursor.Alpha, targetAlpha, Math.Clamp(playfield.Time.Elapsed / TRANSITION_DURATION, 0, 1));
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
private bool isDownState;
|
private bool isDownState;
|
||||||
private bool wasLeft;
|
private bool wasLeft;
|
||||||
|
|
||||||
private OsuInputManager osuInputManager;
|
private OsuInputManager? osuInputManager;
|
||||||
|
|
||||||
private ReplayState<OsuAction>? state;
|
private ReplayState<OsuAction>? state;
|
||||||
private double lastStateChangeTime;
|
private double lastStateChangeTime;
|
||||||
@ -44,6 +44,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public void ApplyToPlayer(Player player)
|
public void ApplyToPlayer(Player player)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(osuInputManager != null);
|
||||||
|
|
||||||
if (osuInputManager.ReplayInputHandler != null)
|
if (osuInputManager.ReplayInputHandler != null)
|
||||||
{
|
{
|
||||||
hasReplay = true;
|
hasReplay = true;
|
||||||
@ -132,6 +134,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
wasLeft = !wasLeft;
|
wasLeft = !wasLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug.Assert(osuInputManager != null);
|
||||||
|
|
||||||
state?.Apply(osuInputManager.CurrentState, osuInputManager);
|
state?.Apply(osuInputManager.CurrentState, osuInputManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
@ -94,11 +96,11 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
#region Private Fields
|
#region Private Fields
|
||||||
|
|
||||||
private ControlPointInfo controlPointInfo;
|
private ControlPointInfo? controlPointInfo;
|
||||||
|
|
||||||
private List<OsuHitObject> originalHitObjects;
|
private List<OsuHitObject>? originalHitObjects;
|
||||||
|
|
||||||
private Random rng;
|
private Random? rng;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -158,7 +160,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
circle.ApproachCircle.Hide();
|
circle.ApproachCircle.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
using (circle.BeginAbsoluteSequence(startTime - controlPointInfo.TimingPointAt(startTime).BeatLength - undim_duration))
|
using (circle.BeginAbsoluteSequence(startTime - controlPointInfo.AsNonNull().TimingPointAt(startTime).BeatLength - undim_duration))
|
||||||
circle.FadeColour(Color4.White, undim_duration);
|
circle.FadeColour(Color4.White, undim_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,6 +202,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
private IEnumerable<double> generateBeats(IBeatmap beatmap)
|
private IEnumerable<double> generateBeats(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(originalHitObjects != null);
|
||||||
|
|
||||||
double startTime = originalHitObjects.First().StartTime;
|
double startTime = originalHitObjects.First().StartTime;
|
||||||
double endTime = originalHitObjects.Last().GetEndTime();
|
double endTime = originalHitObjects.Last().GetEndTime();
|
||||||
|
|
||||||
@ -228,6 +232,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
private void addHitSamples(IEnumerable<OsuHitObject> hitObjects)
|
private void addHitSamples(IEnumerable<OsuHitObject> hitObjects)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(originalHitObjects != null);
|
||||||
|
|
||||||
foreach (var obj in hitObjects)
|
foreach (var obj in hitObjects)
|
||||||
{
|
{
|
||||||
var samples = getSamplesAtTime(originalHitObjects, obj.StartTime);
|
var samples = getSamplesAtTime(originalHitObjects, obj.StartTime);
|
||||||
@ -240,6 +246,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
private void fixComboInfo(List<OsuHitObject> hitObjects)
|
private void fixComboInfo(List<OsuHitObject> hitObjects)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(originalHitObjects != null);
|
||||||
|
|
||||||
// Copy combo indices from an original object at the same time or from the closest preceding object
|
// Copy combo indices from an original object at the same time or from the closest preceding object
|
||||||
// (Objects lying between two combos are assumed to belong to the preceding combo)
|
// (Objects lying between two combos are assumed to belong to the preceding combo)
|
||||||
hitObjects.ForEach(newObj =>
|
hitObjects.ForEach(newObj =>
|
||||||
@ -276,7 +284,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
{
|
{
|
||||||
if (hitObjects.Count == 0) return;
|
if (hitObjects.Count == 0) return;
|
||||||
|
|
||||||
float nextSingle(float max = 1f) => (float)(rng.NextDouble() * max);
|
float nextSingle(float max = 1f) => (float)(rng.AsNonNull().NextDouble() * max);
|
||||||
|
|
||||||
const float two_pi = MathF.PI * 2;
|
const float two_pi = MathF.PI * 2;
|
||||||
|
|
||||||
@ -357,6 +365,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
/// <param name="time">The time to be checked.</param>=
|
/// <param name="time">The time to be checked.</param>=
|
||||||
private bool isInsideBreakPeriod(IEnumerable<BreakPeriod> breaks, double time)
|
private bool isInsideBreakPeriod(IEnumerable<BreakPeriod> breaks, double time)
|
||||||
{
|
{
|
||||||
|
Debug.Assert(originalHitObjects != null);
|
||||||
|
|
||||||
return breaks.Any(breakPeriod =>
|
return breaks.Any(breakPeriod =>
|
||||||
{
|
{
|
||||||
var firstObjAfterBreak = originalHitObjects.First(obj => almostBigger(obj.StartTime, breakPeriod.EndTime));
|
var firstObjAfterBreak = originalHitObjects.First(obj => almostBigger(obj.StartTime, breakPeriod.EndTime));
|
||||||
@ -372,6 +382,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
double currentTime = timingPoint.Time;
|
double currentTime = timingPoint.Time;
|
||||||
|
|
||||||
|
Debug.Assert(controlPointInfo != null);
|
||||||
|
|
||||||
while (!definitelyBigger(currentTime, mapEndTime) && ReferenceEquals(controlPointInfo.TimingPointAt(currentTime), timingPoint))
|
while (!definitelyBigger(currentTime, mapEndTime) && ReferenceEquals(controlPointInfo.TimingPointAt(currentTime), timingPoint))
|
||||||
{
|
{
|
||||||
beats.Add(Math.Floor(currentTime));
|
beats.Add(Math.Floor(currentTime));
|
||||||
|
Loading…
Reference in New Issue
Block a user