Skip to content

Commit 2f2847f

Browse files
authored
Merge pull request #35498 from smoogipoo/qp-add-helpers
Add quick play helpers to add users/rounds
2 parents 5da132c + 7203f41 commit 2f2847f

File tree

8 files changed

+101
-105
lines changed

8 files changed

+101
-105
lines changed

osu.Game.Tests/Online/Matchmaking/MatchmakingRoomStateTest.cs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ public void Basic()
2929
new SoloScoreInfo { UserID = 3, TotalScore = 750 },
3030
], placement_points);
3131

32-
Assert.AreEqual(8, state.Users[1].Points);
33-
Assert.AreEqual(1, state.Users[1].Placement);
34-
Assert.AreEqual(1, state.Users[1].Rounds[1].Placement);
32+
Assert.AreEqual(8, state.Users.GetOrAdd(1).Points);
33+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Placement);
34+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Rounds.GetOrAdd(1).Placement);
3535

36-
Assert.AreEqual(6, state.Users[2].Points);
37-
Assert.AreEqual(3, state.Users[2].Placement);
38-
Assert.AreEqual(3, state.Users[2].Rounds[1].Placement);
36+
Assert.AreEqual(6, state.Users.GetOrAdd(2).Points);
37+
Assert.AreEqual(3, state.Users.GetOrAdd(2).Placement);
38+
Assert.AreEqual(3, state.Users.GetOrAdd(2).Rounds.GetOrAdd(1).Placement);
3939

40-
Assert.AreEqual(7, state.Users[3].Points);
41-
Assert.AreEqual(2, state.Users[3].Placement);
42-
Assert.AreEqual(2, state.Users[3].Rounds[1].Placement);
40+
Assert.AreEqual(7, state.Users.GetOrAdd(3).Points);
41+
Assert.AreEqual(2, state.Users.GetOrAdd(3).Placement);
42+
Assert.AreEqual(2, state.Users.GetOrAdd(3).Rounds.GetOrAdd(1).Placement);
4343

4444
// 2 -> 1 -> 3
4545

@@ -51,17 +51,17 @@ public void Basic()
5151
new SoloScoreInfo { UserID = 3, TotalScore = 500 },
5252
], placement_points);
5353

54-
Assert.AreEqual(15, state.Users[1].Points);
55-
Assert.AreEqual(1, state.Users[1].Placement);
56-
Assert.AreEqual(2, state.Users[1].Rounds[2].Placement);
54+
Assert.AreEqual(15, state.Users.GetOrAdd(1).Points);
55+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Placement);
56+
Assert.AreEqual(2, state.Users.GetOrAdd(1).Rounds.GetOrAdd(2).Placement);
5757

58-
Assert.AreEqual(14, state.Users[2].Points);
59-
Assert.AreEqual(2, state.Users[2].Placement);
60-
Assert.AreEqual(1, state.Users[2].Rounds[2].Placement);
58+
Assert.AreEqual(14, state.Users.GetOrAdd(2).Points);
59+
Assert.AreEqual(2, state.Users.GetOrAdd(2).Placement);
60+
Assert.AreEqual(1, state.Users.GetOrAdd(2).Rounds.GetOrAdd(2).Placement);
6161

62-
Assert.AreEqual(13, state.Users[3].Points);
63-
Assert.AreEqual(3, state.Users[3].Placement);
64-
Assert.AreEqual(3, state.Users[3].Rounds[2].Placement);
62+
Assert.AreEqual(13, state.Users.GetOrAdd(3).Points);
63+
Assert.AreEqual(3, state.Users.GetOrAdd(3).Placement);
64+
Assert.AreEqual(3, state.Users.GetOrAdd(3).Rounds.GetOrAdd(2).Placement);
6565
}
6666

6767
[Test]
@@ -80,21 +80,21 @@ public void MatchingScores()
8080
new SoloScoreInfo { UserID = 4, TotalScore = 500 },
8181
], placement_points);
8282

83-
Assert.AreEqual(7, state.Users[1].Points);
84-
Assert.AreEqual(1, state.Users[1].Placement);
85-
Assert.AreEqual(2, state.Users[1].Rounds[1].Placement);
83+
Assert.AreEqual(7, state.Users.GetOrAdd(1).Points);
84+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Placement);
85+
Assert.AreEqual(2, state.Users.GetOrAdd(1).Rounds.GetOrAdd(1).Placement);
8686

87-
Assert.AreEqual(7, state.Users[2].Points);
88-
Assert.AreEqual(2, state.Users[2].Placement);
89-
Assert.AreEqual(2, state.Users[2].Rounds[1].Placement);
87+
Assert.AreEqual(7, state.Users.GetOrAdd(2).Points);
88+
Assert.AreEqual(2, state.Users.GetOrAdd(2).Placement);
89+
Assert.AreEqual(2, state.Users.GetOrAdd(2).Rounds.GetOrAdd(1).Placement);
9090

91-
Assert.AreEqual(5, state.Users[3].Points);
92-
Assert.AreEqual(3, state.Users[3].Placement);
93-
Assert.AreEqual(4, state.Users[3].Rounds[1].Placement);
91+
Assert.AreEqual(5, state.Users.GetOrAdd(3).Points);
92+
Assert.AreEqual(3, state.Users.GetOrAdd(3).Placement);
93+
Assert.AreEqual(4, state.Users.GetOrAdd(3).Rounds.GetOrAdd(1).Placement);
9494

95-
Assert.AreEqual(5, state.Users[4].Points);
96-
Assert.AreEqual(4, state.Users[4].Placement);
97-
Assert.AreEqual(4, state.Users[4].Rounds[1].Placement);
95+
Assert.AreEqual(5, state.Users.GetOrAdd(4).Points);
96+
Assert.AreEqual(4, state.Users.GetOrAdd(4).Placement);
97+
Assert.AreEqual(4, state.Users.GetOrAdd(4).Rounds.GetOrAdd(1).Placement);
9898
}
9999

100100
[Test]
@@ -120,8 +120,8 @@ public void RoundTieBreaker()
120120
new SoloScoreInfo { UserID = 2, TotalScore = 1000 },
121121
], placement_points);
122122

123-
Assert.AreEqual(1, state.Users[1].Placement);
124-
Assert.AreEqual(2, state.Users[2].Placement);
123+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Placement);
124+
Assert.AreEqual(2, state.Users.GetOrAdd(2).Placement);
125125
}
126126

127127
[Test]
@@ -142,12 +142,12 @@ public void UserIdTieBreaker()
142142
new SoloScoreInfo { UserID = 5, TotalScore = 1000 },
143143
], placement_points);
144144

145-
Assert.AreEqual(1, state.Users[1].Placement);
146-
Assert.AreEqual(2, state.Users[2].Placement);
147-
Assert.AreEqual(3, state.Users[3].Placement);
148-
Assert.AreEqual(4, state.Users[4].Placement);
149-
Assert.AreEqual(5, state.Users[5].Placement);
150-
Assert.AreEqual(6, state.Users[6].Placement);
145+
Assert.AreEqual(1, state.Users.GetOrAdd(1).Placement);
146+
Assert.AreEqual(2, state.Users.GetOrAdd(2).Placement);
147+
Assert.AreEqual(3, state.Users.GetOrAdd(3).Placement);
148+
Assert.AreEqual(4, state.Users.GetOrAdd(4).Placement);
149+
Assert.AreEqual(5, state.Users.GetOrAdd(5).Placement);
150+
Assert.AreEqual(6, state.Users.GetOrAdd(6).Placement);
151151
}
152152
}
153153
}

osu.Game.Tests/Visual/Matchmaking/TestSceneMatchmakingScreen.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ public void TestGameplayFlow()
124124

125125
foreach (var user in MultiplayerClient.ServerRoom!.Users.OrderBy(_ => RNG.Next()))
126126
{
127-
state.Users[user.UserID].Placement = i++;
128-
state.Users[user.UserID].Points = (8 - i) * 7;
129-
state.Users[user.UserID].Rounds[1].Placement = 1;
130-
state.Users[user.UserID].Rounds[1].TotalScore = 1;
131-
state.Users[user.UserID].Rounds[1].Statistics[HitResult.LargeBonus] = 1;
127+
state.Users.GetOrAdd(user.UserID).Placement = i++;
128+
state.Users.GetOrAdd(user.UserID).Points = (8 - i) * 7;
129+
state.Users.GetOrAdd(user.UserID).Rounds.GetOrAdd(1).Placement = 1;
130+
state.Users.GetOrAdd(user.UserID).Rounds.GetOrAdd(1).TotalScore = 1;
131+
state.Users.GetOrAdd(user.UserID).Rounds.GetOrAdd(1).Statistics[HitResult.LargeBonus] = 1;
132132
}
133133
});
134134
}

osu.Game.Tests/Visual/Matchmaking/TestScenePlayerPanelOverlay.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public void ChangeRankings()
153153
MatchmakingRoomState state = new MatchmakingRoomState();
154154

155155
for (int i = 0; i < room.Users.Count; i++)
156-
state.Users[room.Users[i].UserID].Placement = placements[i];
156+
state.Users.GetOrAdd(room.Users[i].UserID).Placement = placements[i];
157157

158158
MultiplayerClient.ChangeMatchRoomState(state).WaitSafely();
159159
});

osu.Game.Tests/Visual/Matchmaking/TestSceneResultsScreen.cs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,28 @@ public override void SetUpSteps()
3636
int localUserId = API.LocalUser.Value.OnlineID;
3737

3838
// Overall state.
39-
state.Users[localUserId].Placement = 1;
40-
state.Users[localUserId].Points = 8;
39+
state.Users.GetOrAdd(localUserId).Placement = 1;
40+
state.Users.GetOrAdd(localUserId).Points = 8;
4141
for (int round = 1; round <= state.CurrentRound; round++)
42-
state.Users[localUserId].Rounds[round].Placement = round;
42+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(round).Placement = round;
4343

4444
// Highest score.
45-
state.Users[localUserId].Rounds[1].TotalScore = 1000;
45+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(1).TotalScore = 1000;
4646

4747
// Highest accuracy.
48-
state.Users[localUserId].Rounds[2].Accuracy = 0.9995;
48+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(2).Accuracy = 0.9995;
4949

5050
// Highest combo.
51-
state.Users[localUserId].Rounds[3].MaxCombo = 100;
51+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(3).MaxCombo = 100;
5252

5353
// Most bonus score.
54-
state.Users[localUserId].Rounds[4].Statistics[HitResult.LargeBonus] = 50;
54+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(4).Statistics[HitResult.LargeBonus] = 50;
5555

5656
// Smallest score difference.
57-
state.Users[localUserId].Rounds[5].TotalScore = 1000;
57+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(5).TotalScore = 1000;
5858

5959
// Largest score difference.
60-
state.Users[localUserId].Rounds[6].TotalScore = 1000;
60+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(6).TotalScore = 1000;
6161

6262
MultiplayerClient.ChangeMatchRoomState(state).WaitSafely();
6363
});
@@ -103,36 +103,36 @@ public void TestInvalidUser()
103103
int localUserId = API.LocalUser.Value.OnlineID;
104104

105105
// Overall state.
106-
state.Users[localUserId].Placement = 1;
107-
state.Users[localUserId].Points = 8;
108-
state.Users[invalid_user_id].Placement = 2;
109-
state.Users[invalid_user_id].Points = 7;
106+
state.Users.GetOrAdd(localUserId).Placement = 1;
107+
state.Users.GetOrAdd(localUserId).Points = 8;
108+
state.Users.GetOrAdd(invalid_user_id).Placement = 2;
109+
state.Users.GetOrAdd(invalid_user_id).Points = 7;
110110
for (int round = 1; round <= state.CurrentRound; round++)
111-
state.Users[localUserId].Rounds[round].Placement = round;
111+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(round).Placement = round;
112112

113113
// Highest score.
114-
state.Users[localUserId].Rounds[1].TotalScore = 1000;
115-
state.Users[invalid_user_id].Rounds[1].TotalScore = 990;
114+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(1).TotalScore = 1000;
115+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(1).TotalScore = 990;
116116

117117
// Highest accuracy.
118-
state.Users[localUserId].Rounds[2].Accuracy = 0.9995;
119-
state.Users[invalid_user_id].Rounds[2].Accuracy = 0.5;
118+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(2).Accuracy = 0.9995;
119+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(2).Accuracy = 0.5;
120120

121121
// Highest combo.
122-
state.Users[localUserId].Rounds[3].MaxCombo = 100;
123-
state.Users[invalid_user_id].Rounds[3].MaxCombo = 10;
122+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(3).MaxCombo = 100;
123+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(3).MaxCombo = 10;
124124

125125
// Most bonus score.
126-
state.Users[localUserId].Rounds[4].Statistics[HitResult.LargeBonus] = 50;
127-
state.Users[invalid_user_id].Rounds[4].Statistics[HitResult.LargeBonus] = 25;
126+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(4).Statistics[HitResult.LargeBonus] = 50;
127+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(4).Statistics[HitResult.LargeBonus] = 25;
128128

129129
// Smallest score difference.
130-
state.Users[localUserId].Rounds[5].TotalScore = 1000;
131-
state.Users[invalid_user_id].Rounds[5].TotalScore = 999;
130+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(5).TotalScore = 1000;
131+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(5).TotalScore = 999;
132132

133133
// Largest score difference.
134-
state.Users[localUserId].Rounds[6].TotalScore = 1000;
135-
state.Users[invalid_user_id].Rounds[6].TotalScore = 0;
134+
state.Users.GetOrAdd(localUserId).Rounds.GetOrAdd(6).TotalScore = 1000;
135+
state.Users.GetOrAdd(invalid_user_id).Rounds.GetOrAdd(6).TotalScore = 0;
136136

137137
MultiplayerClient.ChangeMatchRoomState(state).WaitSafely();
138138
});

osu.Game/Online/Multiplayer/MatchTypes/Matchmaking/MatchmakingRoomState.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ public void RecordScores(SoloScoreInfo[] scores, int[] placementPoints)
8181

8282
foreach (var score in scoreGroup)
8383
{
84-
MatchmakingUser mmUser = Users[score.UserID];
84+
MatchmakingUser mmUser = Users.GetOrAdd(score.UserID);
8585
mmUser.Points += placementPoints[placement - 1];
8686

87-
MatchmakingRound mmRound = mmUser.Rounds[CurrentRound];
87+
MatchmakingRound mmRound = mmUser.Rounds.GetOrAdd(CurrentRound);
8888
mmRound.Placement = placement;
8989
mmRound.TotalScore = score.TotalScore;
9090
mmRound.Accuracy = score.Accuracy;

osu.Game/Online/Multiplayer/MatchTypes/Matchmaking/MatchmakingRoundList.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,23 @@ public class MatchmakingRoundList : IEnumerable<MatchmakingRound>
2222
public IDictionary<int, MatchmakingRound> RoundsDictionary { get; set; } = new Dictionary<int, MatchmakingRound>();
2323

2424
/// <summary>
25-
/// Creates or retrieves the score for the given round.
25+
/// The total number of rounds.
26+
/// </summary>
27+
[IgnoreMember]
28+
public int Count => RoundsDictionary.Count;
29+
30+
/// <summary>
31+
/// Retrieves or adds a <see cref="MatchmakingRound"/> entry to this list.
2632
/// </summary>
2733
/// <param name="round">The round.</param>
28-
public MatchmakingRound this[int round]
34+
public MatchmakingRound GetOrAdd(int round)
2935
{
30-
get
31-
{
32-
if (RoundsDictionary.TryGetValue(round, out MatchmakingRound? score))
33-
return score;
36+
if (RoundsDictionary.TryGetValue(round, out MatchmakingRound? score))
37+
return score;
3438

35-
return RoundsDictionary[round] = new MatchmakingRound { Round = round };
36-
}
39+
return RoundsDictionary[round] = new MatchmakingRound { Round = round };
3740
}
3841

39-
/// <summary>
40-
/// The total number of rounds.
41-
/// </summary>
42-
[IgnoreMember]
43-
public int Count => RoundsDictionary.Count;
44-
4542
public IEnumerator<MatchmakingRound> GetEnumerator() => RoundsDictionary.Values.GetEnumerator();
4643

4744
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

osu.Game/Online/Multiplayer/MatchTypes/Matchmaking/MatchmakingUserList.cs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,24 @@ public class MatchmakingUserList : IEnumerable<MatchmakingUser>
2121
[Key(0)]
2222
public IDictionary<int, MatchmakingUser> UserDictionary { get; set; } = new Dictionary<int, MatchmakingUser>();
2323

24-
/// <summary>
25-
/// Creates or retrieves the user for the given id.
26-
/// </summary>
27-
/// <param name="userId">The user id.</param>
28-
public MatchmakingUser this[int userId]
29-
{
30-
get
31-
{
32-
if (UserDictionary.TryGetValue(userId, out MatchmakingUser? user))
33-
return user;
34-
35-
return UserDictionary[userId] = new MatchmakingUser { UserId = userId };
36-
}
37-
}
38-
3924
/// <summary>
4025
/// The total number of users.
4126
/// </summary>
4227
[IgnoreMember]
4328
public int Count => UserDictionary.Count;
4429

30+
/// <summary>
31+
/// Retrieves or adds a <see cref="MatchmakingUser"/> entry to this list.
32+
/// </summary>
33+
/// <param name="userId">The user ID.</param>
34+
public MatchmakingUser GetOrAdd(int userId)
35+
{
36+
if (UserDictionary.TryGetValue(userId, out MatchmakingUser? user))
37+
return user;
38+
39+
return UserDictionary[userId] = new MatchmakingUser { UserId = userId };
40+
}
41+
4542
public IEnumerator<MatchmakingUser> GetEnumerator() => UserDictionary.Values.GetEnumerator();
4643

4744
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

osu.Game/Screens/OnlinePlay/Matchmaking/Match/Results/SubScreenResults.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,21 +194,23 @@ private void populateUserStatistics(MatchmakingRoomState state)
194194
{
195195
userStatistics.Clear();
196196

197-
if (state.Users[client.LocalUser!.UserID].Rounds.Count == 0)
197+
var localUserState = state.Users.GetOrAdd(client.LocalUser!.UserID);
198+
199+
if (localUserState.Rounds.Count == 0)
198200
{
199201
placementText.Text = "-";
200202
placementText.Colour = OsuColour.Gray(1f);
201203
return;
202204
}
203205

204-
int? overallPlacement = state.Users[client.LocalUser!.UserID].Placement;
206+
int? overallPlacement = localUserState.Placement;
205207

206208
if (overallPlacement != null)
207209
{
208210
placementText.Text = overallPlacement.Value.Ordinalize(CultureInfo.CurrentCulture);
209211
placementText.Colour = ColourForPlacement(overallPlacement.Value);
210212

211-
int overallPoints = state.Users[client.LocalUser!.UserID].Points;
213+
int overallPoints = localUserState.Points;
212214
addStatistic(overallPlacement.Value, $"Overall position ({overallPoints} points)");
213215
}
214216

@@ -226,7 +228,7 @@ private void populateUserStatistics(MatchmakingRoomState state)
226228
int maxComboPlacement = maxComboOrderedUsers.index + 1;
227229
addStatistic(maxComboPlacement, $"Best max combo ({maxComboOrderedUsers.info.maxCombo}x)");
228230

229-
var bestPlacement = state.Users[client.LocalUser!.UserID].Rounds.MinBy(r => r.Placement);
231+
var bestPlacement = localUserState.Rounds.MinBy(r => r.Placement);
230232
addStatistic(bestPlacement!.Placement, $"Best round placement (round {bestPlacement.Round})");
231233

232234
void addStatistic(int position, string text) => userStatistics.Add(new PanelUserStatistic(position, text));

0 commit comments

Comments
 (0)