7 Commits

16 changed files with 88 additions and 62 deletions

View File

@@ -257,7 +257,11 @@ namespace osu.Game.Rulesets.Osu
public override string ShortName => SHORT_NAME; public override string ShortName => SHORT_NAME;
#if !DEBUG
public override string PlayingVerb => "Clicking circles"; public override string PlayingVerb => "Clicking circles";
#else
public override string PlayingVerb => "Debugging circles";
#endif
public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this); public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this);

View File

@@ -107,7 +107,7 @@ namespace osu.Game.Audio
Logger.Log($"A {nameof(PreviewTrack)} was created without a containing {nameof(IPreviewTrackOwner)}. An owner should be added for correct behaviour."); Logger.Log($"A {nameof(PreviewTrack)} was created without a containing {nameof(IPreviewTrackOwner)}. An owner should be added for correct behaviour.");
} }
protected override Track GetTrack() => trackManager.Get($"https://b.ppy.sh/preview/{beatmapSetInfo.OnlineID}.mp3"); protected override Track GetTrack() => trackManager.Get($"https://osu.jvnko.boats/uploads/preview/{beatmapSetInfo.OnlineID}.mp3");
} }
} }
} }

View File

@@ -214,7 +214,7 @@ namespace osu.Game.Database
#if !DEBUG #if !DEBUG
// in the lazer. straight up "migrating it". and by "it", haha, well. let's just say. My realm . // in the lazer. straight up "migrating it". and by "it", haha, well. let's just say. My realm .
string altFilename = filename; string altFilename = filename;
applyFilenameSchemaSuffix(ref altFilename); // it also migrates older versions automagically! (sorry, I only used that word for irony...) applyFilenameSchemaSuffix(ref altFilename);
if (storage.Exists(altFilename) && !storage.Exists(Filename)) if (storage.Exists(altFilename) && !storage.Exists(Filename))
{ {
using (var previous = storage.GetStream(altFilename)) using (var previous = storage.GetStream(altFilename))
@@ -222,6 +222,7 @@ namespace osu.Game.Database
{ {
Logger.Log($@"Migrating production build DB: {altFilename} -> {Filename}"); Logger.Log($@"Migrating production build DB: {altFilename} -> {Filename}");
previous.CopyTo(current); previous.CopyTo(current);
Logger.Log("Sucessfully migrated local database!", level: LogLevel.Important);
} }
} }
#endif #endif

View File

@@ -124,10 +124,10 @@ namespace osu.Game.Graphics.Backgrounds
api.PerformAsync(request); api.PerformAsync(request);
} }
public SeasonalBackground LoadNextBackground() public Background LoadNextBackground()
{ {
if (!shouldShowCustomBackgrounds || !shouldFetchCustomBackgrounds || currentBackgrounds.Value?.Backgrounds?.Any() != true) if (!shouldShowCustomBackgrounds || !shouldFetchCustomBackgrounds || currentBackgrounds.Value?.Backgrounds?.Any() != true)
return (SeasonalBackground)(new Background($@"Menu/menu-background-{RNG.Next(1, 9)}")); return new Background($@"Menu/menu-background-{RNG.Next(1, 9)}");
var backgrounds = currentBackgrounds.Value.Backgrounds; var backgrounds = currentBackgrounds.Value.Backgrounds;
currentBackgroundIndex = (currentBackgroundIndex + 1) % backgrounds.Count; currentBackgroundIndex = (currentBackgroundIndex + 1) % backgrounds.Count;

View File

@@ -438,7 +438,9 @@ namespace osu.Game.Overlays.Mods
foreach (var modState in AllAvailableMods) foreach (var modState in AllAvailableMods)
{ {
var matchingSelectedMod = SelectedMods.Value.SingleOrDefault(selected => selected.GetType() == modState.Mod.GetType()); // BUG: when trying to switch ruleset in a multiplayer room this was previously throwing an InvalidOperationException.
// If it still throws, then I guess it's not good
var matchingSelectedMod = SelectedMods.Value.FirstOrDefault(selected => selected.GetType() == modState.Mod.GetType());
if (matchingSelectedMod != null) if (matchingSelectedMod != null)
{ {

View File

@@ -15,7 +15,7 @@ namespace osu.Game.Overlays.Profile.Sections.Recent
private readonly string slug; private readonly string slug;
private readonly Sprite sprite; private readonly Sprite sprite;
private string url => $@"https://s.ppy.sh/images/medals-client/{slug}@2x.png"; private string url => $@"https://osu.jvnko.boats/images/medals-client/{slug}@2x.png";
public MedalIcon(string slug) public MedalIcon(string slug)
{ {

View File

@@ -256,18 +256,15 @@ namespace osu.Game.Overlays.Volume
displayVolumeInt = intValue; displayVolumeInt = intValue;
text.WireframeTemplate = new string('#', intValue.ToString().Length); text.WireframeTemplate = new string('#', intValue.ToString(CultureInfo.CurrentCulture).Length);
text.Text = intValue.ToString(CultureInfo.CurrentCulture);
if (displayVolume >= 0.995f) if (displayVolume >= 0.995f)
{ maxGlow.EffectColour = meterColour.Opacity(5f);
text.Text = "100"; else if (displayVolume < 0.01f)
maxGlow.EffectColour = meterColour.Opacity(2f); maxGlow.EffectColour = meterColour.Opacity(0f);
}
else else
{ maxGlow.EffectColour = meterColour.Opacity((float)displayVolume * 3f + 1f);
maxGlow.EffectColour = Color4.Transparent;
text.Text = intValue.ToString(CultureInfo.CurrentCulture);
}
volumeCircle.Progress = displayVolume * 0.75f; volumeCircle.Progress = displayVolume * 0.75f;
volumeCircleGlow.Progress = displayVolume * 0.75f; volumeCircleGlow.Progress = displayVolume * 0.75f;

View File

@@ -159,8 +159,9 @@ namespace osu.Game.Rulesets.UI
Origin = Anchor.Centre, Origin = Anchor.Centre,
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Alpha = 0, Alpha = 0,
Font = OsuFont.Numeric.With(size: 22f, weight: FontWeight.Black), Font = OsuFont.TorusAlternate.With(size: 36, weight: FontWeight.SemiBold),
UseFullGlyphHeight = false, Margin = new MarginPadding { Bottom = 5 },
UseFullGlyphHeight = true,
Text = mod.Acronym Text = mod.Acronym
}, },
modIcon = new SpriteIcon modIcon = new SpriteIcon

View File

@@ -91,11 +91,12 @@ namespace osu.Game.Rulesets.UI
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Shadow = false, Shadow = false,
Font = OsuFont.Numeric.With(size: 24, weight: FontWeight.Black), Font = OsuFont.TorusAlternate.With(size: 36, weight: FontWeight.Bold),
Text = mod.Acronym, Text = mod.Acronym,
Margin = new MarginPadding Margin = new MarginPadding
{ {
Top = 4 Top = 3,
Bottom = 6
} }
}, },
}, },

View File

@@ -18,14 +18,12 @@ using osu.Game.Graphics;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
using osu.Game.Graphics.UserInterfaceV2;
using osu.Game.Input.Bindings; using osu.Game.Input.Bindings;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
using osu.Game.Localisation; using osu.Game.Localisation;
using osu.Game.Resources.Localisation.Web; using osu.Game.Resources.Localisation.Web;
using osu.Game.Utils; using osu.Game.Utils;
using System.Runtime.InteropServices;
namespace osu.Game.Screens.Play namespace osu.Game.Screens.Play
{ {
@@ -73,8 +71,6 @@ namespace osu.Game.Screens.Play
[Resolved] [Resolved]
private GlobalActionContainer globalAction { get; set; } = null!; private GlobalActionContainer globalAction { get; set; } = null!;
private ShearedButton saveReplay { get; set; } = null!;
protected GameplayMenuOverlay() protected GameplayMenuOverlay()
{ {
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
@@ -124,15 +120,20 @@ namespace osu.Game.Screens.Play
Radius = 50 Radius = 50
}, },
}, },
saveReplay = new ShearedButton
{ // XXX: I have mixed feelings about this, but it works at least
Text = "Quit and save replay", (OnQuitReplay != null)
Origin = Anchor.TopCentre, ? new ShearedButton
Anchor = Anchor.TopCentre, {
Height = 32, Text = "Quit and save replay",
Colour = colours.PurpleLight, Origin = Anchor.TopCentre,
// Visibility = false Anchor = Anchor.TopCentre,
}, Height = 32,
Colour = colours.PurpleLight,
Action = () => OnQuitReplay.Invoke()
}
: [],
playInfoText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.GetFont(size: 18)) playInfoText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.GetFont(size: 18))
{ {
Origin = Anchor.TopCentre, Origin = Anchor.TopCentre,
@@ -153,12 +154,6 @@ namespace osu.Game.Screens.Play
if (OnQuit != null) if (OnQuit != null)
AddButton(GameplayMenuOverlayStrings.Quit, new Color4(170, 27, 39, 255), () => OnQuit.Invoke()); AddButton(GameplayMenuOverlayStrings.Quit, new Color4(170, 27, 39, 255), () => OnQuit.Invoke());
if (OnQuitReplay != null)
{
// saveReplay.Visibility = true;
saveReplay.Action = () => OnQuitReplay.Invoke();
}
State.ValueChanged += _ => InternalButtons.Deselect(); State.ValueChanged += _ => InternalButtons.Deselect();
updateInfoText(); updateInfoText();

View File

@@ -519,7 +519,7 @@ namespace osu.Game.Screens.Play
Retries = RestartCount, Retries = RestartCount,
OnRetry = () => Restart(), OnRetry = () => Restart(),
OnQuit = () => PerformExitWithConfirmation(), OnQuit = () => PerformExitWithConfirmation(),
OnQuitReplay = () => PerformExitReplay() OnQuitReplay = (this is not SoloPlayer) ? null : PerformExitReplay
}, },
}, },
}; };
@@ -998,13 +998,10 @@ namespace osu.Game.Screens.Play
PauseOverlay.Hide(); PauseOverlay.Hide();
bool exitOnFail = GameplayState.Mods.OfType<IApplicableFailExit>().Any(m => m.ExitOnFail) bool exitOnFail = GameplayState.Mods.OfType<IApplicableFailExit>().Any(m => m.ExitOnFail)
&& Score.ScoreInfo.User.Username == config.Get<string>(OsuSetting.Username); // TODO: do more concrete checks && Score.ScoreInfo.User.Username == config.Get<string>(OsuSetting.Username)
&& this is SoloPlayer;
if (exitOnFail) if (exitOnFail)
{ game.Exit(); // we're done here
// game.AttemptExit();
game.Exit();
}
bool restartOnFail = GameplayState.Mods.OfType<IApplicableFailOverride>().Any(m => m.RestartOnFail); bool restartOnFail = GameplayState.Mods.OfType<IApplicableFailOverride>().Any(m => m.RestartOnFail);
if (!restartOnFail) if (!restartOnFail)

View File

@@ -122,9 +122,9 @@ namespace osu.Game.Screens.Ranking.Expanded
FillMode = FillMode.Fit, FillMode = FillMode.Fit,
} }
}, },
scoreCounter = new TotalScoreCounter(!withFlair) scoreCounter = new TotalScoreCounter(!withFlair, score)
{ {
Margin = new MarginPadding { Top = 0, Bottom = 5 }, Margin = new MarginPadding { Top = 10, Bottom = 5 },
Current = { Value = 0 }, Current = { Value = 0 },
Alpha = 0, Alpha = 0,
AlwaysPresent = true AlwaysPresent = true

View File

@@ -1,17 +1,23 @@
// 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.
#nullable disable #nullable enable
using System.Globalization;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Audio; using osu.Framework.Audio;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Audio; using osu.Framework.Graphics.Audio;
using osu.Framework.Localisation; using osu.Framework.Localisation;
using osu.Game.Configuration;
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.Rulesets.Scoring;
using osu.Game.Scoring;
using osu.Game.Scoring.Legacy;
using osu.Game.Screens.Play.HUD;
using osu.Game.Screens.Ranking.Expanded.Accuracy; using osu.Game.Screens.Ranking.Expanded.Accuracy;
using osuTK; using osuTK;
@@ -30,43 +36,65 @@ namespace osu.Game.Screens.Ranking.Expanded
private readonly Bindable<double> tickPlaybackRate = new Bindable<double>(); private readonly Bindable<double> tickPlaybackRate = new Bindable<double>();
private ScoreInfo score;
private Bindable<ScoringMode> scoringMode = new Bindable<ScoringMode>(ScoringMode.Standardised);
private ScoringMode mode => scoringMode.Value;
private double lastSampleTime; private double lastSampleTime;
private DrawableSample sampleTick; private DrawableSample sampleTick = null!;
private ArgonCounterTextComponent counter = null!;
public TotalScoreCounter(bool playSamples = false) public TotalScoreCounter(bool playSamples = false, ScoreInfo? score = null)
{ {
// Todo: AutoSize X removed here due to https://github.com/ppy/osu-framework/issues/3369 // Todo: AutoSize X removed here due to https://github.com/ppy/osu-framework/issues/3369
AutoSizeAxes = Axes.Y; AutoSizeAxes = Axes.Y;
RelativeSizeAxes = Axes.X; RelativeSizeAxes = Axes.X;
this.playSamples = playSamples; this.playSamples = playSamples;
this.score = score ?? new ScoreInfo();
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(AudioManager audio) private void load(AudioManager audio, OsuConfigManager? config)
{ {
AddInternal(sampleTick = new DrawableSample(audio.Samples.Get(@"Results/score-tick-lesser"))); AddInternal(sampleTick = new DrawableSample(audio.Samples.Get(@"Results/score-tick-lesser")));
scoringMode.BindTo(
config?.GetBindable<ScoringMode>(OsuSetting.ScoreDisplayMode)
);
} }
protected override void LoadComplete() protected override void LoadComplete()
{ {
base.LoadComplete(); base.LoadComplete();
scoringMode.BindValueChanged(_ => updateWireframe(), true);
if (playSamples) if (playSamples)
Current.BindValueChanged(_ => startTicking()); Current.BindValueChanged(_ => startTicking());
} }
protected override LocalisableString FormatCount(long count) => count.ToString("N0"); protected override LocalisableString FormatCount(long count) => count.ToString("N0", CultureInfo.CreateSpecificCulture("en-US")).Replace(',', '.'); // XXX: make this look okay
protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(s => private void updateWireframe()
{ {
s.Anchor = Anchor.TopCentre; string getWireframe(long sc) => (sc >= 100000)
s.Origin = Anchor.TopCentre; ? FormatCount(sc).ToString()
: "###.###";
s.Font = OsuFont.Torus.With(size: 60, weight: FontWeight.Light, fixedWidth: true); long dispScore = Scoring.Legacy.ScoreInfoExtensions.GetDisplayScore(score, mode);
s.Spacing = new Vector2(-5, 0); counter.WireframeTemplate = getWireframe(dispScore);
}); }
protected override ArgonCounterTextComponent CreateText()
{
counter = new ArgonCounterTextComponent(Anchor.Centre);
counter.WireframeOpacity.BindTo(new BindableFloat(0.25f));
counter.WireframeTemplate = "###.###";
return counter;
}
public override long DisplayedCount public override long DisplayedCount
{ {

View File

@@ -270,7 +270,7 @@ namespace osu.Game.Screens.Select
TextSize = 11, TextSize = 11,
TextPadding = new MarginPadding { Horizontal = 8, Vertical = 2 }, TextPadding = new MarginPadding { Horizontal = 8, Vertical = 2 },
Status = beatmapInfo.Status, Status = beatmapInfo.Status,
ShowUnknownStatus = true, ShowUnknownStatus = working is not DummyWorkingBeatmap,
Alpha = string.IsNullOrEmpty(beatmapInfo.DifficultyName) ? 0 : 1 Alpha = string.IsNullOrEmpty(beatmapInfo.DifficultyName) ? 0 : 1
} }
} }

View File

@@ -105,7 +105,7 @@ namespace osu.Game.Screens.SelectV2
new ShearAligningWrapper(statusPill = new BeatmapSetOnlineStatusPill new ShearAligningWrapper(statusPill = new BeatmapSetOnlineStatusPill
{ {
Shear = -OsuGame.SHEAR, Shear = -OsuGame.SHEAR,
ShowUnknownStatus = true, ShowUnknownStatus = working is not DummyWorkingBeatmap,
TextSize = OsuFont.Style.Caption1.Size, TextSize = OsuFont.Style.Caption1.Size,
TextPadding = new MarginPadding { Horizontal = 6, Vertical = 1 }, TextPadding = new MarginPadding { Horizontal = 6, Vertical = 1 },
}), }),

View File

@@ -9,7 +9,7 @@ namespace osu.Game.Users
{ {
public string Name { get; set; } public string Name { get; set; }
public string InternalName { get; set; } public string InternalName { get; set; }
public string ImageUrl => $@"https://s.ppy.sh/images/medals-client/{InternalName}@2x.png"; public string ImageUrl => $@"https://osu.jvnko.boats/images/medals/{InternalName}@2x.png";
public string Description { get; set; } public string Description { get; set; }
} }
} }