Display rank information on CSS and Game Setup Screen (#441)

* chore: update codeset files

* feature: add rank display

this is a port of https://github.com/project-slippi/dolphin/pull/38

* chore: update rust extensions

* chore: update playback codes
This commit is contained in:
Jas Laferriere
2025-08-10 01:22:37 -04:00
committed by GitHub
parent af8cafdda4
commit d04b2cabef
16 changed files with 331 additions and 77 deletions

View File

@@ -1147,7 +1147,7 @@ B07E01C9 3B200000
7D8903A6 4E800421
7C791B78 3A800000
3ABF0060 3AFE01CB
3B590034 1C74001F
3B590036 1C74001F
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -1161,7 +1161,7 @@ B07E01C9 3B200000
4E800421 3A940001
2C140004 4180FFA0
3A800000 3ABF0060
3AFE0247 3B5900CF
3AFE0247 3B5900D1
1C74000A 7F03BA14
1ED40024 7ED6AA14
88760001 2C030000
@@ -1176,7 +1176,7 @@ B07E01C9 3B200000
3A940001 2C140004
4180FFA0 3A800000
3ABF0060 3AFE026F
3B5900F7 1C74001D
3B5900F9 1C74001D
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -1196,7 +1196,7 @@ B07E01C9 3B200000
618CADF4 7D8903A6
4E800421 987E02E3
2C190000 41820044
387E02E4 38990394
387E02E4 38990396
38A00033 3D808000
618C31F4 7D8903A6
4E800421 3C60803D

View File

@@ -1146,7 +1146,7 @@ B07E01C9 3B200000
7D8903A6 4E800421
7C791B78 3A800000
3ABF0060 3AFE01CB
3B590034 1C74001F
3B590036 1C74001F
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -1160,7 +1160,7 @@ B07E01C9 3B200000
4E800421 3A940001
2C140004 4180FFA0
3A800000 3ABF0060
3AFE0247 3B5900CF
3AFE0247 3B5900D1
1C74000A 7F03BA14
1ED40024 7ED6AA14
88760001 2C030000
@@ -1175,7 +1175,7 @@ B07E01C9 3B200000
3A940001 2C140004
4180FFA0 3A800000
3ABF0060 3AFE026F
3B5900F7 1C74001D
3B5900F9 1C74001D
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -1195,7 +1195,7 @@ B07E01C9 3B200000
618CADF4 7D8903A6
4E800421 987E02E3
2C190000 41820044
387E02E4 38990394
387E02E4 38990396
38A00033 3D808000
618C31F4 7D8903A6
4E800421 3C60803D

Binary file not shown.

View File

@@ -894,7 +894,7 @@ B07E01C9 3B200000
7D8903A6 4E800421
7C791B78 3A800000
3ABF0060 3AFE01CB
3B590034 1C74001F
3B590036 1C74001F
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -908,7 +908,7 @@ B07E01C9 3B200000
4E800421 3A940001
2C140004 4180FFA0
3A800000 3ABF0060
3AFE0247 3B5900CF
3AFE0247 3B5900D1
1C74000A 7F03BA14
1ED40024 7ED6AA14
88760001 2C030000
@@ -923,7 +923,7 @@ B07E01C9 3B200000
3A940001 2C140004
4180FFA0 3A800000
3ABF0060 3AFE026F
3B5900F7 1C74001D
3B5900F9 1C74001D
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -943,7 +943,7 @@ B07E01C9 3B200000
618CADF4 7D8903A6
4E800421 987E02E3
2C190000 41820044
387E02E4 38990394
387E02E4 38990396
38A00033 3D808000
618C31F4 7D8903A6
4E800421 3C60803D
@@ -1447,14 +1447,14 @@ B06C0001 38600001
88780004 987B0001
80780005 907B0007
3C80804D 90645F90
7FE3FB78 3898025C
7FE3FB78 3898025E
38A00138 3D808000
618C31F4 7D8903A6
4E800421 3C60801D
6063457C 80830000
5485302E 38800040
7C8523D6 7C832214
887803C7 98640008
887803C9 98640008
886DAFA0 2C030000
4082007C 3CA0803D
60A5AD40 80A50000
@@ -3278,7 +3278,7 @@ C022AEC8 80610080
38800009 480003B9
887E0000 2C030004
4182000C 38BD0064
48000008 38BE00B0
48000008 38BE00B2
3880000A 48000399
887E0000 2C030004
4182000C 38BD0064
@@ -3307,7 +3307,7 @@ C022AEC8 80610080
2C030005 408200A8
3B60000B 3B200000
3B000000 3AE00000
3ADE016B 7EB6C8AE
3ADE016D 7EB6C8AE
56A00631 41820010
3B390002 3B180001
48000018 2C150020
@@ -3321,7 +3321,7 @@ C022AEC8 80610080
3B7B0001 7ED6BA14
3AD60001 3B200000
3B000000 2C150000
41820020 387E025C
41820020 387E025E
7C96CA14 7C041800
40800010 2C1B000E
41810008 4BFFFF78
@@ -3462,7 +3462,7 @@ BE8100B0 4BFFFFB1
3D808000 618CC160
7D8903A6 4E800421
3C608000 60635614
93E30000 386003C8
93E30000 386003CA
3D808037 618CF1E4
7D8903A6 4E800421
907F0000 886DAFA0
@@ -4215,7 +4215,7 @@ D03D0008 C03C0040
D03D000C D03D0010
4CC63242 C03C0048
C05C0048 7FA3EB78
389A0034 1CB4001F
389A0036 1CB4001F
7C842A14 3D80803A
618C6B98 7D8903A6
4E800421 7FA3EB78
@@ -4980,18 +4980,18 @@ BE8100B0 38600000
989E004A C03F0000
D03E0008 C03F0004
D03E0024 D03E0028
887D0264 2C030001
887D0266 2C030001
41820038 387F0010
389F0052 38BD0034
389F0052 38BD0036
38C00000 C03F001C
48000141 387F0014
389F0055 38BD0053
389F0055 38BD0055
38C00000 C03F0020
48000129 48000038
807D000D 4800022D
807D000F 4800022D
387F0010 389F0044
C03F001C 4800010D
807D0011 48000215
807D0013 48000215
387F0014 389F004B
C03F0020 480000F5
48000004 38600000
@@ -5007,12 +5007,12 @@ C03F0004 D03E0024
D03E0028 38800001
989E004A 989E0049
C03F0000 D03E0008
7FC3F378 A09D026A
7FC3F378 A09D026C
3D808000 618C5690
7D8903A6 4E800421
2C030001 41820058
3CA0803B 60A57808
A0DD026A 38600000
A0DD026C 38600000
1C830002 7C85222E
7C043000 41820014
38630001 2C03001D
@@ -5064,7 +5064,7 @@ CBE100E0 CBC100E8
7C7A3039 7C632C30
38E00008 39200000
7C643039 1C84001F
38840034 7C84EA14
38840036 7C84EA14
7D070A14 90880000
7C632C30 38E70004
39290001 2C090003
@@ -5083,7 +5083,7 @@ BE8100B0 38600000
3D808000 618C5610
7D8903A6 4E800421
7C7F1B78 887F0004
1C630024 389F02BC
1C630024 389F02BE
7FC418AE 7FE3FB78
3D808037 618CF1B0
7D8903A6 4E800421
@@ -5372,7 +5372,7 @@ A09B0001 38840006
7F9B21AE 387C0003
7C9B18AE 38A40001
7CBB19AE 1C9C0002
38840010 A07F026A
38840010 A07F026C
7C7B232E 889B0000
38840001 38600002
7C841B96 7C052000
@@ -5469,10 +5469,10 @@ BE8100B0 38600000
887F0084 98640008
887F0087 9864000E
38600000 9864FFFF
9864FFFB 887E0264
9864FFFB 887E0266
2C030000 418200F4
887E0003 1C630024
386302C5 7F7E18AE
386302C7 7F7E18AE
38600002 98640002
38600001 9864FFFB
98640006 98640007
@@ -5506,7 +5506,7 @@ BE8100B0 38600000
887F0063 98640018
887F0084 9064001C
887F0087 98640020
887E0264 2C030000
887E0266 2C030000
41820024 887F00A8
90640024 887F00AB
98640028 887F00CC
@@ -5559,7 +5559,7 @@ BE8100B0 3C808047
618C5610 7D8903A6
4E800421 7C7F1B78
83CD8840 3BDE0598
7FC3F378 389F025C
7FC3F378 389F025E
38A00138 3D808000
618C31F4 7D8903A6
4E800421 7FC3F378
@@ -5567,16 +5567,16 @@ BE8100B0 3C808047
7D8903A6 4E800421
3D808017 618CEB30
7D8903A6 4E800421
889F02BC 98830000
889F02BF 98830001
889F02BE 98830000
889F02C1 98830001
38800000 98830002
38800003 98830005
38800078 98830004
3C80803D 6084DEC8
8084000C 887F02E0
8084000C 887F02E2
98640002 38602121
B0640003 3C808049
60840880 887F02E3
60840880 887F02E5
98640016 7FE3FB78
3D808037 618CF1B0
7D8903A6 4E800421
@@ -5714,7 +5714,7 @@ C2005690 0000000C #Online/Static/CheckAltStageName.asm
9421FF20 BE8100B0
7C7E1B78 38600000
2C040003 4082002C
881D03C7 2C000000
881D03C9 2C000000
41820020 7FC3F378
38800059 3D80803A
618C6368 7D8903A6
@@ -5758,7 +5758,7 @@ C2005610 00000012 #Online/Static/LoadMatchState.asm
7C0802A6 90010004
9421FF20 BE8100B0
2C030000 40820018
386003C8 3D808037
386003CA 3D808037
618CF1E4 7D8903A6
4E800421 7C7F1B78
386000B3 987F0000
@@ -5766,7 +5766,7 @@ C2005610 00000012 #Online/Static/LoadMatchState.asm
38A00001 3D808000
618C55F0 7D8903A6
4E800421 7FE3FB78
388003C8 38A00000
388003CA 38A00000
3D808000 618C55F0
7D8903A6 4E800421
7FE3FB78 BA8100B0

View File

@@ -893,7 +893,7 @@ B07E01C9 3B200000
7D8903A6 4E800421
7C791B78 3A800000
3ABF0060 3AFE01CB
3B590034 1C74001F
3B590036 1C74001F
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -907,7 +907,7 @@ B07E01C9 3B200000
4E800421 3A940001
2C140004 4180FFA0
3A800000 3ABF0060
3AFE0247 3B5900CF
3AFE0247 3B5900D1
1C74000A 7F03BA14
1ED40024 7ED6AA14
88760001 2C030000
@@ -922,7 +922,7 @@ B07E01C9 3B200000
3A940001 2C140004
4180FFA0 3A800000
3ABF0060 3AFE026F
3B5900F7 1C74001D
3B5900F9 1C74001D
7F03BA14 1ED40024
7ED6AA14 88760001
2C030000 40820028
@@ -942,7 +942,7 @@ B07E01C9 3B200000
618CADF4 7D8903A6
4E800421 987E02E3
2C190000 41820044
387E02E4 38990394
387E02E4 38990396
38A00033 3D808000
618C31F4 7D8903A6
4E800421 3C60803D
@@ -1446,14 +1446,14 @@ B06C0001 38600001
88780004 987B0001
80780005 907B0007
3C80804D 90645F90
7FE3FB78 3898025C
7FE3FB78 3898025E
38A00138 3D808000
618C31F4 7D8903A6
4E800421 3C60801D
6063457C 80830000
5485302E 38800040
7C8523D6 7C832214
887803C7 98640008
887803C9 98640008
886DAFA0 2C030000
4082007C 3CA0803D
60A5AD40 80A50000
@@ -3277,7 +3277,7 @@ C022AEC8 80610080
38800009 480003B9
887E0000 2C030004
4182000C 38BD0064
48000008 38BE00B0
48000008 38BE00B2
3880000A 48000399
887E0000 2C030004
4182000C 38BD0064
@@ -3306,7 +3306,7 @@ C022AEC8 80610080
2C030005 408200A8
3B60000B 3B200000
3B000000 3AE00000
3ADE016B 7EB6C8AE
3ADE016D 7EB6C8AE
56A00631 41820010
3B390002 3B180001
48000018 2C150020
@@ -3320,7 +3320,7 @@ C022AEC8 80610080
3B7B0001 7ED6BA14
3AD60001 3B200000
3B000000 2C150000
41820020 387E025C
41820020 387E025E
7C96CA14 7C041800
40800010 2C1B000E
41810008 4BFFFF78
@@ -3461,7 +3461,7 @@ BE8100B0 4BFFFFB1
3D808000 618CC160
7D8903A6 4E800421
3C608000 60635614
93E30000 386003C8
93E30000 386003CA
3D808037 618CF1E4
7D8903A6 4E800421
907F0000 886DAFA0
@@ -4214,7 +4214,7 @@ D03D0008 C03C0040
D03D000C D03D0010
4CC63242 C03C0048
C05C0048 7FA3EB78
389A0034 1CB4001F
389A0036 1CB4001F
7C842A14 3D80803A
618C6B98 7D8903A6
4E800421 7FA3EB78
@@ -4979,18 +4979,18 @@ BE8100B0 38600000
989E004A C03F0000
D03E0008 C03F0004
D03E0024 D03E0028
887D0264 2C030001
887D0266 2C030001
41820038 387F0010
389F0052 38BD0034
389F0052 38BD0036
38C00000 C03F001C
48000141 387F0014
389F0055 38BD0053
389F0055 38BD0055
38C00000 C03F0020
48000129 48000038
807D000D 4800022D
807D000F 4800022D
387F0010 389F0044
C03F001C 4800010D
807D0011 48000215
807D0013 48000215
387F0014 389F004B
C03F0020 480000F5
48000004 38600000
@@ -5006,12 +5006,12 @@ C03F0004 D03E0024
D03E0028 38800001
989E004A 989E0049
C03F0000 D03E0008
7FC3F378 A09D026A
7FC3F378 A09D026C
3D808000 618C5690
7D8903A6 4E800421
2C030001 41820058
3CA0803B 60A57808
A0DD026A 38600000
A0DD026C 38600000
1C830002 7C85222E
7C043000 41820014
38630001 2C03001D
@@ -5063,7 +5063,7 @@ CBE100E0 CBC100E8
7C7A3039 7C632C30
38E00008 39200000
7C643039 1C84001F
38840034 7C84EA14
38840036 7C84EA14
7D070A14 90880000
7C632C30 38E70004
39290001 2C090003
@@ -5082,7 +5082,7 @@ BE8100B0 38600000
3D808000 618C5610
7D8903A6 4E800421
7C7F1B78 887F0004
1C630024 389F02BC
1C630024 389F02BE
7FC418AE 7FE3FB78
3D808037 618CF1B0
7D8903A6 4E800421
@@ -5371,7 +5371,7 @@ A09B0001 38840006
7F9B21AE 387C0003
7C9B18AE 38A40001
7CBB19AE 1C9C0002
38840010 A07F026A
38840010 A07F026C
7C7B232E 889B0000
38840001 38600002
7C841B96 7C052000
@@ -5468,10 +5468,10 @@ BE8100B0 38600000
887F0084 98640008
887F0087 9864000E
38600000 9864FFFF
9864FFFB 887E0264
9864FFFB 887E0266
2C030000 418200F4
887E0003 1C630024
386302C5 7F7E18AE
386302C7 7F7E18AE
38600002 98640002
38600001 9864FFFB
98640006 98640007
@@ -5505,7 +5505,7 @@ BE8100B0 38600000
887F0063 98640018
887F0084 9064001C
887F0087 98640020
887E0264 2C030000
887E0266 2C030000
41820024 887F00A8
90640024 887F00AB
98640028 887F00CC
@@ -5558,7 +5558,7 @@ BE8100B0 3C808047
618C5610 7D8903A6
4E800421 7C7F1B78
83CD8840 3BDE0598
7FC3F378 389F025C
7FC3F378 389F025E
38A00138 3D808000
618C31F4 7D8903A6
4E800421 7FC3F378
@@ -5566,16 +5566,16 @@ BE8100B0 3C808047
7D8903A6 4E800421
3D808017 618CEB30
7D8903A6 4E800421
889F02BC 98830000
889F02BF 98830001
889F02BE 98830000
889F02C1 98830001
38800000 98830002
38800003 98830005
38800078 98830004
3C80803D 6084DEC8
8084000C 887F02E0
8084000C 887F02E2
98640002 38602121
B0640003 3C808049
60840880 887F02E3
60840880 887F02E5
98640016 7FE3FB78
3D808037 618CF1B0
7D8903A6 4E800421
@@ -5713,7 +5713,7 @@ C2005690 0000000C #Online/Static/CheckAltStageName.asm
9421FF20 BE8100B0
7C7E1B78 38600000
2C040003 4082002C
881D03C7 2C000000
881D03C9 2C000000
41820020 7FC3F378
38800059 3D80803A
618C6368 7D8903A6
@@ -5757,7 +5757,7 @@ C2005610 00000012 #Online/Static/LoadMatchState.asm
7C0802A6 90010004
9421FF20 BE8100B0
2C030000 40820018
386003C8 3D808037
386003CA 3D808037
618CF1E4 7D8903A6
4E800421 7C7F1B78
386000B3 987F0000
@@ -5765,7 +5765,7 @@ C2005610 00000012 #Online/Static/LoadMatchState.asm
38A00001 3D808000
618C55F0 7D8903A6
4E800421 7FE3FB78
388003C8 38A00000
388003CA 38A00000
3D808000 618C55F0
7D8903A6 4E800421
7FE3FB78 BA8100B0

View File

@@ -150,6 +150,8 @@ struct SConfig : NonCopyable
bool bAdapterWarning = true;
bool bReduceTimingDispersion = false;
bool bSlippiPlayerRankDisplay = true;
bool bSlippiOpponentRankDisplay = true;
bool bSlippiJukeboxEnabled = true;
int iSlippiJukeboxVolume = 100;

View File

@@ -2148,6 +2148,8 @@ void CEXISlippi::prepareOnlineMatchState()
std::string oppName = "";
std::string p1Name = "";
std::string p2Name = "";
u8 localRank = 0;
u8 oppRank = 0;
u8 chatMessageId = 0;
u8 chatMessagePlayerIdx = 0;
u8 sentChatMessageId = 0;
@@ -2160,6 +2162,8 @@ void CEXISlippi::prepareOnlineMatchState()
// in CSS p1 is always current player and p2 is opponent
localPlayerName = p1Name = userInfo.displayName;
oppName = p2Name = "Player 2";
localRank = 8;
oppRank = 15;
#endif
SlippiDesyncRecoveryResp desync_recovery;
@@ -2488,6 +2492,16 @@ void CEXISlippi::prepareOnlineMatchState()
m_read_queue.push_back((u8)chatMessageId);
m_read_queue.push_back((u8)chatMessagePlayerIdx);
bool isRanked = lastSearch.mode == SlippiMatchmaking::OnlinePlayMode::RANKED;
if (isRanked)
{
localRank = (u8)matchmaking->GetPlayerRank(localPlayerIndex);
oppRank = (u8)matchmaking->GetPlayerRank(remotePlayerIndex);
}
m_read_queue.push_back(localRank);
m_read_queue.push_back(oppRank);
// Add player groupings for VS splash screen
leftTeamPlayers.resize(4, 0);
rightTeamPlayers.resize(4, 0);
@@ -3199,6 +3213,30 @@ void CEXISlippi::handleGetPlayerSettings()
m_read_queue.insert(m_read_queue.end(), data_ptr, data_ptr + sizeof(SlippiExiTypes::GetPlayerSettingsResponse));
}
void CEXISlippi::handleGetRank()
{
RustRankInfo rank_info = slprs_get_rank_info(slprs_exi_device_ptr);
m_read_queue.clear();
// Determine rank info visibility
u8 local_rank_enabled = static_cast<u8>(SConfig::GetInstance().bSlippiPlayerRankDisplay);
u8 opp_rank_enabled = static_cast<u8>(SConfig::GetInstance().bSlippiOpponentRankDisplay);
u8 rank_visibility = local_rank_enabled | (opp_rank_enabled << 1);
// Push rank data header
m_read_queue.push_back(rank_visibility);
m_read_queue.push_back(static_cast<u8>(rank_info.fetch_status));
// ERROR_LOG_FMT(SLIPPI_ONLINE, "Update count: {}", rank_info.rating_update_count);
// Push rank data
m_read_queue.push_back(static_cast<u8>(rank_info.rank));
appendWordToBuffer(&m_read_queue, *(u32 *)(&rank_info.rating_ordinal));
appendWordToBuffer(&m_read_queue, static_cast<u32>(rank_info.rating_update_count));
appendWordToBuffer(&m_read_queue, *(u32 *)(&rank_info.rating_change));
m_read_queue.push_back(static_cast<u8>(rank_info.rank_change));
}
void CEXISlippi::DMAWrite(u32 _uAddr, u32 _uSize)
{
u8 *memPtr = Memory::GetPointer(_uAddr);
@@ -3390,6 +3428,16 @@ void CEXISlippi::DMAWrite(u32 _uAddr, u32 _uSize)
slprs_jukebox_set_melee_music_volume(slprs_exi_device_ptr, args.volume);
break;
}
case CMD_GET_RANK:
{
handleGetRank();
break;
}
case CMD_FETCH_RANK:
{
slprs_fetch_match_result(slprs_exi_device_ptr, recentMmResult.id.c_str());
break;
}
default:
writeToFileAsync(&memPtr[bufLoc], payloadLen + 1, "");
m_slippiserver->write(&memPtr[bufLoc], payloadLen + 1);

View File

@@ -106,6 +106,9 @@ class CEXISlippi : public IEXIDevice
CMD_CHANGE_MUSIC_VOLUME = 0xD8,
CMD_PREMADE_TEXT_LENGTH = 0xE1,
CMD_PREMADE_TEXT_LOAD = 0xE2,
CMD_GET_RANK = 0xE3,
CMD_FETCH_RANK = 0xE4,
CMD_GET_RANK_VISIBILITY = 0xE5
};
enum
@@ -189,6 +192,9 @@ class CEXISlippi : public IEXIDevice
{CMD_CHANGE_MUSIC_VOLUME, static_cast<u32>(sizeof(SlippiExiTypes::ChangeMusicVolumeQuery) - 1)},
{CMD_PREMADE_TEXT_LENGTH, 0x2},
{CMD_PREMADE_TEXT_LOAD, 0x2},
{CMD_GET_RANK, 0x0},
{CMD_FETCH_RANK, 0x0},
{CMD_GET_RANK_VISIBILITY, 0x0},
};
struct WriteMessage
@@ -257,6 +263,7 @@ class CEXISlippi : public IEXIDevice
void handleCompleteSet(const SlippiExiTypes::ReportSetCompletionQuery &query);
void handleMatchStatusUpdate(const SlippiExiTypes::ReportMatchStatusUpdateQuery &query);
void handleGetPlayerSettings();
void handleGetRank();
// replay playback stuff
void prepareGameInfo(u8 *payload);

View File

@@ -531,6 +531,15 @@ void SlippiMatchmaking::handleMatchmaking()
playerInfo.chatMessages = m_user->GetDefaultChatMessages();
}
json rankEl = el["rank"];
if (rankEl.is_object())
{
playerInfo.rankedRating = rankEl.value("rating", 0.0f);
playerInfo.rankedUpdateCount = rankEl.value("updateCount", 0);
playerInfo.rankedGlobalPlacement = rankEl.value("globalPlacement", 0);
playerInfo.rankedRegionalPlacement = rankEl.value("regionalPlacement", 0);
}
m_playerInfo.push_back(playerInfo);
if (isLocal)
@@ -609,8 +618,11 @@ void SlippiMatchmaking::handleMatchmaking()
// Disconnect and destroy enet client to mm server
terminateMmConnection();
// Report to backend that we are attempting to connect to this match
slprs_exi_device_report_match_status(slprs_exi_device_ptr, matchId.c_str(), "connecting", true);
// If ranked, report to backend that we are attempting to connect to this match
if (matchId.find("mode.ranked") != std::string::npos)
{
slprs_exi_device_report_match_status(slprs_exi_device_ptr, matchId.c_str(), "connecting", true);
}
m_state = ProcessState::OPPONENT_CONNECTING;
ERROR_LOG(SLIPPI_ONLINE, "[Matchmaking] Opponent found. isDecider: %s", m_isHost ? "true" : "false");
@@ -631,6 +643,125 @@ std::vector<u16> SlippiMatchmaking::GetStages()
return m_allowedStages;
}
// This is kind of duplicate code from what exists in rust. Maybe eventually it should be remove
// and exist only on the rust side
SlippiMatchmaking::SlippiRank SlippiMatchmaking::GetPlayerRank(u8 port)
{
if (port >= m_playerInfo.size())
{
return SlippiRank::Unranked;
}
auto info = m_playerInfo[port];
float rating = info.rankedRating;
int updateCount = info.rankedUpdateCount;
int global = info.rankedGlobalPlacement;
int regional = info.rankedRegionalPlacement;
if (updateCount < 5)
{
return SlippiRank::Unranked;
}
if (rating <= 765.42f)
{
return SlippiRank::Bronze1;
}
if (rating > 765.43f && rating <= 913.71f)
{
return SlippiRank::Bronze2;
}
if (rating > 913.72f && rating <= 1054.86f)
{
return SlippiRank::Bronze3;
}
if (rating > 1054.87f && rating <= 1188.87f)
{
return SlippiRank::Silver1;
}
if (rating > 1188.88f && rating <= 1315.74f)
{
return SlippiRank::Silver2;
}
if (rating > 1315.75f && rating <= 1435.47f)
{
return SlippiRank::Silver3;
}
if (rating > 1435.48f && rating <= 1548.06f)
{
return SlippiRank::Gold1;
}
if (rating > 1548.07f && rating <= 1653.51f)
{
return SlippiRank::Gold2;
}
if (rating > 1653.52f && rating <= 1751.82f)
{
return SlippiRank::Gold3;
}
if (rating > 1751.83f && rating <= 1842.99f)
{
return SlippiRank::Platinum1;
}
if (rating > 1843.0f && rating <= 1927.02f)
{
return SlippiRank::Platinum2;
}
if (rating > 1927.03f && rating <= 2003.91f)
{
return SlippiRank::Platinum3;
}
if (rating > 2003.92f && rating <= 2073.66f)
{
return SlippiRank::Diamond1;
}
if (rating > 2073.67f && rating <= 2136.27f)
{
return SlippiRank::Diamond2;
}
if (rating > 2136.28f && rating <= 2191.74f)
{
return SlippiRank::Diamond3;
}
if (rating >= 2191.75f && global > 0 && regional > 0)
{
return SlippiRank::Grandmaster;
}
if (rating > 2191.75f && rating <= 2274.99f)
{
return SlippiRank::Master1;
}
if (rating > 2275.0f && rating <= 2350.0f)
{
return SlippiRank::Master2;
}
if (rating > 2350.0f)
{
return SlippiRank::Master3;
}
return SlippiRank::Unranked;
}
SlippiMatchmaking::MatchmakeResult SlippiMatchmaking::GetMatchmakeResult()
{
return m_mmResult;

View File

@@ -40,6 +40,30 @@ class SlippiMatchmaking
ERROR_ENCOUNTERED,
};
enum SlippiRank
{
Unranked,
Bronze1,
Bronze2,
Bronze3,
Silver1,
Silver2,
Silver3,
Gold1,
Gold2,
Gold3,
Platinum1,
Platinum2,
Platinum3,
Diamond1,
Diamond2,
Diamond3,
Master1,
Master2,
Master3,
Grandmaster
};
struct MatchSearchSettings
{
OnlinePlayMode mode = OnlinePlayMode::RANKED;
@@ -62,6 +86,7 @@ class SlippiMatchmaking
int LocalPlayerIndex();
std::vector<SlippiUser::UserInfo> GetPlayerInfo();
std::string GetPlayerName(u8 port);
SlippiRank GetPlayerRank(u8 port);
std::vector<u16> GetStages();
u8 RemotePlayerCount();
MatchmakeResult GetMatchmakeResult();

View File

@@ -33,6 +33,11 @@ class SlippiUser
std::vector<std::string> chatMessages;
bool isBot = false;
float rankedRating = 0;
int rankedUpdateCount = 0;
int rankedGlobalPlacement = 0;
int rankedRegionalPlacement = 0;
};
SlippiUser(uintptr_t rs_exi_device_ptr);

View File

@@ -101,6 +101,10 @@ void SlippiNetplayConfigPane::InitializeGUI()
_("Make inputs feel more console-like for overclocked GCC to USB "
"adapters at the cost of 1.6ms of input lag (2ms for single-port official adapter)."));
m_slippi_show_player_rank =
new wxCheckBox(this, wxID_ANY, _("Show your rank (Character Select and Ranked Setup Screen)"));
m_slippi_show_opponent_rank = new wxCheckBox(this, wxID_ANY, _("Show opponent's rank (Ranked Setup Screen"));
m_slippi_jukebox_enabled_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Music"));
// WASAPI does not work with this and we want a note for the user.
@@ -180,6 +184,17 @@ void SlippiNetplayConfigPane::InitializeGUI()
main_sizer->Add(sbSlippiInputSettings, 0, wxEXPAND | wxLEFT | wxRIGHT, space5);
main_sizer->AddSpacer(space5);
wxStaticBoxSizer *const sbRankSettings =
new wxStaticBoxSizer(wxVERTICAL, this, _("Rank Settings"));
sbRankSettings->AddSpacer(space5);
sbRankSettings->Add(m_slippi_show_player_rank, 0, wxLEFT | wxRIGHT, space5);
sbRankSettings->AddSpacer(space5);
sbRankSettings->Add(m_slippi_show_opponent_rank, 0, wxLEFT | wxRIGHT, space5);
sbRankSettings->AddSpacer(space5);
main_sizer->Add(sbRankSettings, 0, wxEXPAND | wxLEFT | wxRIGHT, space5);
main_sizer->AddSpacer(space5);
wxStaticBoxSizer *const sbSlippiJukeboxSettings =
new wxStaticBoxSizer(wxVERTICAL, this, _("Slippi Jukebox Settings (Beta)"));
sbSlippiJukeboxSettings->AddSpacer(space5);
@@ -233,6 +248,9 @@ void SlippiNetplayConfigPane::LoadGUIValues()
m_reduce_timing_dispersion_checkbox->SetValue(startup_params.bReduceTimingDispersion);
m_slippi_show_player_rank->SetValue(startup_params.bSlippiPlayerRankDisplay);
m_slippi_show_opponent_rank->SetValue(startup_params.bSlippiOpponentRankDisplay);
m_slippi_jukebox_enabled_checkbox->SetValue(enableJukebox);
m_slippi_jukebox_volume_slider->SetValue(startup_params.iSlippiJukeboxVolume);
m_jukebox_volume_text->SetLabel(wxString::Format("%d %%", startup_params.iSlippiJukeboxVolume));
@@ -267,6 +285,9 @@ void SlippiNetplayConfigPane::BindEvents()
m_reduce_timing_dispersion_checkbox->Bind(wxEVT_CHECKBOX, &SlippiNetplayConfigPane::OnReduceTimingDispersionToggle,
this);
m_slippi_show_player_rank->Bind(wxEVT_CHECKBOX, &SlippiNetplayConfigPane::OnToggleShowPlayerRank, this);
m_slippi_show_opponent_rank->Bind(wxEVT_CHECKBOX, &SlippiNetplayConfigPane::OnToggleShowOpponentRank, this);
m_slippi_jukebox_enabled_checkbox->Bind(wxEVT_CHECKBOX, &SlippiNetplayConfigPane::OnToggleJukeboxEnabled, this);
m_slippi_jukebox_volume_slider->Bind(wxEVT_SLIDER, &SlippiNetplayConfigPane::OnJukeboxVolumeUpdate, this);
}
@@ -353,6 +374,16 @@ void SlippiNetplayConfigPane::OnReduceTimingDispersionToggle(wxCommandEvent &eve
SConfig::GetInstance().bReduceTimingDispersion = m_reduce_timing_dispersion_checkbox->GetValue();
}
void SlippiNetplayConfigPane::OnToggleShowPlayerRank(wxCommandEvent &event)
{
SConfig::GetInstance().bSlippiPlayerRankDisplay = m_slippi_show_player_rank->GetValue();
}
void SlippiNetplayConfigPane::OnToggleShowOpponentRank(wxCommandEvent &event)
{
SConfig::GetInstance().bSlippiOpponentRankDisplay = m_slippi_show_opponent_rank->GetValue();
}
void SlippiNetplayConfigPane::OnToggleJukeboxEnabled(wxCommandEvent &event)
{
bool isEnabled = m_slippi_jukebox_enabled_checkbox->GetValue();

View File

@@ -42,6 +42,10 @@ class SlippiNetplayConfigPane final : public wxPanel
void OnQuickChatChanged(wxCommandEvent &event);
void OnReduceTimingDispersionToggle(wxCommandEvent &event);
void PopulateEnableChatChoiceBox();
void OnToggleJukeboxEnabled(wxCommandEvent &event);
void OnJukeboxVolumeUpdate(wxCommandEvent &event);
void OnToggleShowPlayerRank(wxCommandEvent &event);
void OnToggleShowOpponentRank(wxCommandEvent &event);
wxArrayString m_slippi_enable_quick_chat_strings;
@@ -59,11 +63,12 @@ class SlippiNetplayConfigPane final : public wxPanel
wxCheckBox *m_reduce_timing_dispersion_checkbox;
void OnToggleJukeboxEnabled(wxCommandEvent &event);
wxCheckBox *m_slippi_show_player_rank;
wxCheckBox *m_slippi_show_opponent_rank;
wxCheckBox *m_slippi_jukebox_enabled_checkbox;
DolphinSlider *m_slippi_jukebox_volume_slider;
wxStaticText *m_jukebox_volume_text;
void OnJukeboxVolumeUpdate(wxCommandEvent &event);
};
class SlippiPlaybackConfigPane final : public wxPanel