mirror of
https://github.com/SK-la/Ez2Lazer.git
synced 2026-03-13 11:20:28 +00:00
维护代码质量,调整自定义hitmod相关
[标记反键无法加载问题]添加针对性测试及备忘。以前也出现过类似问题,无法进入游戏。修复后压缩提交
This commit is contained in:
2
.idea/.idea.osu/.idea/vcs.xml
generated
2
.idea/.idea.osu/.idea/vcs.xml
generated
@@ -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>
|
||||
@@ -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();
|
||||
|
||||
142
osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModSpaceBody.cs
Normal file
142
osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModSpaceBody.cs
Normal 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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>() }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Scoring;
|
||||
|
||||
namespace osu.Game.Rulesets.Mania.Objects.EzCurrentHitObject
|
||||
{
|
||||
// 注意注册顺序必须是:头 尾 身体
|
||||
public class Ez2AcHoldNote : HoldNote
|
||||
{
|
||||
public Ez2AcHoldNote()
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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!;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -360,7 +360,7 @@ namespace osu.Game.LAsEzExtensions.Screens
|
||||
{
|
||||
ApplySettings();
|
||||
Hide();
|
||||
}, () => Hide()));
|
||||
}, Hide));
|
||||
}
|
||||
|
||||
public void PresentGameplay()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
|
||||
|
||||
@@ -71,7 +71,6 @@ namespace osu.Game.Overlays.Settings.Sections
|
||||
AllowNonContiguousMatching = true,
|
||||
LabelText = SkinSettingsStrings.CurrentSkin,
|
||||
Current = skins.CurrentSkinInfo,
|
||||
Keywords = new[] { @"skins" },
|
||||
},
|
||||
new FillFlowContainer
|
||||
{
|
||||
|
||||
@@ -532,7 +532,7 @@ namespace osu.Game.Overlays.SkinEditor
|
||||
SelectedComponents.Add(component);
|
||||
|
||||
if (!component.UsesFixedAnchor)
|
||||
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
|
||||
SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace osu.Game.Screens.SelectV2
|
||||
RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) },
|
||||
Content = new[]
|
||||
{
|
||||
new Drawable[]
|
||||
new[]
|
||||
{
|
||||
new OsuSpriteText
|
||||
{
|
||||
|
||||
@@ -383,7 +383,6 @@ namespace osu.Game.Skinning
|
||||
|
||||
if (guid == SkinInfo.RETRO_SKIN)
|
||||
skinInfo = retroSkin.SkinInfo;
|
||||
|
||||
}
|
||||
|
||||
CurrentSkinInfo.Value = skinInfo ?? trianglesSkin.SkinInfo;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user