mirror of
https://github.com/ppy/osu.git
synced 2025-01-14 03:15:45 +08:00
Merge pull request #6823 from huoyaoyuan/sharpen
Apply new language features
This commit is contained in:
commit
005a492838
@ -111,9 +111,15 @@ csharp_preserve_single_line_statements = true
|
|||||||
|
|
||||||
#Roslyn language styles
|
#Roslyn language styles
|
||||||
|
|
||||||
|
#Style - this. qualification
|
||||||
|
dotnet_style_qualification_for_field = false:warning
|
||||||
|
dotnet_style_qualification_for_property = false:warning
|
||||||
|
dotnet_style_qualification_for_method = false:warning
|
||||||
|
dotnet_style_qualification_for_event = false:warning
|
||||||
|
|
||||||
#Style - type names
|
#Style - type names
|
||||||
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
|
||||||
dotnet_style_predefined_type_for_member_access = true:silent
|
dotnet_style_predefined_type_for_member_access = true:warning
|
||||||
csharp_style_var_when_type_is_apparent = true:none
|
csharp_style_var_when_type_is_apparent = true:none
|
||||||
csharp_style_var_for_built_in_types = true:none
|
csharp_style_var_for_built_in_types = true:none
|
||||||
csharp_style_var_elsewhere = true:silent
|
csharp_style_var_elsewhere = true:silent
|
||||||
@ -126,51 +132,57 @@ csharp_preferred_modifier_order = public,private,protected,internal,new,abstract
|
|||||||
# Skipped because roslyn cannot separate +-*/ with << >>
|
# Skipped because roslyn cannot separate +-*/ with << >>
|
||||||
|
|
||||||
#Style - expression bodies
|
#Style - expression bodies
|
||||||
csharp_style_expression_bodied_accessors = true:silent
|
csharp_style_expression_bodied_accessors = true:warning
|
||||||
csharp_style_expression_bodied_constructors = false:none
|
csharp_style_expression_bodied_constructors = false:none
|
||||||
csharp_style_expression_bodied_indexers = true:silent
|
csharp_style_expression_bodied_indexers = true:warning
|
||||||
csharp_style_expression_bodied_methods = true:silent
|
csharp_style_expression_bodied_methods = true:silent
|
||||||
csharp_style_expression_bodied_operators = true:silent
|
csharp_style_expression_bodied_operators = true:warning
|
||||||
csharp_style_expression_bodied_properties = true:silent
|
csharp_style_expression_bodied_properties = true:warning
|
||||||
|
csharp_style_expression_bodied_local_functions = true:silent
|
||||||
|
|
||||||
#Style - expression preferences
|
#Style - expression preferences
|
||||||
dotnet_style_object_initializer = true:warning
|
dotnet_style_object_initializer = true:warning
|
||||||
dotnet_style_collection_initializer = true:warning
|
dotnet_style_collection_initializer = true:warning
|
||||||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
|
||||||
dotnet_style_prefer_auto_properties = true:silent
|
dotnet_style_prefer_auto_properties = true:warning
|
||||||
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
|
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
|
||||||
dotnet_style_prefer_conditional_expression_over_return = true:silent
|
dotnet_style_prefer_conditional_expression_over_return = true:silent
|
||||||
dotnet_style_prefer_compound_assignment = true:silent
|
dotnet_style_prefer_compound_assignment = true:warning
|
||||||
|
|
||||||
#Style - null/type checks
|
#Style - null/type checks
|
||||||
dotnet_style_coalesce_expression = true:warning
|
dotnet_style_coalesce_expression = true:warning
|
||||||
dotnet_style_null_propagation = true:warning
|
dotnet_style_null_propagation = true:warning
|
||||||
csharp_style_pattern_matching_over_is_with_cast_check = true:silent
|
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
|
||||||
csharp_style_pattern_matching_over_as_with_null_check = true:silent
|
csharp_style_pattern_matching_over_as_with_null_check = true:warning
|
||||||
csharp_style_throw_expression = true:silent
|
csharp_style_throw_expression = true:silent
|
||||||
csharp_style_conditional_delegate_call = true:suggestion
|
csharp_style_conditional_delegate_call = true:warning
|
||||||
|
|
||||||
#Style - unused
|
#Style - unused
|
||||||
|
dotnet_style_readonly_field = true:silent
|
||||||
dotnet_code_quality_unused_parameters = non_public:silent
|
dotnet_code_quality_unused_parameters = non_public:silent
|
||||||
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
|
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
|
||||||
csharp_style_unused_value_assignment_preference = discard_variable:silent
|
csharp_style_unused_value_assignment_preference = discard_variable:warning
|
||||||
|
|
||||||
#Style - variable declaration
|
#Style - variable declaration
|
||||||
csharp_style_inlined_variable_declaration = true:silent
|
csharp_style_inlined_variable_declaration = true:warning
|
||||||
csharp_style_deconstructed_variable_declaration = true:silent
|
csharp_style_deconstructed_variable_declaration = true:warning
|
||||||
|
|
||||||
#Style - other C# 7.x features
|
#Style - other C# 7.x features
|
||||||
csharp_style_expression_bodied_local_functions = true:silent
|
|
||||||
dotnet_style_prefer_inferred_tuple_names = true:warning
|
dotnet_style_prefer_inferred_tuple_names = true:warning
|
||||||
csharp_prefer_simple_default_expression = true:warning
|
csharp_prefer_simple_default_expression = true:warning
|
||||||
csharp_style_pattern_local_over_anonymous_function = true:silent
|
csharp_style_pattern_local_over_anonymous_function = true:warning
|
||||||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
|
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
|
||||||
|
|
||||||
|
#Style - C# 8 features
|
||||||
|
csharp_prefer_static_local_function = true:warning
|
||||||
|
csharp_prefer_simple_using_statement = true:silent
|
||||||
|
csharp_style_prefer_index_operator = false:none
|
||||||
|
csharp_style_prefer_range_operator = false:none
|
||||||
|
csharp_style_prefer_switch_expression = false:none
|
||||||
|
|
||||||
#Supressing roslyn built-in analyzers
|
#Supressing roslyn built-in analyzers
|
||||||
# Suppress: EC112
|
# Suppress: EC112
|
||||||
|
|
||||||
#Field can be readonly
|
|
||||||
dotnet_diagnostic.IDE0044.severity = silent
|
|
||||||
#Private method is unused
|
#Private method is unused
|
||||||
dotnet_diagnostic.IDE0051.severity = silent
|
dotnet_diagnostic.IDE0051.severity = silent
|
||||||
#Private member is unused
|
#Private member is unused
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<!-- Contains required properties for osu!framework projects. -->
|
<!-- Contains required properties for osu!framework projects. -->
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup Label="C#">
|
<PropertyGroup Label="C#">
|
||||||
<LangVersion>7.3</LangVersion>
|
<LangVersion>8.0</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ApplicationManifest>$(MSBuildThisFileDirectory)app.manifest</ApplicationManifest>
|
<ApplicationManifest>$(MSBuildThisFileDirectory)app.manifest</ApplicationManifest>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
<LangVersion>8.0</LangVersion>
|
||||||
<OutputPath>bin\$(Configuration)</OutputPath>
|
<OutputPath>bin\$(Configuration)</OutputPath>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
@ -112,14 +112,14 @@ namespace osu.Desktop
|
|||||||
{
|
{
|
||||||
protected override string LocateBasePath()
|
protected override string LocateBasePath()
|
||||||
{
|
{
|
||||||
bool checkExists(string p) => Directory.Exists(Path.Combine(p, "Songs"));
|
static bool checkExists(string p) => Directory.Exists(Path.Combine(p, "Songs"));
|
||||||
|
|
||||||
string stableInstallPath;
|
string stableInstallPath;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("osu"))
|
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("osu"))
|
||||||
stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(String.Empty).ToString().Split('"')[1].Replace("osu!.exe", "");
|
stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(string.Empty).ToString().Split('"')[1].Replace("osu!.exe", "");
|
||||||
|
|
||||||
if (checkExists(stableInstallPath))
|
if (checkExists(stableInstallPath))
|
||||||
return stableInstallPath;
|
return stableInstallPath;
|
||||||
|
@ -8,6 +8,7 @@ using System;
|
|||||||
using osu.Game.Rulesets.Catch.UI;
|
using osu.Game.Rulesets.Catch.UI;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Catch.Beatmaps
|
namespace osu.Game.Rulesets.Catch.Beatmaps
|
||||||
{
|
{
|
||||||
@ -22,48 +23,44 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
|
|
||||||
protected override IEnumerable<CatchHitObject> ConvertHitObject(HitObject obj, IBeatmap beatmap)
|
protected override IEnumerable<CatchHitObject> ConvertHitObject(HitObject obj, IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var curveData = obj as IHasCurve;
|
|
||||||
var positionData = obj as IHasXPosition;
|
var positionData = obj as IHasXPosition;
|
||||||
var comboData = obj as IHasCombo;
|
var comboData = obj as IHasCombo;
|
||||||
var endTime = obj as IHasEndTime;
|
|
||||||
var legacyOffset = obj as IHasLegacyLastTickOffset;
|
|
||||||
|
|
||||||
if (curveData != null)
|
switch (obj)
|
||||||
{
|
{
|
||||||
yield return new JuiceStream
|
case IHasCurve curveData:
|
||||||
{
|
return new JuiceStream
|
||||||
StartTime = obj.StartTime,
|
{
|
||||||
Samples = obj.Samples,
|
StartTime = obj.StartTime,
|
||||||
Path = curveData.Path,
|
Samples = obj.Samples,
|
||||||
NodeSamples = curveData.NodeSamples,
|
Path = curveData.Path,
|
||||||
RepeatCount = curveData.RepeatCount,
|
NodeSamples = curveData.NodeSamples,
|
||||||
X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH,
|
RepeatCount = curveData.RepeatCount,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
LegacyLastTickOffset = legacyOffset?.LegacyLastTickOffset ?? 0
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
};
|
LegacyLastTickOffset = (obj as IHasLegacyLastTickOffset)?.LegacyLastTickOffset ?? 0
|
||||||
}
|
}.Yield();
|
||||||
else if (endTime != null)
|
|
||||||
{
|
case IHasEndTime endTime:
|
||||||
yield return new BananaShower
|
return new BananaShower
|
||||||
{
|
{
|
||||||
StartTime = obj.StartTime,
|
StartTime = obj.StartTime,
|
||||||
Samples = obj.Samples,
|
Samples = obj.Samples,
|
||||||
Duration = endTime.Duration,
|
Duration = endTime.Duration,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
};
|
}.Yield();
|
||||||
}
|
|
||||||
else
|
default:
|
||||||
{
|
return new Fruit
|
||||||
yield return new Fruit
|
{
|
||||||
{
|
StartTime = obj.StartTime,
|
||||||
StartTime = obj.StartTime,
|
Samples = obj.Samples,
|
||||||
Samples = obj.Samples,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH
|
||||||
X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH
|
}.Yield();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Catch.Objects.Drawable
|
|||||||
|
|
||||||
const float small_pulp = large_pulp_3 / 2;
|
const float small_pulp = large_pulp_3 / 2;
|
||||||
|
|
||||||
Vector2 positionAt(float angle, float distance) => new Vector2(
|
static Vector2 positionAt(float angle, float distance) => new Vector2(
|
||||||
distance * MathF.Sin(angle * MathF.PI / 180),
|
distance * MathF.Sin(angle * MathF.PI / 180),
|
||||||
distance * MathF.Cos(angle * MathF.PI / 180));
|
distance * MathF.Cos(angle * MathF.PI / 180));
|
||||||
|
|
||||||
|
@ -116,13 +116,7 @@ namespace osu.Game.Rulesets.Catch.Objects
|
|||||||
|
|
||||||
public double Duration => EndTime - StartTime;
|
public double Duration => EndTime - StartTime;
|
||||||
|
|
||||||
private SliderPath path;
|
public SliderPath Path { get; set; }
|
||||||
|
|
||||||
public SliderPath Path
|
|
||||||
{
|
|
||||||
get => path;
|
|
||||||
set => path = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public double Distance => Path.Distance;
|
public double Distance => Path.Distance;
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ namespace osu.Game.Rulesets.Catch.UI
|
|||||||
var additive = createCatcherSprite();
|
var additive = createCatcherSprite();
|
||||||
|
|
||||||
additive.Anchor = Anchor;
|
additive.Anchor = Anchor;
|
||||||
additive.OriginPosition = additive.OriginPosition + new Vector2(DrawWidth / 2, 0); // also temporary to align sprite correctly.
|
additive.OriginPosition += new Vector2(DrawWidth / 2, 0); // also temporary to align sprite correctly.
|
||||||
additive.Position = Position;
|
additive.Position = Position;
|
||||||
additive.Scale = Scale;
|
additive.Scale = Scale;
|
||||||
additive.Colour = HyperDashing ? Color4.Red : Color4.White;
|
additive.Colour = HyperDashing ? Color4.Red : Color4.White;
|
||||||
|
@ -51,7 +51,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
|
|
||||||
if (TargetColumns >= 10)
|
if (TargetColumns >= 10)
|
||||||
{
|
{
|
||||||
TargetColumns = TargetColumns / 2;
|
TargetColumns /= 2;
|
||||||
Dual = true;
|
Dual = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,37 +156,44 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
/// <returns>The hit objects generated.</returns>
|
/// <returns>The hit objects generated.</returns>
|
||||||
private IEnumerable<ManiaHitObject> generateConverted(HitObject original, IBeatmap originalBeatmap)
|
private IEnumerable<ManiaHitObject> generateConverted(HitObject original, IBeatmap originalBeatmap)
|
||||||
{
|
{
|
||||||
var endTimeData = original as IHasEndTime;
|
|
||||||
var distanceData = original as IHasDistance;
|
|
||||||
var positionData = original as IHasPosition;
|
|
||||||
|
|
||||||
Patterns.PatternGenerator conversion = null;
|
Patterns.PatternGenerator conversion = null;
|
||||||
|
|
||||||
if (distanceData != null)
|
switch (original)
|
||||||
{
|
{
|
||||||
var generator = new DistanceObjectPatternGenerator(Random, original, beatmap, lastPattern, originalBeatmap);
|
case IHasDistance _:
|
||||||
conversion = generator;
|
|
||||||
|
|
||||||
for (double time = original.StartTime; !Precision.DefinitelyBigger(time, generator.EndTime); time += generator.SegmentDuration)
|
|
||||||
{
|
{
|
||||||
recordNote(time, positionData?.Position ?? Vector2.Zero);
|
var generator = new DistanceObjectPatternGenerator(Random, original, beatmap, lastPattern, originalBeatmap);
|
||||||
computeDensity(time);
|
conversion = generator;
|
||||||
|
|
||||||
|
var positionData = original as IHasPosition;
|
||||||
|
|
||||||
|
for (double time = original.StartTime; !Precision.DefinitelyBigger(time, generator.EndTime); time += generator.SegmentDuration)
|
||||||
|
{
|
||||||
|
recordNote(time, positionData?.Position ?? Vector2.Zero);
|
||||||
|
computeDensity(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (endTimeData != null)
|
|
||||||
{
|
|
||||||
conversion = new EndTimeObjectPatternGenerator(Random, original, beatmap, originalBeatmap);
|
|
||||||
|
|
||||||
recordNote(endTimeData.EndTime, new Vector2(256, 192));
|
case IHasEndTime endTimeData:
|
||||||
computeDensity(endTimeData.EndTime);
|
{
|
||||||
}
|
conversion = new EndTimeObjectPatternGenerator(Random, original, beatmap, originalBeatmap);
|
||||||
else if (positionData != null)
|
|
||||||
{
|
|
||||||
computeDensity(original.StartTime);
|
|
||||||
|
|
||||||
conversion = new HitObjectPatternGenerator(Random, original, beatmap, lastPattern, lastTime, lastPosition, density, lastStair, originalBeatmap);
|
recordNote(endTimeData.EndTime, new Vector2(256, 192));
|
||||||
|
computeDensity(endTimeData.EndTime);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
recordNote(original.StartTime, positionData.Position);
|
case IHasPosition positionData:
|
||||||
|
{
|
||||||
|
computeDensity(original.StartTime);
|
||||||
|
|
||||||
|
conversion = new HitObjectPatternGenerator(Random, original, beatmap, lastPattern, lastTime, lastPosition, density, lastStair, originalBeatmap);
|
||||||
|
|
||||||
|
recordNote(original.StartTime, positionData.Position);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conversion == null)
|
if (conversion == null)
|
||||||
@ -219,14 +226,13 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
|
|
||||||
private Pattern generate()
|
private Pattern generate()
|
||||||
{
|
{
|
||||||
var endTimeData = HitObject as IHasEndTime;
|
|
||||||
var positionData = HitObject as IHasXPosition;
|
var positionData = HitObject as IHasXPosition;
|
||||||
|
|
||||||
int column = GetColumn(positionData?.X ?? 0);
|
int column = GetColumn(positionData?.X ?? 0);
|
||||||
|
|
||||||
var pattern = new Pattern();
|
var pattern = new Pattern();
|
||||||
|
|
||||||
if (endTimeData != null)
|
if (HitObject is IHasEndTime endTimeData)
|
||||||
{
|
{
|
||||||
pattern.Add(new HoldNote
|
pattern.Add(new HoldNote
|
||||||
{
|
{
|
||||||
@ -237,7 +243,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
Tail = { Samples = sampleInfoListAt(endTimeData.EndTime) },
|
Tail = { Samples = sampleInfoListAt(endTimeData.EndTime) },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (positionData != null)
|
else if (HitObject is IHasXPosition)
|
||||||
{
|
{
|
||||||
pattern.Add(new Note
|
pattern.Add(new Note
|
||||||
{
|
{
|
||||||
@ -257,9 +263,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private IList<HitSampleInfo> sampleInfoListAt(double time)
|
private IList<HitSampleInfo> sampleInfoListAt(double time)
|
||||||
{
|
{
|
||||||
var curveData = HitObject as IHasCurve;
|
if (!(HitObject is IHasCurve curveData))
|
||||||
|
|
||||||
if (curveData == null)
|
|
||||||
return HitObject.Samples;
|
return HitObject.Samples;
|
||||||
|
|
||||||
double segmentTime = (curveData.EndTime - HitObject.StartTime) / curveData.SpanCount();
|
double segmentTime = (curveData.EndTime - HitObject.StartTime) / curveData.SpanCount();
|
||||||
|
@ -364,7 +364,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isDoubleSample(HitSampleInfo sample) => sample.Name == HitSampleInfo.HIT_CLAP || sample.Name == HitSampleInfo.HIT_FINISH;
|
static bool isDoubleSample(HitSampleInfo sample) => sample.Name == HitSampleInfo.HIT_CLAP || sample.Name == HitSampleInfo.HIT_FINISH;
|
||||||
|
|
||||||
bool canGenerateTwoNotes = !convertType.HasFlag(PatternType.LowProbability);
|
bool canGenerateTwoNotes = !convertType.HasFlag(PatternType.LowProbability);
|
||||||
canGenerateTwoNotes &= HitObject.Samples.Any(isDoubleSample) || sampleInfoListAt(HitObject.StartTime).Any(isDoubleSample);
|
canGenerateTwoNotes &= HitObject.Samples.Any(isDoubleSample) || sampleInfoListAt(HitObject.StartTime).Any(isDoubleSample);
|
||||||
@ -474,9 +474,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private IList<HitSampleInfo> sampleInfoListAt(double time)
|
private IList<HitSampleInfo> sampleInfoListAt(double time)
|
||||||
{
|
{
|
||||||
var curveData = HitObject as IHasCurve;
|
if (!(HitObject is IHasCurve curveData))
|
||||||
|
|
||||||
if (curveData == null)
|
|
||||||
return HitObject.Samples;
|
return HitObject.Samples;
|
||||||
|
|
||||||
double segmentTime = (EndTime - HitObject.StartTime) / spanCount;
|
double segmentTime = (EndTime - HitObject.StartTime) / spanCount;
|
||||||
|
@ -12,6 +12,7 @@ using osu.Game.Rulesets.Mania.MathUtils;
|
|||||||
using osu.Game.Rulesets.Mania.Objects;
|
using osu.Game.Rulesets.Mania.Objects;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
||||||
{
|
{
|
||||||
@ -88,15 +89,10 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
|
|
||||||
public override IEnumerable<Pattern> Generate()
|
public override IEnumerable<Pattern> Generate()
|
||||||
{
|
{
|
||||||
yield return generate();
|
Pattern generateCore()
|
||||||
}
|
|
||||||
|
|
||||||
private Pattern generate()
|
|
||||||
{
|
|
||||||
var pattern = new Pattern();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
var pattern = new Pattern();
|
||||||
|
|
||||||
if (TotalColumns == 1)
|
if (TotalColumns == 1)
|
||||||
{
|
{
|
||||||
addToPattern(pattern, 0);
|
addToPattern(pattern, 0);
|
||||||
@ -168,54 +164,56 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (convertType.HasFlag(PatternType.KeepSingle))
|
if (convertType.HasFlag(PatternType.KeepSingle))
|
||||||
return pattern = generateRandomNotes(1);
|
return generateRandomNotes(1);
|
||||||
|
|
||||||
if (convertType.HasFlag(PatternType.Mirror))
|
if (convertType.HasFlag(PatternType.Mirror))
|
||||||
{
|
{
|
||||||
if (ConversionDifficulty > 6.5)
|
if (ConversionDifficulty > 6.5)
|
||||||
return pattern = generateRandomPatternWithMirrored(0.12, 0.38, 0.12);
|
return generateRandomPatternWithMirrored(0.12, 0.38, 0.12);
|
||||||
if (ConversionDifficulty > 4)
|
if (ConversionDifficulty > 4)
|
||||||
return pattern = generateRandomPatternWithMirrored(0.12, 0.17, 0);
|
return generateRandomPatternWithMirrored(0.12, 0.17, 0);
|
||||||
|
|
||||||
return pattern = generateRandomPatternWithMirrored(0.12, 0, 0);
|
return generateRandomPatternWithMirrored(0.12, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConversionDifficulty > 6.5)
|
if (ConversionDifficulty > 6.5)
|
||||||
{
|
{
|
||||||
if (convertType.HasFlag(PatternType.LowProbability))
|
if (convertType.HasFlag(PatternType.LowProbability))
|
||||||
return pattern = generateRandomPattern(0.78, 0.42, 0, 0);
|
return generateRandomPattern(0.78, 0.42, 0, 0);
|
||||||
|
|
||||||
return pattern = generateRandomPattern(1, 0.62, 0, 0);
|
return generateRandomPattern(1, 0.62, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConversionDifficulty > 4)
|
if (ConversionDifficulty > 4)
|
||||||
{
|
{
|
||||||
if (convertType.HasFlag(PatternType.LowProbability))
|
if (convertType.HasFlag(PatternType.LowProbability))
|
||||||
return pattern = generateRandomPattern(0.35, 0.08, 0, 0);
|
return generateRandomPattern(0.35, 0.08, 0, 0);
|
||||||
|
|
||||||
return pattern = generateRandomPattern(0.52, 0.15, 0, 0);
|
return generateRandomPattern(0.52, 0.15, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConversionDifficulty > 2)
|
if (ConversionDifficulty > 2)
|
||||||
{
|
{
|
||||||
if (convertType.HasFlag(PatternType.LowProbability))
|
if (convertType.HasFlag(PatternType.LowProbability))
|
||||||
return pattern = generateRandomPattern(0.18, 0, 0, 0);
|
return generateRandomPattern(0.18, 0, 0, 0);
|
||||||
|
|
||||||
return pattern = generateRandomPattern(0.45, 0, 0, 0);
|
return generateRandomPattern(0.45, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return pattern = generateRandomPattern(0, 0, 0, 0);
|
return generateRandomPattern(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
|
var p = generateCore();
|
||||||
|
|
||||||
|
foreach (var obj in p.HitObjects)
|
||||||
{
|
{
|
||||||
foreach (var obj in pattern.HitObjects)
|
if (convertType.HasFlag(PatternType.Stair) && obj.Column == TotalColumns - 1)
|
||||||
{
|
StairType = PatternType.ReverseStair;
|
||||||
if (convertType.HasFlag(PatternType.Stair) && obj.Column == TotalColumns - 1)
|
if (convertType.HasFlag(PatternType.ReverseStair) && obj.Column == RandomStart)
|
||||||
StairType = PatternType.ReverseStair;
|
StairType = PatternType.Stair;
|
||||||
if (convertType.HasFlag(PatternType.ReverseStair) && obj.Column == RandomStart)
|
|
||||||
StairType = PatternType.Stair;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return p.Yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -303,8 +301,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
|
|
||||||
var pattern = new Pattern();
|
var pattern = new Pattern();
|
||||||
|
|
||||||
bool addToCentre;
|
int noteCount = getRandomNoteCountMirrored(centreProbability, p2, p3, out var addToCentre);
|
||||||
int noteCount = getRandomNoteCountMirrored(centreProbability, p2, p3, out addToCentre);
|
|
||||||
|
|
||||||
int columnLimit = (TotalColumns % 2 == 0 ? TotalColumns : TotalColumns - 1) / 2;
|
int columnLimit = (TotalColumns % 2 == 0 ? TotalColumns : TotalColumns - 1) / 2;
|
||||||
int nextColumn = GetRandomColumn(upperBound: columnLimit);
|
int nextColumn = GetRandomColumn(upperBound: columnLimit);
|
||||||
@ -384,8 +381,6 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
/// <returns>The amount of notes to be generated. The note to be added to the centre column will NOT be part of this count.</returns>
|
/// <returns>The amount of notes to be generated. The note to be added to the centre column will NOT be part of this count.</returns>
|
||||||
private int getRandomNoteCountMirrored(double centreProbability, double p2, double p3, out bool addToCentre)
|
private int getRandomNoteCountMirrored(double centreProbability, double p2, double p3, out bool addToCentre)
|
||||||
{
|
{
|
||||||
addToCentre = false;
|
|
||||||
|
|
||||||
switch (TotalColumns)
|
switch (TotalColumns)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -147,9 +147,9 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
protected int FindAvailableColumn(int initialColumn, int? lowerBound = null, int? upperBound = null, Func<int, int> nextColumn = null, [InstantHandle] Func<int, bool> validation = null,
|
protected int FindAvailableColumn(int initialColumn, int? lowerBound = null, int? upperBound = null, Func<int, int> nextColumn = null, [InstantHandle] Func<int, bool> validation = null,
|
||||||
params Pattern[] patterns)
|
params Pattern[] patterns)
|
||||||
{
|
{
|
||||||
lowerBound = lowerBound ?? RandomStart;
|
lowerBound ??= RandomStart;
|
||||||
upperBound = upperBound ?? TotalColumns;
|
upperBound ??= TotalColumns;
|
||||||
nextColumn = nextColumn ?? (_ => GetRandomColumn(lowerBound, upperBound));
|
nextColumn ??= (_ => GetRandomColumn(lowerBound, upperBound));
|
||||||
|
|
||||||
// Check for the initial column
|
// Check for the initial column
|
||||||
if (isValid(initialColumn))
|
if (isValid(initialColumn))
|
||||||
|
@ -55,7 +55,7 @@ namespace osu.Game.Rulesets.Mania.Edit
|
|||||||
|
|
||||||
// Flip the vertical coordinate space when scrolling downwards
|
// Flip the vertical coordinate space when scrolling downwards
|
||||||
if (scrollingInfo.Direction.Value == ScrollingDirection.Down)
|
if (scrollingInfo.Direction.Value == ScrollingDirection.Down)
|
||||||
targetPosition = targetPosition - referenceParent.DrawHeight;
|
targetPosition -= referenceParent.DrawHeight;
|
||||||
|
|
||||||
float movementDelta = targetPosition - reference.DrawableObject.Position.Y;
|
float movementDelta = targetPosition - reference.DrawableObject.Position.Y;
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
|
|
||||||
foreach (var stage in stages)
|
foreach (var stage in stages)
|
||||||
{
|
{
|
||||||
sum = sum + stage.Columns.Count;
|
sum += stage.Columns.Count;
|
||||||
if (sum > column)
|
if (sum > column)
|
||||||
return stage;
|
return stage;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConvertValue createConvertValue(OsuHitObject obj) => new ConvertValue
|
static ConvertValue createConvertValue(OsuHitObject obj) => new ConvertValue
|
||||||
{
|
{
|
||||||
StartTime = obj.StartTime,
|
StartTime = obj.StartTime,
|
||||||
EndTime = obj.GetEndTime(),
|
EndTime = obj.GetEndTime(),
|
||||||
|
@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
|
|
||||||
private Drawable testSingle(float circleSize, bool auto = false, double timeOffset = 0, Vector2? positionOffset = null)
|
private Drawable testSingle(float circleSize, bool auto = false, double timeOffset = 0, Vector2? positionOffset = null)
|
||||||
{
|
{
|
||||||
positionOffset = positionOffset ?? Vector2.Zero;
|
positionOffset ??= Vector2.Zero;
|
||||||
|
|
||||||
var circle = new HitCircle
|
var circle = new HitCircle
|
||||||
{
|
{
|
||||||
|
@ -148,9 +148,9 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
AddAssert("repeat samples updated", () => ((Slider)slider.HitObject).NestedHitObjects.OfType<RepeatPoint>().All(assertSamples));
|
AddAssert("repeat samples updated", () => ((Slider)slider.HitObject).NestedHitObjects.OfType<RepeatPoint>().All(assertSamples));
|
||||||
AddAssert("tail has no samples", () => ((Slider)slider.HitObject).TailCircle.Samples.Count == 0);
|
AddAssert("tail has no samples", () => ((Slider)slider.HitObject).TailCircle.Samples.Count == 0);
|
||||||
|
|
||||||
bool assertTickSamples(SliderTick tick) => tick.Samples.Single().Name == "slidertick";
|
static bool assertTickSamples(SliderTick tick) => tick.Samples.Single().Name == "slidertick";
|
||||||
|
|
||||||
bool assertSamples(HitObject hitObject)
|
static bool assertSamples(HitObject hitObject)
|
||||||
{
|
{
|
||||||
return hitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP)
|
return hitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP)
|
||||||
&& hitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_WHISTLE);
|
&& hitObject.Samples.Any(s => s.Name == HitSampleInfo.HIT_WHISTLE);
|
||||||
@ -183,8 +183,9 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
AddAssert("repeat samples not updated", () => ((Slider)slider.HitObject).NestedHitObjects.OfType<RepeatPoint>().All(assertSamples));
|
AddAssert("repeat samples not updated", () => ((Slider)slider.HitObject).NestedHitObjects.OfType<RepeatPoint>().All(assertSamples));
|
||||||
AddAssert("tail has no samples", () => ((Slider)slider.HitObject).TailCircle.Samples.Count == 0);
|
AddAssert("tail has no samples", () => ((Slider)slider.HitObject).TailCircle.Samples.Count == 0);
|
||||||
|
|
||||||
bool assertTickSamples(SliderTick tick) => tick.Samples.Single().Name == "slidertick";
|
static bool assertTickSamples(SliderTick tick) => tick.Samples.Single().Name == "slidertick";
|
||||||
bool assertSamples(HitObject hitObject) => hitObject.Samples.All(s => s.Name != HitSampleInfo.HIT_CLAP && s.Name != HitSampleInfo.HIT_WHISTLE);
|
|
||||||
|
static bool assertSamples(HitObject hitObject) => hitObject.Samples.All(s => s.Name != HitSampleInfo.HIT_CLAP && s.Name != HitSampleInfo.HIT_WHISTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Drawable testSimpleBig(int repeats = 0) => createSlider(2, repeats: repeats);
|
private Drawable testSimpleBig(int repeats = 0) => createSlider(2, repeats: repeats);
|
||||||
@ -379,8 +380,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
|
|
||||||
private void onNewResult(DrawableHitObject judgedObject, JudgementResult result)
|
private void onNewResult(DrawableHitObject judgedObject, JudgementResult result)
|
||||||
{
|
{
|
||||||
var osuObject = judgedObject as DrawableOsuHitObject;
|
if (!(judgedObject is DrawableOsuHitObject osuObject))
|
||||||
if (osuObject == null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
OsuSpriteText text;
|
OsuSpriteText text;
|
||||||
|
@ -9,6 +9,7 @@ using System.Collections.Generic;
|
|||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using System;
|
using System;
|
||||||
using osu.Game.Rulesets.Osu.UI;
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Beatmaps
|
namespace osu.Game.Rulesets.Osu.Beatmaps
|
||||||
{
|
{
|
||||||
@ -23,52 +24,48 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
|
|
||||||
protected override IEnumerable<OsuHitObject> ConvertHitObject(HitObject original, IBeatmap beatmap)
|
protected override IEnumerable<OsuHitObject> ConvertHitObject(HitObject original, IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var curveData = original as IHasCurve;
|
|
||||||
var endTimeData = original as IHasEndTime;
|
|
||||||
var positionData = original as IHasPosition;
|
var positionData = original as IHasPosition;
|
||||||
var comboData = original as IHasCombo;
|
var comboData = original as IHasCombo;
|
||||||
var legacyOffset = original as IHasLegacyLastTickOffset;
|
|
||||||
|
|
||||||
if (curveData != null)
|
switch (original)
|
||||||
{
|
{
|
||||||
yield return new Slider
|
case IHasCurve curveData:
|
||||||
{
|
return new Slider
|
||||||
StartTime = original.StartTime,
|
{
|
||||||
Samples = original.Samples,
|
StartTime = original.StartTime,
|
||||||
Path = curveData.Path,
|
Samples = original.Samples,
|
||||||
NodeSamples = curveData.NodeSamples,
|
Path = curveData.Path,
|
||||||
RepeatCount = curveData.RepeatCount,
|
NodeSamples = curveData.NodeSamples,
|
||||||
Position = positionData?.Position ?? Vector2.Zero,
|
RepeatCount = curveData.RepeatCount,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
Position = positionData?.Position ?? Vector2.Zero,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
LegacyLastTickOffset = legacyOffset?.LegacyLastTickOffset,
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
// prior to v8, speed multipliers don't adjust for how many ticks are generated over the same distance.
|
LegacyLastTickOffset = (original as IHasLegacyLastTickOffset)?.LegacyLastTickOffset,
|
||||||
// this results in more (or less) ticks being generated in <v8 maps for the same time duration.
|
// prior to v8, speed multipliers don't adjust for how many ticks are generated over the same distance.
|
||||||
TickDistanceMultiplier = beatmap.BeatmapInfo.BeatmapVersion < 8 ? 1f / beatmap.ControlPointInfo.DifficultyPointAt(original.StartTime).SpeedMultiplier : 1
|
// this results in more (or less) ticks being generated in <v8 maps for the same time duration.
|
||||||
};
|
TickDistanceMultiplier = beatmap.BeatmapInfo.BeatmapVersion < 8 ? 1f / beatmap.ControlPointInfo.DifficultyPointAt(original.StartTime).SpeedMultiplier : 1
|
||||||
}
|
}.Yield();
|
||||||
else if (endTimeData != null)
|
|
||||||
{
|
case IHasEndTime endTimeData:
|
||||||
yield return new Spinner
|
return new Spinner
|
||||||
{
|
{
|
||||||
StartTime = original.StartTime,
|
StartTime = original.StartTime,
|
||||||
Samples = original.Samples,
|
Samples = original.Samples,
|
||||||
EndTime = endTimeData.EndTime,
|
EndTime = endTimeData.EndTime,
|
||||||
Position = positionData?.Position ?? OsuPlayfield.BASE_SIZE / 2,
|
Position = positionData?.Position ?? OsuPlayfield.BASE_SIZE / 2,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
};
|
}.Yield();
|
||||||
}
|
|
||||||
else
|
default:
|
||||||
{
|
return new HitCircle
|
||||||
yield return new HitCircle
|
{
|
||||||
{
|
StartTime = original.StartTime,
|
||||||
StartTime = original.StartTime,
|
Samples = original.Samples,
|
||||||
Samples = original.Samples,
|
Position = positionData?.Position ?? Vector2.Zero,
|
||||||
Position = positionData?.Position ?? Vector2.Zero,
|
NewCombo = comboData?.NewCombo ?? false,
|
||||||
NewCombo = comboData?.NewCombo ?? false,
|
ComboOffset = comboData?.ComboOffset ?? 0,
|
||||||
ComboOffset = comboData?.ComboOffset ?? 0,
|
}.Yield();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
|
|||||||
if (progress % 2 >= 1)
|
if (progress % 2 >= 1)
|
||||||
progress = 1 - progress % 1;
|
progress = 1 - progress % 1;
|
||||||
else
|
else
|
||||||
progress = progress % 1;
|
progress %= 1;
|
||||||
|
|
||||||
// ReSharper disable once PossibleInvalidOperationException (bugged in current r# version)
|
// ReSharper disable once PossibleInvalidOperationException (bugged in current r# version)
|
||||||
var diff = slider.StackedPosition + slider.Path.PositionAt(progress) - slider.LazyEndPosition.Value;
|
var diff = slider.StackedPosition + slider.Path.PositionAt(progress) - slider.LazyEndPosition.Value;
|
||||||
|
@ -130,7 +130,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
|
|||||||
newControlPoints[i] = newControlPoints[i] - first;
|
newControlPoints[i] = newControlPoints[i] - first;
|
||||||
|
|
||||||
// The slider's position defines the position of the first control point, and all further control points are relative to that point
|
// The slider's position defines the position of the first control point, and all further control points are relative to that point
|
||||||
slider.Position = slider.Position + first;
|
slider.Position += first;
|
||||||
|
|
||||||
// Since pieces are re-used, they will not point to the deleted control points while remaining selected
|
// Since pieces are re-used, they will not point to the deleted control points while remaining selected
|
||||||
foreach (var piece in Pieces)
|
foreach (var piece in Pieces)
|
||||||
|
@ -22,8 +22,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y);
|
osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y);
|
||||||
|
|
||||||
var slider = hitObject as Slider;
|
if (!(hitObject is Slider slider))
|
||||||
if (slider == null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
slider.NestedHitObjects.OfType<SliderTick>().ForEach(h => h.Position = new Vector2(h.Position.X, OsuPlayfield.BASE_SIZE.Y - h.Position.Y));
|
slider.NestedHitObjects.OfType<SliderTick>().ForEach(h => h.Position = new Vector2(h.Position.X, OsuPlayfield.BASE_SIZE.Y - h.Position.Y));
|
||||||
|
@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public override void ApplyToDrawableHitObjects(IEnumerable<DrawableHitObject> drawables)
|
public override void ApplyToDrawableHitObjects(IEnumerable<DrawableHitObject> drawables)
|
||||||
{
|
{
|
||||||
void adjustFadeIn(OsuHitObject h) => h.TimeFadeIn = h.TimePreempt * fade_in_duration_multiplier;
|
static void adjustFadeIn(OsuHitObject h) => h.TimeFadeIn = h.TimePreempt * fade_in_duration_multiplier;
|
||||||
|
|
||||||
foreach (var d in drawables.OfType<DrawableOsuHitObject>())
|
foreach (var d in drawables.OfType<DrawableOsuHitObject>())
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
protected sealed override double InitialLifetimeOffset => HitObject.TimePreempt;
|
protected sealed override double InitialLifetimeOffset => HitObject.TimePreempt;
|
||||||
|
|
||||||
private OsuInputManager osuActionInputManager;
|
private OsuInputManager osuActionInputManager;
|
||||||
internal OsuInputManager OsuActionInputManager => osuActionInputManager ?? (osuActionInputManager = GetContainingInputManager() as OsuInputManager);
|
internal OsuInputManager OsuActionInputManager => osuActionInputManager ??= GetContainingInputManager() as OsuInputManager;
|
||||||
|
|
||||||
protected virtual void Shake(double maximumLength) => shakeContainer.Shake(maximumLength);
|
protected virtual void Shake(double maximumLength) => shakeContainer.Shake(maximumLength);
|
||||||
|
|
||||||
|
@ -73,127 +73,133 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
|
|||||||
|
|
||||||
protected override IEnumerable<TaikoHitObject> ConvertHitObject(HitObject obj, IBeatmap beatmap)
|
protected override IEnumerable<TaikoHitObject> ConvertHitObject(HitObject obj, IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var distanceData = obj as IHasDistance;
|
|
||||||
var repeatsData = obj as IHasRepeats;
|
|
||||||
var endTimeData = obj as IHasEndTime;
|
|
||||||
var curveData = obj as IHasCurve;
|
|
||||||
|
|
||||||
// Old osu! used hit sounding to determine various hit type information
|
// Old osu! used hit sounding to determine various hit type information
|
||||||
IList<HitSampleInfo> samples = obj.Samples;
|
IList<HitSampleInfo> samples = obj.Samples;
|
||||||
|
|
||||||
bool strong = samples.Any(s => s.Name == HitSampleInfo.HIT_FINISH);
|
bool strong = samples.Any(s => s.Name == HitSampleInfo.HIT_FINISH);
|
||||||
|
|
||||||
if (distanceData != null)
|
switch (obj)
|
||||||
{
|
{
|
||||||
// Number of spans of the object - one for the initial length and for each repeat
|
case IHasDistance distanceData:
|
||||||
int spans = repeatsData?.SpanCount() ?? 1;
|
|
||||||
|
|
||||||
TimingControlPoint timingPoint = beatmap.ControlPointInfo.TimingPointAt(obj.StartTime);
|
|
||||||
DifficultyControlPoint difficultyPoint = beatmap.ControlPointInfo.DifficultyPointAt(obj.StartTime);
|
|
||||||
|
|
||||||
double speedAdjustment = difficultyPoint.SpeedMultiplier;
|
|
||||||
double speedAdjustedBeatLength = timingPoint.BeatLength / speedAdjustment;
|
|
||||||
|
|
||||||
// The true distance, accounting for any repeats. This ends up being the drum roll distance later
|
|
||||||
double distance = distanceData.Distance * spans * legacy_velocity_multiplier;
|
|
||||||
|
|
||||||
// The velocity of the taiko hit object - calculated as the velocity of a drum roll
|
|
||||||
double taikoVelocity = taiko_base_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier / speedAdjustedBeatLength;
|
|
||||||
// The duration of the taiko hit object
|
|
||||||
double taikoDuration = distance / taikoVelocity;
|
|
||||||
|
|
||||||
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
|
||||||
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier / speedAdjustedBeatLength;
|
|
||||||
// The duration of the osu! hit object
|
|
||||||
double osuDuration = distance / osuVelocity;
|
|
||||||
|
|
||||||
// osu-stable always uses the speed-adjusted beatlength to determine the velocities, but
|
|
||||||
// only uses it for tick rate if beatmap version < 8
|
|
||||||
if (beatmap.BeatmapInfo.BeatmapVersion >= 8)
|
|
||||||
speedAdjustedBeatLength *= speedAdjustment;
|
|
||||||
|
|
||||||
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
|
||||||
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate, taikoDuration / spans);
|
|
||||||
|
|
||||||
if (!isForCurrentRuleset && tickSpacing > 0 && osuDuration < 2 * speedAdjustedBeatLength)
|
|
||||||
{
|
{
|
||||||
List<IList<HitSampleInfo>> allSamples = curveData != null ? curveData.NodeSamples : new List<IList<HitSampleInfo>>(new[] { samples });
|
// Number of spans of the object - one for the initial length and for each repeat
|
||||||
|
int spans = (obj as IHasRepeats)?.SpanCount() ?? 1;
|
||||||
|
|
||||||
int i = 0;
|
TimingControlPoint timingPoint = beatmap.ControlPointInfo.TimingPointAt(obj.StartTime);
|
||||||
|
DifficultyControlPoint difficultyPoint = beatmap.ControlPointInfo.DifficultyPointAt(obj.StartTime);
|
||||||
|
|
||||||
for (double j = obj.StartTime; j <= obj.StartTime + taikoDuration + tickSpacing / 8; j += tickSpacing)
|
double speedAdjustment = difficultyPoint.SpeedMultiplier;
|
||||||
|
double speedAdjustedBeatLength = timingPoint.BeatLength / speedAdjustment;
|
||||||
|
|
||||||
|
// The true distance, accounting for any repeats. This ends up being the drum roll distance later
|
||||||
|
double distance = distanceData.Distance * spans * legacy_velocity_multiplier;
|
||||||
|
|
||||||
|
// The velocity of the taiko hit object - calculated as the velocity of a drum roll
|
||||||
|
double taikoVelocity = taiko_base_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier / speedAdjustedBeatLength;
|
||||||
|
// The duration of the taiko hit object
|
||||||
|
double taikoDuration = distance / taikoVelocity;
|
||||||
|
|
||||||
|
// The velocity of the osu! hit object - calculated as the velocity of a slider
|
||||||
|
double osuVelocity = osu_base_scoring_distance * beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier / speedAdjustedBeatLength;
|
||||||
|
// The duration of the osu! hit object
|
||||||
|
double osuDuration = distance / osuVelocity;
|
||||||
|
|
||||||
|
// osu-stable always uses the speed-adjusted beatlength to determine the velocities, but
|
||||||
|
// only uses it for tick rate if beatmap version < 8
|
||||||
|
if (beatmap.BeatmapInfo.BeatmapVersion >= 8)
|
||||||
|
speedAdjustedBeatLength *= speedAdjustment;
|
||||||
|
|
||||||
|
// If the drum roll is to be split into hit circles, assume the ticks are 1/8 spaced within the duration of one beat
|
||||||
|
double tickSpacing = Math.Min(speedAdjustedBeatLength / beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate, taikoDuration / spans);
|
||||||
|
|
||||||
|
if (!isForCurrentRuleset && tickSpacing > 0 && osuDuration < 2 * speedAdjustedBeatLength)
|
||||||
{
|
{
|
||||||
IList<HitSampleInfo> currentSamples = allSamples[i];
|
List<IList<HitSampleInfo>> allSamples = obj is IHasCurve curveData ? curveData.NodeSamples : new List<IList<HitSampleInfo>>(new[] { samples });
|
||||||
bool isRim = currentSamples.Any(s => s.Name == HitSampleInfo.HIT_CLAP || s.Name == HitSampleInfo.HIT_WHISTLE);
|
|
||||||
strong = currentSamples.Any(s => s.Name == HitSampleInfo.HIT_FINISH);
|
|
||||||
|
|
||||||
if (isRim)
|
int i = 0;
|
||||||
{
|
|
||||||
yield return new RimHit
|
|
||||||
{
|
|
||||||
StartTime = j,
|
|
||||||
Samples = currentSamples,
|
|
||||||
IsStrong = strong
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
yield return new CentreHit
|
|
||||||
{
|
|
||||||
StartTime = j,
|
|
||||||
Samples = currentSamples,
|
|
||||||
IsStrong = strong
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
i = (i + 1) % allSamples.Count;
|
for (double j = obj.StartTime; j <= obj.StartTime + taikoDuration + tickSpacing / 8; j += tickSpacing)
|
||||||
|
{
|
||||||
|
IList<HitSampleInfo> currentSamples = allSamples[i];
|
||||||
|
bool isRim = currentSamples.Any(s => s.Name == HitSampleInfo.HIT_CLAP || s.Name == HitSampleInfo.HIT_WHISTLE);
|
||||||
|
strong = currentSamples.Any(s => s.Name == HitSampleInfo.HIT_FINISH);
|
||||||
|
|
||||||
|
if (isRim)
|
||||||
|
{
|
||||||
|
yield return new RimHit
|
||||||
|
{
|
||||||
|
StartTime = j,
|
||||||
|
Samples = currentSamples,
|
||||||
|
IsStrong = strong
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yield return new CentreHit
|
||||||
|
{
|
||||||
|
StartTime = j,
|
||||||
|
Samples = currentSamples,
|
||||||
|
IsStrong = strong
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (i + 1) % allSamples.Count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
|
||||||
{
|
|
||||||
yield return new DrumRoll
|
|
||||||
{
|
{
|
||||||
StartTime = obj.StartTime,
|
yield return new DrumRoll
|
||||||
Samples = obj.Samples,
|
{
|
||||||
IsStrong = strong,
|
StartTime = obj.StartTime,
|
||||||
Duration = taikoDuration,
|
Samples = obj.Samples,
|
||||||
TickRate = beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate == 3 ? 3 : 4
|
IsStrong = strong,
|
||||||
};
|
Duration = taikoDuration,
|
||||||
}
|
TickRate = beatmap.BeatmapInfo.BaseDifficulty.SliderTickRate == 3 ? 3 : 4
|
||||||
}
|
};
|
||||||
else if (endTimeData != null)
|
}
|
||||||
{
|
|
||||||
double hitMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty, 3, 5, 7.5) * swell_hit_multiplier;
|
|
||||||
|
|
||||||
yield return new Swell
|
break;
|
||||||
{
|
|
||||||
StartTime = obj.StartTime,
|
|
||||||
Samples = obj.Samples,
|
|
||||||
Duration = endTimeData.Duration,
|
|
||||||
RequiredHits = (int)Math.Max(1, endTimeData.Duration / 1000 * hitMultiplier)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool isRim = samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP || s.Name == HitSampleInfo.HIT_WHISTLE);
|
|
||||||
|
|
||||||
if (isRim)
|
|
||||||
{
|
|
||||||
yield return new RimHit
|
|
||||||
{
|
|
||||||
StartTime = obj.StartTime,
|
|
||||||
Samples = obj.Samples,
|
|
||||||
IsStrong = strong
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
case IHasEndTime endTimeData:
|
||||||
{
|
{
|
||||||
yield return new CentreHit
|
double hitMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.OverallDifficulty, 3, 5, 7.5) * swell_hit_multiplier;
|
||||||
|
|
||||||
|
yield return new Swell
|
||||||
{
|
{
|
||||||
StartTime = obj.StartTime,
|
StartTime = obj.StartTime,
|
||||||
Samples = obj.Samples,
|
Samples = obj.Samples,
|
||||||
IsStrong = strong
|
Duration = endTimeData.Duration,
|
||||||
|
RequiredHits = (int)Math.Max(1, endTimeData.Duration / 1000 * hitMultiplier)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
bool isRim = samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP || s.Name == HitSampleInfo.HIT_WHISTLE);
|
||||||
|
|
||||||
|
if (isRim)
|
||||||
|
{
|
||||||
|
yield return new RimHit
|
||||||
|
{
|
||||||
|
StartTime = obj.StartTime,
|
||||||
|
Samples = obj.Samples,
|
||||||
|
IsStrong = strong
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yield return new CentreHit
|
||||||
|
{
|
||||||
|
StartTime = obj.StartTime,
|
||||||
|
Samples = obj.Samples,
|
||||||
|
IsStrong = strong
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,27 +10,15 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
|
|||||||
{
|
{
|
||||||
public class TaikoPiece : BeatSyncedContainer, IHasAccentColour
|
public class TaikoPiece : BeatSyncedContainer, IHasAccentColour
|
||||||
{
|
{
|
||||||
private Color4 accentColour;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The colour of the inner circle and outer glows.
|
/// The colour of the inner circle and outer glows.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual Color4 AccentColour
|
public virtual Color4 AccentColour { get; set; }
|
||||||
{
|
|
||||||
get => accentColour;
|
|
||||||
set => accentColour = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool kiaiMode;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether Kiai mode effects are enabled for this circle piece.
|
/// Whether Kiai mode effects are enabled for this circle piece.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual bool KiaiMode
|
public virtual bool KiaiMode { get; set; }
|
||||||
{
|
|
||||||
get => kiaiMode;
|
|
||||||
set => kiaiMode = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaikoPiece()
|
public TaikoPiece()
|
||||||
{
|
{
|
||||||
|
@ -43,76 +43,83 @@ namespace osu.Game.Rulesets.Taiko.Replays
|
|||||||
IHasEndTime endTimeData = h as IHasEndTime;
|
IHasEndTime endTimeData = h as IHasEndTime;
|
||||||
double endTime = endTimeData?.EndTime ?? h.StartTime;
|
double endTime = endTimeData?.EndTime ?? h.StartTime;
|
||||||
|
|
||||||
Swell swell = h as Swell;
|
switch (h)
|
||||||
DrumRoll drumRoll = h as DrumRoll;
|
|
||||||
Hit hit = h as Hit;
|
|
||||||
|
|
||||||
if (swell != null)
|
|
||||||
{
|
{
|
||||||
int d = 0;
|
case Swell swell:
|
||||||
int count = 0;
|
|
||||||
int req = swell.RequiredHits;
|
|
||||||
double hitRate = Math.Min(swell_hit_speed, swell.Duration / req);
|
|
||||||
|
|
||||||
for (double j = h.StartTime; j < endTime; j += hitRate)
|
|
||||||
{
|
{
|
||||||
TaikoAction action;
|
int d = 0;
|
||||||
|
int count = 0;
|
||||||
|
int req = swell.RequiredHits;
|
||||||
|
double hitRate = Math.Min(swell_hit_speed, swell.Duration / req);
|
||||||
|
|
||||||
switch (d)
|
for (double j = h.StartTime; j < endTime; j += hitRate)
|
||||||
{
|
{
|
||||||
default:
|
TaikoAction action;
|
||||||
case 0:
|
|
||||||
action = TaikoAction.LeftCentre;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
switch (d)
|
||||||
action = TaikoAction.LeftRim;
|
{
|
||||||
break;
|
default:
|
||||||
|
case 0:
|
||||||
|
action = TaikoAction.LeftCentre;
|
||||||
|
break;
|
||||||
|
|
||||||
case 2:
|
case 1:
|
||||||
action = TaikoAction.RightCentre;
|
action = TaikoAction.LeftRim;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 2:
|
||||||
action = TaikoAction.RightRim;
|
action = TaikoAction.RightCentre;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
action = TaikoAction.RightRim;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Frames.Add(new TaikoReplayFrame(j, action));
|
||||||
|
d = (d + 1) % 4;
|
||||||
|
if (++count == req)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Frames.Add(new TaikoReplayFrame(j, action));
|
break;
|
||||||
d = (d + 1) % 4;
|
|
||||||
if (++count == req)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (drumRoll != null)
|
|
||||||
{
|
|
||||||
foreach (var tick in drumRoll.NestedHitObjects.OfType<DrumRollTick>())
|
|
||||||
{
|
|
||||||
Frames.Add(new TaikoReplayFrame(tick.StartTime, hitButton ? TaikoAction.LeftCentre : TaikoAction.RightCentre));
|
|
||||||
hitButton = !hitButton;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (hit != null)
|
|
||||||
{
|
|
||||||
TaikoAction[] actions;
|
|
||||||
|
|
||||||
if (hit is CentreHit)
|
|
||||||
{
|
|
||||||
actions = h.IsStrong
|
|
||||||
? new[] { TaikoAction.LeftCentre, TaikoAction.RightCentre }
|
|
||||||
: new[] { hitButton ? TaikoAction.LeftCentre : TaikoAction.RightCentre };
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
actions = h.IsStrong
|
|
||||||
? new[] { TaikoAction.LeftRim, TaikoAction.RightRim }
|
|
||||||
: new[] { hitButton ? TaikoAction.LeftRim : TaikoAction.RightRim };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Frames.Add(new TaikoReplayFrame(h.StartTime, actions));
|
case DrumRoll drumRoll:
|
||||||
|
{
|
||||||
|
foreach (var tick in drumRoll.NestedHitObjects.OfType<DrumRollTick>())
|
||||||
|
{
|
||||||
|
Frames.Add(new TaikoReplayFrame(tick.StartTime, hitButton ? TaikoAction.LeftCentre : TaikoAction.RightCentre));
|
||||||
|
hitButton = !hitButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Hit hit:
|
||||||
|
{
|
||||||
|
TaikoAction[] actions;
|
||||||
|
|
||||||
|
if (hit is CentreHit)
|
||||||
|
{
|
||||||
|
actions = h.IsStrong
|
||||||
|
? new[] { TaikoAction.LeftCentre, TaikoAction.RightCentre }
|
||||||
|
: new[] { hitButton ? TaikoAction.LeftCentre : TaikoAction.RightCentre };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
actions = h.IsStrong
|
||||||
|
? new[] { TaikoAction.LeftRim, TaikoAction.RightRim }
|
||||||
|
: new[] { hitButton ? TaikoAction.LeftRim : TaikoAction.RightRim };
|
||||||
|
}
|
||||||
|
|
||||||
|
Frames.Add(new TaikoReplayFrame(h.StartTime, actions));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException("Unknown hit object type.");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
throw new InvalidOperationException("Unknown hit object type.");
|
|
||||||
|
|
||||||
var nextHitObject = GetNextObject(i); // Get the next object that requires pressing the same button
|
var nextHitObject = GetNextObject(i); // Get the next object that requires pressing the same button
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual("soft-hitnormal8", getTestableSampleInfo(hitObjects[4]).LookupNames.First());
|
Assert.AreEqual("soft-hitnormal8", getTestableSampleInfo(hitObjects[4]).LookupNames.First());
|
||||||
}
|
}
|
||||||
|
|
||||||
HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
static HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@ -431,7 +431,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual("normal-hitnormal3", getTestableSampleInfo(hitObjects[2]).LookupNames.First());
|
Assert.AreEqual("normal-hitnormal3", getTestableSampleInfo(hitObjects[2]).LookupNames.First());
|
||||||
}
|
}
|
||||||
|
|
||||||
HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
static HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@ -451,7 +451,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.AreEqual(70, getTestableSampleInfo(hitObjects[3]).Volume);
|
Assert.AreEqual(70, getTestableSampleInfo(hitObjects[3]).Volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
static HitSampleInfo getTestableSampleInfo(HitObject hitObject) => hitObject.SampleControlPoint.ApplyTo(hitObject.Samples[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -59,7 +59,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var _ = int.Parse(input);
|
_ = int.Parse(input);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -87,7 +87,7 @@ namespace osu.Game.Tests.NonVisual.Filtering
|
|||||||
Assert.IsNull(filterCriteria.BPM.Max);
|
Assert.IsNull(filterCriteria.BPM.Max);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object[] lengthQueryExamples =
|
private static readonly object[] length_query_examples =
|
||||||
{
|
{
|
||||||
new object[] { "6ms", TimeSpan.FromMilliseconds(6), TimeSpan.FromMilliseconds(1) },
|
new object[] { "6ms", TimeSpan.FromMilliseconds(6), TimeSpan.FromMilliseconds(1) },
|
||||||
new object[] { "23s", TimeSpan.FromSeconds(23), TimeSpan.FromSeconds(1) },
|
new object[] { "23s", TimeSpan.FromSeconds(23), TimeSpan.FromSeconds(1) },
|
||||||
@ -97,7 +97,7 @@ namespace osu.Game.Tests.NonVisual.Filtering
|
|||||||
};
|
};
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[TestCaseSource(nameof(lengthQueryExamples))]
|
[TestCaseSource(nameof(length_query_examples))]
|
||||||
public void TestApplyLengthQueries(string lengthQuery, TimeSpan expectedLength, TimeSpan scale)
|
public void TestApplyLengthQueries(string lengthQuery, TimeSpan expectedLength, TimeSpan scale)
|
||||||
{
|
{
|
||||||
string query = $"length={lengthQuery} time";
|
string query = $"length={lengthQuery} time";
|
||||||
|
@ -335,16 +335,14 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
|
|
||||||
private class TestSkinComponent : ISkinComponent
|
private class TestSkinComponent : ISkinComponent
|
||||||
{
|
{
|
||||||
private readonly string name;
|
|
||||||
|
|
||||||
public TestSkinComponent(string name)
|
public TestSkinComponent(string name)
|
||||||
{
|
{
|
||||||
this.name = name;
|
LookupName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ComponentGroup => string.Empty;
|
public string ComponentGroup => string.Empty;
|
||||||
|
|
||||||
public string LookupName => name;
|
public string LookupName { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ namespace osu.Game.Tests.Visual.Online
|
|||||||
AddStep("set second set", () => successRate.Beatmap = secondBeatmap);
|
AddStep("set second set", () => successRate.Beatmap = secondBeatmap);
|
||||||
AddAssert("ratings set", () => successRate.Graph.Metrics == secondBeatmap.Metrics);
|
AddAssert("ratings set", () => successRate.Graph.Metrics == secondBeatmap.Metrics);
|
||||||
|
|
||||||
BeatmapInfo createBeatmap() => new BeatmapInfo
|
static BeatmapInfo createBeatmap() => new BeatmapInfo
|
||||||
{
|
{
|
||||||
Metrics = new BeatmapMetrics
|
Metrics = new BeatmapMetrics
|
||||||
{
|
{
|
||||||
|
@ -259,7 +259,7 @@ namespace osu.Game.Tournament.Components
|
|||||||
Margin = new MarginPadding { Horizontal = 15, Vertical = 1 };
|
Margin = new MarginPadding { Horizontal = 15, Vertical = 1 };
|
||||||
AutoSizeAxes = Axes.Both;
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
void cp(SpriteText s, Color4 colour)
|
static void cp(SpriteText s, Color4 colour)
|
||||||
{
|
{
|
||||||
s.Colour = colour;
|
s.Colour = colour;
|
||||||
s.Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15);
|
s.Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15);
|
||||||
@ -267,7 +267,7 @@ namespace osu.Game.Tournament.Components
|
|||||||
|
|
||||||
for (var i = 0; i < tuples.Length; i++)
|
for (var i = 0; i < tuples.Length; i++)
|
||||||
{
|
{
|
||||||
var tuple = tuples[i];
|
var (heading, content) = tuples[i];
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
@ -278,9 +278,9 @@ namespace osu.Game.Tournament.Components
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
AddText(new OsuSpriteText { Text = tuple.heading }, s => cp(s, OsuColour.Gray(0.33f)));
|
AddText(new OsuSpriteText { Text = heading }, s => cp(s, OsuColour.Gray(0.33f)));
|
||||||
AddText(" ", s => cp(s, OsuColour.Gray(0.33f)));
|
AddText(" ", s => cp(s, OsuColour.Gray(0.33f)));
|
||||||
AddText(new OsuSpriteText { Text = tuple.content }, s => cp(s, OsuColour.Gray(0.5f)));
|
AddText(new OsuSpriteText { Text = content }, s => cp(s, OsuColour.Gray(0.5f)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ namespace osu.Game.Tournament.IPC
|
|||||||
{
|
{
|
||||||
protected override string LocateBasePath()
|
protected override string LocateBasePath()
|
||||||
{
|
{
|
||||||
bool checkExists(string p)
|
static bool checkExists(string p)
|
||||||
{
|
{
|
||||||
return File.Exists(Path.Combine(p, "ipc.txt"));
|
return File.Exists(Path.Combine(p, "ipc.txt"));
|
||||||
}
|
}
|
||||||
@ -180,7 +180,7 @@ namespace osu.Game.Tournament.IPC
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("osu"))
|
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("osu"))
|
||||||
stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(String.Empty).ToString().Split('"')[1].Replace("osu!.exe", "");
|
stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(string.Empty).ToString().Split('"')[1].Replace("osu!.exe", "");
|
||||||
|
|
||||||
if (checkExists(stableInstallPath))
|
if (checkExists(stableInstallPath))
|
||||||
return stableInstallPath;
|
return stableInstallPath;
|
||||||
|
@ -125,9 +125,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
|
|||||||
|
|
||||||
foreach (var c in Children)
|
foreach (var c in Children)
|
||||||
{
|
{
|
||||||
var stc = c as ScrollingTeam;
|
if (!(c is ScrollingTeam stc))
|
||||||
|
|
||||||
if (stc == null)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (closest == null)
|
if (closest == null)
|
||||||
@ -203,15 +201,13 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
|
|||||||
|
|
||||||
foreach (var c in Children)
|
foreach (var c in Children)
|
||||||
{
|
{
|
||||||
ScrollingTeam st = c as ScrollingTeam;
|
if (c is ScrollingTeam st)
|
||||||
|
|
||||||
if (st == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (st.Team == team)
|
|
||||||
{
|
{
|
||||||
st.FadeOut(200);
|
if (st.Team == team)
|
||||||
st.Expire();
|
{
|
||||||
|
st.FadeOut(200);
|
||||||
|
st.Expire();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -295,14 +291,13 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
|
|||||||
{
|
{
|
||||||
foreach (var c in Children)
|
foreach (var c in Children)
|
||||||
{
|
{
|
||||||
ScrollingTeam st = c as ScrollingTeam;
|
if (c is ScrollingTeam st)
|
||||||
if (st == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (st.Selected)
|
|
||||||
{
|
{
|
||||||
st.Selected = false;
|
if (st.Selected)
|
||||||
RemoveTeam(st.Team);
|
{
|
||||||
|
st.Selected = false;
|
||||||
|
RemoveTeam(st.Team);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,9 +225,7 @@ namespace osu.Game.Tournament.Screens.Editors
|
|||||||
beatmapId.Value = Model.ID.ToString();
|
beatmapId.Value = Model.ID.ToString();
|
||||||
beatmapId.BindValueChanged(idString =>
|
beatmapId.BindValueChanged(idString =>
|
||||||
{
|
{
|
||||||
int parsed;
|
int.TryParse(idString.NewValue, out var parsed);
|
||||||
|
|
||||||
int.TryParse(idString.NewValue, out parsed);
|
|
||||||
|
|
||||||
Model.ID = parsed;
|
Model.ID = parsed;
|
||||||
|
|
||||||
|
@ -267,9 +267,7 @@ namespace osu.Game.Tournament.Screens.Editors
|
|||||||
userId.Value = user.Id.ToString();
|
userId.Value = user.Id.ToString();
|
||||||
userId.BindValueChanged(idString =>
|
userId.BindValueChanged(idString =>
|
||||||
{
|
{
|
||||||
long parsed;
|
long.TryParse(idString.NewValue, out var parsed);
|
||||||
|
|
||||||
long.TryParse(idString.NewValue, out parsed);
|
|
||||||
|
|
||||||
user.Id = parsed;
|
user.Id = parsed;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
Vector2 getCenteredVector(Vector2 top, Vector2 bottom) => new Vector2(top.X, top.Y + (bottom.Y - top.Y) / 2);
|
static Vector2 getCenteredVector(Vector2 top, Vector2 bottom) => new Vector2(top.X, top.Y + (bottom.Y - top.Y) / 2);
|
||||||
|
|
||||||
var q1 = Source.ScreenSpaceDrawQuad;
|
var q1 = Source.ScreenSpaceDrawQuad;
|
||||||
var q2 = Destination.ScreenSpaceDrawQuad;
|
var q2 = Destination.ScreenSpaceDrawQuad;
|
||||||
|
@ -35,7 +35,7 @@ namespace osu.Game.Tournament.Screens.Ladder
|
|||||||
{
|
{
|
||||||
var newScale = Math.Clamp(scale + e.ScrollDelta.Y / 15 * scale, min_scale, max_scale);
|
var newScale = Math.Clamp(scale + e.ScrollDelta.Y / 15 * scale, min_scale, max_scale);
|
||||||
|
|
||||||
this.MoveTo(target = target - e.MousePosition * (newScale - scale), 2000, Easing.OutQuint);
|
this.MoveTo(target -= e.MousePosition * (newScale - scale), 2000, Easing.OutQuint);
|
||||||
this.ScaleTo(scale = newScale, 2000, Easing.OutQuint);
|
this.ScaleTo(scale = newScale, 2000, Easing.OutQuint);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -120,7 +120,7 @@ namespace osu.Game.Tournament.Screens.MapPool
|
|||||||
pickColour = colour;
|
pickColour = colour;
|
||||||
pickType = choiceType;
|
pickType = choiceType;
|
||||||
|
|
||||||
Color4 setColour(bool active) => active ? Color4.White : Color4.Gray;
|
static Color4 setColour(bool active) => active ? Color4.White : Color4.Gray;
|
||||||
|
|
||||||
buttonRedBan.Colour = setColour(pickColour == TeamColour.Red && pickType == ChoiceType.Ban);
|
buttonRedBan.Colour = setColour(pickColour == TeamColour.Red && pickType == ChoiceType.Ban);
|
||||||
buttonBlueBan.Colour = setColour(pickColour == TeamColour.Blue && pickType == ChoiceType.Ban);
|
buttonBlueBan.Colour = setColour(pickColour == TeamColour.Blue && pickType == ChoiceType.Ban);
|
||||||
|
@ -84,7 +84,7 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return (trackStore ?? (trackStore = AudioManager.GetTrackStore(store))).Get(getPathForFile(Metadata.AudioFile));
|
return (trackStore ??= AudioManager.GetTrackStore(store)).Get(getPathForFile(Metadata.AudioFile));
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@ namespace osu.Game.Beatmaps.ControlPoints
|
|||||||
|
|
||||||
private ControlPointGroup controlPointGroup;
|
private ControlPointGroup controlPointGroup;
|
||||||
|
|
||||||
public void AttachGroup(ControlPointGroup pointGroup) => this.controlPointGroup = pointGroup;
|
public void AttachGroup(ControlPointGroup pointGroup) => controlPointGroup = pointGroup;
|
||||||
|
|
||||||
public int CompareTo(ControlPoint other) => Time.CompareTo(other.Time);
|
public int CompareTo(ControlPoint other) => Time.CompareTo(other.Time);
|
||||||
|
|
||||||
|
@ -293,9 +293,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
string[] split = line.Split(',');
|
string[] split = line.Split(',');
|
||||||
|
|
||||||
EventType type;
|
if (!Enum.TryParse(split[0], out EventType type))
|
||||||
|
|
||||||
if (!Enum.TryParse(split[0], out type))
|
|
||||||
throw new InvalidDataException($@"Unknown event type: {split[0]}");
|
throw new InvalidDataException($@"Unknown event type: {split[0]}");
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -83,9 +83,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
storyboardSprite = null;
|
storyboardSprite = null;
|
||||||
|
|
||||||
EventType type;
|
if (!Enum.TryParse(split[0], out EventType type))
|
||||||
|
|
||||||
if (!Enum.TryParse(split[0], out type))
|
|
||||||
throw new InvalidDataException($@"Unknown event type: {split[0]}");
|
throw new InvalidDataException($@"Unknown event type: {split[0]}");
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -150,7 +150,7 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
public bool BeatmapLoaded => beatmapLoadTask?.IsCompleted ?? false;
|
public bool BeatmapLoaded => beatmapLoadTask?.IsCompleted ?? false;
|
||||||
|
|
||||||
public Task<IBeatmap> LoadBeatmapAsync() => (beatmapLoadTask ?? (beatmapLoadTask = Task.Factory.StartNew(() =>
|
public Task<IBeatmap> LoadBeatmapAsync() => beatmapLoadTask ??= Task.Factory.StartNew(() =>
|
||||||
{
|
{
|
||||||
// Todo: Handle cancellation during beatmap parsing
|
// Todo: Handle cancellation during beatmap parsing
|
||||||
var b = GetBeatmap() ?? new Beatmap();
|
var b = GetBeatmap() ?? new Beatmap();
|
||||||
@ -162,7 +162,7 @@ namespace osu.Game.Beatmaps
|
|||||||
b.BeatmapInfo = BeatmapInfo;
|
b.BeatmapInfo = BeatmapInfo;
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
}, beatmapCancellation.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default)));
|
}, beatmapCancellation.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
|
||||||
|
|
||||||
public IBeatmap Beatmap
|
public IBeatmap Beatmap
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ namespace osu.Game.Configuration
|
|||||||
protected override void PerformLoad()
|
protected override void PerformLoad()
|
||||||
{
|
{
|
||||||
databasedSettings = settings.Query(ruleset?.ID, variant);
|
databasedSettings = settings.Query(ruleset?.ID, variant);
|
||||||
legacySettingsExist = databasedSettings.Any(s => int.TryParse(s.Key, out var _));
|
legacySettingsExist = databasedSettings.Any(s => int.TryParse(s.Key, out _));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool PerformSave()
|
protected override bool PerformSave()
|
||||||
|
@ -41,7 +41,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
public override void Increment(double amount)
|
public override void Increment(double amount)
|
||||||
{
|
{
|
||||||
Current.Value = Current.Value + amount;
|
Current.Value += amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
public override void Increment(double amount)
|
public override void Increment(double amount)
|
||||||
{
|
{
|
||||||
Current.Value = Current.Value + amount;
|
Current.Value += amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
|
|
||||||
public override void Increment(int amount)
|
public override void Increment(int amount)
|
||||||
{
|
{
|
||||||
Current.Value = Current.Value + amount;
|
Current.Value += amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,9 +226,7 @@ namespace osu.Game.IO.Legacy
|
|||||||
|
|
||||||
public override Type BindToType(string assemblyName, string typeName)
|
public override Type BindToType(string assemblyName, string typeName)
|
||||||
{
|
{
|
||||||
Type typeToDeserialize;
|
if (cache.TryGetValue(assemblyName + typeName, out var typeToDeserialize))
|
||||||
|
|
||||||
if (cache.TryGetValue(assemblyName + typeName, out typeToDeserialize))
|
|
||||||
return typeToDeserialize;
|
return typeToDeserialize;
|
||||||
|
|
||||||
List<Type> tmpTypes = new List<Type>();
|
List<Type> tmpTypes = new List<Type>();
|
||||||
|
@ -50,17 +50,14 @@ namespace osu.Game.Online.API.Requests.Responses
|
|||||||
[JsonProperty(@"user_votes")]
|
[JsonProperty(@"user_votes")]
|
||||||
private List<long> userVotes
|
private List<long> userVotes
|
||||||
{
|
{
|
||||||
set
|
set => value.ForEach(v =>
|
||||||
{
|
{
|
||||||
value.ForEach(v =>
|
Comments.ForEach(c =>
|
||||||
{
|
{
|
||||||
Comments.ForEach(c =>
|
if (v == c.Id)
|
||||||
{
|
c.IsVoted = true;
|
||||||
if (v == c.Id)
|
|
||||||
c.IsVoted = true;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<User> users;
|
private List<User> users;
|
||||||
|
@ -288,17 +288,15 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
private class ScoreComponentLabel : Container, IHasTooltip
|
private class ScoreComponentLabel : Container, IHasTooltip
|
||||||
{
|
{
|
||||||
private const float icon_size = 20;
|
private const float icon_size = 20;
|
||||||
|
|
||||||
private readonly string name;
|
|
||||||
private readonly FillFlowContainer content;
|
private readonly FillFlowContainer content;
|
||||||
|
|
||||||
public override bool Contains(Vector2 screenSpacePos) => content.Contains(screenSpacePos);
|
public override bool Contains(Vector2 screenSpacePos) => content.Contains(screenSpacePos);
|
||||||
|
|
||||||
public string TooltipText => name;
|
public string TooltipText { get; }
|
||||||
|
|
||||||
public ScoreComponentLabel(LeaderboardScoreStatistic statistic)
|
public ScoreComponentLabel(LeaderboardScoreStatistic statistic)
|
||||||
{
|
{
|
||||||
name = statistic.Name;
|
TooltipText = statistic.Name;
|
||||||
AutoSizeAxes = Axes.Both;
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
Child = content = new FillFlowContainer
|
Child = content = new FillFlowContainer
|
||||||
|
@ -74,8 +74,6 @@ namespace osu.Game
|
|||||||
|
|
||||||
protected Storage Storage { get; set; }
|
protected Storage Storage { get; set; }
|
||||||
|
|
||||||
private Bindable<WorkingBeatmap> beatmap; // cached via load() method
|
|
||||||
|
|
||||||
[Cached]
|
[Cached]
|
||||||
[Cached(typeof(IBindable<RulesetInfo>))]
|
[Cached(typeof(IBindable<RulesetInfo>))]
|
||||||
protected readonly Bindable<RulesetInfo> Ruleset = new Bindable<RulesetInfo>();
|
protected readonly Bindable<RulesetInfo> Ruleset = new Bindable<RulesetInfo>();
|
||||||
@ -85,7 +83,7 @@ namespace osu.Game
|
|||||||
[Cached(Type = typeof(IBindable<IReadOnlyList<Mod>>))]
|
[Cached(Type = typeof(IBindable<IReadOnlyList<Mod>>))]
|
||||||
protected readonly Bindable<IReadOnlyList<Mod>> Mods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
protected readonly Bindable<IReadOnlyList<Mod>> Mods = new Bindable<IReadOnlyList<Mod>>(Array.Empty<Mod>());
|
||||||
|
|
||||||
protected Bindable<WorkingBeatmap> Beatmap => beatmap;
|
protected Bindable<WorkingBeatmap> Beatmap { get; private set; } // cached via load() method
|
||||||
|
|
||||||
private Bindable<bool> fpsDisplayVisible;
|
private Bindable<bool> fpsDisplayVisible;
|
||||||
|
|
||||||
@ -201,16 +199,16 @@ namespace osu.Game
|
|||||||
// this adds a global reduction of track volume for the time being.
|
// this adds a global reduction of track volume for the time being.
|
||||||
Audio.Tracks.AddAdjustment(AdjustableProperty.Volume, new BindableDouble(0.8));
|
Audio.Tracks.AddAdjustment(AdjustableProperty.Volume, new BindableDouble(0.8));
|
||||||
|
|
||||||
beatmap = new NonNullableBindable<WorkingBeatmap>(defaultBeatmap);
|
Beatmap = new NonNullableBindable<WorkingBeatmap>(defaultBeatmap);
|
||||||
beatmap.BindValueChanged(b => ScheduleAfterChildren(() =>
|
Beatmap.BindValueChanged(b => ScheduleAfterChildren(() =>
|
||||||
{
|
{
|
||||||
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
// compare to last beatmap as sometimes the two may share a track representation (optimisation, see WorkingBeatmap.TransferTo)
|
||||||
if (b.OldValue?.TrackLoaded == true && b.OldValue?.Track != b.NewValue?.Track)
|
if (b.OldValue?.TrackLoaded == true && b.OldValue?.Track != b.NewValue?.Track)
|
||||||
b.OldValue.RecycleTrack();
|
b.OldValue.RecycleTrack();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
dependencies.CacheAs<IBindable<WorkingBeatmap>>(beatmap);
|
dependencies.CacheAs<IBindable<WorkingBeatmap>>(Beatmap);
|
||||||
dependencies.CacheAs(beatmap);
|
dependencies.CacheAs(Beatmap);
|
||||||
|
|
||||||
FileStore.Cleanup();
|
FileStore.Cleanup();
|
||||||
|
|
||||||
|
@ -91,10 +91,9 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
|
|
||||||
private class Statistic : Container, IHasTooltip
|
private class Statistic : Container, IHasTooltip
|
||||||
{
|
{
|
||||||
private readonly string name;
|
|
||||||
private readonly OsuSpriteText value;
|
private readonly OsuSpriteText value;
|
||||||
|
|
||||||
public string TooltipText => name;
|
public string TooltipText { get; }
|
||||||
|
|
||||||
public string Value
|
public string Value
|
||||||
{
|
{
|
||||||
@ -104,7 +103,7 @@ namespace osu.Game.Overlays.BeatmapSet
|
|||||||
|
|
||||||
public Statistic(IconUsage icon, string name)
|
public Statistic(IconUsage icon, string name)
|
||||||
{
|
{
|
||||||
this.name = name;
|
TooltipText = name;
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
|
|
||||||
|
@ -45,31 +45,28 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
|
|||||||
|
|
||||||
protected APILegacyScores Scores
|
protected APILegacyScores Scores
|
||||||
{
|
{
|
||||||
set
|
set => Schedule(() =>
|
||||||
{
|
{
|
||||||
Schedule(() =>
|
topScoresContainer.Clear();
|
||||||
|
|
||||||
|
if (value?.Scores.Any() != true)
|
||||||
{
|
{
|
||||||
topScoresContainer.Clear();
|
scoreTable.Scores = null;
|
||||||
|
scoreTable.Hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (value?.Scores.Any() != true)
|
scoreTable.Scores = value.Scores;
|
||||||
{
|
scoreTable.Show();
|
||||||
scoreTable.Scores = null;
|
|
||||||
scoreTable.Hide();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
scoreTable.Scores = value.Scores;
|
var topScore = value.Scores.First();
|
||||||
scoreTable.Show();
|
var userScore = value.UserScore;
|
||||||
|
|
||||||
var topScore = value.Scores.First();
|
topScoresContainer.Add(new DrawableTopScore(topScore));
|
||||||
var userScore = value.UserScore;
|
|
||||||
|
|
||||||
topScoresContainer.Add(new DrawableTopScore(topScore));
|
if (userScore != null && userScore.Score.OnlineScoreID != topScore.OnlineScoreID)
|
||||||
|
topScoresContainer.Add(new DrawableTopScore(userScore.Score, userScore.Position));
|
||||||
if (userScore != null && userScore.Score.OnlineScoreID != topScore.OnlineScoreID)
|
});
|
||||||
topScoresContainer.Add(new DrawableTopScore(userScore.Score, userScore.Position));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScoresContainer()
|
public ScoresContainer()
|
||||||
|
@ -58,9 +58,8 @@ namespace osu.Game.Overlays.Chat
|
|||||||
|
|
||||||
private Message message;
|
private Message message;
|
||||||
private OsuSpriteText username;
|
private OsuSpriteText username;
|
||||||
private LinkFlowContainer contentFlow;
|
|
||||||
|
|
||||||
public LinkFlowContainer ContentFlow => contentFlow;
|
public LinkFlowContainer ContentFlow { get; private set; }
|
||||||
|
|
||||||
public Message Message
|
public Message Message
|
||||||
{
|
{
|
||||||
@ -164,7 +163,7 @@ namespace osu.Game.Overlays.Chat
|
|||||||
Padding = new MarginPadding { Left = MessagePadding + HorizontalPadding },
|
Padding = new MarginPadding { Left = MessagePadding + HorizontalPadding },
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
contentFlow = new LinkFlowContainer(t =>
|
ContentFlow = new LinkFlowContainer(t =>
|
||||||
{
|
{
|
||||||
t.Shadow = false;
|
t.Shadow = false;
|
||||||
|
|
||||||
@ -206,8 +205,8 @@ namespace osu.Game.Overlays.Chat
|
|||||||
// remove non-existent channels from the link list
|
// remove non-existent channels from the link list
|
||||||
message.Links.RemoveAll(link => link.Action == LinkAction.OpenChannel && chatManager?.AvailableChannels.Any(c => c.Name == link.Argument) != true);
|
message.Links.RemoveAll(link => link.Action == LinkAction.OpenChannel && chatManager?.AvailableChannels.Any(c => c.Name == link.Argument) != true);
|
||||||
|
|
||||||
contentFlow.Clear();
|
ContentFlow.Clear();
|
||||||
contentFlow.AddLinks(message.DisplayContent, message.Links);
|
ContentFlow.AddLinks(message.DisplayContent, message.Links);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MessageSender : OsuClickableContainer, IHasContextMenu
|
private class MessageSender : OsuClickableContainer, IHasContextMenu
|
||||||
|
@ -22,7 +22,7 @@ namespace osu.Game.Overlays.Chat.Selection
|
|||||||
{
|
{
|
||||||
public class ChannelSelectionOverlay : WaveOverlayContainer
|
public class ChannelSelectionOverlay : WaveOverlayContainer
|
||||||
{
|
{
|
||||||
public static readonly float WIDTH_PADDING = 170;
|
public const float WIDTH_PADDING = 170;
|
||||||
|
|
||||||
private const float transition_duration = 500;
|
private const float transition_duration = 500;
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ namespace osu.Game.Overlays.Chat.Tabs
|
|||||||
{
|
{
|
||||||
public class ChannelTabControl : OsuTabControl<Channel>
|
public class ChannelTabControl : OsuTabControl<Channel>
|
||||||
{
|
{
|
||||||
public static readonly float SHEAR_WIDTH = 10;
|
public const float SHEAR_WIDTH = 10;
|
||||||
|
|
||||||
public Action<Channel> OnRequestLeave;
|
public Action<Channel> OnRequestLeave;
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ namespace osu.Game.Overlays.Dialog
|
|||||||
{
|
{
|
||||||
public abstract class PopupDialog : VisibilityContainer
|
public abstract class PopupDialog : VisibilityContainer
|
||||||
{
|
{
|
||||||
public static readonly float ENTER_DURATION = 500;
|
public const float ENTER_DURATION = 500;
|
||||||
public static readonly float EXIT_DURATION = 200;
|
public const float EXIT_DURATION = 200;
|
||||||
|
|
||||||
private readonly Vector2 ringSize = new Vector2(100f);
|
private readonly Vector2 ringSize = new Vector2(100f);
|
||||||
private readonly Vector2 ringMinifiedSize = new Vector2(20f);
|
private readonly Vector2 ringMinifiedSize = new Vector2(20f);
|
||||||
|
@ -7,8 +7,7 @@ namespace osu.Game.Overlays.KeyBinding
|
|||||||
{
|
{
|
||||||
public class VariantBindingsSubsection : KeyBindingsSubsection
|
public class VariantBindingsSubsection : KeyBindingsSubsection
|
||||||
{
|
{
|
||||||
protected override string Header => variantName;
|
protected override string Header { get; }
|
||||||
private readonly string variantName;
|
|
||||||
|
|
||||||
public VariantBindingsSubsection(RulesetInfo ruleset, int variant)
|
public VariantBindingsSubsection(RulesetInfo ruleset, int variant)
|
||||||
: base(variant)
|
: base(variant)
|
||||||
@ -17,7 +16,7 @@ namespace osu.Game.Overlays.KeyBinding
|
|||||||
|
|
||||||
var rulesetInstance = ruleset.CreateInstance();
|
var rulesetInstance = ruleset.CreateInstance();
|
||||||
|
|
||||||
variantName = rulesetInstance.GetVariantName(variant);
|
Header = rulesetInstance.GetVariantName(variant);
|
||||||
Defaults = rulesetInstance.GetDefaultKeyBindings(variant);
|
Defaults = rulesetInstance.GetDefaultKeyBindings(variant);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ namespace osu.Game.Overlays.SearchableList
|
|||||||
{
|
{
|
||||||
public abstract class SearchableListOverlay : FullscreenOverlay
|
public abstract class SearchableListOverlay : FullscreenOverlay
|
||||||
{
|
{
|
||||||
public static readonly float WIDTH_PADDING = 80;
|
public const float WIDTH_PADDING = 80;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class SearchableListOverlay<T, U, S> : SearchableListOverlay
|
public abstract class SearchableListOverlay<T, U, S> : SearchableListOverlay
|
||||||
|
@ -297,10 +297,8 @@ namespace osu.Game.Overlays.Settings.Sections.General
|
|||||||
{
|
{
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
var h = Header as UserDropdownHeader;
|
if (Header is UserDropdownHeader h)
|
||||||
if (h == null) return;
|
h.StatusColour = value;
|
||||||
|
|
||||||
h.StatusColour = value;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,8 +30,7 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
private readonly BindableDouble muteAdjustment = new BindableDouble();
|
private readonly BindableDouble muteAdjustment = new BindableDouble();
|
||||||
|
|
||||||
private readonly Bindable<bool> isMuted = new Bindable<bool>();
|
public Bindable<bool> IsMuted { get; } = new Bindable<bool>();
|
||||||
public Bindable<bool> IsMuted => isMuted;
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(AudioManager audio, OsuColour colours)
|
private void load(AudioManager audio, OsuColour colours)
|
||||||
@ -66,7 +65,7 @@ namespace osu.Game.Overlays
|
|||||||
muteButton = new MuteButton
|
muteButton = new MuteButton
|
||||||
{
|
{
|
||||||
Margin = new MarginPadding { Top = 100 },
|
Margin = new MarginPadding { Top = 100 },
|
||||||
Current = { BindTarget = isMuted }
|
Current = { BindTarget = IsMuted }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -76,7 +75,7 @@ namespace osu.Game.Overlays
|
|||||||
volumeMeterEffect.Bindable.BindTo(audio.VolumeSample);
|
volumeMeterEffect.Bindable.BindTo(audio.VolumeSample);
|
||||||
volumeMeterMusic.Bindable.BindTo(audio.VolumeTrack);
|
volumeMeterMusic.Bindable.BindTo(audio.VolumeTrack);
|
||||||
|
|
||||||
isMuted.BindValueChanged(muted =>
|
IsMuted.BindValueChanged(muted =>
|
||||||
{
|
{
|
||||||
if (muted.NewValue)
|
if (muted.NewValue)
|
||||||
audio.AddAdjustment(AdjustableProperty.Volume, muteAdjustment);
|
audio.AddAdjustment(AdjustableProperty.Volume, muteAdjustment);
|
||||||
|
@ -116,7 +116,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
}
|
}
|
||||||
|
|
||||||
// osu-stable special-cased colinear perfect curves to a CurveType.Linear
|
// osu-stable special-cased colinear perfect curves to a CurveType.Linear
|
||||||
bool isLinear(Vector2[] p) => Precision.AlmostEquals(0, (p[1].Y - p[0].Y) * (p[2].X - p[0].X) - (p[1].X - p[0].X) * (p[2].Y - p[0].Y));
|
static bool isLinear(Vector2[] p) => Precision.AlmostEquals(0, (p[1].Y - p[0].Y) * (p[2].X - p[0].X) - (p[1].X - p[0].X) * (p[2].Y - p[0].Y));
|
||||||
|
|
||||||
if (points.Length == 3 && pathType == PathType.PerfectCurve && isLinear(points))
|
if (points.Length == 3 && pathType == PathType.PerfectCurve && isLinear(points))
|
||||||
pathType = PathType.Linear;
|
pathType = PathType.Linear;
|
||||||
@ -177,8 +177,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
if (i >= adds.Length)
|
if (i >= adds.Length)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
int sound;
|
int.TryParse(adds[i], out var sound);
|
||||||
int.TryParse(adds[i], out sound);
|
|
||||||
nodeSoundTypes[i] = (LegacySoundType)sound;
|
nodeSoundTypes[i] = (LegacySoundType)sound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
|
|
||||||
isInitialised = true;
|
isInitialised = true;
|
||||||
|
|
||||||
controlPoints = controlPoints ?? Array.Empty<Vector2>();
|
controlPoints ??= Array.Empty<Vector2>();
|
||||||
calculatedPath = new List<Vector2>();
|
calculatedPath = new List<Vector2>();
|
||||||
cumulativeLength = new List<double>();
|
cumulativeLength = new List<double>();
|
||||||
|
|
||||||
|
@ -147,13 +147,9 @@ namespace osu.Game.Rulesets.UI.Scrolling
|
|||||||
// Generate the timing points, making non-timing changes use the previous timing change and vice-versa
|
// Generate the timing points, making non-timing changes use the previous timing change and vice-versa
|
||||||
var timingChanges = allPoints.Select(c =>
|
var timingChanges = allPoints.Select(c =>
|
||||||
{
|
{
|
||||||
var timingPoint = c as TimingControlPoint;
|
if (c is TimingControlPoint timingPoint)
|
||||||
var difficultyPoint = c as DifficultyControlPoint;
|
|
||||||
|
|
||||||
if (timingPoint != null)
|
|
||||||
lastTimingPoint = timingPoint;
|
lastTimingPoint = timingPoint;
|
||||||
|
else if (c is DifficultyControlPoint difficultyPoint)
|
||||||
if (difficultyPoint != null)
|
|
||||||
lastDifficultyPoint = difficultyPoint;
|
lastDifficultyPoint = difficultyPoint;
|
||||||
|
|
||||||
return new MultiplierControlPoint(c.Time)
|
return new MultiplierControlPoint(c.Time)
|
||||||
|
@ -17,10 +17,10 @@ namespace osu.Game.Screens.Backgrounds
|
|||||||
|
|
||||||
public override bool Equals(BackgroundScreen other)
|
public override bool Equals(BackgroundScreen other)
|
||||||
{
|
{
|
||||||
var backgroundScreenCustom = other as BackgroundScreenCustom;
|
if (other is BackgroundScreenCustom backgroundScreenCustom)
|
||||||
if (backgroundScreenCustom == null) return false;
|
return base.Equals(other) && textureName == backgroundScreenCustom.textureName;
|
||||||
|
|
||||||
return base.Equals(other) && textureName == backgroundScreenCustom.textureName;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// 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 System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
@ -93,7 +92,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
|
textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20));
|
||||||
textFlow.NewParagraph();
|
textFlow.NewParagraph();
|
||||||
|
|
||||||
Action<SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);
|
static void format(SpriteText t) => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);
|
||||||
|
|
||||||
textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
|
textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
|
||||||
textFlow.NewParagraph();
|
textFlow.NewParagraph();
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// 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 System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.EntityFrameworkCore.Internal;
|
using Microsoft.EntityFrameworkCore.Internal;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
@ -77,12 +76,13 @@ namespace osu.Game.Screens.Multi.Ranking.Pages
|
|||||||
|
|
||||||
private void scoresLoaded(IEnumerable<APIRoomScoreInfo> scores)
|
private void scoresLoaded(IEnumerable<APIRoomScoreInfo> scores)
|
||||||
{
|
{
|
||||||
Action<SpriteText> gray = s => s.Colour = colours.GrayC;
|
void gray(SpriteText s) => s.Colour = colours.GrayC;
|
||||||
Action<SpriteText> white = s =>
|
|
||||||
|
void white(SpriteText s)
|
||||||
{
|
{
|
||||||
s.Font = s.Font.With(size: s.Font.Size * 1.4f);
|
s.Font = s.Font.With(size: s.Font.Size * 1.4f);
|
||||||
s.Colour = colours.GrayF;
|
s.Colour = colours.GrayF;
|
||||||
};
|
}
|
||||||
|
|
||||||
rankText.AddText(name + "\n", white);
|
rankText.AddText(name + "\n", white);
|
||||||
rankText.AddText("You are placed ", gray);
|
rankText.AddText("You are placed ", gray);
|
||||||
|
@ -68,7 +68,7 @@ namespace osu.Game.Screens.Play
|
|||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
this.mods = mods;
|
this.mods = mods;
|
||||||
this.gameplayStartTime = gameplayStartTime;
|
this.gameplayStartTime = gameplayStartTime;
|
||||||
this.firstHitObjectTime = beatmap.Beatmap.HitObjects.First().StartTime;
|
firstHitObjectTime = beatmap.Beatmap.HitObjects.First().StartTime;
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ namespace osu.Game.Screens.Play.HUD
|
|||||||
/// <param name="amount"></param>
|
/// <param name="amount"></param>
|
||||||
public void Increment(int amount = 1)
|
public void Increment(int amount = 1)
|
||||||
{
|
{
|
||||||
Current.Value = Current.Value + amount;
|
Current.Value += amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -26,7 +26,7 @@ namespace osu.Game.Screens.Play.HUD
|
|||||||
|
|
||||||
public override void Increment(long amount)
|
public override void Increment(long amount)
|
||||||
{
|
{
|
||||||
Current.Value = Current.Value + amount;
|
Current.Value += amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ namespace osu.Game.Screens.Select
|
|||||||
newRoot.Filter(activeCriteria);
|
newRoot.Filter(activeCriteria);
|
||||||
|
|
||||||
// preload drawables as the ctor overhead is quite high currently.
|
// preload drawables as the ctor overhead is quite high currently.
|
||||||
var _ = newRoot.Drawables;
|
_ = newRoot.Drawables;
|
||||||
|
|
||||||
root = newRoot;
|
root = newRoot;
|
||||||
if (selectedBeatmapSet != null && !beatmapSets.Contains(selectedBeatmapSet.BeatmapSet))
|
if (selectedBeatmapSet != null && !beatmapSets.Contains(selectedBeatmapSet.BeatmapSet))
|
||||||
|
@ -17,7 +17,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
public class BeatmapDetailAreaTabControl : Container
|
public class BeatmapDetailAreaTabControl : Container
|
||||||
{
|
{
|
||||||
public static readonly float HEIGHT = 24;
|
public const float HEIGHT = 24;
|
||||||
private readonly OsuTabControlCheckbox modsCheckbox;
|
private readonly OsuTabControlCheckbox modsCheckbox;
|
||||||
private readonly OsuTabControl<BeatmapDetailTab> tabs;
|
private readonly OsuTabControl<BeatmapDetailTab> tabs;
|
||||||
private readonly Container tabsContainer;
|
private readonly Container tabsContainer;
|
||||||
|
@ -17,7 +17,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
public class FooterButton : OsuClickableContainer
|
public class FooterButton : OsuClickableContainer
|
||||||
{
|
{
|
||||||
public static readonly float SHEAR_WIDTH = 7.5f;
|
public const float SHEAR_WIDTH = 7.5f;
|
||||||
|
|
||||||
protected static readonly Vector2 SHEAR = new Vector2(SHEAR_WIDTH / Footer.HEIGHT, 0);
|
protected static readonly Vector2 SHEAR = new Vector2(SHEAR_WIDTH / Footer.HEIGHT, 0);
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ namespace osu.Game.Skinning
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
model.Name = model.Name.Replace(".osk", "");
|
model.Name = model.Name.Replace(".osk", "");
|
||||||
model.Creator = model.Creator ?? "Unknown";
|
model.Creator ??= "Unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,8 +96,8 @@ namespace osu.Game.Skinning
|
|||||||
|
|
||||||
if (adjustments != null)
|
if (adjustments != null)
|
||||||
{
|
{
|
||||||
foreach (var adjustment in adjustments)
|
foreach (var (property, bindable) in adjustments)
|
||||||
ch.AddAdjustment(adjustment.property, adjustment.bindable);
|
ch.AddAdjustment(property, bindable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,14 +28,12 @@ namespace osu.Game.Skinning
|
|||||||
|
|
||||||
private class SpriteComponent : ISkinComponent
|
private class SpriteComponent : ISkinComponent
|
||||||
{
|
{
|
||||||
private readonly string textureName;
|
|
||||||
|
|
||||||
public SpriteComponent(string textureName)
|
public SpriteComponent(string textureName)
|
||||||
{
|
{
|
||||||
this.textureName = textureName;
|
LookupName = textureName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string LookupName => textureName;
|
public string LookupName { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,7 @@ namespace osu.Game.Storyboards.Drawables
|
|||||||
{
|
{
|
||||||
public Storyboard Storyboard { get; private set; }
|
public Storyboard Storyboard { get; private set; }
|
||||||
|
|
||||||
private readonly Container<DrawableStoryboardLayer> content;
|
protected override Container<DrawableStoryboardLayer> Content { get; }
|
||||||
protected override Container<DrawableStoryboardLayer> Content => content;
|
|
||||||
|
|
||||||
protected override Vector2 DrawScale => new Vector2(Parent.DrawHeight / 480);
|
protected override Vector2 DrawScale => new Vector2(Parent.DrawHeight / 480);
|
||||||
|
|
||||||
@ -49,7 +48,7 @@ namespace osu.Game.Storyboards.Drawables
|
|||||||
Anchor = Anchor.Centre;
|
Anchor = Anchor.Centre;
|
||||||
Origin = Anchor.Centre;
|
Origin = Anchor.Centre;
|
||||||
|
|
||||||
AddInternal(content = new Container<DrawableStoryboardLayer>
|
AddInternal(Content = new Container<DrawableStoryboardLayer>
|
||||||
{
|
{
|
||||||
Size = new Vector2(640, 480),
|
Size = new Vector2(640, 480),
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
|
@ -29,8 +29,7 @@ namespace osu.Game.Storyboards
|
|||||||
|
|
||||||
public StoryboardLayer GetLayer(string name)
|
public StoryboardLayer GetLayer(string name)
|
||||||
{
|
{
|
||||||
StoryboardLayer layer;
|
if (!layers.TryGetValue(name, out var layer))
|
||||||
if (!layers.TryGetValue(name, out layer))
|
|
||||||
layers[name] = layer = new StoryboardLayer(name, layers.Values.Min(l => l.Depth) - 1);
|
layers[name] = layer = new StoryboardLayer(name, layers.Values.Min(l => l.Depth) - 1);
|
||||||
|
|
||||||
return layer;
|
return layer;
|
||||||
|
@ -219,7 +219,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
public IEnumerable<string> GetAvailableResources() => throw new NotImplementedException();
|
public IEnumerable<string> GetAvailableResources() => throw new NotImplementedException();
|
||||||
|
|
||||||
public Track GetVirtual(double length = Double.PositiveInfinity)
|
public Track GetVirtual(double length = double.PositiveInfinity)
|
||||||
{
|
{
|
||||||
var track = new TrackVirtualManual(referenceClock) { Length = length };
|
var track = new TrackVirtualManual(referenceClock) { Length = length };
|
||||||
AddItem(track);
|
AddItem(track);
|
||||||
|
@ -129,7 +129,7 @@ namespace osu.Game.Users
|
|||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
private string[] playstyle
|
private string[] playstyle
|
||||||
{
|
{
|
||||||
set { PlayStyles = value?.Select(str => Enum.Parse(typeof(PlayStyle), str, true)).Cast<PlayStyle>().ToArray(); }
|
set => PlayStyles = value?.Select(str => Enum.Parse(typeof(PlayStyle), str, true)).Cast<PlayStyle>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayStyle[] PlayStyles;
|
public PlayStyle[] PlayStyles;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
<LangVersion>8.0</LangVersion>
|
||||||
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
|
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
|
||||||
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
|
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeTypeMemberModifiers/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeTypeMemberModifiers/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeTypeModifiers/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeTypeModifiers/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignedValueIsNeverUsed/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignedValueIsNeverUsed/@EntryIndexedValue">HINT</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignmentIsFullyDiscarded/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignNullToNotNullAttribute/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignNullToNotNullAttribute/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AutoPropertyCanBeMadeGetOnly_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AutoPropertyCanBeMadeGetOnly_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AutoPropertyCanBeMadeGetOnly_002ELocal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AutoPropertyCanBeMadeGetOnly_002ELocal/@EntryIndexedValue">HINT</s:String>
|
||||||
@ -63,11 +64,14 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertIfToOrExpression/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertIfToOrExpression/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertNullableToShortForm/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertNullableToShortForm/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertPropertyToExpressionBody/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertPropertyToExpressionBody/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToAutoProperty/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToAutoProperty/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToAutoPropertyWhenPossible/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToAutoPropertyWithPrivateSetter/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToConstant_002ELocal/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToConstant_002ELocal/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToLambdaExpression/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToLambdaExpression/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToLocalFunction/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToLocalFunction/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToStaticClass/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToStaticClass/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToUsingDeclaration/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=DoubleNegationOperator/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=DoubleNegationOperator/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EmptyGeneralCatchClause/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EmptyGeneralCatchClause/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=EnforceDoWhileStatementBraces/@EntryIndexedValue">WARNING</s:String>
|
||||||
@ -116,6 +120,7 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterHidesMember/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterHidesMember/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterOnlyUsedForPreconditionCheck_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterOnlyUsedForPreconditionCheck_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterOnlyUsedForPreconditionCheck_002ELocal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ParameterOnlyUsedForPreconditionCheck_002ELocal/@EntryIndexedValue">HINT</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PatternAlwaysOfType/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PossibleInterfaceMemberAmbiguity/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PossibleInterfaceMemberAmbiguity/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PossibleMultipleEnumeration/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PossibleMultipleEnumeration/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PrivateVariableCanBeMadeReadonly/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=PrivateVariableCanBeMadeReadonly/@EntryIndexedValue">WARNING</s:String>
|
||||||
@ -130,7 +135,6 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantCommaInEnumDeclaration/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantCommaInEnumDeclaration/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantCommaInInitializer/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantCommaInInitializer/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantEmptyObjectCreationArgumentList/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantEmptyObjectCreationArgumentList/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantExplicitParamsArrayCreation/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantExplicitParamsArrayCreation/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantImmediateDelegateInvocation/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantImmediateDelegateInvocation/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantLambdaSignatureParentheses/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=RedundantLambdaSignatureParentheses/@EntryIndexedValue">WARNING</s:String>
|
||||||
@ -209,12 +213,13 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMember_002ELocal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMember_002ELocal/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMethodReturnValue_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMethodReturnValue_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMethodReturnValue_002ELocal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedMethodReturnValue_002ELocal/@EntryIndexedValue">HINT</s:String>
|
||||||
|
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedParameter_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedParameter_002EGlobal/@EntryIndexedValue">HINT</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedParameter_002ELocal/@EntryIndexedValue">HINT</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedParameter_002ELocal/@EntryIndexedValue">HINT</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseAwaitUsing/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseCollectionCountProperty/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseCollectionCountProperty/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseFormatSpecifierInFormatString/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseFormatSpecifierInFormatString/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseFormatSpecifierInInterpolation/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseFormatSpecifierInInterpolation/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseIndexFromEndExpression/@EntryIndexedValue">DO_NOT_SHOW</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNameofExpression/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNameofExpression/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNegatedPatternMatching/@EntryIndexedValue"></s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNegatedPatternMatching/@EntryIndexedValue"></s:String>
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNegatedPatternMatching/@EntryIndexRemoved">True</s:Boolean>
|
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNegatedPatternMatching/@EntryIndexRemoved">True</s:Boolean>
|
||||||
|
Loading…
Reference in New Issue
Block a user