mirror of
https://github.com/osukey/osukey.git
synced 2025-05-30 01:47:30 +09:00
Merge pull request #8311 from smoogipoo/results-screen
Implement the new results screen
This commit is contained in:
commit
156a3db57d
@ -27,6 +27,7 @@ using osu.Game.Screens;
|
|||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osu.Game.Screens.Play.PlayerSettings;
|
using osu.Game.Screens.Play.PlayerSettings;
|
||||||
|
using osu.Game.Screens.Ranking;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Game.Tests.Resources;
|
using osu.Game.Tests.Resources;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
@ -203,7 +204,7 @@ namespace osu.Game.Tests.Visual.Background
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check if the visual settings container removes user dim when suspending <see cref="Player"/> for <see cref="SoloResults"/>
|
/// Check if the visual settings container removes user dim when suspending <see cref="Player"/> for <see cref="ResultsScreen"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TransitionTest()
|
public void TransitionTest()
|
||||||
@ -335,7 +336,7 @@ namespace osu.Game.Tests.Visual.Background
|
|||||||
public bool IsBackgroundCurrent() => ((FadeAccessibleBackground)Background).IsCurrentScreen();
|
public bool IsBackgroundCurrent() => ((FadeAccessibleBackground)Background).IsCurrentScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FadeAccessibleResults : SoloResults
|
private class FadeAccessibleResults : ResultsScreen
|
||||||
{
|
{
|
||||||
public FadeAccessibleResults(ScoreInfo score)
|
public FadeAccessibleResults(ScoreInfo score)
|
||||||
: base(score)
|
: base(score)
|
||||||
|
@ -11,7 +11,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Screens.Ranking.Pages;
|
using osu.Game.Screens.Ranking;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Gameplay
|
namespace osu.Game.Tests.Visual.Gameplay
|
||||||
{
|
{
|
||||||
|
@ -1,106 +0,0 @@
|
|||||||
// 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;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Online.API;
|
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Multi.Match.Components;
|
|
||||||
using osu.Game.Screens.Multi.Ranking;
|
|
||||||
using osu.Game.Screens.Multi.Ranking.Pages;
|
|
||||||
using osu.Game.Screens.Multi.Ranking.Types;
|
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
using osu.Game.Users;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Multiplayer
|
|
||||||
{
|
|
||||||
public class TestSceneMatchResults : MultiplayerTestScene
|
|
||||||
{
|
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[]
|
|
||||||
{
|
|
||||||
typeof(MatchResults),
|
|
||||||
typeof(RoomLeaderboardPageInfo),
|
|
||||||
typeof(RoomLeaderboardPage)
|
|
||||||
};
|
|
||||||
|
|
||||||
[Resolved]
|
|
||||||
private BeatmapManager beatmaps { get; set; }
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load()
|
|
||||||
{
|
|
||||||
var beatmapInfo = beatmaps.QueryBeatmap(b => b.RulesetID == 0);
|
|
||||||
if (beatmapInfo != null)
|
|
||||||
Beatmap.Value = beatmaps.GetWorkingBeatmap(beatmapInfo);
|
|
||||||
|
|
||||||
Room.RoomID.Value = 1;
|
|
||||||
Room.Name.Value = "an awesome room";
|
|
||||||
|
|
||||||
LoadScreen(new TestMatchResults(new ScoreInfo
|
|
||||||
{
|
|
||||||
User = new User { Id = 10 },
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TestMatchResults : MatchResults
|
|
||||||
{
|
|
||||||
public TestMatchResults(ScoreInfo score)
|
|
||||||
: base(score)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override IEnumerable<IResultPageInfo> CreateResultPages() => new[] { new TestRoomLeaderboardPageInfo(Score, Beatmap.Value) };
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TestRoomLeaderboardPageInfo : RoomLeaderboardPageInfo
|
|
||||||
{
|
|
||||||
private readonly ScoreInfo score;
|
|
||||||
private readonly WorkingBeatmap beatmap;
|
|
||||||
|
|
||||||
public TestRoomLeaderboardPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
: base(score, beatmap)
|
|
||||||
{
|
|
||||||
this.score = score;
|
|
||||||
this.beatmap = beatmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override ResultsPage CreatePage() => new TestRoomLeaderboardPage(score, beatmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TestRoomLeaderboardPage : RoomLeaderboardPage
|
|
||||||
{
|
|
||||||
public TestRoomLeaderboardPage(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
: base(score, beatmap)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override MatchLeaderboard CreateLeaderboard() => new TestMatchLeaderboard();
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TestMatchLeaderboard : RoomLeaderboardPage.ResultsMatchLeaderboard
|
|
||||||
{
|
|
||||||
protected override APIRequest FetchScores(Action<IEnumerable<APIUserScoreAggregate>> scoresCallback)
|
|
||||||
{
|
|
||||||
var scores = Enumerable.Range(0, 50).Select(createRoomScore).ToArray();
|
|
||||||
|
|
||||||
scoresCallback?.Invoke(scores);
|
|
||||||
ScoresLoaded?.Invoke(scores);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private APIUserScoreAggregate createRoomScore(int id) => new APIUserScoreAggregate
|
|
||||||
{
|
|
||||||
User = new User { Id = id, Username = $"User {id}" },
|
|
||||||
Accuracy = 0.98,
|
|
||||||
TotalScore = 987654,
|
|
||||||
TotalAttempts = 13,
|
|
||||||
CompletedBeatmaps = 5
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,29 +10,27 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Osu;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens;
|
using osu.Game.Screens;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
using osu.Game.Screens.Ranking.Pages;
|
using osu.Game.Tests.Beatmaps;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Gameplay
|
namespace osu.Game.Tests.Visual.Ranking
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class TestSceneResults : ScreenTestScene
|
public class TestSceneResultsScreen : ScreenTestScene
|
||||||
{
|
{
|
||||||
private BeatmapManager beatmaps;
|
private BeatmapManager beatmaps;
|
||||||
|
|
||||||
public override IReadOnlyList<Type> RequiredTypes => new[]
|
public override IReadOnlyList<Type> RequiredTypes => new[]
|
||||||
{
|
{
|
||||||
typeof(Results),
|
typeof(ResultsScreen),
|
||||||
typeof(ResultsPage),
|
|
||||||
typeof(ScoreResultsPage),
|
|
||||||
typeof(RetryButton),
|
typeof(RetryButton),
|
||||||
typeof(ReplayDownloadButton),
|
typeof(ReplayDownloadButton),
|
||||||
typeof(LocalLeaderboardPage),
|
|
||||||
typeof(TestPlayer)
|
typeof(TestPlayer)
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -65,6 +63,7 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
{ HitResult.Meh, 50 },
|
{ HitResult.Meh, 50 },
|
||||||
{ HitResult.Miss, 1 }
|
{ HitResult.Miss, 1 }
|
||||||
},
|
},
|
||||||
|
Beatmap = new TestBeatmap(new OsuRuleset().RulesetInfo).BeatmapInfo,
|
||||||
User = new User
|
User = new User
|
||||||
{
|
{
|
||||||
Username = "peppy",
|
Username = "peppy",
|
||||||
@ -119,7 +118,7 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TestSoloResults : SoloResults
|
private class TestSoloResults : ResultsScreen
|
||||||
{
|
{
|
||||||
public HotkeyRetryOverlay RetryOverlay;
|
public HotkeyRetryOverlay RetryOverlay;
|
||||||
|
|
@ -14,9 +14,7 @@ using osu.Game.Online.API.Requests;
|
|||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens.Multi.Ranking;
|
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Multi.Play
|
namespace osu.Game.Screens.Multi.Play
|
||||||
{
|
{
|
||||||
@ -115,7 +113,5 @@ namespace osu.Game.Screens.Multi.Play
|
|||||||
|
|
||||||
Exited = null;
|
Exited = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Results CreateResults(ScoreInfo score) => new MatchResults(score);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
// 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 osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Multi.Ranking.Types;
|
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
using osu.Game.Screens.Ranking.Types;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Multi.Ranking
|
|
||||||
{
|
|
||||||
public class MatchResults : Results
|
|
||||||
{
|
|
||||||
public MatchResults(ScoreInfo score)
|
|
||||||
: base(score)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override IEnumerable<IResultPageInfo> CreateResultPages() => new IResultPageInfo[]
|
|
||||||
{
|
|
||||||
new ScoreOverviewPageInfo(Score, Beatmap.Value),
|
|
||||||
new LocalLeaderboardPageInfo(Score, Beatmap.Value),
|
|
||||||
new RoomLeaderboardPageInfo(Score, Beatmap.Value),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
// 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 Microsoft.EntityFrameworkCore.Internal;
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Bindables;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Framework.Lists;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Online.API.Requests.Responses;
|
|
||||||
using osu.Game.Online.Leaderboards;
|
|
||||||
using osu.Game.Online.Multiplayer;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Multi.Match.Components;
|
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Multi.Ranking.Pages
|
|
||||||
{
|
|
||||||
public class RoomLeaderboardPage : ResultsPage
|
|
||||||
{
|
|
||||||
[Resolved]
|
|
||||||
private OsuColour colours { get; set; }
|
|
||||||
|
|
||||||
private TextFlowContainer rankText;
|
|
||||||
|
|
||||||
[Resolved(typeof(Room), nameof(Room.Name))]
|
|
||||||
private Bindable<string> name { get; set; }
|
|
||||||
|
|
||||||
public RoomLeaderboardPage(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
: base(score, beatmap)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load()
|
|
||||||
{
|
|
||||||
MatchLeaderboard leaderboard;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
Colour = colours.Gray6,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
},
|
|
||||||
new BufferedContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
BackgroundColour = colours.Gray6,
|
|
||||||
Child = leaderboard = CreateLeaderboard()
|
|
||||||
},
|
|
||||||
rankText = new TextFlowContainer
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Width = 0.5f,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Y = 50,
|
|
||||||
TextAnchor = Anchor.TopCentre
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
leaderboard.Origin = Anchor.Centre;
|
|
||||||
leaderboard.Anchor = Anchor.Centre;
|
|
||||||
leaderboard.RelativeSizeAxes = Axes.Both;
|
|
||||||
leaderboard.Height = 0.8f;
|
|
||||||
leaderboard.Y = 55;
|
|
||||||
leaderboard.ScoresLoaded = scoresLoaded;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void scoresLoaded(IEnumerable<APIUserScoreAggregate> scores)
|
|
||||||
{
|
|
||||||
void gray(SpriteText s) => s.Colour = colours.GrayC;
|
|
||||||
|
|
||||||
void white(SpriteText s)
|
|
||||||
{
|
|
||||||
s.Font = s.Font.With(size: s.Font.Size * 1.4f);
|
|
||||||
s.Colour = colours.GrayF;
|
|
||||||
}
|
|
||||||
|
|
||||||
rankText.AddText(name + "\n", white);
|
|
||||||
rankText.AddText("You are placed ", gray);
|
|
||||||
|
|
||||||
int index = scores.IndexOf(new APIUserScoreAggregate { User = Score.User }, new FuncEqualityComparer<APIUserScoreAggregate>((s1, s2) => s1.User.Id.Equals(s2.User.Id)));
|
|
||||||
|
|
||||||
rankText.AddText($"#{index + 1} ", s =>
|
|
||||||
{
|
|
||||||
s.Font = s.Font.With(Typeface.Torus, weight: FontWeight.Bold);
|
|
||||||
s.Colour = colours.YellowDark;
|
|
||||||
});
|
|
||||||
|
|
||||||
rankText.AddText("in the room!", gray);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual MatchLeaderboard CreateLeaderboard() => new ResultsMatchLeaderboard();
|
|
||||||
|
|
||||||
public class ResultsMatchLeaderboard : MatchLeaderboard
|
|
||||||
{
|
|
||||||
protected override bool FadeTop => true;
|
|
||||||
|
|
||||||
protected override LeaderboardScore CreateDrawableScore(APIUserScoreAggregate model, int index)
|
|
||||||
=> new ResultsMatchLeaderboardScore(model, index);
|
|
||||||
|
|
||||||
protected override FillFlowContainer<LeaderboardScore> CreateScoreFlow()
|
|
||||||
{
|
|
||||||
var flow = base.CreateScoreFlow();
|
|
||||||
flow.Padding = new MarginPadding
|
|
||||||
{
|
|
||||||
Top = LeaderboardScore.HEIGHT * 2,
|
|
||||||
Bottom = LeaderboardScore.HEIGHT * 3,
|
|
||||||
};
|
|
||||||
return flow;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ResultsMatchLeaderboardScore : MatchLeaderboardScore
|
|
||||||
{
|
|
||||||
public ResultsMatchLeaderboardScore(APIUserScoreAggregate score, int rank)
|
|
||||||
: base(score, rank)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
// 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 osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Multi.Ranking.Pages;
|
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Multi.Ranking.Types
|
|
||||||
{
|
|
||||||
public class RoomLeaderboardPageInfo : IResultPageInfo
|
|
||||||
{
|
|
||||||
private readonly ScoreInfo score;
|
|
||||||
private readonly WorkingBeatmap beatmap;
|
|
||||||
|
|
||||||
public RoomLeaderboardPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
{
|
|
||||||
this.score = score;
|
|
||||||
this.beatmap = beatmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IconUsage Icon => FontAwesome.Solid.Users;
|
|
||||||
|
|
||||||
public string Name => "Room Leaderboard";
|
|
||||||
|
|
||||||
public virtual ResultsPage CreatePage() => new RoomLeaderboardPage(score, beatmap);
|
|
||||||
}
|
|
||||||
}
|
|
@ -420,7 +420,7 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
protected override bool OnScroll(ScrollEvent e) => mouseWheelDisabled.Value && !GameplayClockContainer.IsPaused.Value;
|
protected override bool OnScroll(ScrollEvent e) => mouseWheelDisabled.Value && !GameplayClockContainer.IsPaused.Value;
|
||||||
|
|
||||||
protected virtual Results CreateResults(ScoreInfo score) => new SoloResults(score);
|
protected virtual ResultsScreen CreateResults(ScoreInfo score) => new ResultsScreen(score);
|
||||||
|
|
||||||
#region Fail Logic
|
#region Fail Logic
|
||||||
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
// 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 osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Ranking;
|
|
||||||
using osu.Game.Screens.Ranking.Types;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play
|
|
||||||
{
|
|
||||||
public class SoloResults : Results
|
|
||||||
{
|
|
||||||
public SoloResults(ScoreInfo score)
|
|
||||||
: base(score)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override IEnumerable<IResultPageInfo> CreateResultPages() => new IResultPageInfo[]
|
|
||||||
{
|
|
||||||
new ScoreOverviewPageInfo(Score, Beatmap.Value),
|
|
||||||
new LocalLeaderboardPageInfo(Score, Beatmap.Value)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,10 +4,12 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
@ -45,8 +47,11 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load(Bindable<WorkingBeatmap> working)
|
||||||
{
|
{
|
||||||
|
var beatmap = working.Value.BeatmapInfo;
|
||||||
|
var metadata = beatmap.Metadata;
|
||||||
|
|
||||||
var topStatistics = new List<StatisticDisplay>
|
var topStatistics = new List<StatisticDisplay>
|
||||||
{
|
{
|
||||||
new AccuracyStatistic(score.Accuracy),
|
new AccuracyStatistic(score.Accuracy),
|
||||||
@ -81,14 +86,14 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Text = new LocalisedString((score.Beatmap.Metadata.Title, score.Beatmap.Metadata.TitleUnicode)),
|
Text = new LocalisedString((metadata.Title, metadata.TitleUnicode)),
|
||||||
Font = OsuFont.Torus.With(size: 20, weight: FontWeight.SemiBold),
|
Font = OsuFont.Torus.With(size: 20, weight: FontWeight.SemiBold),
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Text = new LocalisedString((score.Beatmap.Metadata.Artist, score.Beatmap.Metadata.ArtistUnicode)),
|
Text = new LocalisedString((metadata.Artist, metadata.ArtistUnicode)),
|
||||||
Font = OsuFont.Torus.With(size: 14, weight: FontWeight.SemiBold)
|
Font = OsuFont.Torus.With(size: 14, weight: FontWeight.SemiBold)
|
||||||
},
|
},
|
||||||
new Container
|
new Container
|
||||||
@ -120,7 +125,7 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new StarRatingDisplay(score.Beatmap)
|
new StarRatingDisplay(beatmap)
|
||||||
{
|
{
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
Origin = Anchor.CentreLeft
|
Origin = Anchor.CentreLeft
|
||||||
@ -148,7 +153,7 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
Text = score.Beatmap.Version,
|
Text = beatmap.Version,
|
||||||
Font = OsuFont.Torus.With(size: 16, weight: FontWeight.SemiBold),
|
Font = OsuFont.Torus.With(size: 16, weight: FontWeight.SemiBold),
|
||||||
},
|
},
|
||||||
new OsuTextFlowContainer(s => s.Font = OsuFont.Torus.With(size: 12))
|
new OsuTextFlowContainer(s => s.Font = OsuFont.Torus.With(size: 12))
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
// 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 osu.Framework.Graphics.Sprites;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
|
||||||
{
|
|
||||||
public interface IResultPageInfo
|
|
||||||
{
|
|
||||||
IconUsage Icon { get; }
|
|
||||||
|
|
||||||
string Name { get; }
|
|
||||||
|
|
||||||
ResultsPage CreatePage();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
// 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 osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Select.Leaderboards;
|
|
||||||
using osuTK;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Pages
|
|
||||||
{
|
|
||||||
public class LocalLeaderboardPage : ResultsPage
|
|
||||||
{
|
|
||||||
public LocalLeaderboardPage(ScoreInfo score, WorkingBeatmap beatmap = null)
|
|
||||||
: base(score, beatmap)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
Colour = colours.Gray6,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
},
|
|
||||||
new BeatmapLeaderboard
|
|
||||||
{
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Beatmap = Beatmap.BeatmapInfo ?? Score.Beatmap,
|
|
||||||
Scale = new Vector2(0.7f)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,428 +0,0 @@
|
|||||||
// 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;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Extensions;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Colour;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Framework.Graphics.Textures;
|
|
||||||
using osu.Framework.Localisation;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
|
||||||
using osu.Game.Graphics.UserInterface;
|
|
||||||
using osu.Game.Online.Leaderboards;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Play;
|
|
||||||
using osu.Game.Users;
|
|
||||||
using osuTK;
|
|
||||||
using osuTK.Graphics;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Pages
|
|
||||||
{
|
|
||||||
public class ScoreResultsPage : ResultsPage
|
|
||||||
{
|
|
||||||
private Container scoreContainer;
|
|
||||||
private ScoreCounter scoreCounter;
|
|
||||||
|
|
||||||
private readonly ScoreInfo score;
|
|
||||||
|
|
||||||
public ScoreResultsPage(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
: base(score, beatmap)
|
|
||||||
{
|
|
||||||
this.score = score;
|
|
||||||
}
|
|
||||||
|
|
||||||
private FillFlowContainer<DrawableScoreStatistic> statisticsContainer;
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
const float user_header_height = 120;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Padding = new MarginPadding { Top = user_header_height },
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.White,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new DelayedLoadWrapper(new UserHeader(Score.User)
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
})
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = user_header_height,
|
|
||||||
},
|
|
||||||
new UpdateableRank(Score.Rank)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Size = new Vector2(150, 60),
|
|
||||||
Margin = new MarginPadding(20),
|
|
||||||
},
|
|
||||||
scoreContainer = new Container
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = 60,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new SongProgressGraph
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Alpha = 0.5f,
|
|
||||||
Objects = Beatmap.Beatmap.HitObjects,
|
|
||||||
},
|
|
||||||
scoreCounter = new SlowScoreCounter(6)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Colour = colours.PinkDarker,
|
|
||||||
Y = 10,
|
|
||||||
TextSize = 56,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Colour = colours.PinkDarker,
|
|
||||||
Shadow = false,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold),
|
|
||||||
Text = "total score",
|
|
||||||
Margin = new MarginPadding { Bottom = 15 },
|
|
||||||
},
|
|
||||||
new BeatmapDetails(Beatmap.BeatmapInfo)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Margin = new MarginPadding { Bottom = 10 },
|
|
||||||
},
|
|
||||||
new DateTimeDisplay(Score.Date.LocalDateTime)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
},
|
|
||||||
new Container
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Size = new Vector2(0.75f, 1),
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Margin = new MarginPadding { Top = 10, Bottom = 10 },
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
Colour = ColourInfo.GradientHorizontal(
|
|
||||||
colours.GrayC.Opacity(0),
|
|
||||||
colours.GrayC.Opacity(0.9f)),
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Size = new Vector2(0.5f, 1),
|
|
||||||
},
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopRight,
|
|
||||||
Origin = Anchor.TopRight,
|
|
||||||
Colour = ColourInfo.GradientHorizontal(
|
|
||||||
colours.GrayC.Opacity(0.9f),
|
|
||||||
colours.GrayC.Opacity(0)),
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Size = new Vector2(0.5f, 1),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
statisticsContainer = new FillFlowContainer<DrawableScoreStatistic>
|
|
||||||
{
|
|
||||||
AutoSizeAxes = Axes.Both,
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Direction = FillDirection.Horizontal,
|
|
||||||
LayoutDuration = 200,
|
|
||||||
LayoutEasing = Easing.OutQuint
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Margin = new MarginPadding { Bottom = 10 },
|
|
||||||
Spacing = new Vector2(5),
|
|
||||||
AutoSizeAxes = Axes.Both,
|
|
||||||
Direction = FillDirection.Horizontal,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new ReplayDownloadButton(score),
|
|
||||||
new RetryButton()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
statisticsContainer.ChildrenEnumerable = Score.SortedStatistics.Select(s => new DrawableScoreStatistic(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
|
|
||||||
Schedule(() =>
|
|
||||||
{
|
|
||||||
scoreCounter.Increment(Score.TotalScore);
|
|
||||||
|
|
||||||
int delay = 0;
|
|
||||||
|
|
||||||
foreach (var s in statisticsContainer.Children)
|
|
||||||
{
|
|
||||||
s.FadeOut()
|
|
||||||
.Then(delay += 200)
|
|
||||||
.FadeIn(300 + delay, Easing.Out);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void UpdateAfterChildren()
|
|
||||||
{
|
|
||||||
base.UpdateAfterChildren();
|
|
||||||
|
|
||||||
scoreCounter.Scale = new Vector2(Math.Min(1f, (scoreContainer.DrawWidth - 20) / scoreCounter.DrawWidth));
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DrawableScoreStatistic : Container
|
|
||||||
{
|
|
||||||
private readonly KeyValuePair<HitResult, int> statistic;
|
|
||||||
|
|
||||||
public DrawableScoreStatistic(KeyValuePair<HitResult, int> statistic)
|
|
||||||
{
|
|
||||||
this.statistic = statistic;
|
|
||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
Margin = new MarginPadding { Left = 5, Right = 5 };
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = statistic.Value.ToString().PadLeft(4, '0'),
|
|
||||||
Colour = colours.Gray7,
|
|
||||||
Font = OsuFont.GetFont(size: 30),
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = statistic.Key.GetDescription(),
|
|
||||||
Colour = colours.Gray7,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold),
|
|
||||||
Y = 26,
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DateTimeDisplay : Container
|
|
||||||
{
|
|
||||||
private readonly DateTime date;
|
|
||||||
|
|
||||||
public DateTimeDisplay(DateTime date)
|
|
||||||
{
|
|
||||||
this.date = date;
|
|
||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
|
|
||||||
Masking = true;
|
|
||||||
CornerRadius = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = colours.Gray6,
|
|
||||||
},
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
AutoSizeAxes = Axes.Both,
|
|
||||||
Direction = FillDirection.Horizontal,
|
|
||||||
Padding = new MarginPadding { Horizontal = 10, Vertical = 5 },
|
|
||||||
Spacing = new Vector2(10),
|
|
||||||
Children = new[]
|
|
||||||
{
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = date.ToShortDateString(),
|
|
||||||
Colour = Color4.White,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Text = date.ToShortTimeString(),
|
|
||||||
Colour = Color4.White,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class BeatmapDetails : Container
|
|
||||||
{
|
|
||||||
private readonly BeatmapInfo beatmap;
|
|
||||||
|
|
||||||
private readonly OsuSpriteText title;
|
|
||||||
private readonly OsuSpriteText artist;
|
|
||||||
private readonly OsuSpriteText versionMapper;
|
|
||||||
|
|
||||||
public BeatmapDetails(BeatmapInfo beatmap)
|
|
||||||
{
|
|
||||||
this.beatmap = beatmap;
|
|
||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new FillFlowContainer
|
|
||||||
{
|
|
||||||
Direction = FillDirection.Vertical,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
AutoSizeAxes = Axes.Y,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
title = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Shadow = false,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 24, italics: true),
|
|
||||||
},
|
|
||||||
artist = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Shadow = false,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 20, italics: true),
|
|
||||||
},
|
|
||||||
versionMapper = new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Shadow = false,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
title.Colour = artist.Colour = colours.BlueDarker;
|
|
||||||
versionMapper.Colour = colours.Gray8;
|
|
||||||
|
|
||||||
var creator = beatmap.Metadata.Author?.Username;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(creator))
|
|
||||||
{
|
|
||||||
versionMapper.Text = $"mapped by {creator}";
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(beatmap.Version))
|
|
||||||
versionMapper.Text = $"{beatmap.Version} - " + versionMapper.Text;
|
|
||||||
}
|
|
||||||
|
|
||||||
title.Text = new LocalisedString((beatmap.Metadata.TitleUnicode, beatmap.Metadata.Title));
|
|
||||||
artist.Text = new LocalisedString((beatmap.Metadata.ArtistUnicode, beatmap.Metadata.Artist));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[LongRunningLoad]
|
|
||||||
private class UserHeader : Container
|
|
||||||
{
|
|
||||||
private readonly User user;
|
|
||||||
private readonly Sprite cover;
|
|
||||||
|
|
||||||
public UserHeader(User user)
|
|
||||||
{
|
|
||||||
this.user = user;
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
cover = new Sprite
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
FillMode = FillMode.Fill,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Text = user.Username,
|
|
||||||
Font = OsuFont.GetFont(size: 30, weight: FontWeight.Regular, italics: true),
|
|
||||||
Padding = new MarginPadding { Bottom = 10 },
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(LargeTextureStore textures)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(user.CoverUrl))
|
|
||||||
cover.Texture = textures.Get(user.CoverUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class SlowScoreCounter : ScoreCounter
|
|
||||||
{
|
|
||||||
protected override double RollingDuration => 3000;
|
|
||||||
|
|
||||||
protected override Easing RollingEasing => Easing.OutPow10;
|
|
||||||
|
|
||||||
public SlowScoreCounter(uint leading = 0)
|
|
||||||
: base(leading)
|
|
||||||
{
|
|
||||||
DisplayedCountSpriteText.Shadow = false;
|
|
||||||
DisplayedCountSpriteText.Font = DisplayedCountSpriteText.Font.With(Typeface.Venera, weight: FontWeight.Light);
|
|
||||||
UseCommaSeparator = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,7 +9,7 @@ using osu.Game.Online;
|
|||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Pages
|
namespace osu.Game.Screens.Ranking
|
||||||
{
|
{
|
||||||
public class ReplayDownloadButton : DownloadTrackingComposite<ScoreInfo, ScoreManager>
|
public class ReplayDownloadButton : DownloadTrackingComposite<ScoreInfo, ScoreManager>
|
||||||
{
|
{
|
@ -1,97 +0,0 @@
|
|||||||
// 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 osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Cursor;
|
|
||||||
using osu.Framework.Graphics.Effects;
|
|
||||||
using osu.Framework.Graphics.UserInterface;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osuTK;
|
|
||||||
using osuTK.Graphics;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
|
||||||
{
|
|
||||||
public class ResultModeButton : TabItem<IResultPageInfo>, IHasTooltip
|
|
||||||
{
|
|
||||||
private readonly IconUsage icon;
|
|
||||||
private Color4 activeColour;
|
|
||||||
private Color4 inactiveColour;
|
|
||||||
private CircularContainer colouredPart;
|
|
||||||
|
|
||||||
public ResultModeButton(IResultPageInfo mode)
|
|
||||||
: base(mode)
|
|
||||||
{
|
|
||||||
icon = mode.Icon;
|
|
||||||
TooltipText = mode.Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
Size = new Vector2(50);
|
|
||||||
|
|
||||||
Masking = true;
|
|
||||||
|
|
||||||
CornerRadius = 25;
|
|
||||||
CornerExponent = 2;
|
|
||||||
|
|
||||||
activeColour = colours.PinkDarker;
|
|
||||||
inactiveColour = OsuColour.Gray(0.8f);
|
|
||||||
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Colour = Color4.Black.Opacity(0.4f),
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.White,
|
|
||||||
},
|
|
||||||
colouredPart = new CircularContainer
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Size = new Vector2(0.8f),
|
|
||||||
BorderThickness = 4,
|
|
||||||
BorderColour = Color4.White,
|
|
||||||
Colour = inactiveColour,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
AlwaysPresent = true, //for border rendering
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.Transparent,
|
|
||||||
},
|
|
||||||
new SpriteIcon
|
|
||||||
{
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Shadow = false,
|
|
||||||
Colour = OsuColour.Gray(0.95f),
|
|
||||||
Icon = icon,
|
|
||||||
Size = new Vector2(20),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnActivated() => colouredPart.FadeColour(activeColour, 200, Easing.OutQuint);
|
|
||||||
|
|
||||||
protected override void OnDeactivated() => colouredPart.FadeColour(inactiveColour, 200, Easing.OutQuint);
|
|
||||||
|
|
||||||
public string TooltipText { get; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// 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 osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.UserInterface;
|
|
||||||
using osuTK;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
|
||||||
{
|
|
||||||
public class ResultModeTabControl : TabControl<IResultPageInfo>
|
|
||||||
{
|
|
||||||
public ResultModeTabControl()
|
|
||||||
{
|
|
||||||
TabContainer.Anchor = Anchor.BottomCentre;
|
|
||||||
TabContainer.Origin = Anchor.BottomCentre;
|
|
||||||
TabContainer.Spacing = new Vector2(15);
|
|
||||||
|
|
||||||
TabContainer.Masking = false;
|
|
||||||
TabContainer.Padding = new MarginPadding(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override Dropdown<IResultPageInfo> CreateDropdown() => null;
|
|
||||||
|
|
||||||
protected override TabItem<IResultPageInfo> CreateTabItem(IResultPageInfo value) => new ResultModeButton(value)
|
|
||||||
{
|
|
||||||
Anchor = TabContainer.Anchor,
|
|
||||||
Origin = TabContainer.Origin
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,291 +0,0 @@
|
|||||||
// 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 osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Effects;
|
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Framework.Screens;
|
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
using osu.Game.Screens.Backgrounds;
|
|
||||||
using osuTK;
|
|
||||||
using osuTK.Graphics;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Play;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
|
||||||
{
|
|
||||||
public abstract class Results : OsuScreen
|
|
||||||
{
|
|
||||||
protected const float BACKGROUND_BLUR = 20;
|
|
||||||
|
|
||||||
private Container circleOuterBackground;
|
|
||||||
private Container circleOuter;
|
|
||||||
private Container circleInner;
|
|
||||||
|
|
||||||
private ParallaxContainer backgroundParallax;
|
|
||||||
|
|
||||||
private ResultModeTabControl modeChangeButtons;
|
|
||||||
|
|
||||||
[Resolved(canBeNull: true)]
|
|
||||||
private Player player { get; set; }
|
|
||||||
|
|
||||||
public override bool DisallowExternalBeatmapRulesetChanges => true;
|
|
||||||
|
|
||||||
protected readonly ScoreInfo Score;
|
|
||||||
|
|
||||||
private Container currentPage;
|
|
||||||
|
|
||||||
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap.Value);
|
|
||||||
|
|
||||||
private const float overscan = 1.3f;
|
|
||||||
|
|
||||||
private const float circle_outer_scale = 0.96f;
|
|
||||||
|
|
||||||
protected Results(ScoreInfo score)
|
|
||||||
{
|
|
||||||
Score = score;
|
|
||||||
}
|
|
||||||
|
|
||||||
private const float transition_time = 800;
|
|
||||||
|
|
||||||
private IEnumerable<Drawable> allCircles => new Drawable[] { circleOuterBackground, circleInner, circleOuter };
|
|
||||||
|
|
||||||
public override void OnEntering(IScreen last)
|
|
||||||
{
|
|
||||||
base.OnEntering(last);
|
|
||||||
((BackgroundScreenBeatmap)Background).BlurAmount.Value = BACKGROUND_BLUR;
|
|
||||||
Background.ScaleTo(1.1f, transition_time, Easing.OutQuint);
|
|
||||||
|
|
||||||
allCircles.ForEach(c =>
|
|
||||||
{
|
|
||||||
c.FadeOut();
|
|
||||||
c.ScaleTo(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
backgroundParallax.FadeOut();
|
|
||||||
modeChangeButtons.FadeOut();
|
|
||||||
currentPage?.FadeOut();
|
|
||||||
|
|
||||||
circleOuterBackground
|
|
||||||
.FadeIn(transition_time, Easing.OutQuint)
|
|
||||||
.ScaleTo(1, transition_time, Easing.OutQuint);
|
|
||||||
|
|
||||||
using (BeginDelayedSequence(transition_time * 0.25f, true))
|
|
||||||
{
|
|
||||||
circleOuter
|
|
||||||
.FadeIn(transition_time, Easing.OutQuint)
|
|
||||||
.ScaleTo(1, transition_time, Easing.OutQuint);
|
|
||||||
|
|
||||||
using (BeginDelayedSequence(transition_time * 0.3f, true))
|
|
||||||
{
|
|
||||||
backgroundParallax.FadeIn(transition_time, Easing.OutQuint);
|
|
||||||
|
|
||||||
circleInner
|
|
||||||
.FadeIn(transition_time, Easing.OutQuint)
|
|
||||||
.ScaleTo(1, transition_time, Easing.OutQuint);
|
|
||||||
|
|
||||||
using (BeginDelayedSequence(transition_time * 0.4f, true))
|
|
||||||
{
|
|
||||||
modeChangeButtons.FadeIn(transition_time, Easing.OutQuint);
|
|
||||||
currentPage?.FadeIn(transition_time, Easing.OutQuint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool OnExiting(IScreen next)
|
|
||||||
{
|
|
||||||
allCircles.ForEach(c => c.ScaleTo(0, transition_time, Easing.OutSine));
|
|
||||||
|
|
||||||
Background.ScaleTo(1f, transition_time / 4, Easing.OutQuint);
|
|
||||||
|
|
||||||
this.FadeOut(transition_time / 4);
|
|
||||||
|
|
||||||
return base.OnExiting(next);
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
InternalChild = new AspectContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Y,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Height = overscan,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
circleOuterBackground = new CircularContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Masking = true,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
Alpha = 0.2f,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.Black,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
circleOuter = new CircularContainer
|
|
||||||
{
|
|
||||||
Size = new Vector2(circle_outer_scale),
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Colour = Color4.Black.Opacity(0.4f),
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 15,
|
|
||||||
},
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Masking = true,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.White,
|
|
||||||
},
|
|
||||||
backgroundParallax = new ParallaxContainer
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
ParallaxAmount = 0.01f,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Sprite
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Alpha = 0.2f,
|
|
||||||
Texture = Beatmap.Value.Background,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
FillMode = FillMode.Fill
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
modeChangeButtons = new ResultModeTabControl
|
|
||||||
{
|
|
||||||
Anchor = Anchor.BottomCentre,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Height = 50,
|
|
||||||
Margin = new MarginPadding { Bottom = 110 },
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Text = $"{Score.MaxCombo}x",
|
|
||||||
RelativePositionAxes = Axes.X,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 40),
|
|
||||||
X = 0.1f,
|
|
||||||
Colour = colours.BlueDarker,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Text = "max combo",
|
|
||||||
Font = OsuFont.GetFont(size: 20),
|
|
||||||
RelativePositionAxes = Axes.X,
|
|
||||||
X = 0.1f,
|
|
||||||
Colour = colours.Gray6,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.BottomCentre,
|
|
||||||
Text = Score.DisplayAccuracy,
|
|
||||||
Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 40),
|
|
||||||
RelativePositionAxes = Axes.X,
|
|
||||||
X = 0.9f,
|
|
||||||
Colour = colours.BlueDarker,
|
|
||||||
},
|
|
||||||
new OsuSpriteText
|
|
||||||
{
|
|
||||||
Anchor = Anchor.CentreLeft,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
Text = "accuracy",
|
|
||||||
Font = OsuFont.GetFont(size: 20),
|
|
||||||
RelativePositionAxes = Axes.X,
|
|
||||||
X = 0.9f,
|
|
||||||
Colour = colours.Gray6,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
circleInner = new CircularContainer
|
|
||||||
{
|
|
||||||
Size = new Vector2(0.6f),
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Colour = Color4.Black.Opacity(0.4f),
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 15,
|
|
||||||
},
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Masking = true,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = Color4.White,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (player != null)
|
|
||||||
{
|
|
||||||
AddInternal(new HotkeyRetryOverlay
|
|
||||||
{
|
|
||||||
Action = () =>
|
|
||||||
{
|
|
||||||
if (!this.IsCurrentScreen()) return;
|
|
||||||
|
|
||||||
player?.Restart();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var pages = CreateResultPages();
|
|
||||||
|
|
||||||
foreach (var p in pages)
|
|
||||||
modeChangeButtons.AddItem(p);
|
|
||||||
|
|
||||||
modeChangeButtons.Current.Value = pages.FirstOrDefault();
|
|
||||||
|
|
||||||
modeChangeButtons.Current.BindValueChanged(page =>
|
|
||||||
{
|
|
||||||
currentPage?.FadeOut();
|
|
||||||
currentPage?.Expire();
|
|
||||||
|
|
||||||
currentPage = page.NewValue?.CreatePage();
|
|
||||||
|
|
||||||
if (currentPage != null)
|
|
||||||
LoadComponentAsync(currentPage, circleInner.Add);
|
|
||||||
}, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract IEnumerable<IResultPageInfo> CreateResultPages();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,92 +0,0 @@
|
|||||||
// 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 osu.Framework.Allocation;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Framework.Graphics.Effects;
|
|
||||||
using osu.Framework.Graphics.Shapes;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osuTK;
|
|
||||||
using osuTK.Graphics;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking
|
|
||||||
{
|
|
||||||
public abstract class ResultsPage : Container
|
|
||||||
{
|
|
||||||
protected readonly ScoreInfo Score;
|
|
||||||
protected readonly WorkingBeatmap Beatmap;
|
|
||||||
private CircularContainer content;
|
|
||||||
private Box fill;
|
|
||||||
|
|
||||||
protected override Container<Drawable> Content => content;
|
|
||||||
|
|
||||||
protected ResultsPage(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
{
|
|
||||||
Score = score;
|
|
||||||
Beatmap = beatmap;
|
|
||||||
RelativeSizeAxes = Axes.Both;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadComplete()
|
|
||||||
{
|
|
||||||
base.LoadComplete();
|
|
||||||
fill.Delay(400).FadeInFromZero(600);
|
|
||||||
}
|
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load(OsuColour colours)
|
|
||||||
{
|
|
||||||
AddRangeInternal(new Drawable[]
|
|
||||||
{
|
|
||||||
fill = new Box
|
|
||||||
{
|
|
||||||
Alpha = 0,
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Colour = colours.Gray6
|
|
||||||
},
|
|
||||||
new CircularContainer
|
|
||||||
{
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Colour = colours.GrayF.Opacity(0.8f),
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 1,
|
|
||||||
},
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Masking = true,
|
|
||||||
BorderThickness = 20,
|
|
||||||
BorderColour = Color4.White,
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
Children = new Drawable[]
|
|
||||||
{
|
|
||||||
new Box
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Alpha = 0,
|
|
||||||
AlwaysPresent = true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
content = new CircularContainer
|
|
||||||
{
|
|
||||||
EdgeEffect = new EdgeEffectParameters
|
|
||||||
{
|
|
||||||
Colour = Color4.Black.Opacity(0.2f),
|
|
||||||
Type = EdgeEffectType.Shadow,
|
|
||||||
Radius = 15,
|
|
||||||
},
|
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Masking = true,
|
|
||||||
Size = new Vector2(0.88f),
|
|
||||||
Anchor = Anchor.Centre,
|
|
||||||
Origin = Anchor.Centre,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
142
osu.Game/Screens/Ranking/ResultsScreen.cs
Normal file
142
osu.Game/Screens/Ranking/ResultsScreen.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 osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Framework.Screens;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Scoring;
|
||||||
|
using osu.Game.Screens.Backgrounds;
|
||||||
|
using osu.Game.Screens.Play;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
|
namespace osu.Game.Screens.Ranking
|
||||||
|
{
|
||||||
|
public class ResultsScreen : OsuScreen
|
||||||
|
{
|
||||||
|
protected const float BACKGROUND_BLUR = 20;
|
||||||
|
|
||||||
|
public override bool DisallowExternalBeatmapRulesetChanges => true;
|
||||||
|
|
||||||
|
// Temporary for now to stop dual transitions. Should respect the current toolbar mode, but there's no way to do so currently.
|
||||||
|
public override bool HideOverlaysOnEnter => true;
|
||||||
|
|
||||||
|
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap.Value);
|
||||||
|
|
||||||
|
[Resolved(CanBeNull = true)]
|
||||||
|
private Player player { get; set; }
|
||||||
|
|
||||||
|
private readonly ScoreInfo score;
|
||||||
|
|
||||||
|
private Drawable bottomPanel;
|
||||||
|
|
||||||
|
public ResultsScreen(ScoreInfo score)
|
||||||
|
{
|
||||||
|
this.score = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
InternalChildren = new[]
|
||||||
|
{
|
||||||
|
new ResultsScrollContainer
|
||||||
|
{
|
||||||
|
Child = new ScorePanel(score)
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
State = PanelState.Expanded
|
||||||
|
},
|
||||||
|
},
|
||||||
|
bottomPanel = new Container
|
||||||
|
{
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
Height = TwoLayerButton.SIZE_EXTENDED.Y,
|
||||||
|
Alpha = 0,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = Color4Extensions.FromHex("#333")
|
||||||
|
},
|
||||||
|
new FillFlowContainer
|
||||||
|
{
|
||||||
|
Anchor = Anchor.Centre,
|
||||||
|
Origin = Anchor.Centre,
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
Spacing = new Vector2(5),
|
||||||
|
Direction = FillDirection.Horizontal,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new ReplayDownloadButton(score) { Width = 300 },
|
||||||
|
new RetryButton { Width = 300 },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
AddInternal(new HotkeyRetryOverlay
|
||||||
|
{
|
||||||
|
Action = () =>
|
||||||
|
{
|
||||||
|
if (!this.IsCurrentScreen()) return;
|
||||||
|
|
||||||
|
player?.Restart();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnEntering(IScreen last)
|
||||||
|
{
|
||||||
|
base.OnEntering(last);
|
||||||
|
|
||||||
|
((BackgroundScreenBeatmap)Background).BlurAmount.Value = BACKGROUND_BLUR;
|
||||||
|
|
||||||
|
Background.FadeTo(0.5f, 250);
|
||||||
|
bottomPanel.FadeTo(1, 250);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool OnExiting(IScreen next)
|
||||||
|
{
|
||||||
|
Background.FadeTo(1, 250);
|
||||||
|
|
||||||
|
return base.OnExiting(next);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ResultsScrollContainer : OsuScrollContainer
|
||||||
|
{
|
||||||
|
private readonly Container content;
|
||||||
|
|
||||||
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
|
public ResultsScrollContainer()
|
||||||
|
{
|
||||||
|
base.Content.Add(content = new Container
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.X
|
||||||
|
});
|
||||||
|
|
||||||
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
ScrollbarVisible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Update()
|
||||||
|
{
|
||||||
|
base.Update();
|
||||||
|
content.Height = DrawHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ using osu.Game.Graphics.UserInterface;
|
|||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Pages
|
namespace osu.Game.Screens.Ranking
|
||||||
{
|
{
|
||||||
public class RetryButton : OsuAnimatedButton
|
public class RetryButton : OsuAnimatedButton
|
||||||
{
|
{
|
@ -1,28 +0,0 @@
|
|||||||
// 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 osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Ranking.Pages;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Types
|
|
||||||
{
|
|
||||||
public class LocalLeaderboardPageInfo : IResultPageInfo
|
|
||||||
{
|
|
||||||
private readonly ScoreInfo score;
|
|
||||||
private readonly WorkingBeatmap beatmap;
|
|
||||||
|
|
||||||
public LocalLeaderboardPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
{
|
|
||||||
this.score = score;
|
|
||||||
this.beatmap = beatmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IconUsage Icon => FontAwesome.Solid.User;
|
|
||||||
|
|
||||||
public string Name => @"Local Leaderboard";
|
|
||||||
|
|
||||||
public ResultsPage CreatePage() => new LocalLeaderboardPage(score, beatmap);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
// 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 osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Game.Beatmaps;
|
|
||||||
using osu.Game.Scoring;
|
|
||||||
using osu.Game.Screens.Ranking.Pages;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Ranking.Types
|
|
||||||
{
|
|
||||||
public class ScoreOverviewPageInfo : IResultPageInfo
|
|
||||||
{
|
|
||||||
public IconUsage Icon => FontAwesome.Solid.Asterisk;
|
|
||||||
|
|
||||||
public string Name => "Overview";
|
|
||||||
private readonly ScoreInfo score;
|
|
||||||
private readonly WorkingBeatmap beatmap;
|
|
||||||
|
|
||||||
public ScoreOverviewPageInfo(ScoreInfo score, WorkingBeatmap beatmap)
|
|
||||||
{
|
|
||||||
this.score = score;
|
|
||||||
this.beatmap = beatmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResultsPage CreatePage()
|
|
||||||
{
|
|
||||||
return new ScoreResultsPage(score, beatmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,6 +8,7 @@ using osu.Framework.Input.Events;
|
|||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
|
using osu.Game.Screens.Ranking;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
@ -31,7 +32,7 @@ namespace osu.Game.Screens.Select
|
|||||||
Edit();
|
Edit();
|
||||||
}, Key.Number4);
|
}, Key.Number4);
|
||||||
|
|
||||||
((PlayBeatmapDetailArea)BeatmapDetails).Leaderboard.ScoreSelected += score => this.Push(new SoloResults(score));
|
((PlayBeatmapDetailArea)BeatmapDetails).Leaderboard.ScoreSelected += score => this.Push(new ResultsScreen(score));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override BeatmapDetailArea CreateBeatmapDetailArea() => new PlayBeatmapDetailArea();
|
protected override BeatmapDetailArea CreateBeatmapDetailArea() => new PlayBeatmapDetailArea();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user