同步更新
@@ -19,6 +19,9 @@ indent_style = space
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# temporary workaround for https://youtrack.jetbrains.com/issue/RIDER-130051/Cannot-resolve-symbol-inspections-incorrectly-firing-for-xmldoc-protected-member-references
|
||||
resharper_c_sharp_warnings_cs1574_cs1584_cs1581_cs1580_highlighting = hint
|
||||
|
||||
#license header
|
||||
file_header_template = Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.\nSee the LICENCE file in the repository root for full licence text.
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.829.0" />
|
||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.908.0" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<!-- Fody does not handle Android build well, and warns when unchanged.
|
||||
|
||||
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -1,2 +0,0 @@
|
||||
[General]
|
||||
// no version specified means v1
|
||||
@@ -29,6 +29,7 @@ namespace osu.Game.Rulesets.Mania
|
||||
bool keyCountMatch = includedKeyCounts.Contains(keyCount);
|
||||
bool longNotePercentageMatch = !longNotePercentage.HasFilter || (!isConvertedBeatmap(beatmapInfo) && longNotePercentage.IsInRange(calculateLongNotePercentage(beatmapInfo)));
|
||||
|
||||
//多选过滤实现
|
||||
if (criteria.DiscreteCircleSizeValues?.Any() == true)
|
||||
{
|
||||
keyCountMatch = criteria.DiscreteCircleSizeValues.Contains(keyCount);
|
||||
|
||||
@@ -109,6 +109,7 @@ namespace osu.Game.Rulesets.Mania
|
||||
return new ManiaSbISkinTransformer(skin, beatmap);
|
||||
|
||||
case DefaultLegacySkin:
|
||||
case RetroSkin:
|
||||
return new ManiaClassicSkinTransformer(skin, beatmap);
|
||||
|
||||
case LegacySkin:
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
|
||||
using System;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Bindables;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Screens;
|
||||
using osu.Game.Screens.Play;
|
||||
|
||||
namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
|
||||
@@ -17,6 +19,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
|
||||
|
||||
protected override string ColorPrefix => "white";
|
||||
|
||||
private Bindable<double> hitTargetFloatFixed = new Bindable<double>();
|
||||
private Bindable<double> hitTargetAlpha = new Bindable<double>(0.3);
|
||||
|
||||
[Resolved]
|
||||
private IBeatmap beatmap { get; set; } = null!;
|
||||
|
||||
@@ -27,7 +32,6 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
|
||||
{
|
||||
RelativeSizeAxes = Axes.X;
|
||||
FillMode = FillMode.Fill;
|
||||
Alpha = 0.3f;
|
||||
}
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
@@ -35,25 +39,50 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
|
||||
{
|
||||
Anchor = Anchor.BottomCentre;
|
||||
Origin = Anchor.BottomCentre;
|
||||
|
||||
Alpha = (float)hitTargetAlpha.Value;
|
||||
hitTargetAlpha = EZSkinConfig.GetBindable<double>(EzSkinSetting.HitTargetAlpha);
|
||||
hitTargetAlpha.BindValueChanged(v => Alpha = (float)v.NewValue, true);
|
||||
|
||||
hitTargetFloatFixed = EZSkinConfig.GetBindable<double>(EzSkinSetting.HitTargetFloatFixed);
|
||||
hitTargetFloatFixed.BindValueChanged(_ => updatePosition());
|
||||
}
|
||||
|
||||
private double beatInterval;
|
||||
private bool requiresUpdate = true;
|
||||
|
||||
protected override void LoadComplete()
|
||||
{
|
||||
base.LoadComplete();
|
||||
double bpm = beatmap.BeatmapInfo.BPM * gameplayClock.GetTrueGameplayRate();
|
||||
beatInterval = 60000 / bpm;
|
||||
calculateBeatInterval();
|
||||
requiresUpdate = true;
|
||||
}
|
||||
|
||||
protected override void Update()
|
||||
{
|
||||
base.Update();
|
||||
|
||||
double progress = (gameplayClock.CurrentTime % beatInterval) / beatInterval;
|
||||
if (requiresUpdate)
|
||||
{
|
||||
updatePosition();
|
||||
}
|
||||
}
|
||||
|
||||
private void calculateBeatInterval()
|
||||
{
|
||||
double bpm = beatmap.BeatmapInfo.BPM * gameplayClock.GetTrueGameplayRate();
|
||||
beatInterval = 60000 / bpm;
|
||||
}
|
||||
|
||||
private void updatePosition()
|
||||
{
|
||||
// 平滑正弦波效果
|
||||
double smoothValue = 0.3 * Math.Sin(progress * 2 * Math.PI);
|
||||
Y = (float)(smoothValue * 6);
|
||||
if (beatInterval > 0)
|
||||
{
|
||||
double progress = (gameplayClock.CurrentTime % beatInterval) / beatInterval;
|
||||
double smoothValue = 0.3 * Math.Sin(progress * 2 * Math.PI);
|
||||
Y = (float)(smoothValue * hitTargetFloatFixed.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace osu.Game.Rulesets.Mania.Skinning.EzStylePro
|
||||
MainContainer.Child = animation;
|
||||
}
|
||||
|
||||
Schedule(UpdateSize);
|
||||
UpdateSize();
|
||||
}
|
||||
|
||||
protected override void UpdateSize()
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.Mania.UI.Components
|
||||
private EzSkinSettingsManager ezSkinConfig { get; set; } = null!;
|
||||
|
||||
private Bindable<double> hitPositonBindable = new Bindable<double>();
|
||||
private readonly Bindable<bool> globalHitPosition = new Bindable<bool>();
|
||||
private Bindable<bool> globalHitPosition = new Bindable<bool>();
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(IScrollingInfo scrollingInfo)
|
||||
@@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Mania.UI.Components
|
||||
Direction.BindTo(scrollingInfo.Direction);
|
||||
Direction.BindValueChanged(_ => UpdateHitPosition(), true);
|
||||
|
||||
globalHitPosition.BindTo(ezSkinConfig.GetBindable<bool>(EzSkinSetting.GlobalHitPosition));
|
||||
globalHitPosition = ezSkinConfig.GetBindable<bool>(EzSkinSetting.GlobalHitPosition);
|
||||
hitPositonBindable = ezSkinConfig.GetBindable<double>(EzSkinSetting.HitPosition);
|
||||
skin.SourceChanged += onSkinChanged;
|
||||
}
|
||||
|
||||
@@ -42,13 +42,22 @@ namespace osu.Game.Rulesets.Mania
|
||||
var bindings = new List<KeyBinding>();
|
||||
|
||||
for (int i = LeftKeys.Length - columns / 2; i < LeftKeys.Length; i++)
|
||||
bindings.Add(new KeyBinding(LeftKeys[i], currentAction++));
|
||||
{
|
||||
bindings.Add(new KeyBinding(LeftKeys[i], currentAction));
|
||||
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||
}
|
||||
|
||||
if (columns % 2 == 1)
|
||||
bindings.Add(new KeyBinding(SpecialKey, currentAction++));
|
||||
{
|
||||
bindings.Add(new KeyBinding(SpecialKey, currentAction));
|
||||
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||
}
|
||||
|
||||
for (int i = 0; i < columns / 2; i++)
|
||||
bindings.Add(new KeyBinding(RightKeys[i], currentAction++));
|
||||
{
|
||||
bindings.Add(new KeyBinding(RightKeys[i], currentAction));
|
||||
bindings.Add(new KeyBinding(InputKey.None, currentAction++));
|
||||
}
|
||||
|
||||
return bindings;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 865 B |
|
Before Width: | Height: | Size: 771 B |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,6 +0,0 @@
|
||||
[General]
|
||||
// no version specified means v1
|
||||
|
||||
[Fonts]
|
||||
HitCircleOverlap: 3
|
||||
ScoreOverlap: 3
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 21 KiB |
@@ -176,6 +176,11 @@ namespace osu.Game.Rulesets.Osu.Edit
|
||||
|
||||
private void applyPosition()
|
||||
{
|
||||
// can happen if popover is dismissed by a keyboard key press while dragging UI controls
|
||||
// it doesn't cause a crash, but it looks wrong
|
||||
if (!editorBeatmap.TransactionActive)
|
||||
return;
|
||||
|
||||
editorBeatmap.PerformOnSelection(ho =>
|
||||
{
|
||||
if (!initialPositions.TryGetValue(ho, out var initialPosition))
|
||||
|
||||
@@ -157,6 +157,10 @@ namespace osu.Game.Rulesets.Osu.Edit
|
||||
|
||||
rotationInfo.BindValueChanged(rotation =>
|
||||
{
|
||||
// can happen if the popover is dismissed by a keyboard key press while dragging UI controls
|
||||
if (!rotationHandler.OperationInProgress.Value)
|
||||
return;
|
||||
|
||||
rotationHandler.Update(rotation.NewValue.Degrees, getOriginPosition(rotation.NewValue));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -220,6 +220,10 @@ namespace osu.Game.Rulesets.Osu.Edit
|
||||
|
||||
scaleInfo.BindValueChanged(scale =>
|
||||
{
|
||||
// can happen if the popover is dismissed by a keyboard key press while dragging UI controls
|
||||
if (!scaleHandler.OperationInProgress.Value)
|
||||
return;
|
||||
|
||||
var newScale = new Vector2(scale.NewValue.Scale, scale.NewValue.Scale);
|
||||
scaleHandler.Update(newScale, getOriginPosition(scale.NewValue), getAdjustAxis(scale.NewValue), getRotation(scale.NewValue));
|
||||
});
|
||||
|
||||
@@ -5,10 +5,13 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using osu.Framework.Testing;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Beatmaps.ControlPoints;
|
||||
using osu.Game.Configuration;
|
||||
using osu.Game.Rulesets.Taiko.Mods;
|
||||
using osu.Game.Rulesets.Taiko.Objects;
|
||||
using osu.Game.Rulesets.Taiko.Objects.Drawables;
|
||||
|
||||
namespace osu.Game.Rulesets.Taiko.Tests.Mods
|
||||
{
|
||||
@@ -69,5 +72,106 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIncreasedVisibilityOnFirstObject()
|
||||
{
|
||||
bool firstHitNeverFadedOut = true;
|
||||
AddStep("enable increased visibility", () => LocalConfig.SetValue(OsuSetting.IncreaseFirstObjectVisibility, true));
|
||||
CreateModTest(new ModTestData
|
||||
{
|
||||
Mod = new TaikoModHidden(),
|
||||
Autoplay = true,
|
||||
PassCondition = () =>
|
||||
{
|
||||
var firstHit = this.ChildrenOfType<DrawableHit>().FirstOrDefault(h => h.HitObject.StartTime == 100);
|
||||
|
||||
if (firstHit?.Alpha < 1 && !firstHit.IsHit)
|
||||
firstHitNeverFadedOut = false;
|
||||
|
||||
return firstHitNeverFadedOut && checkAllMaxResultJudgements(2).Invoke();
|
||||
},
|
||||
CreateBeatmap = () =>
|
||||
{
|
||||
var beatmap = new Beatmap<TaikoHitObject>
|
||||
{
|
||||
HitObjects = new List<TaikoHitObject>
|
||||
{
|
||||
new Hit
|
||||
{
|
||||
Type = HitType.Rim,
|
||||
StartTime = 100,
|
||||
},
|
||||
new Hit
|
||||
{
|
||||
Type = HitType.Centre,
|
||||
StartTime = 200,
|
||||
},
|
||||
},
|
||||
BeatmapInfo =
|
||||
{
|
||||
Difficulty = new BeatmapDifficulty
|
||||
{
|
||||
SliderTickRate = 4,
|
||||
OverallDifficulty = 0,
|
||||
},
|
||||
Ruleset = new TaikoRuleset().RulesetInfo
|
||||
},
|
||||
};
|
||||
|
||||
beatmap.ControlPointInfo.Add(0, new EffectControlPoint { ScrollSpeed = 0.1f });
|
||||
return beatmap;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestNoIncreasedVisibilityOnFirstObject()
|
||||
{
|
||||
bool firstHitFadedOut = true;
|
||||
AddStep("enable increased visibility", () => LocalConfig.SetValue(OsuSetting.IncreaseFirstObjectVisibility, false));
|
||||
CreateModTest(new ModTestData
|
||||
{
|
||||
Mod = new TaikoModHidden(),
|
||||
Autoplay = true,
|
||||
PassCondition = () =>
|
||||
{
|
||||
var firstHit = this.ChildrenOfType<DrawableHit>().FirstOrDefault(h => h.HitObject.StartTime == 100);
|
||||
firstHitFadedOut |= firstHit?.IsHit == false && firstHit.Alpha < 1;
|
||||
return firstHitFadedOut && checkAllMaxResultJudgements(2).Invoke();
|
||||
},
|
||||
CreateBeatmap = () =>
|
||||
{
|
||||
var beatmap = new Beatmap<TaikoHitObject>
|
||||
{
|
||||
HitObjects = new List<TaikoHitObject>
|
||||
{
|
||||
new Hit
|
||||
{
|
||||
Type = HitType.Rim,
|
||||
StartTime = 100,
|
||||
},
|
||||
new Hit
|
||||
{
|
||||
Type = HitType.Centre,
|
||||
StartTime = 200,
|
||||
},
|
||||
},
|
||||
BeatmapInfo =
|
||||
{
|
||||
Difficulty = new BeatmapDifficulty
|
||||
{
|
||||
SliderTickRate = 4,
|
||||
OverallDifficulty = 0,
|
||||
},
|
||||
Ruleset = new TaikoRuleset().RulesetInfo
|
||||
},
|
||||
};
|
||||
|
||||
beatmap.ControlPointInfo.Add(0, new EffectControlPoint { ScrollSpeed = 0.1f });
|
||||
return beatmap;
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,5 +0,0 @@
|
||||
[General]
|
||||
Name: an old skin
|
||||
Author: an old guy
|
||||
|
||||
// no version specified means v1
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 20 KiB |