mirror of
https://github.com/ppy/osu.git
synced 2025-03-01 00:53:29 +08:00
somewhat working prototype
This commit is contained in:
parent
8a1fc7c340
commit
50235cc245
58
osu.Game/Overlays/Mods/ModMapInfoContainer.cs
Normal file
58
osu.Game/Overlays/Mods/ModMapInfoContainer.cs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// 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.Linq;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Online;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using osu.Game.Overlays.BeatmapSet;
|
||||||
|
using osu.Game.Resources.Localisation.Web;
|
||||||
|
using osu.Game.Screens.Select.Details;
|
||||||
|
using osuTK;
|
||||||
|
using osuTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Overlays.Mods
|
||||||
|
{
|
||||||
|
public partial class ModMapInfoContainer : Container
|
||||||
|
{
|
||||||
|
private ModMapInfoDisplay starRatingDisplay = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private OsuColour colours { get; set; } = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private Bindable<BeatmapInfo> adjustedInfo { get; set; } = null!;
|
||||||
|
private Bindable<double> starRatingValue = new Bindable<double>();
|
||||||
|
|
||||||
|
//public ModMapInfoContainer()
|
||||||
|
//{
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
starRatingDisplay = new ModMapInfoDisplay("Star Rating", colours.ForStarDifficulty);
|
||||||
|
starRatingDisplay.Current.BindTo(starRatingValue);
|
||||||
|
|
||||||
|
Content.Add(starRatingDisplay);
|
||||||
|
|
||||||
|
adjustedInfo.BindValueChanged(e => { updateValues(); }, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateValues()
|
||||||
|
{
|
||||||
|
starRatingValue.Value = adjustedInfo.Value.StarRating;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Extensions.LocalisationExtensions;
|
using osu.Framework.Extensions.LocalisationExtensions;
|
||||||
@ -12,14 +13,13 @@ using osu.Framework.Localisation;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Screens.Select.Details;
|
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Mods
|
namespace osu.Game.Overlays.Mods
|
||||||
{
|
{
|
||||||
public partial class ModMapInfoDisplay : Container, IHasCurrentValue<MapStats>
|
public partial class ModMapInfoDisplay : Container, IHasCurrentValue<double>
|
||||||
{
|
{
|
||||||
public const float HEIGHT = 42;
|
public const float HEIGHT = 42;
|
||||||
private const float transition_duration = 200;
|
private const float transition_duration = 200;
|
||||||
@ -28,36 +28,40 @@ namespace osu.Game.Overlays.Mods
|
|||||||
private readonly Box labelBackground;
|
private readonly Box labelBackground;
|
||||||
private readonly FillFlowContainer content;
|
private readonly FillFlowContainer content;
|
||||||
|
|
||||||
public Bindable<MapStats> Current
|
//public Bindable<double> Current
|
||||||
{
|
//{
|
||||||
get => current.Current;
|
// get => current.Current;
|
||||||
set => current.Current = value;
|
// set => current.Current = value;
|
||||||
}
|
//}
|
||||||
private readonly BindableWithCurrent<MapStats> current = new BindableWithCurrent<MapStats>();
|
//private readonly BindableWithCurrent<double> current = new BindableWithCurrent<double>();
|
||||||
|
|
||||||
[Resolved]
|
public Bindable<double> Current { get; set; } = new BindableWithCurrent<double>();
|
||||||
private OsuColour colours { get; set; } = null!;
|
|
||||||
|
//[Resolved]
|
||||||
|
//private OsuColour colours { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private OverlayColourProvider colourProvider { get; set; } = null!;
|
private OverlayColourProvider colourProvider { get; set; } = null!;
|
||||||
|
|
||||||
|
protected Func<double, osuTK.Graphics.Color4> GetColor;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Text to display in the left area of the display.
|
/// Text to display in the left area of the display.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
//protected abstract LocalisableString Label { get; }
|
protected LocalisableString Label;
|
||||||
protected LocalisableString Label => CommonStrings.Finish;
|
|
||||||
//protected string Label { get; }
|
|
||||||
|
|
||||||
protected virtual float ValueAreaWidth => 56;
|
protected virtual float ValueAreaWidth => 56;
|
||||||
|
|
||||||
protected virtual string CounterFormat => @"N0";
|
protected virtual string CounterFormat => @"0.00";
|
||||||
|
|
||||||
protected override Container<Drawable> Content => content;
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
protected readonly RollingCounter<double> Counter;
|
protected readonly RollingCounter<double> Counter;
|
||||||
|
|
||||||
public ModMapInfoDisplay()
|
public ModMapInfoDisplay(LocalisableString label, Func<double, osuTK.Graphics.Color4> colorFunc)
|
||||||
{
|
{
|
||||||
|
Label = label;
|
||||||
|
GetColor = colorFunc;
|
||||||
Height = HEIGHT;
|
Height = HEIGHT;
|
||||||
AutoSizeAxes = Axes.X;
|
AutoSizeAxes = Axes.X;
|
||||||
|
|
||||||
@ -125,7 +129,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
Origin = Anchor.CentreLeft,
|
Origin = Anchor.CentreLeft,
|
||||||
Current = { BindTarget = Current.Value.StarRating }
|
Current = { BindTarget = Current }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -146,39 +150,17 @@ namespace osu.Game.Overlays.Mods
|
|||||||
Current.BindValueChanged(e =>
|
Current.BindValueChanged(e =>
|
||||||
{
|
{
|
||||||
//var effect = CalculateEffectForComparison(e.NewValue.CompareTo(Current.Default));
|
//var effect = CalculateEffectForComparison(e.NewValue.CompareTo(Current.Default));
|
||||||
setColours(e.NewValue.StarRating.Value);
|
setColours(e.NewValue);
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fades colours of text and its background according to displayed value.
|
/// Fades colours of text and its background according to displayed value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="stars">random number.</param>
|
/// <param name="value">value</param>
|
||||||
private void setColours(double stars)
|
private void setColours(double value)
|
||||||
{
|
{
|
||||||
contentBackground.FadeColour(colours.ForStarDifficulty(stars), transition_duration, Easing.OutQuint);
|
contentBackground.FadeColour(GetColor(value), transition_duration, Easing.OutQuint);
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts signed integer into <see cref="ModEffect"/>. Negative values are counted as difficulty reduction, positive as increase.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="comparison">Value to convert. Will arrive from comparison between <see cref="Current"/> bindable once it changes and it's <see cref="Bindable{T}.Default"/>.</param>
|
|
||||||
/// <returns>Effect of the value.</returns>
|
|
||||||
protected virtual ModEffect CalculateEffectForComparison(int comparison)
|
|
||||||
{
|
|
||||||
if (comparison == 0)
|
|
||||||
return ModEffect.NotChanged;
|
|
||||||
if (comparison < 0)
|
|
||||||
return ModEffect.DifficultyReduction;
|
|
||||||
|
|
||||||
return ModEffect.DifficultyIncrease;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected enum ModEffect
|
|
||||||
{
|
|
||||||
NotChanged,
|
|
||||||
DifficultyReduction,
|
|
||||||
DifficultyIncrease
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private partial class EffectCounter : RollingCounter<double>
|
private partial class EffectCounter : RollingCounter<double>
|
||||||
|
@ -25,9 +25,9 @@ using osu.Game.Graphics.UserInterface;
|
|||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Screens.Select.Details;
|
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
using osuTK.Graphics;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Mods
|
namespace osu.Game.Overlays.Mods
|
||||||
@ -124,7 +124,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
private Container aboveColumnsContent = null!;
|
private Container aboveColumnsContent = null!;
|
||||||
private DifficultyMultiplierDisplay? multiplierDisplay;
|
private DifficultyMultiplierDisplay? multiplierDisplay;
|
||||||
private ModMapInfoDisplay mapInfoDisplay = null!;
|
|
||||||
|
private ModMapInfoContainer mapInfoContainer = null!;
|
||||||
|
|
||||||
protected ShearedButton BackButton { get; private set; } = null!;
|
protected ShearedButton BackButton { get; private set; } = null!;
|
||||||
protected ShearedToggleButton? CustomisationButton { get; private set; }
|
protected ShearedToggleButton? CustomisationButton { get; private set; }
|
||||||
@ -221,7 +222,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
aboveColumnsContent.Add(mapInfoDisplay = new ModMapInfoDisplay
|
aboveColumnsContent.Add(mapInfoContainer = new ModMapInfoContainer
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopLeft,
|
Anchor = Anchor.TopLeft,
|
||||||
Origin = Anchor.TopLeft
|
Origin = Anchor.TopLeft
|
||||||
@ -251,11 +252,6 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
globalAvailableMods.BindTo(game.AvailableMods);
|
globalAvailableMods.BindTo(game.AvailableMods);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetBindedMapStats(Bindable<MapStats> stats)
|
|
||||||
{
|
|
||||||
mapInfoDisplay.Current = stats;
|
|
||||||
}
|
|
||||||
public override void Hide()
|
public override void Hide()
|
||||||
{
|
{
|
||||||
base.Hide();
|
base.Hide();
|
||||||
@ -282,6 +278,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
SelectedMods.BindValueChanged(_ =>
|
SelectedMods.BindValueChanged(_ =>
|
||||||
{
|
{
|
||||||
|
updateMapInfo();
|
||||||
updateMultiplier();
|
updateMultiplier();
|
||||||
updateFromExternalSelection();
|
updateFromExternalSelection();
|
||||||
updateCustomisation();
|
updateCustomisation();
|
||||||
@ -413,8 +410,10 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
private void updateMapInfo()
|
private void updateMapInfo()
|
||||||
{
|
{
|
||||||
if (mapInfoDisplay == null)
|
if (mapInfoContainer == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
//mapInfoDisplay.Current.Value = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateCustomisation()
|
private void updateCustomisation()
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
@ -30,6 +31,9 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
public readonly BeatmapDetails Details;
|
public readonly BeatmapDetails Details;
|
||||||
|
|
||||||
|
//[Cached]
|
||||||
|
//public Bindable<BeatmapInfo> AdjustedInfo { get; private set; } = new Bindable<BeatmapInfo>();
|
||||||
|
|
||||||
protected Bindable<BeatmapDetailAreaTabItem> CurrentTab => tabControl.Current;
|
protected Bindable<BeatmapDetailAreaTabItem> CurrentTab => tabControl.Current;
|
||||||
|
|
||||||
protected Bindable<bool> CurrentModsFilter => tabControl.CurrentModsFilter;
|
protected Bindable<bool> CurrentModsFilter => tabControl.CurrentModsFilter;
|
||||||
|
@ -274,11 +274,6 @@ namespace osu.Game.Screens.Select
|
|||||||
loading.Hide();
|
loading.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bindable<MapStats> GetBindedAdjustedMapStats()
|
|
||||||
{
|
|
||||||
return advanced.AdjustedMapStats.GetBoundCopy();
|
|
||||||
}
|
|
||||||
|
|
||||||
private partial class DetailBox : Container
|
private partial class DetailBox : Container
|
||||||
{
|
{
|
||||||
private readonly Container content;
|
private readonly Container content;
|
||||||
|
@ -46,6 +46,11 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
|
|
||||||
private IBeatmapInfo beatmapInfo;
|
private IBeatmapInfo beatmapInfo;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
[Resolved]
|
||||||
|
private Bindable<BeatmapInfo>? adjustedInfo { get; set; } = null;
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
public IBeatmapInfo BeatmapInfo
|
public IBeatmapInfo BeatmapInfo
|
||||||
{
|
{
|
||||||
get => beatmapInfo;
|
get => beatmapInfo;
|
||||||
@ -99,6 +104,21 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
private ModSettingChangeTracker modSettingChangeTracker;
|
private ModSettingChangeTracker modSettingChangeTracker;
|
||||||
private ScheduledDelegate debouncedStatisticsUpdate;
|
private ScheduledDelegate debouncedStatisticsUpdate;
|
||||||
|
|
||||||
|
private void updateBindedInfo()
|
||||||
|
{
|
||||||
|
if (adjustedInfo == null) return;
|
||||||
|
|
||||||
|
BeatmapInfo adjusted = (BeatmapInfo)beatmapInfo;
|
||||||
|
adjusted.Difficulty.CircleSize = FirstValue.Value.adjustedValue ?? 0;
|
||||||
|
adjusted.Difficulty.DrainRate = HpDrain.Value.adjustedValue ?? 0;
|
||||||
|
adjusted.Difficulty.ApproachRate = ApproachRate.Value.adjustedValue ?? 5;
|
||||||
|
adjusted.Difficulty.OverallDifficulty = Accuracy.Value.adjustedValue ?? 0;
|
||||||
|
adjusted.StarRating = starDifficulty.Value.adjustedValue ?? 0;
|
||||||
|
|
||||||
|
adjustedInfo.Value = adjusted;
|
||||||
|
adjustedInfo.TriggerChange();
|
||||||
|
}
|
||||||
|
|
||||||
private void modsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
|
private void modsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
|
||||||
{
|
{
|
||||||
modSettingChangeTracker?.Dispose();
|
modSettingChangeTracker?.Dispose();
|
||||||
@ -113,8 +133,6 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
updateStatistics();
|
updateStatistics();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bindable<MapStats> AdjustedMapStats = new Bindable<MapStats>();
|
|
||||||
|
|
||||||
private void updateStatistics()
|
private void updateStatistics()
|
||||||
{
|
{
|
||||||
IBeatmapDifficultyInfo baseDifficulty = BeatmapInfo?.Difficulty;
|
IBeatmapDifficultyInfo baseDifficulty = BeatmapInfo?.Difficulty;
|
||||||
@ -149,13 +167,6 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
|
|
||||||
updateStarDifficulty();
|
updateStarDifficulty();
|
||||||
|
|
||||||
var temp = AdjustedMapStats.Value;
|
|
||||||
temp.CS.Value = FirstValue.Value.adjustedValue ?? 0;
|
|
||||||
temp.HP.Value = HpDrain.Value.adjustedValue ?? 0;
|
|
||||||
temp.OD.Value = Accuracy.Value.adjustedValue ?? 0;
|
|
||||||
temp.AR.Value = ApproachRate.Value.adjustedValue ?? 5;
|
|
||||||
AdjustedMapStats.Value = temp;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private CancellationTokenSource starDifficultyCancellationSource;
|
private CancellationTokenSource starDifficultyCancellationSource;
|
||||||
@ -188,10 +199,7 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
starDifficulty.Value = ((float)normalDifficulty.Value.Stars, (float)moddedDifficulty.Value.Stars);
|
starDifficulty.Value = ((float)normalDifficulty.Value.Stars, (float)moddedDifficulty.Value.Stars);
|
||||||
|
updateBindedInfo();
|
||||||
var temp = AdjustedMapStats.Value;
|
|
||||||
temp.StarRating.Value = moddedDifficulty.Value.Stars;
|
|
||||||
AdjustedMapStats.Value = temp;
|
|
||||||
|
|
||||||
}), starDifficultyCancellationSource.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current);
|
}), starDifficultyCancellationSource.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Current);
|
||||||
});
|
});
|
||||||
@ -311,10 +319,4 @@ namespace osu.Game.Screens.Select.Details
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public struct MapStats
|
|
||||||
{
|
|
||||||
public Bindable<double> StarRating;
|
|
||||||
public Bindable<double> MinBPM, MaxBPM, AvgBPM;
|
|
||||||
public Bindable<float> CS, HP, AR, OD;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -99,6 +99,9 @@ namespace osu.Game.Screens.Select
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private Bindable<IReadOnlyList<Mod>> selectedMods { get; set; } = null!;
|
private Bindable<IReadOnlyList<Mod>> selectedMods { get; set; } = null!;
|
||||||
|
|
||||||
|
[Cached]
|
||||||
|
private Bindable<BeatmapInfo> adjustedInfo { get; set; } = new Bindable<BeatmapInfo>();
|
||||||
|
|
||||||
protected BeatmapCarousel Carousel { get; private set; } = null!;
|
protected BeatmapCarousel Carousel { get; private set; } = null!;
|
||||||
|
|
||||||
private ParallaxContainer wedgeBackground = null!;
|
private ParallaxContainer wedgeBackground = null!;
|
||||||
@ -305,8 +308,8 @@ namespace osu.Game.Screens.Select
|
|||||||
// therein it will be registered at the `OsuGame` level to properly function as a blocking overlay.
|
// therein it will be registered at the `OsuGame` level to properly function as a blocking overlay.
|
||||||
LoadComponent(ModSelect = CreateModSelectOverlay());
|
LoadComponent(ModSelect = CreateModSelectOverlay());
|
||||||
|
|
||||||
var bindedStats = BeatmapDetails.Details.GetBindedAdjustedMapStats();
|
//var bindedStats = BeatmapDetails.Details.GetBindedAdjustedMapStats();
|
||||||
ModSelect.SetBindedMapStats(bindedStats);
|
//ModSelect.SetBindedMapStats(bindedStats);
|
||||||
|
|
||||||
if (Footer != null)
|
if (Footer != null)
|
||||||
{
|
{
|
||||||
@ -583,6 +586,7 @@ namespace osu.Game.Screens.Select
|
|||||||
FilterControl.Activate();
|
FilterControl.Activate();
|
||||||
|
|
||||||
ModSelect.SelectedMods.BindTo(selectedMods);
|
ModSelect.SelectedMods.BindTo(selectedMods);
|
||||||
|
//BeatmapDetails.AdjustedInfo.BindTo(adjustedInfo);
|
||||||
|
|
||||||
beginLooping();
|
beginLooping();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user