维护代码质量,调整自定义hitmod相关

[标记反键无法加载问题]添加针对性测试及备忘。以前也出现过类似问题,无法进入游戏。修复后压缩提交
This commit is contained in:
LA
2026-01-14 00:48:46 +08:00
parent 9dbe9075c9
commit d0d7631094
49 changed files with 277 additions and 315 deletions

View File

@@ -2,7 +2,5 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../osu-framework" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../osu-resources" vcs="Git" />
</component>
</project>

View File

@@ -26,7 +26,7 @@ namespace osu.Desktop.EzMacOS
[BackgroundDependencyLoader]
private void load(ILocalUserPlayInfo localUserInfo, Ez2ConfigManager ezConfig)
{
RelativeSizeAxes = osu.Framework.Graphics.Axes.Both;
RelativeSizeAxes = Axes.Both;
AlwaysPresent = true;
localUserPlaying = localUserInfo.PlayingState.GetBoundCopy();

View File

@@ -0,0 +1,142 @@
// 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.
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mania.Mods.LAsMods;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Objects;
using osu.Game.Tests.Visual;
namespace osu.Game.Rulesets.Mania.Tests.Mods
{
public partial class TestSceneManiaModSpaceBody : ModTestScene
{
protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset();
[Test]
public void TestDefaultSettings()
{
var mod = new ManiaModSpaceBody();
CreateModTest(new ModTestData
{
Mod = mod,
CreateBeatmap = () => new Beatmap
{
BeatmapInfo = { Ruleset = new ManiaRuleset().RulesetInfo },
HitObjects = new List<HitObject>
{
new Note { StartTime = 1000, Column = 0 },
new Note { StartTime = 2000, Column = 0 },
new Note { StartTime = 3000, Column = 0 },
new Note { StartTime = 1000, Column = 1 },
new Note { StartTime = 2500, Column = 1 },
new Note { StartTime = 1000, Column = 2 },
new Note { StartTime = 3500, Column = 2 }
}
},
PassCondition = () => Player.DrawableRuleset?.Objects.Any() == true
});
}
[Test]
public void TestWithSmallSpaceBeat()
{
var mod = new ManiaModSpaceBody
{
SpaceBeat = { Value = 2.0 }
};
CreateModTest(new ModTestData
{
Mod = mod,
CreateBeatmap = () => new Beatmap
{
BeatmapInfo = { Ruleset = new ManiaRuleset().RulesetInfo },
HitObjects = new List<HitObject>
{
new Note { StartTime = 1000, Column = 0 },
new Note { StartTime = 2000, Column = 0 },
new Note { StartTime = 3000, Column = 0 }
}
},
PassCondition = () => Player.DrawableRuleset?.Objects.Any() == true
});
}
[Test]
public void TestWithLargeSpaceBeat()
{
var mod = new ManiaModSpaceBody
{
SpaceBeat = { Value = 8.0 }
};
CreateModTest(new ModTestData
{
Mod = mod,
CreateBeatmap = () => new Beatmap
{
BeatmapInfo = { Ruleset = new ManiaRuleset().RulesetInfo },
HitObjects = new List<HitObject>
{
new Note { StartTime = 1000, Column = 0 },
new Note { StartTime = 2000, Column = 0 },
new Note { StartTime = 3000, Column = 0 }
}
},
PassCondition = () => Player.DrawableRuleset?.Objects.Any() == true
});
}
[Test]
public void TestWithShieldEnabled()
{
var mod = new ManiaModSpaceBody
{
Shield = { Value = true }
};
CreateModTest(new ModTestData
{
Mod = mod,
CreateBeatmap = () => new Beatmap
{
BeatmapInfo = { Ruleset = new ManiaRuleset().RulesetInfo },
HitObjects = new List<HitObject>
{
new Note { StartTime = 1000, Column = 0 },
new Note { StartTime = 2000, Column = 0 },
new Note { StartTime = 3000, Column = 0 }
}
},
PassCondition = () => Player.DrawableRuleset?.Objects.Any() == true
});
}
[Test]
public void TestWithHoldNotes()
{
var mod = new ManiaModSpaceBody();
CreateModTest(new ModTestData
{
Mod = mod,
CreateBeatmap = () => new Beatmap
{
BeatmapInfo = { Ruleset = new ManiaRuleset().RulesetInfo },
HitObjects = new List<HitObject>
{
new Note { StartTime = 1000, Column = 0 },
new HoldNote { StartTime = 2000, Duration = 500, Column = 0 },
new Note { StartTime = 3000, Column = 0 }
}
},
PassCondition = () => Player.DrawableRuleset?.Objects.Any() == true
});
}
}
}

View File

@@ -290,6 +290,7 @@ namespace osu.Game.Rulesets.Mania.Tests
offset = GenerateNormalOffset(random, 0, 20);
offset = Math.Max(-40, Math.Min(40, offset));
break;
case 1: // [±40, ±100]ms
offset = GenerateNormalOffset(random, isNegative ? -40 : 40, 30);
if (isNegative)
@@ -297,6 +298,7 @@ namespace osu.Game.Rulesets.Mania.Tests
else
offset = Math.Max(40, Math.Min(100, offset));
break;
case 2: // [±100, ±150]ms
offset = GenerateNormalOffset(random, isNegative ? -100 : 100, 25);
if (isNegative)
@@ -304,6 +306,7 @@ namespace osu.Game.Rulesets.Mania.Tests
else
offset = Math.Max(100, Math.Min(150, offset));
break;
case 3: // [±150, ±200]ms
offset = GenerateNormalOffset(random, isNegative ? -150 : 150, 25);
if (isNegative)
@@ -377,18 +380,23 @@ namespace osu.Game.Rulesets.Mania.Tests
case HitResult.Perfect:
totalPoints += 305;
break;
case HitResult.Great:
totalPoints += 300;
break;
case HitResult.Good:
totalPoints += 200;
break;
case HitResult.Ok:
totalPoints += 100;
break;
case HitResult.Meh:
totalPoints += 50;
break;
default:
totalPoints += 0;
break;

View File

@@ -146,18 +146,19 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
yield return CurrentHitMode switch
{
EzMUGHitMode.EZ2AC => new Ez2AcNote(note),
EzMUGHitMode.Melody => new NoJudgementNote(note),
EzMUGHitMode.Malody => new NoJudgementNote(note),
EzMUGHitMode.O2Jam => new O2Note(note),
EzMUGHitMode.IIDX => new Ez2AcNote(note),
_ => note
};
}
else if (maniaObj is HoldNote hold && CurrentHitMode != EzMUGHitMode.Lazer)
else
if (maniaObj is HoldNote hold && CurrentHitMode != EzMUGHitMode.Lazer)
{
yield return CurrentHitMode switch
{
EzMUGHitMode.EZ2AC => new Ez2AcHoldNote(hold),
EzMUGHitMode.Melody => new NoJudgmentHoldNote(hold),
EzMUGHitMode.Malody => new NoJudgmentHoldNote(hold),
EzMUGHitMode.O2Jam => new O2HoldNote(hold),
EzMUGHitMode.IIDX => new Ez2AcHoldNote(hold),
_ => hold
@@ -267,18 +268,19 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
yield return CurrentHitMode switch
{
EzMUGHitMode.EZ2AC => new Ez2AcNote(note),
EzMUGHitMode.Melody => new NoJudgementNote(note),
EzMUGHitMode.Malody => new NoJudgementNote(note),
EzMUGHitMode.O2Jam => new O2Note(note),
EzMUGHitMode.IIDX => new Ez2AcNote(note),
_ => note
};
}
else if (obj is HoldNote hold && CurrentHitMode != EzMUGHitMode.Lazer)
else
if (obj is HoldNote hold && CurrentHitMode != EzMUGHitMode.Lazer)
{
yield return CurrentHitMode switch
{
EzMUGHitMode.EZ2AC => new Ez2AcHoldNote(hold),
EzMUGHitMode.Melody => new NoJudgmentHoldNote(hold),
EzMUGHitMode.Malody => new NoJudgmentHoldNote(hold),
EzMUGHitMode.O2Jam => new O2HoldNote(hold),
EzMUGHitMode.IIDX => new Ez2AcHoldNote(hold),
_ => hold

View File

@@ -15,7 +15,7 @@ using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring;
using osu.Game.Utils;
namespace osu.Game.Rulesets.Mania.Analysis
namespace osu.Game.Rulesets.Mania.LAsEzMania.Analysis
{
/// <summary>
/// Generates <see cref="HitEvent"/>s for mania scores by re-evaluating a score's replay input against a provided playable beatmap.

View File

@@ -426,7 +426,7 @@ namespace osu.Game.Rulesets.Mania.LAsEZMania.Analysis
return usage;
}
#region LN计算
#region LN计算
private static LNRepStruct buildLNRepresentation(List<NoteStruct> longNotes, int totalTime)
{

View File

@@ -168,7 +168,7 @@ namespace osu.Game.Rulesets.Mania.LAsEZMania.Helper
case EzMUGHitMode.IIDX:
return GetHitWindowsIIDX();
case EzMUGHitMode.Melody:
case EzMUGHitMode.Malody:
return GetHitWindowsMelody();
default:
@@ -204,7 +204,7 @@ namespace osu.Game.Rulesets.Mania.LAsEZMania.Helper
SetRanges(GetHitWindowsIIDX());
break;
case EzMUGHitMode.Melody:
case EzMUGHitMode.Malody:
SetRanges(GetHitWindowsMelody());
break;
@@ -289,7 +289,7 @@ namespace osu.Game.Rulesets.Mania.LAsEZMania.Helper
/// <summary>
/// Allow external code to replace the current windows (e.g. when switching hit modes).
/// </summary>
public void SetRanges(double[] ranges)
public void SetRanges(double[]? ranges)
{
if (ranges == null) return;

View File

@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
using System.Globalization;
using osu.Framework.Bindables;
using osu.Framework.Localisation;
using osu.Game.Beatmaps;
@@ -52,8 +53,8 @@ namespace osu.Game.Rulesets.Mania.Mods.LAsMods
{
get
{
yield return ("Rescale Threshold", new LocalisableString(RescaleThreshold.Value.ToString()));
yield return ("LN Integral Multiplier", new LocalisableString(LnMultiplier.Value.ToString()));
yield return ("Rescale Threshold", new LocalisableString(RescaleThreshold.Value.ToString(CultureInfo.InvariantCulture)));
yield return ("LN Integral Multiplier", new LocalisableString(LnMultiplier.Value.ToString(CultureInfo.InvariantCulture)));
}
}

View File

@@ -17,6 +17,10 @@ using osu.Game.Rulesets.Mods;
namespace osu.Game.Rulesets.Mania.Mods.LAsMods
{
/// <summary>
/// 需要同时使用IApplicableAfterBeatmapConversion, IHasApplyOrder
///否则时序错误
/// </summary>
public class ManiaModSpaceBody : Mod, IApplicableAfterBeatmapConversion, IHasApplyOrder
{
public override string Name => "Space Body";
@@ -84,7 +88,7 @@ namespace osu.Game.Rulesets.Mania.Mods.LAsMods
newColumnObjects.Add(new HoldNote
{
Column = Math.Clamp(column.Key, 0, (int)maniaBeatmap.TotalColumns - 1),
Column = Math.Clamp(column.Key, 0, maniaBeatmap.TotalColumns - 1),
StartTime = locations[i].startTime,
Duration = duration,
NodeSamples = new List<IList<HitSampleInfo>> { locations[i].samples, Array.Empty<HitSampleInfo>() }

View File

@@ -22,12 +22,10 @@ namespace osu.Game.Rulesets.Mania.Objects.EzCurrentHitObject
if (timeOffset >= 0 && HoldNote.IsHolding.Value)
{
ApplyMaxResult();
return;
}
else if (timeOffset > 0)
{
ApplyMinResult();
return;
}
}
}

View File

@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Scoring;
namespace osu.Game.Rulesets.Mania.Objects.EzCurrentHitObject
{
// 注意注册顺序必须是:头 尾 身体
public class Ez2AcHoldNote : HoldNote
{
public Ez2AcHoldNote()

View File

@@ -29,19 +29,17 @@ namespace osu.Game.Rulesets.Mania.Objects.EzCurrentHitObject
Column = Column,
Samples = GetNodeSamples(0),
});
AddNested(Body = new NoMissLNBody
{
StartTime = StartTime,
Column = Column,
});
AddNested(Tail = new NoComboBreakLNTail
{
StartTime = EndTime,
Column = Column,
Samples = GetNodeSamples((NodeSamples?.Count - 1) ?? 1),
});
AddNested(Body = new NoMissLNBody
{
StartTime = StartTime,
Column = Column,
});
}
}
}

View File

@@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Mania.Scoring
{
public class ManiaHitWindows : HitWindows
{
private readonly CustomHitWindowsHelper customHelper = new CustomHitWindowsHelper(GlobalConfigStore.EzConfig?.Get<EzMUGHitMode>(Ez2Setting.HitMode) ?? EzMUGHitMode.Lazer);
private static readonly CustomHitWindowsHelper custom_helper = new CustomHitWindowsHelper(GlobalConfigStore.EzConfig?.Get<EzMUGHitMode>(Ez2Setting.HitMode) ?? EzMUGHitMode.Lazer);
public static readonly DifficultyRange PERFECT_WINDOW_RANGE = new DifficultyRange(22.4D, 19.4D, 13.9D);
private static readonly DifficultyRange great_window_range = new DifficultyRange(64, 49, 34);
private static readonly DifficultyRange good_window_range = new DifficultyRange(97, 82, 67);
@@ -206,19 +206,19 @@ namespace osu.Game.Rulesets.Mania.Scoring
O2HitModeExtension.CoolCombo = 0;
O2HitModeExtension.PillActivated = true;
SetSpecialDifficultyRange(customHelper.GetHitWindowsO2Jam(bpm));
SetSpecialDifficultyRange(custom_helper.GetHitWindowsO2Jam(bpm));
break;
case EzMUGHitMode.EZ2AC:
SetSpecialDifficultyRange(customHelper.GetHitWindowsEZ2AC());
SetSpecialDifficultyRange(custom_helper.GetHitWindowsEZ2AC());
break;
case EzMUGHitMode.IIDX:
SetSpecialDifficultyRange(customHelper.GetHitWindowsIIDX());
SetSpecialDifficultyRange(custom_helper.GetHitWindowsIIDX());
break;
case EzMUGHitMode.Melody:
SetSpecialDifficultyRange(customHelper.GetHitWindowsMelody());
case EzMUGHitMode.Malody:
SetSpecialDifficultyRange(custom_helper.GetHitWindowsMelody());
break;
default:

View File

@@ -27,8 +27,8 @@ namespace osu.Game.Rulesets.Mania.Scoring
protected override IEnumerable<HitObject> EnumerateHitObjects(IBeatmap beatmap)
{
od = Mods.Value.OfType<ManiaModAdjust>().FirstOrDefault(m => m.OverallDifficulty.Value is not null && m.CustomOD.Value)
?.OverallDifficulty.Value ?? beatmap.Difficulty.OverallDifficulty;
od = Mods.Value.OfType<ManiaModAdjust>().FirstOrDefault(m => m.OverallDifficulty.Value is not null && m.CustomOD.Value)
?.OverallDifficulty.Value ?? beatmap.Difficulty.OverallDifficulty;
return base.EnumerateHitObjects(beatmap).Order(JudgementOrderComparer.DEFAULT);
}

View File

@@ -39,7 +39,7 @@ namespace osu.Game.Rulesets.Mania.Skinning.Editor
return new SkinProvidingContainer(transformedSkin)
{
RelativeSizeAxes = Axes.Both,
Child = createTwoKeyLayout(new[]
Child = createTwoKeyLayout(new Drawable[]
{
createHoldPreview(looping: true, column: 0, maniaAction: ManiaAction.Key1, width: columnWidth0),
createHoldPreview(looping: true, column: 1, maniaAction: ManiaAction.Key2, width: columnWidth1),
@@ -322,11 +322,11 @@ namespace osu.Game.Rulesets.Mania.Skinning.Editor
if (endY < startY)
(startY, endY) = (endY, startY);
float extraWidth = 12;
const float extra_width = 12;
judgementArea.X = -extraWidth / 2;
judgementArea.X = -extra_width / 2;
judgementArea.Y = startY;
judgementArea.Width = drawableHoldNote.DrawWidth + extraWidth;
judgementArea.Width = drawableHoldNote.DrawWidth + extra_width;
judgementArea.Height = Math.Max(0, endY - startY);
}

View File

@@ -22,8 +22,8 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
{
private Container sprite = null!;
[Resolved]
private StageDefinition stageDefinition { get; set; } = null!;
// [Resolved]
// private StageDefinition stageDefinition { get; set; } = null!;
[Resolved]
private EzLocalTextureFactory factory { get; set; } = null!;

View File

@@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
float scale = actualPanelWidth / 412.0f;
sprite.Scale = new Vector2(scale);
sprite.Y = 205f - 384f * scale + ezSkinConfig.DefaultHitPosition - (float)hitPositonBindable.Value;
sprite.Y = 205f - 384f * scale + ezSkinConfig.DefaultHitPosition - (float)hitPositonBindable.Value;
// 计算纹理高度和位置
// float textureHeight = sprite.Child.Height * scale;

View File

@@ -162,7 +162,7 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
new EzComHitResultScore(),
new EzComHitTiming(),
new EzComHitTiming(),
new EzComO2JamPillUI()
new EzComO2JamPillUI
{
Anchor = Anchor.CentreRight,
Origin = Anchor.CentreRight,

View File

@@ -328,7 +328,7 @@ namespace osu.Game.Rulesets.Mania.UI
column.RegisterPool<Ez2AcLNTail, Ez2AcDrawableLNTail>(10, 50);
break;
case EzMUGHitMode.Melody:
case EzMUGHitMode.Malody:
column.RegisterPool<NoJudgementNote, DrawableNote>(10, 50);
column.RegisterPool<HeadNote, DrawableHoldNoteHead>(10, 50);
column.RegisterPool<NoMissLNBody, MalodyDrawableLNBody>(10, 50);

View File

@@ -294,11 +294,12 @@ namespace osu.Game.Beatmaps
// Convert
IBeatmap converted = converter.Convert(token);
// Apply conversion mods to the result.
// 应用转换后的Mod。如果Mod实现了IHasApplyOrder接口则尊重它们的顺序值较小的优先
// 没有该接口的Mod默认为顺序0以保持现有行为。
// Apply conversion mods to the result
foreach (var mod in mods.OfType<IApplicableAfterBeatmapConversion>()
.OrderBy(m => (m as osu.Game.Rulesets.Mods.IHasApplyOrder)?.ApplyOrder ?? 0))
.OrderBy(m => (m as IHasApplyOrder)?.ApplyOrder ?? 0)
)
{
token.ThrowIfCancellationRequested();
mod.ApplyToBeatmap(converted);

View File

@@ -79,6 +79,7 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordRequest()
{
if (!Enabled) return;
Interlocked.Increment(ref request_count);
}
@@ -109,6 +110,7 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordComputeCancelled()
{
if (!Enabled) return;
Interlocked.Increment(ref compute_cancelled_count);
}
@@ -150,12 +152,14 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordEviction()
{
if (!Enabled) return;
Interlocked.Increment(ref eviction_count);
}
public static void UpdateCacheGauges(int currentSize, int limit)
{
if (!Enabled) return;
Volatile.Write(ref in_memory_cache_size, currentSize);
Volatile.Write(ref in_memory_cache_limit, limit);
}
@@ -163,6 +167,7 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordUiUpdate(long elapsedTicks, long allocatedBytes)
{
if (!Enabled) return;
Interlocked.Increment(ref ui_update_count);
Interlocked.Add(ref ui_update_ticks, elapsedTicks);
Interlocked.Add(ref ui_update_alloc_bytes, allocatedBytes);
@@ -171,6 +176,7 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordUiGraphSet(int points, long elapsedTicks, long allocatedBytes)
{
if (!Enabled) return;
Interlocked.Increment(ref ui_graph_set_count);
Interlocked.Add(ref ui_graph_set_ticks, elapsedTicks);
Interlocked.Add(ref ui_graph_set_alloc_bytes, allocatedBytes);
@@ -180,6 +186,7 @@ namespace osu.Game.LAsEzExtensions.Analysis.Diagnostics
public static void RecordUiKpcUpdate(int columns, bool isBarChart, long elapsedTicks, long allocatedBytes)
{
if (!Enabled) return;
Interlocked.Increment(ref ui_kpc_update_count);
Interlocked.Add(ref ui_kpc_update_ticks, elapsedTicks);
Interlocked.Add(ref ui_kpc_update_alloc_bytes, allocatedBytes);

View File

@@ -3,16 +3,13 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using osu.Framework.Allocation;
using osu.Framework.Audio.Track;
using osu.Framework.Bindables;
using osu.Framework.Extensions;
using osu.Framework.Graphics.Textures;
using osu.Framework.Lists;
using osu.Framework.Logging;
using osu.Framework.Threading;
@@ -21,9 +18,6 @@ using osu.Game.Configuration;
using osu.Game.Database;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Scoring;
using osu.Game.Skinning;
using osu.Game.Storyboards;
namespace osu.Game.LAsEzExtensions.Analysis
{
@@ -103,10 +97,10 @@ namespace osu.Game.LAsEzExtensions.Analysis
}
public Task<double?> GetXxySrAsync(IBeatmapInfo beatmapInfo,
IRulesetInfo? rulesetInfo = null,
IEnumerable<Mod>? mods = null,
CancellationToken cancellationToken = default,
int computationDelay = 0)
IRulesetInfo? rulesetInfo = null,
IEnumerable<Mod>? mods = null,
CancellationToken cancellationToken = default,
int computationDelay = 0)
{
var localBeatmapInfo = beatmapInfo as BeatmapInfo;
var localRulesetInfo = (rulesetInfo ?? beatmapInfo.Ruleset) as RulesetInfo;
@@ -121,7 +115,7 @@ namespace osu.Game.LAsEzExtensions.Analysis
{
return Task.Factory.StartNew(() =>
{
if (CheckExists(lookup, out var existing))
if (CheckExists(lookup, out double? existing))
return existing;
return computeXxySr(lookup, token);
@@ -323,6 +317,7 @@ namespace osu.Game.LAsEzExtensions.Analysis
sr = 0;
var method = calculateMethod.Value;
if (method == null)
{
if (Interlocked.Exchange(ref resolve_fail_logged, 1) == 0)
@@ -356,10 +351,8 @@ namespace osu.Game.LAsEzExtensions.Analysis
try
{
var type = findType(calculator_type_name);
if (type == null)
return null;
return type.GetMethod(calculator_method_name, BindingFlags.Public | BindingFlags.Static, binder: null, types: new[] { typeof(IBeatmap) }, modifiers: null);
return type?.GetMethod(calculator_method_name, BindingFlags.Public | BindingFlags.Static, binder: null, types: new[] { typeof(IBeatmap) }, modifiers: null);
}
catch (Exception ex)
{

View File

@@ -70,7 +70,7 @@ namespace osu.Game.LAsEzExtensions.Analysis
// Base seed derived from beatmap identity.
int baseSeed = 17;
baseSeed = baseSeed * 31 + beatmapInfo.ID.GetHashCode();
baseSeed = baseSeed * 31 + (beatmapInfo.Hash?.GetHashCode(StringComparison.Ordinal) ?? 0);
baseSeed = baseSeed * 31 + (beatmapInfo.Hash.GetHashCode(StringComparison.Ordinal));
for (int i = 0; i < orderedMods.Length; i++)
{

View File

@@ -32,6 +32,7 @@ namespace osu.Game.LAsEzExtensions.Analysis
}
int lastIndex = source.Count - 1;
for (int i = 0; i < targetCount; i++)
{
int index = (int)((long)i * lastIndex / (targetCount - 1));
@@ -198,7 +199,7 @@ namespace osu.Game.LAsEzExtensions.Analysis
double songEnd = hitObjects[^1].StartTime;
double duration = Math.Max(1, songEnd - songStart);
var bucketsCounts = new long[buckets];
long[] bucketsCounts = new long[buckets];
foreach (var obj in hitObjects)
{

View File

@@ -34,7 +34,7 @@ namespace osu.Game.LAsEzExtensions.Audio
private double lastKeyPressTime;
private Key lastKey;
public static InputAudioLatencyTracker GlobalTracker { get; set; }
public static InputAudioLatencyTracker? GlobalTracker { get; set; }
public InputAudioLatencyTracker()
{
@@ -61,9 +61,10 @@ namespace osu.Game.LAsEzExtensions.Audio
Logger.Log($"[InputAudioLatency] Audio play at {timeMs:F2}ms", LoggingTarget.Runtime, LogLevel.Verbose);
var lastRecord = records.LastOrDefault(r => r.AudioPlayTimeMs == 0);
if (lastRecord.AudioPlayTimeMs == 0 && records.Count > 0 && records.Last().AudioPlayTimeMs == 0)
{
records[records.Count - 1] = new LatencyRecord
records[^1] = new LatencyRecord
{
KeyPressTimeMs = lastRecord.KeyPressTimeMs,
JudgementTimeMs = lastRecord.JudgementTimeMs,

View File

@@ -8,21 +8,21 @@ namespace osu.Game.LAsEzExtensions.Configuration
public enum EzMUGHitMode
{
[Description("Lazer Style")]
Lazer,
Lazer = 0,
[Description("EZ2AC Style")]
EZ2AC,
EZ2AC = 1,
[Description("Beatmania IIDX Style(NoAction)")]
IIDX,
[Description("Melody Style")]
Melody,
IIDX = 2,
[Description("O2JAM Style")]
O2Jam,
O2Jam = 3,
[Description("Malody Style")]
Malody = 4,
[Description("Classic Style(NoAction)")]
Classic,
Classic = 5,
}
}

View File

@@ -22,7 +22,7 @@ namespace osu.Game.LAsEzExtensions.HUD
/// </summary>
public static event Action? OnGameThemesReloaded;
private static readonly string gametheme_path = @"EzResources\GameTheme";
private const string gametheme_path = @"EzResources\GameTheme";
public static List<string> AvailableGameThemes { get; } = new List<string>();

View File

@@ -25,7 +25,7 @@ namespace osu.Game.LAsEzExtensions.HUD
{
base.LoadComplete();
// 动态加载GameTheme文件夹
var availableThemes = loadAvailableThemes();
// var availableThemes = loadAvailableThemes();
Items = Enum.GetValues(typeof(EzEnumGameThemeName)).Cast<EzEnumGameThemeName>().ToList();
}

View File

@@ -360,7 +360,7 @@ namespace osu.Game.LAsEzExtensions.Screens
{
ApplySettings();
Hide();
}, () => Hide()));
}, Hide));
}
public void PresentGameplay()

View File

@@ -35,9 +35,6 @@ namespace osu.Game.LAsEzExtensions.Select
[Resolved]
private Ez2ConfigManager ezConfig { get; set; } = null!;
[Resolved]
private OsuConfigManager config { get; set; } = null!;
[Resolved]
private IBindable<RulesetInfo> ruleset { get; set; } = null!;
@@ -184,9 +181,9 @@ namespace osu.Game.LAsEzExtensions.Select
public bool IsMultiSelectMode { get; set; }
public Action<HashSet<string>>? SetCurrentSelections;
[Resolved]
private OverlayColourProvider colourProvider { get; set; } = null!;
//
// [Resolved]
// private OverlayColourProvider colourProvider { get; set; } = null!;
public ShearedCsModeTabControl()
{
@@ -223,13 +220,12 @@ namespace osu.Game.LAsEzExtensions.Select
Schedule(() =>
{
int count = keyModes.Count;
int count = keyModes.Count;
if (count > 0)
{
float totalWidth = DrawWidth;
float spacing = 2f;
float itemWidth = (totalWidth - (count * spacing)) / count;
float itemWidth = (totalWidth - (count * 2f)) / count;
foreach (var tab in TabContainer.Children.Cast<ShearedCsModeTabItem>())
tab.Width = itemWidth;
}

View File

@@ -1068,8 +1068,7 @@ namespace osu.Game
frameSyncMode = frameworkConfig.GetBindable<FrameSync>(FrameworkSetting.FrameSync);
frameSyncMode.BindValueChanged(_ => Schedule(updateDrawLimiter), true);
if (gameHost?.Window != null)
gameHost.Window.CurrentDisplayMode.BindValueChanged(_ => Schedule(updateDrawLimiter), true);
gameHost?.Window?.CurrentDisplayMode.BindValueChanged(_ => Schedule(updateDrawLimiter), true);
var languages = Enum.GetValues<Language>();

View File

@@ -71,7 +71,6 @@ namespace osu.Game.Overlays.Settings.Sections
AllowNonContiguousMatching = true,
LabelText = SkinSettingsStrings.CurrentSkin,
Current = skins.CurrentSkinInfo,
Keywords = new[] { @"skins" },
},
new FillFlowContainer
{

View File

@@ -532,7 +532,7 @@ namespace osu.Game.Overlays.SkinEditor
SelectedComponents.Add(component);
if (!component.UsesFixedAnchor)
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
return true;
}

View File

@@ -94,7 +94,7 @@ namespace osu.Game.Rulesets.Scoring
{
double miss = WindowFor(HitResult.Miss);
double poolEarlyWindow = miss + 50;
double poolLateWindow = miss + 50;
double poolLateWindow = miss + 15;
if ((timeOffset > -poolEarlyWindow &&
timeOffset < -miss) ||
(timeOffset < poolLateWindow &&

View File

@@ -64,16 +64,16 @@ namespace osu.Game.Screens
{
this.FadeOut();
this.FadeIn(TRANSITION_LENGTH, Easing.InOutQuart);
this.MoveToX(x_movement_amount);
this.MoveToX(0, TRANSITION_LENGTH, Easing.InOutQuart);
}
this.MoveToX(x_movement_amount);
this.MoveToX(0, TRANSITION_LENGTH, Easing.InOutQuart);
}
base.OnEntering(e);
}
public override void OnSuspending(ScreenTransitionEvent e)
{
this.MoveToX(-x_movement_amount, TRANSITION_LENGTH, Easing.InOutQuart);
this.MoveToX(-x_movement_amount, TRANSITION_LENGTH, Easing.InOutQuart);
base.OnSuspending(e);
}

View File

@@ -196,8 +196,7 @@ namespace osu.Game.Screens.Backgrounds
var loader = gameHost.CreateTextureLoaderStore(new osu.Framework.IO.Stores.StorageBackedResourceStore(storage));
textures.AddTextureSource(loader);
if (largeTextures != null)
largeTextures.AddTextureSource(loader);
largeTextures?.AddTextureSource(loader);
storageTextureSourceAdded = true;
}

View File

@@ -247,8 +247,8 @@ namespace osu.Game.Screens.Edit
return;
}
transformSeekTo(seekDestination, transform_time, Easing.OutQuint);
}
transformSeekTo(seekDestination, transform_time, Easing.OutQuint);
}
public void BindAdjustments() => track.Value?.BindAdjustments(AudioAdjustments);

View File

@@ -50,7 +50,8 @@ namespace osu.Game.Screens.Play
[CanBeNull]
private UserStatisticsWatcher userStatisticsWatcher { get; set; }
private InputAudioLatencyTracker? latencyTracker;
[CanBeNull]
private InputAudioLatencyTracker latencyTracker;
private readonly object scoreSubmissionLock = new object();
private TaskCompletionSource<bool> scoreSubmissionSource;

View File

@@ -17,11 +17,11 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Cursor;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Framework.Screens;
using osu.Game.Audio;
using osu.Game.Configuration;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
@@ -64,9 +64,6 @@ namespace osu.Game.Screens.Ranking
[Resolved]
private Player? player { get; set; }
[Resolved]
private OsuConfigManager config { get; set; } = null!;
[Resolved]
private Ez2ConfigManager ezConfig { get; set; } = null!;
@@ -614,7 +611,7 @@ namespace osu.Game.Screens.Ranking
Action = this.ShowPopover;
}
public osu.Framework.Graphics.UserInterface.Popover GetPopover() => new HitModePopover(hitModeSetting);
public Popover GetPopover() => new HitModePopover(hitModeSetting);
}
private partial class HitModePopover : OsuPopover

View File

@@ -50,7 +50,7 @@ namespace osu.Game.Screens.Ranking.Statistics
{
// Avoid spamming logs if something is systematically broken.
if (Interlocked.Increment(ref invoke_fail_count) <= 10)
Logger.Error(ex, $"HitEvent generation bridge invoke exception. ruleset={score?.ScoreInfo?.Ruleset?.ShortName}", logger_name);
Logger.Error(ex, $"HitEvent generation bridge invoke exception. ruleset={score.ScoreInfo?.Ruleset.ShortName}", logger_name);
return null;
}

View File

@@ -25,7 +25,6 @@ using osu.Game.Graphics;
using osu.Game.Graphics.Backgrounds;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.LAsEzExtensions.Analysis;
using osu.Game.Online.API;
using osu.Game.Overlays;
using osu.Game.Resources.Localisation.Web;
@@ -71,9 +70,6 @@ namespace osu.Game.Screens.Select.Carousel
[Resolved]
private BeatmapDifficultyCache difficultyCache { get; set; } = null!;
[Resolved]
private EzBeatmapManiaAnalysisCache maniaAnalysisCache { get; set; } = null!;
[Resolved]
private ManageCollectionsDialog? manageCollectionsDialog { get; set; }
@@ -98,18 +94,6 @@ namespace osu.Game.Screens.Select.Carousel
private IBindable<StarDifficulty> starDifficultyBindable = null!;
private CancellationTokenSource? starDifficultyCancellationSource;
private IBindable<ManiaBeatmapAnalysisResult>? maniaAnalysisBindable;
private CancellationTokenSource? maniaAnalysisCancellationSource;
private IBeatmap playableBeatmap = null!;
private WorkingBeatmap working = null!;
private FillFlowContainer columnNotes = null!;
private LineGraph kpsGraph = null!;
private OsuSpriteText kpsText = null!;
private Dictionary<int, int> columnNoteCounts = new Dictionary<int, int>();
private (double averageKps, double maxKps, List<double> kpsList) kpsResult;
public DrawableCarouselBeatmap(CarouselBeatmap panel)
{
beatmapInfo = panel.BeatmapInfo;
@@ -128,16 +112,8 @@ namespace osu.Game.Screens.Select.Carousel
}
if (manager != null)
{
hideRequested = b => manager.Hide(b);
if (ruleset.Value.OnlineID == 3)
{
working = manager.GetWorkingBeatmap(beatmapInfo);
playableBeatmap = working.GetPlayableBeatmap(ruleset.Value, mods.Value);
}
}
Header.Children = new Drawable[]
{
background = new Box
@@ -151,13 +127,6 @@ namespace osu.Game.Screens.Select.Carousel
ColourLight = Color4Extensions.FromHex(@"3a7285"),
ColourDark = Color4Extensions.FromHex(@"123744")
},
kpsGraph = new LineGraph
{
Size = new Vector2(600, 50),
Colour = OsuColour.Gray(0.25f),
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
},
new FillFlowContainer
{
Padding = new MarginPadding(5),
@@ -167,29 +136,10 @@ namespace osu.Game.Screens.Select.Carousel
Origin = Anchor.CentreLeft,
Children = new Drawable[]
{
new FillFlowContainer
difficultyIcon = new DifficultyIcon(beatmapInfo)
{
Padding = new MarginPadding { Left = 2 },
Direction = FillDirection.Vertical,
AutoSizeAxes = Axes.X,
Children = new Drawable[]
{
difficultyIcon = new DifficultyIcon(beatmapInfo)
{
TooltipType = DifficultyIconTooltipType.None,
Scale = new Vector2(1.8f),
},
new Box
{
RelativeSizeAxes = Axes.X,
Height = 2,
Colour = Colour4.Transparent
},
new TopLocalRank(beatmapInfo)
{
Scale = new Vector2(0.9f),
},
}
TooltipType = DifficultyIconTooltipType.None,
Scale = new Vector2(1.8f),
},
new FillFlowContainer
{
@@ -211,7 +161,6 @@ namespace osu.Game.Screens.Select.Carousel
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Alpha = 0,
Colour = Colour4.Pink
},
new OsuSpriteText
{
@@ -224,38 +173,7 @@ namespace osu.Game.Screens.Select.Carousel
{
Text = BeatmapsetsStrings.ShowDetailsMappedBy(beatmapInfo.Metadata.Author.Username),
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft,
Colour = Colour4.LightGoldenrodYellow
},
}
},
new FillFlowContainer
{
Direction = FillDirection.Horizontal,
Spacing = new Vector2(4, 0),
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
new OsuSpriteText
{
Text = $"[{beatmapInfo.StarRating:F2}*] ",
Font = OsuFont.GetFont(size: 18),
Colour = Colour4.LightGoldenrodYellow,
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
},
starCounter = new StarCounter
{
Scale = new Vector2(0.6f),
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft
},
kpsText = new OsuSpriteText
{
Font = OsuFont.GetFont(size: 18),
Colour = Colour4.CornflowerBlue,
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft
Origin = Anchor.BottomLeft
},
}
},
@@ -267,93 +185,23 @@ namespace osu.Game.Screens.Select.Carousel
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
new OsuSpriteText
{
Text = "[Notes] ",
Font = OsuFont.GetFont(size: 14),
Colour = Colour4.GhostWhite,
Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft
},
columnNotes = new FillFlowContainer
{
Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
},
new TopLocalRank(beatmapInfo),
starCounter = new StarCounter()
}
},
}
}
},
}
}
},
}
};
}
protected override void LoadComplete()
{
base.LoadComplete();
updateCalculations();
ruleset.BindValueChanged(_ =>
{
updateCalculations();
updateKeyCount();
});
mods.BindValueChanged(_ =>
{
updateCalculations();
updateKeyCount();
});
}
private void updateCalculations()
{
if (manager == null || ruleset.Value.OnlineID != 3)
return;
maniaAnalysisCancellationSource?.Cancel();
maniaAnalysisCancellationSource = new CancellationTokenSource();
var localCancellationSource = maniaAnalysisCancellationSource;
// 旧选歌界面与 V2 统一:通过 EzBeatmapManiaAnalysisCache 获取分析结果(会优先走 SQLite 持久化)。
maniaAnalysisBindable = maniaAnalysisCache.GetBindableAnalysis(beatmapInfo, maniaAnalysisCancellationSource.Token, computationDelay: 0);
maniaAnalysisBindable.BindValueChanged(result =>
{
if (localCancellationSource != maniaAnalysisCancellationSource)
return;
var value = result.NewValue;
kpsResult = (value.AverageKps, value.MaxKps, value.KpsList);
columnNoteCounts = value.ColumnCounts;
var (averageKps, maxKps, kpsList) = kpsResult;
kpsGraph.Values = kpsList.Count > 0 ? kpsList.Select(kps => (float)kps).ToArray() : new[] { 0f };
kpsText.Text = averageKps > 0 ? $" KPS: {averageKps:F1} ({maxKps:F1} Max)" : " KPS: calculating...";
columnNotes.Clear();
columnNotes.Children = columnNoteCounts
.OrderBy(c => c.Key)
.Select((c, index) => new FillFlowContainer
{
Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
Children = new Drawable[]
{
new OsuSpriteText
{
Text = $"{index + 1}/",
Font = OsuFont.GetFont(size: 12),
Colour = Colour4.Gray,
},
new OsuSpriteText
{
Text = $"{c.Value} ",
Font = OsuFont.GetFont(size: 14),
Colour = Colour4.LightCoral,
}
}
}).ToArray();
}, true);
ruleset.BindValueChanged(_ => updateKeyCount());
mods.BindValueChanged(_ => updateKeyCount());
}
protected override void Selected()

View File

@@ -398,11 +398,11 @@ namespace osu.Game.Screens.SelectV2
{
var meta = beatmap.BeatmapSet!.Metadata;
string source = meta.Source ?? string.Empty;
string tags = meta.Tags ?? string.Empty;
string title = meta.Title ?? string.Empty;
string artist = meta.Artist ?? string.Empty;
string diff = beatmap.DifficultyName ?? string.Empty;
string source = meta.Source;
string tags = meta.Tags;
string title = meta.Title;
string artist = meta.Artist;
string diff = beatmap.DifficultyName;
// combine fields for matching, but preserve whether source was provided
bool hasSource = !string.IsNullOrWhiteSpace(source);
@@ -454,9 +454,6 @@ namespace osu.Game.Screens.SelectV2
if (containsAny(combined, "popn music", "pop'n", "popn"))
return new GroupDefinition(0, "Pop'n").Yield();
if (containsAny(combined, "maimai", "maimai deluxe", "maimaiでらっくす"))
return new GroupDefinition(0, "MaiMai").Yield();
// If none of the special rules matched but the source field was provided, put into Others
if (hasSource)
return new GroupDefinition(50, "Others").Yield();

View File

@@ -33,9 +33,6 @@ namespace osu.Game.Screens.SelectV2
{
private const float corner_radius = 10;
// 这里存储所选的工作谱面以供全局访问例如在MOD中无法注入可以用这个来获取工作谱面
public static WorkingBeatmap? SelectedWorkingBeatmap;
[Resolved]
private IBindable<WorkingBeatmap> working { get; set; } = null!;
@@ -184,11 +181,7 @@ namespace osu.Game.Screens.SelectV2
{
base.LoadComplete();
working.BindValueChanged(value =>
{
SelectedWorkingBeatmap = value.NewValue;
updateDisplay();
});
working.BindValueChanged(_ => updateDisplay());
ruleset.BindValueChanged(_ => updateDisplay());
onlineLookupResult.BindValueChanged(_ => updateDisplay());

View File

@@ -67,21 +67,15 @@ namespace osu.Game.Screens.SelectV2
[Resolved]
private Ez2ConfigManager ezConfig { get; set; } = null!;
[Resolved]
private EzBeatmapManiaAnalysisCache maniaAnalysisCache { get; set; } = null!;
[Resolved]
private IRulesetStore rulesets { get; set; } = null!;
[Resolved]
private OverlayColourProvider colourProvider { get; set; } = null!;
[Resolved]
private OsuColour colours { get; set; } = null!;
[Resolved]
private BeatmapDifficultyCache difficultyCache { get; set; } = null!;
[Resolved]
private EzBeatmapManiaAnalysisCache maniaAnalysisCache { get; set; } = null!;
[Resolved]
private IBindable<RulesetInfo> ruleset { get; set; } = null!;
@@ -93,9 +87,6 @@ namespace osu.Game.Screens.SelectV2
private BeatmapInfo beatmap => ((GroupedBeatmap)Item!.Model).Beatmap;
[Resolved]
private BeatmapManager beatmapManager { get; set; } = null!;
private IBindable<ManiaBeatmapAnalysisResult>? maniaAnalysisBindable;
private CancellationTokenSource? maniaAnalysisCancellationSource;
private string? cachedScratchText;
@@ -255,7 +246,7 @@ namespace osu.Game.Screens.SelectV2
Origin = Anchor.CentreLeft,
Scale = new Vector2(0.4f)
},
ezKpcDisplay = new EzKpcDisplay()
ezKpcDisplay = new EzKpcDisplay
{
Anchor = Anchor.CentreLeft,
Origin = Anchor.CentreLeft,
@@ -591,21 +582,6 @@ namespace osu.Game.Screens.SelectV2
{
computeManiaAnalysis();
}
// 如果离屏期间收到过分析结果(或刚好在离屏时更新被跳过),这里补一次 UI 应用。
// if (hasPendingUiUpdate && scheduledManiaUiUpdate == null)
// {
// scheduledManiaUiUpdate = Scheduler.AddDelayed(() =>
// {
// scheduledManiaUiUpdate = null;
//
// if (!hasPendingUiUpdate)
// return;
//
// hasPendingUiUpdate = false;
// updateKPs(pendingKpsResult, pendingColumnCounts, pendingHoldNoteCounts);
// }, 0, false);
// }
}
// Dirty hack to make sure we don't take up spacing in parent fill flow when not displaying a rank.

View File

@@ -65,9 +65,6 @@ namespace osu.Game.Screens.SelectV2
[Resolved]
private EzBeatmapManiaAnalysisCache maniaAnalysisCache { get; set; } = null!;
[Resolved]
private BeatmapManager beatmapManager { get; set; } = null!;
private IBindable<ManiaBeatmapAnalysisResult>? maniaAnalysisBindable;
private CancellationTokenSource? maniaAnalysisCancellationSource;
private bool applyNextManiaUiUpdateImmediately;

View File

@@ -93,7 +93,7 @@ namespace osu.Game.Screens.SelectV2
RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) },
Content = new[]
{
new Drawable[]
new[]
{
new OsuSpriteText
{

View File

@@ -383,7 +383,6 @@ namespace osu.Game.Skinning
if (guid == SkinInfo.RETRO_SKIN)
skinInfo = retroSkin.SkinInfo;
}
CurrentSkinInfo.Value = skinInfo ?? trianglesSkin.SkinInfo;

View File

@@ -339,11 +339,13 @@
<s:Boolean x:Key="/Default/CodeStyle/EncapsulateField/MakeFieldPrivate/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/EncapsulateField/UseAutoProperty/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AABB/@EntryIndexedValue">AABB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AC/@EntryIndexedValue">AC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue">API</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ARGB/@EntryIndexedValue">ARGB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BPM/@EntryIndexedValue">BPM</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DDKK/@EntryIndexedValue">DDKK</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EF/@EntryIndexedValue">EF</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EZ/@EntryIndexedValue">EZ</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FPS/@EntryIndexedValue">FPS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GC/@EntryIndexedValue">GC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GL/@EntryIndexedValue">GL</s:String>
@@ -356,6 +358,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HTML/@EntryIndexedValue">HTML</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HUD/@EntryIndexedValue">HUD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IIDX/@EntryIndexedValue">IIDX</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IL/@EntryIndexedValue">IL</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IOS/@EntryIndexedValue">IOS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IP/@EntryIndexedValue">IP</s:String>
@@ -375,6 +378,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RNG/@EntryIndexedValue">RNG</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SDL/@EntryIndexedValue">SDL</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SHA/@EntryIndexedValue">SHA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SR/@EntryIndexedValue">SR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SRGB/@EntryIndexedValue">SRGB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TK/@EntryIndexedValue">TK</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SS/@EntryIndexedValue">SS</s:String>
@@ -1009,6 +1013,7 @@ private void load()
<s:Boolean x:Key="/Default/UserDictionary/Words/=favourited/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Gamefield/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=gameplay/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=gametheme/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Geki/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hashable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hitnormal/@EntryIndexedValue">True</s:Boolean>
@@ -1030,6 +1035,7 @@ private void load()
<s:Boolean x:Key="/Default/UserDictionary/Words/=letterboxing/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=localisable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=maimai/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Malody/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Migratable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nightcore/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Omni/@EntryIndexedValue">True</s:Boolean>