1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-14 00:42:55 +08:00

Implement initial structure for room scores

This commit is contained in:
smoogipoo 2020-05-26 18:12:19 +09:00
parent 013461377e
commit ee59182989
5 changed files with 158 additions and 0 deletions

View File

@ -0,0 +1,21 @@
// 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;
namespace osu.Game.Online.API.Requests
{
public class GetRoomPlaylistScoresRequest : APIRequest<List<RoomScore>>
{
private readonly int roomId;
private readonly int playlistItemId;
public GetRoomPlaylistScoresRequest(int roomId, int playlistItemId)
{
this.roomId = roomId;
this.playlistItemId = playlistItemId;
}
protected override string Target => $@"rooms/{roomId}/playlist/{playlistItemId}/scores";
}
}

View File

@ -0,0 +1,79 @@
// 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 Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using osu.Game.Online.Multiplayer;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring;
namespace osu.Game.Online.API
{
public class RoomScore
{
[JsonProperty("id")]
public int ID { get; set; }
[JsonProperty("user_id")]
public int UserID { get; set; }
[JsonProperty("room_id")]
public int RoomID { get; set; }
[JsonProperty("playlist_item_id")]
public int PlaylistItemID { get; set; }
[JsonProperty("beatmap_id")]
public int BeatmapID { get; set; }
[JsonProperty("rank")]
[JsonConverter(typeof(StringEnumConverter))]
public ScoreRank Rank { get; set; }
[JsonProperty("total_score")]
public long TotalScore { get; set; }
[JsonProperty("accuracy")]
public double Accuracy { get; set; }
[JsonProperty("max_combo")]
public int MaxCombo { get; set; }
[JsonProperty("mods")]
public APIMod[] Mods { get; set; }
[JsonProperty("statistics")]
public Dictionary<HitResult, int> Statistics = new Dictionary<HitResult, int>();
[JsonProperty("passed")]
public bool Passed { get; set; }
[JsonProperty("ended_at")]
public DateTimeOffset EndedAt { get; set; }
public ScoreInfo CreateScoreInfo(PlaylistItem playlistItem)
{
var scoreInfo = new ScoreInfo
{
OnlineScoreID = ID,
TotalScore = TotalScore,
MaxCombo = MaxCombo,
Beatmap = playlistItem.Beatmap.Value,
BeatmapInfoID = playlistItem.BeatmapID,
Ruleset = playlistItem.Ruleset.Value,
RulesetID = playlistItem.RulesetID,
User = null, // todo: do we have a user object?
Accuracy = Accuracy,
Date = EndedAt,
Hash = string.Empty, // todo: temporary?
Rank = Rank,
Mods = Array.Empty<Mod>(), // todo: how?
};
return scoreInfo;
}
}
}

View File

@ -10,6 +10,8 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Screens;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Online.Multiplayer;
using osu.Game.Online.Multiplayer.GameTypes;
using osu.Game.Rulesets.Mods;
@ -162,6 +164,9 @@ namespace osu.Game.Screens.Multi.Match
};
}
[Resolved]
private IAPIProvider api { get; set; }
protected override void LoadComplete()
{
base.LoadComplete();
@ -185,6 +190,17 @@ namespace osu.Game.Screens.Multi.Match
managerAdded = beatmapManager.ItemAdded.GetBoundCopy();
managerAdded.BindValueChanged(beatmapAdded);
if (roomId.Value != null)
{
var req = new GetRoomPlaylistScoresRequest(roomId.Value.Value, playlist[0].ID);
req.Success += scores =>
{
};
api.Queue(req);
}
}
public override bool OnExiting(IScreen next)

View File

@ -14,7 +14,9 @@ using osu.Game.Online.API.Requests;
using osu.Game.Online.Multiplayer;
using osu.Game.Rulesets;
using osu.Game.Scoring;
using osu.Game.Screens.Multi.Ranking;
using osu.Game.Screens.Play;
using osu.Game.Screens.Ranking;
namespace osu.Game.Screens.Multi.Play
{
@ -88,6 +90,12 @@ namespace osu.Game.Screens.Multi.Play
return false;
}
protected override ResultsScreen CreateResults(ScoreInfo score)
{
Debug.Assert(roomId.Value != null);
return new TimeshiftResultsScreen(score, roomId.Value.Value, playlistItem);
}
protected override ScoreInfo CreateScore()
{
submitScore();

View File

@ -0,0 +1,34 @@
// 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.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Online.Multiplayer;
using osu.Game.Scoring;
using osu.Game.Screens.Ranking;
namespace osu.Game.Screens.Multi.Ranking
{
public class TimeshiftResultsScreen : ResultsScreen
{
private readonly int roomId;
private readonly PlaylistItem playlistItem;
public TimeshiftResultsScreen(ScoreInfo score, int roomId, PlaylistItem playlistItem, bool allowRetry = true)
: base(score, allowRetry)
{
this.roomId = roomId;
this.playlistItem = playlistItem;
}
protected override APIRequest FetchScores(Action<IEnumerable<ScoreInfo>> scoresCallback)
{
var req = new GetRoomPlaylistScoresRequest(roomId, playlistItem.ID);
req.Success += r => scoresCallback?.Invoke(r.Select(s => s.CreateScoreInfo(playlistItem)));
return req;
}
}
}