19 Commits

Author SHA1 Message Date
b6f845d99c slightly change score panels and mod icons 2025-12-13 02:41:05 +03:00
a1d6bda63e hide online status if no map is actually selected (ssv1/v2) 2025-12-12 00:06:05 +03:00
547d22a4b5 update some URLs to match instance, fix potential mp crash 2025-12-11 23:57:01 +03:00
b4c530ac04 add a very safe check for IApplicableFailExit mods 2025-12-09 23:59:35 +03:00
5af05d2479 show a message if we successfully migrate db to new place 2025-12-09 23:52:57 +03:00
43ab18ffea hide quit+replay button in most cases where replay can't be saved 2025-12-09 23:15:25 +03:00
9f59259a40 update volume meter design a bit more 2025-12-09 22:45:15 +03:00
82b3015fcc and again? 2025-12-09 21:35:24 +03:00
68f92ab57c messed things up again 2025-12-09 20:24:09 +03:00
d76d4d9a35 okay, i messed things up 2025-12-09 20:20:07 +03:00
Bartłomiej Dach
bb7417c099 Filter out more exceptions from being sent to sentry
More or less covers the first page of client sentry issues sorted by
volume, all of which is pretty much useless for anything because it's
client-specific-failure noise.
2025-12-09 20:19:16 +03:00
Dan Balasescu
066e093987 Adjust vote-to-skip to be explicit about states 2025-12-09 20:19:16 +03:00
Dan Balasescu
56e0c3e65d Fix potentially unsafe quick play event handling 2025-12-09 20:19:16 +03:00
Natelytle
89d7726903 Rank swap mod 2025-12-09 20:19:16 +03:00
Dan Balasescu
36f1bfef07 Fix incorrect quick play download progress 2025-12-09 20:19:15 +03:00
Dan Balasescu
118f07878a Allow score panel to animate 2025-12-09 20:19:15 +03:00
Dan Balasescu
e144968893 Remove quick play round results scroll animation 2025-12-09 20:19:15 +03:00
Dan Balasescu
d2ffea41c6 Consider abandon time for user placements 2025-12-09 20:19:15 +03:00
Dan Balasescu
a8be9b1381 Make quick play chat retain focus after posting 2025-12-09 20:19:15 +03:00
17 changed files with 88 additions and 63 deletions

View File

@@ -257,7 +257,11 @@ namespace osu.Game.Rulesets.Osu
public override string ShortName => SHORT_NAME;
#if !DEBUG
public override string PlayingVerb => "Clicking circles";
#else
public override string PlayingVerb => "Debugging circles";
#endif
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.");
}
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
// in the lazer. straight up "migrating it". and by "it", haha, well. let's just say. My realm .
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))
{
using (var previous = storage.GetStream(altFilename))
@@ -222,6 +222,7 @@ namespace osu.Game.Database
{
Logger.Log($@"Migrating production build DB: {altFilename} -> {Filename}");
previous.CopyTo(current);
Logger.Log("Sucessfully migrated local database!", level: LogLevel.Important);
}
}
#endif

View File

@@ -124,10 +124,10 @@ namespace osu.Game.Graphics.Backgrounds
api.PerformAsync(request);
}
public SeasonalBackground LoadNextBackground()
public Background LoadNextBackground()
{
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;
currentBackgroundIndex = (currentBackgroundIndex + 1) % backgrounds.Count;

View File

@@ -438,7 +438,9 @@ namespace osu.Game.Overlays.Mods
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)
{

View File

@@ -15,7 +15,7 @@ namespace osu.Game.Overlays.Profile.Sections.Recent
private readonly string slug;
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)
{

View File

@@ -256,18 +256,15 @@ namespace osu.Game.Overlays.Volume
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)
{
text.Text = "100";
maxGlow.EffectColour = meterColour.Opacity(2f);
}
maxGlow.EffectColour = meterColour.Opacity(5f);
else if (displayVolume < 0.01f)
maxGlow.EffectColour = meterColour.Opacity(0f);
else
{
maxGlow.EffectColour = Color4.Transparent;
text.Text = intValue.ToString(CultureInfo.CurrentCulture);
}
maxGlow.EffectColour = meterColour.Opacity((float)displayVolume * 3f + 1f);
volumeCircle.Progress = displayVolume * 0.75f;
volumeCircleGlow.Progress = displayVolume * 0.75f;

View File

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

View File

@@ -91,11 +91,12 @@ namespace osu.Game.Rulesets.UI
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Shadow = false,
Font = OsuFont.Numeric.With(size: 24, weight: FontWeight.Black),
Font = OsuFont.TorusAlternate.With(size: 36, weight: FontWeight.Bold),
Text = mod.Acronym,
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.Sprites;
using osu.Game.Graphics.UserInterface;
using osu.Game.Graphics.UserInterfaceV2;
using osu.Game.Input.Bindings;
using osuTK;
using osuTK.Graphics;
using osu.Game.Localisation;
using osu.Game.Resources.Localisation.Web;
using osu.Game.Utils;
using System.Runtime.InteropServices;
namespace osu.Game.Screens.Play
{
@@ -73,8 +71,6 @@ namespace osu.Game.Screens.Play
[Resolved]
private GlobalActionContainer globalAction { get; set; } = null!;
private ShearedButton saveReplay { get; set; } = null!;
protected GameplayMenuOverlay()
{
RelativeSizeAxes = Axes.Both;
@@ -124,15 +120,20 @@ namespace osu.Game.Screens.Play
Radius = 50
},
},
saveReplay = new ShearedButton
// XXX: I have mixed feelings about this, but it works at least
(OnQuitReplay != null)
? new ShearedButton
{
Text = "Quit and save replay",
Origin = Anchor.TopCentre,
Anchor = Anchor.TopCentre,
Height = 32,
Colour = colours.PurpleLight,
// Visibility = false
},
Action = () => OnQuitReplay.Invoke()
}
: [],
playInfoText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.GetFont(size: 18))
{
Origin = Anchor.TopCentre,
@@ -153,12 +154,6 @@ namespace osu.Game.Screens.Play
if (OnQuit != null)
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();
updateInfoText();

View File

@@ -519,7 +519,7 @@ namespace osu.Game.Screens.Play
Retries = RestartCount,
OnRetry = () => Restart(),
OnQuit = () => PerformExitWithConfirmation(),
OnQuitReplay = () => PerformExitReplay()
OnQuitReplay = (this is not SoloPlayer) ? null : PerformExitReplay
},
},
};
@@ -998,13 +998,10 @@ namespace osu.Game.Screens.Play
PauseOverlay.Hide();
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)
{
// game.AttemptExit();
game.Exit();
}
game.Exit(); // we're done here
bool restartOnFail = GameplayState.Mods.OfType<IApplicableFailOverride>().Any(m => m.RestartOnFail);
if (!restartOnFail)

View File

@@ -122,9 +122,9 @@ namespace osu.Game.Screens.Ranking.Expanded
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 },
Alpha = 0,
AlwaysPresent = true

View File

@@ -1,17 +1,23 @@
// 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.
#nullable disable
#nullable enable
using System.Globalization;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Audio;
using osu.Framework.Localisation;
using osu.Game.Configuration;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
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 osuTK;
@@ -30,43 +36,65 @@ namespace osu.Game.Screens.Ranking.Expanded
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 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
AutoSizeAxes = Axes.Y;
RelativeSizeAxes = Axes.X;
this.playSamples = playSamples;
this.score = score ?? new ScoreInfo();
}
[BackgroundDependencyLoader]
private void load(AudioManager audio)
private void load(AudioManager audio, OsuConfigManager? config)
{
AddInternal(sampleTick = new DrawableSample(audio.Samples.Get(@"Results/score-tick-lesser")));
scoringMode.BindTo(
config?.GetBindable<ScoringMode>(OsuSetting.ScoreDisplayMode)
);
}
protected override void LoadComplete()
{
base.LoadComplete();
scoringMode.BindValueChanged(_ => updateWireframe(), true);
if (playSamples)
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;
s.Origin = Anchor.TopCentre;
string getWireframe(long sc) => (sc >= 100000)
? FormatCount(sc).ToString()
: "###.###";
s.Font = OsuFont.Torus.With(size: 60, weight: FontWeight.Light, fixedWidth: true);
s.Spacing = new Vector2(-5, 0);
});
long dispScore = Scoring.Legacy.ScoreInfoExtensions.GetDisplayScore(score, mode);
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
{

View File

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

View File

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

View File

@@ -9,7 +9,7 @@ namespace osu.Game.Users
{
public string Name { 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; }
}
}

View File

@@ -35,7 +35,6 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Realm" Version="20.1.0" />
<PackageReference Include="ppy.osu.Framework" Version="2025.1205.1" />
<PackageReference Include="ppy.osu.Framework" Version="2025.1209.0" />
<PackageReference Include="jvnkosu.Resources" Version="2025.1119.0" />
<PackageReference Include="Sentry" Version="5.1.1" />