Skip to content

Commit d40ea8b

Browse files
committed
- Sort lobby user list case insensitively
- Optimized lobby sort
1 parent 6238a3d commit d40ea8b

2 files changed

Lines changed: 25 additions & 7 deletions

File tree

GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/NGMP_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class NetworkMemberBase
1919
bool m_bIsReady = false;
2020

2121
bool m_bIsAdmin = false;
22+
23+
// Precomputed lowercase key for fast case-insensitive sorting
24+
std::string sort_key;
2225
};
2326

2427
enum class ELoginResult

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -811,25 +811,40 @@ void PopulateLobbyPlayerListbox(void)
811811

812812
// by this point, all stats should be cached - they were either already cached, or we just got them back from the service
813813
// sort
814-
std::vector<NetworkRoomMember> sorted;
815-
{
816-
auto membersMAp = pRoomsInterface->GetMembersListForCurrentRoom();
814+
std::vector<NetworkRoomMember> sorted;
815+
816+
{
817+
auto membersMAp = pRoomsInterface->GetMembersListForCurrentRoom();
817818
sorted.reserve(membersMAp.size());
818819

819-
for (auto& [id, member] : membersMAp)
820-
sorted.emplace_back(member);
820+
for (auto& [id, member] : membersMAp) {
821+
NetworkRoomMember copy = member;
822+
823+
// Precompute lowercase sort key
824+
copy.sort_key.resize(copy.display_name.size());
825+
std::transform(
826+
copy.display_name.begin(),
827+
copy.display_name.end(),
828+
copy.sort_key.begin(),
829+
[](unsigned char c) { return std::tolower(c); }
830+
);
821831

832+
sorted.emplace_back(std::move(copy));
833+
}
834+
835+
// Case-insensitive alphabetical sort
822836
std::sort(sorted.begin(), sorted.end(),
823837
[](const auto& a, const auto& b) {
824-
return a.display_name < b.display_name;
838+
return a.sort_key < b.sort_key;
825839
});
826840

841+
// Admin/staff first
827842
std::stable_partition(sorted.begin(), sorted.end(),
828843
[](const auto& x) {
829844
return x.m_bIsAdmin;
830845
});
846+
}
831847

832-
}
833848

834849
for (const NetworkRoomMember& netRoomMember : sorted)
835850
{

0 commit comments

Comments
 (0)