Skip to content

Instantly share code, notes, and snippets.

@khang06
Last active January 2, 2020 18:40
Show Gist options
  • Save khang06/00e4e62c9572ee2c4a959b2f2c459329 to your computer and use it in GitHub Desktop.
Save khang06/00e4e62c9572ee2c4a959b2f2c459329 to your computer and use it in GitHub Desktop.
(almost) everything that gets sent to nintendo through play reports/splatnet2 in splatoon 2
please visit https://wiki.oatmealdome.me/Telemetry, it's much more well-formatted and is on a wiki
4.1.0 play report/splatnet2 stuff revision 2 (oct 23 2018) by khangaroo
thanks to oatmealdome and shadow for some help
events that have only been statically analyzed are marked with (?)
events that are a big mystery for one reason or another are marked with (???)
3.1.0 function names are used where possible, anything else is the ida name
you can help out with documentation by dumping your own play report data!
1. download my fork of a fork of compelled-disclosure from https://cdn.discordapp.com/attachments/278666973779329024/504466039233445888/Compelled-Disclosure.nro (source available at https://github.com/khang06/Compelled-Disclosure)
2. open up splatoon 2 and play like you normally would
3. close it after you're done and launch compelled-disclosure (this will not work after a reboot)
4. copy sdmc:/switch/compelled_disclosure/80000000000000a1/data/XXXXXXXXXXXXXXXX.msgpack to your pc (the one with the highest number is the latest one)
5. put the msgpack into https://kawanet.github.io/msgpack-lite/ for a nice and clean output
6. datamine away
7. reboot your console before it crashes because this kills bcat
please do not send your msgpack to anyone as it contains console and account-specific information, compare your dump with this list and post your findings instead
Cmn::PlayReport::prepareAndGetPlayReport (prepended to every event)
app_version // (utf8) splatoon 2 version
ctrl_style // (int) control style (motion or stick, handheld or tv)
Cmn::PlayReport::addVersusCommonKeyValueImpl_ (prepended to Game::SeqMgrVersus::savePlayReportDeathEvent_ and Game::SeqVersusResult::savePlayReport_)
udemae // (int) rank (-1 if not applicable)
mmr // (float) mmr/power
rd // (float) rating deviation
xmmr // (float) x power
xrd // (float) x rating deviation
xrank // (int) ??? (i'm not x rank, so it's -1)
xversus_count // (int) number of x rank matches (-1 for me)
has_crown // (bool) is in x rank top 500
season_id // (utf8) ??? (blank for all)
money // (int) money
turban_shell // (int) super sea snails
inet_versus_count_total // (int) total online battles
i_nu // (array) player unique id
Cmn::PlayReport::saveBootEventMain_ (event_id of boot_event2)
player_model_type // (int) player gender/type
player_model_hair // (int) player hair style
player_model_bottom // (int) player pants style
player_model_skin_color // (int) player skin color
player_model_eye_color // (int) player eye color
ctrl_option_tv_style_cam_speed_stick // (float) tv stick sensitivity
ctrl_option_tv_style_cam_speed_gyro // (float) tv gyro sensitivity
ctrl_option_tv_style_is_enable_gyro // (bool) motions controls for tv
ctrl_option_tv_style_is_reverse_ud // (bool) vertically reversed for tv
ctrl_option_tv_style_is_reverse_lr // (bool) horizontally reversed for tv
ctrl_option_hh_style_cam_speed_stick // (float) handheld/tabletop stick sensitivity
ctrl_option_hh_style_cam_speed_gyro // (float) handheld/tabletop gyro sensitivity
ctrl_option_hh_style_is_enable_gyro // (bool) motions controls for handheld/tabletop
ctrl_option_hh_style_is_reverse_ud // (bool) vertically reversed for handheld/tabletop
ctrl_option_hh_style_is_reverse_lr // (bool) horizontally reversed for handheld/tabletop
online_play_penalty_penalty_count // (int) number of penalties for online
online_play_penalty_penalty_point // (int) penalty severity for online
time_location_for_seq // (utf8) time zone
money // (int) money
turban_shell // (int) super sea snails
is_enable_color_support // (bool) color lock
is_disable_coconut // (bool) plaza drawings disabled
i_nu // (array) player unique id
player_rank // (int) level
star_rank // (int) stars
udemae_cVar // (int) splat zones rank
udemae_cVlf // (int) tower control rank
udemae_cVgl // (int) rainmaker rank
udemae_cVcl // (int) clam blitz rank
mmr_cRegular // (float) turf war mmr/power (viewable through splathex)
mmr_cGachi_cVar // (float) splat zones mmr/power
mmr_cGachi_cVlf // (float) tower control mmr/power
mmr_cGachi_cVgl // (float) rainmaker mmr/power
mmr_cGachi_cVcl // (float) clam blitz mmr/power
xmmr_cGachi_cVar // (float) splat zones x power
xmmr_cGachi_cVlf // (float) tower control x power
xmmr_cGachi_cVgl // (float) rainmaker x power
xmmr_cGachi_cVcl // (float) clam blitz x power
rd_cRegular // (float) turf war rating deviation
rd_cGachi_cVar // (float) splat zones rating deviation
rd_cGachi_cVlf // (float) tower control rating deviation
rd_cGachi_cVgl // (float) rainmaker rating deviation
rd_cGachi_cVcl // (float) clam blitz rating deviation
xrd_cGachi_cVar // (float) splat zones x rating deviation
xrd_cGachi_cVlf // (float) tower control x rating deviation
xrd_cGachi_cVgl // (float) rainmaker x rating deviation
xrd_cGachi_cVcl // (float) clam blitz x rating deviation
inet_versus_count_total // (int) total online battles
inet_versus_count_cRegular // (int) total online turf war battles
inet_versus_count_cGachi // (int) total ranked battles
inet_versus_count_cFest // (int) total splatfest battles
inet_versus_count_cPrivate // (int) total private battles
inet_versus_count_cLeague // (int) total league battles
mission_ikura_num // (int) power eggs in octo canyon/singleplayer
mission_is_clear_normal_map_num // (int) number of normal stages beaten in octo canyon/singleplayer
mission_is_clear_last_boss_stage // (bool) boss beaten in octo canyon/singleplayer
coop_grade // (int) salmon run rank
coop_grade_point // (int) salmon run exp
coop_tutorial_phase // (int) salmon run tutorial state
coop_play_count // (int) total salmon run matches
mem_identity_check // (utf8) half sha256 of certain romfs files
Cmn::PlayReport::saveBootEventMission_ (event_id of boot_mission_detail_event)
stageXXX_weapon_clear_flag // (int) weapons the stage was cleared with
stageXXX_item_flag // (int) collectibles collected in the stage
sub_7101242EFC (event_id of boot_ch_event) (obfuscated bullshit) (???)
ch0 // (utf8) probably a half sha256 of something
ch1 // (utf8) probably a half sha256 of something
ch2 // (utf8) probably a half sha256 of something
ch3 // (utf8) probably a half sha256 of something
ch4 // (utf8) probably a half sha256 of something
Cmn::SaveDataVss::UdemaeX::validate (event_id of runtime_undisplayed_error) (maybe a failed check? i'll look into it later) (?)
error_id // (int) ???
detail // (int) ???
Cnet::CoopMatchmakeExe::onSendPlayReportMatchEnd (event_id of match_coop_finish_event2)
player_rank // (int) level (as in level 69 and not salmon run ranks)
star_rank // (int) stars
money // (int) money
grade // (int) salmon run rank
grade_point // (int) salmon run exp
match_result // (int) ??? (got a team wipe and was 1)
total_sec // (int) ??? (doesn't appear to be match time)
session_id // (int) match id
with_friend // (int) ??? (0 without friend, what's the value in a friend room?)
rtt_average // (int) average round-trip time
rtt_median // (int) median round-trip time
rtt_worst // (int) worst round-trip time
is_coral_v2_room // (bool) voice chat enabled
is_coral_v2_save // (bool) ??? (appears to be 1 even if above is false)
mem_identity_check // (utf8) half sha256 of certain romfs files
Cnet::VersusMatchmakeExe::onSendPlayReportMatchEnd (event_id of match_vs_finish_event2)
match_result // (int) ??? (1 on both a win and loss for me, maybe it's set based on alpha or bravo)
total_sec // (int) ??? (doesn't appear to be match time)
league_player_num // (int) ??? (0 if not in league)
league_tag_id // (int) ??? (0 if not in league)
league_id // (int) ??? (0 if not in league)
fest_team // (int) splatfest team
fest_mode // (int) pro or regular
fest_regular_win_count // (int) individual win count
fest_regular_win_count_team // (int) group win count
fest_friends_num // (int) amount of friends in the group
joint_session_status // (int) ??? (maybe set if host?)
rtt_average // (int) average round-trip time
rtt_median // (int) median round-trip time
rtt_worst // (int) worst round-trip time
network_time // (int) time of results recorded (unix time, calibrated to current time zone)
is_coral_v2_room // (bool) voice chat enabled
is_coral_v2_save // (bool) ??? (appears to be 1 even if above is false)
mem_identity_check // (utf8) half sha256 of certain romfs files
Cnet::ErrorCallback::sendPlayReport (event_id of network_error_event) (maybe sent on communication error) (?)
net_mode // (int) network mode (internet, local, lan)
game_mode // (int) game mode (turf war, splat zones, etc)
game_rule // (int) game settings
is_game_scene // (bool) menu or not (false = in-game)
stage_id // (int) stage id
weapon_id // (int) current weapon id
error_from // (int) ???
error_common // (int) ???
error_extra // (int) ???
is_online_lounge // (int) online lounge (not a bool for some reason)
session_id // (int) match id
Cnet::Utl::tryGetNetworkServiceAccount (event_id of runtime_undisplayed_error) (maybe a failed check? i'll look into it later) (?)
error_id // (int) ???
detail // (int) ???
result_module // (int) ???
result_desc // (int) ???
Game::SeqMgrMissionOcta::load + Game::SeqMgrMissionOcta::doPlayReport_ (event_id of mission_octa_stage_result_event)
stage_no // (int) station id
weapon_id // (int) weapon used
is_clear // (bool) cleared or not (looks like this function is used for more than just station completion)
ikura_num // (int) power eggs (not total, but collected in station)
play_time // (float) elapsed time in seconds
weapon_clear_flag // (int) what weapon choices were used
miss_num // (int) station death count
life_num // (int) lives left
money // (int) money
debt // (int) debt
is_octa_clear // (bool) normal final boss complete
medal_flag // (int) mem cake id
Game::SeqMgrMission::load + Game::SeqMgrMission::doPlayPeport_ (event_id of mission_stage_result_event) (that's not a typo, it's really called peport internally unlike above)
weapon_id // (int) weapon used
is_clear // (bool) cleared or not (looks like this function is used for more than just level completion)
ikura_num // (int) power eggs (not total, but collected in level)
play_time // (int) elapsed time in seconds
dead_num // (int) level death count
has_document // (bool) obtained scroll document thing during level
has_parts // (bool) set if above is true
has_ticket // (bool) set if above is true
weapon_clear_flag // (int) what weapon choices were used
mainX_level // (int) level of main weapons (-1 if unobtained, 0 if lv1, etc)
has_subX // (bool) subweapon obtained
tank_level // (int) tank upgrades
Game::OnlineVersusResultExe::stateUploadXPower (event_id of runtime_undisplayed_error) (maybe a failed check? i'll look into it later) (?)
error_id // (int) ???
detail // (int) ???
Game::SeqMgrVersus::savePlayReportDeathEvent_ (event_id of versus_death_event2) (?)
count_sec // (int) match time at death
death_count // (int) previous death count
reason_kind // (int) ???
reason_id // (int) ???
attacker_idx // (int) player index of attacker
attacker_pos_x // (float) attacker x position
attacker_pos_y // (float) attacker y position
attacker_pos_z // (float) attacker z position
victim_pos_x // (float) victim x position
victim_pos_y // (float) victim y position
victim_pos_z // (float) victim z position
victim_team // (int) victim team (why isn't this a bool? maybe spectator counts as a team lmao)
Game::SeqVersusResult::savePlayReport_ (event_id of versus_result_event2)
weapon_id // (int) weapon used
cHead_gear_id // (int) hat id
cHead_gear_power_main // (int) hat main ability
cHead_gear_power_sub0 // (int) hat first sub ability
cHead_gear_power_sub1 // (int) hat second sub ability
cHead_gear_power_sub2 // (int) hat third sub ability
cClothes_gear_id // (int) shirt id
cClothes_gear_power_main // (int) shirt main ability
cClothes_gear_power_sub0 // (int) shirt first sub ability
cClothes_gear_power_sub1 // (int) shirt second sub ability
cClothes_gear_power_sub2 // (int) shirt third sub ability
cShoes_gear_id // (int) shoes id
cShoes_gear_power_main // (int) shoes main ability
cShoes_gear_power_sub0 // (int) shoes first sub ability
cShoes_gear_power_sub1 // (int) shoes second sub ability
cShoes_gear_power_sub2 // (int) shoes third sub ability
report_versus_count // (int) ???
versus_sec // (int) match time
team_score_cAlpha // (int) team alpha score
team_score_cBravo // (int) team bravo score
is_win // (bool) play report sender team winning
is_minority // (bool) true for the team with fewer people
personal_score_paint // (int) points
personal_score_kill // (int) kill count
personal_score_assist // (int) assist count
personal_score_special // (int) special count
personal_score_death // (int) death count
packet_loss_rate // (float) percentage of packets lost
bit_rate_result // (int) ??? (maybe only dumped if using voice chat)
bit_rate_packet_size // (int) ??? (maybe only dumped if using voice chat)
fest_team // (int) splatfest team
fest_mode // (int) pro or regular
fest_heavy_weight_match // (int) 1x, 10x, or 100x
fest_bonus_rate // (float) exp multiplier
fest_contribution // (int) ???
fest_contribution_sum // (int) ???
fest_regular_win_count // (int) individual splatfest win count (regular only?)
fest_regular_win_count_team // (int) group splatfest win count (regular only?)
fest_same_team_match // (int) battle between the same team (why is this an int?)
fest_friends_num // (int) number of friends in group
fest_rank // (int) splatfest rank
sub_7100255370 (event_id of invalid_setting_event) (?) (???)
net_mode // (int) network mode (internet, local, lan)
session_id // (int) match id
player_name // (utf8) player name (what player?)
player_idx // (int) ???
stage_id // (int) stage id
game_rule // (int) match settings
game_mode // (int) game mode
sub_7100DC7088 (called by sub_7100DC6BE4 and sub_7100DC6ECC) (obfuscated bullshit) (?) (???)
reason // (???) ???
player_name // (utf8) ???
i_ns // (array) ???
i_nu // (array) sender unique id
sub_7100DC6BE4 (event_id of versus_ch_event) (obfuscated bullshit) (?) (???)
// ???
sub_71000BBEDC (referenced by Cmn::PlayReport::addVersusCommonKeyValueImpl_, versus_ch_event, and versus_other_event)
net_mode // (int) network mode (internet, local, lan)
game_mode // (int) game mode
game_rule // (int) match settings
session_id // (int) session id
start_clock // (int) ??? (not unix time)
stage_name // (utf8) stage name
sub_7100DC6ECC (event_id of coop_ch_event) (obfuscated bullshit) (?) (???)
session_id // (int) session id
sub_710116AF60 (event_id of invalid_connection_player) (?) (???)
// ???
sub_710117F144 (event_id of versus_other_event)
// seems to be about the player who performed the action and NOT the play report sender
// maybe this is versus_result_event2 but for other people
player_idx // (int) player index (0 to 6)
player_model_type // (int) player gender/type
player_model_hair // (int) player hair style
player_model_bottom // (int) player pants style
player_model_skin_color // (int) player skin color
player_model_eye_color // (int) player eye color
team // (int) team
weapon_id // (int) weapon used
mmr // (float) mmr/power
rd // (float) rating deviation
xmmr // (float) x power
xrd // (float) x rating deviation
player_rank // (int) player level
star_rank // (int) player star count
win_lose_diff // (int) ??? (always 0 for me)
is_win // (bool) win or loss
is_minority // (bool) true for the team with fewer people
personal_score_paint // (int) points
personal_score_kill // (int) kill count
personal_score_assist // (int) assist count
personal_score_special // (int) special count
personal_score_death // (int) death count
i_ns // (array) ???
i_nu // (array) sender unique id
player_name // (utf8) player name
personal_u_score // (int) ???
personal_score0 // (int) ???
personal_score1 // (int) ???
personal_score2 // (int) ???
personal_score3 // (int) ???
report_versus_count // (int) ???
Game::Coop::ResultPlayReport::save (event_id of coop_online_result_event)
grade // (int) salmon run rank
grade_point // (int) salmon run exp
grade_before // (int) rank before match
grade_point_before // (int) exp before match
difficulty // (int) ???
stage // (int) map id
result // (int) ???
final_wave // (int) ??? (probably always 2)
wave_event_X // (int) events like glowflies, fog, etc
wave_water_X // (int) water level
wave_golden_ikura_per_X // (int) ???
wave_dead_count_X // (int) boss death count
normal_ikura_num // (int) total power eggs
golden_ikura_num // (int) total golden eggs
point // (int) ???
total_point // (int) ???
begin_time // (utf8) current schedule begin time
uncooperative_player // (bool) ??? (what triggers this?)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment