@@ -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