Difference between revisions of "FRD Savegame"

From 3dbrew
Jump to navigation Jump to search
m (Remove unknown padding field in mydata section (it overlaps with the previous field and is inaccurate))
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
This page describes the contents of the [[Friend_Services|friend]] sysmodule savegame. Except for the config file, all of the data is stored inside a folder that represents the local account ID of the account. For example: /1/account stores the data of the main account.
+
This page describes the contents of the [[Friend_Services|friends]] sysmodule savegame.
 +
 
 +
Save data for the sysmodule has the following general structure:
 +
 
 +
data
 +
├── [[FRD_Savegame#config|config]]
 +
└── <Local Account ID>
 +
    ├── [[FRD_Savegame#account|account]]
 +
    ├── [[FRD_Savegame#friendlist|friendlist]]
 +
    └── [[FRD_Savegame#mydata|mydata]]
 +
 
 +
Despite being generally unused, the sysmodule supports the usage of multiple accounts.
 +
 
 +
Each account gets its own "Local Account ID", and a directory named after this ID. The directory contains all relevant account information.
  
 
== config ==
 
== config ==
 +
 +
This file only contains the local account ID of the currently active account.
 +
 +
The friends sysmodule uses this file to determine which account to load by default.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Offset
+
! Offset !! Size !! Description
! Size
 
! Description
 
 
|-
 
|-
| 0x00
+
| 0x00 || 4 || File magic "FPCF" (Friends Preference Config)
| 4
 
| File magic "FPCF" (Friends Preference Config)
 
 
|-
 
|-
| 0x04
+
| 0x04 || 4 || File magic number (0x20101021)
| 4
 
| File magic number (0x20101021)
 
 
|-
 
|-
| 0x08
+
| 0x08 || 8 || Padding
| 8
 
| Padding
 
 
|-
 
|-
| 0x10
+
| 0x10 || 4 || Current Local Account ID
| 4
 
| Current Local Account ID
 
 
|}
 
|}
  
 
== account ==
 
== account ==
 +
 +
This file stores various essential data related to the corresponding account.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Offset
+
! Offset !! Size !! Description
! Size
 
! Description
 
 
|-
 
|-
| 0x00
+
| 0x00 || 4 || File magic "FPAC" (Friends Preference Account Config)
| 4
 
| File magic "FPAC" (Friends Preference Account Config)
 
 
|-
 
|-
| 0x04
+
| 0x04 || 4 || File magic number (0x20101021)
| 4
 
| File magic number (0x20101021)
 
 
|-
 
|-
| 0x08
+
| 0x08 || 8 || Padding
| 8
 
| Padding
 
 
|-
 
|-
| 0x10
+
| 0x10 || 4 || Local Account ID
| 4
 
| Local Account ID
 
 
|-
 
|-
| 0x14
+
| 0x14 || 4 || PrincipalID
| 4
 
| PrincipalID
 
 
|-
 
|-
| 0x18
+
| 0x18 || 8 || LocalFriendCode
| 8
 
| LocalFriendCode
 
 
|-
 
|-
| 0x20
+
| 0x20 || (16 + 1) * 2 || 16-character UTF-16 NEX Password (16 characters + NULL termination)
| (16 + 1) * 2
 
| NEX Password
 
 
|-
 
|-
| 0x42
+
| 0x42 || (8 + 1) * 2 || 8-character UTF-16 PrincipalID HMAC (Used for logging into NASC server) (8 characters + NULL termination)
| (8 + 1) * 2
 
| PrincipalID HMAC (Used for logging into NASC server)
 
 
|-
 
|-
| 0x54
+
| 0x54 || 1 || NASC Environment (0: Production, 1: Testing, 2: Development)
| 1
 
| NASC Environment (0: Prod, 1: Test, 2: Dev)
 
 
|-
 
|-
| 0x55
+
| 0x55 || 1 || [[Friend_Services#Server_Types|Server type]] letter value
| 1
 
| [[Friend_Services#Server_Types|Server type]] letter value
 
 
|-
 
|-
| 0x56
+
| 0x56 || 1 || [[Friend_Services#Server_Types|Server type]] number value
| 1
 
| [[Friend_Services#Server_Types|Server type]] number value
 
 
|-
 
|-
| 0x57
+
| 0x57 || 1 || Padding
| 1
 
| Padding
 
 
|}
 
|}
  
 
== mydata ==
 
== mydata ==
 +
 +
Stores console-specific information related to the account.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Offset
+
! Offset !! Size !! Description
! Size
+
|-
! Description
+
| 0x00 || 4 || File magic "FPMD" (Friends Preference My Data/Device)
 
|-
 
|-
| 0x00
+
| 0x04 || 4 || File magic number (0x20101021)
| 4
 
| File magic "FPMD" (Friends Preference My Data/Device)
 
 
|-
 
|-
| 0x04
+
| 0x08 || 8 || Padding
| 4
 
| File magic number (0x20101021)
 
 
|-
 
|-
| 0x08
+
| 0x10 || 4 || My NC Principal ID
| 8
 
| Padding
 
 
|-
 
|-
| 0x10
+
| 0x14 || 4 || Unknown
| 4
 
| My NC Principal ID
 
 
|-
 
|-
| 0x14
+
| 0x18 || 4 || [[FRD_Savegame#Change_Bit_Flags|Change bit flag]]
| 4
 
| Unknown
 
 
|-
 
|-
| 0x18
+
| 0x1C || 3 || [[Friend_Services#Preference|Preferences]]
| 4
 
| [https://github.com/kinnay/NintendoClients/wiki/Friends-Protocol-(3DS)#nintendopresence-structure Changed bit flags]
 
 
|-
 
|-
| 0x1C
+
| 0x1F || 1 || Padding
| 1
 
| Is public mode
 
 
|-
 
|-
| 0x1D
+
| 0x20 || 0x10 || [[Friend_Services#GameKey|GameKey]] of favorite title
| 1
 
| Is show game mode
 
 
|-
 
|-
| 0x1E
+
| 0x30 || (16 + 1) * 2 || 16-Character UTF-16 personal message (comment) (16 characters + NULL termination)
| 1
 
| Is show played game
 
 
|-
 
|-
| 0x1F
+
| 0x52 || 1 || First byte of the console's LocalFriendCodeSeed
| 1
 
| Padding
 
 
|-
 
|-
| 0x20
+
| 0x53 || 5 || Padding
| 0x10
 
| GameKey of my favorite game:
 
  u64 title_id
 
  u32 title_version
 
  u32 unknown
 
 
|-
 
|-
| 0x30
+
| 0x58 || 8 || [[Friend_Services#Profile|Profile]]
| 16 * 2
 
| UTF16 string of personal message
 
 
|-
 
|-
| 0x50
+
| 0x60 || 8 || u64, LocalFriendCodeSeed
| 8
 
| Unknown
 
 
|-
 
|-
| 0x58
+
| 0x68 || (12 + 1) * 2 || 12-character UTF-16 MAC address (only the digits) (12 characters + NULL termination)
| 8
 
|  
 
  u8 region
 
  u8 country
 
  u8 area
 
  u8 language
 
  u8 platform = 2
 
  u8 padding[3]
 
 
|-
 
|-
| 0x60
+
| 0x82 || (15 + 1) * 2 || 15-character UTF-16 console serial number without the checksum digit (15 characters + NULL termination)
| 8
 
| LocalFriendCodeSeed u64
 
 
|-
 
|-
| 0x68
+
| 0xA2 || (10 + 1) * 2 || 10-character UTF-16 Display name (10 characters + NULL termination)
| (12 + 1) * 2
 
| UTF16 string of MAC address of the console (only the digits)
 
 
|-
 
|-
| 0x82
+
| 0xBB || 0x60 || [[Friend_Services#Mii_Data|Mii data]]
| (15 + 1) * 2
 
| UTF16 string of console serial number without the checksum digit
 
 
|-
 
|-
| 0xA2
+
| 0x11B || 5 || Padding
| (10 + 1) * 2
+
|}
| UTF16 string of Display name
+
 
 +
=== Change Bit Flags ===
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0xBB
+
! Value !! Description
| 0x60
 
| Unaligned [[Mii#Mii_format|Mii data]]
 
 
|-
 
|-
| 0x11B
+
| 1 || [[Friend_Services#GameKey|Game Key]] changed.
| 5
+
|-
| Padding (0x120)
+
| 2 || Game mode description changed.         
 +
|-
 +
| 4 || Join availability flag changed.       
 +
|-
 +
| 8 || Matchmake system type changed.         
 +
|-
 +
| 16 || Join game ID changed.                 
 +
|-
 +
| 32 || Join game mode changed.               
 +
|-
 +
| 64 || Owner [PID] changed.                   
 +
|-
 +
| 128 || Join group ID changed.                 
 +
|-
 +
| 256 || Application argument changed.         
 
|}
 
|}
  
 
== friendlist ==
 
== friendlist ==
 +
 +
Contains the friend list associated with the account.
  
 
=== Header ===
 
=== Header ===
Line 187: Line 145:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Offset
+
! Offset !! Size !! Description
! Size
 
! Description
 
 
|-
 
|-
| 0x00
+
| 0x00 || 4 || File magic "FPFL" (Friends Preference Friend List)
| 4
 
| File magic "FPFL" (Friends Preference Friend List)
 
 
|-
 
|-
| 0x04
+
| 0x04 || 4 || File magic number (0x20101021)
| 4
 
| File magic number (0x20101021)
 
 
|-
 
|-
| 0x08
+
| 0x08 || 8 || Padding
| 8
 
| Padding
 
 
|-
 
|-
| 0x10
+
| 0x10 || 100 * 0x100 || [[FRD_Savegame#Friend_entry|Friend entries]] (maximum 100)
| ? * 0x100
 
| [[FRD_Savegame#Friend_entry|Friend entries]]...
 
 
|}
 
|}
  
Line 212: Line 160:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Offset
+
! Offset !! Size !! Description
! Size
 
! Description
 
 
|-
 
|-
| 0x00
+
| 0x00 || 0x10 || [[Friend_Services#FriendKey|FriendKey]] of this friend
| 0x10
 
| FriendKey:
 
  u32 principal_id
 
  u32 padding
 
  u64 friend_code
 
 
|-
 
|-
| 0x10
+
| 0x10 || 0x4 || NC Principal ID of this friend
| 0x4
 
| Unknown
 
 
|-
 
|-
| 0x14
+
| 0x14 || 1 || [[Friend_Services#Relationship_Types|Relationship]] with this friend
| 1
 
| Friend relationship
 
 
|-
 
|-
| 0x15
+
| 0x15 || 8 || [[Friend_Services#Profile|Profile]] of this friend
| 8
 
|  
 
  u8 region
 
  u8 country
 
  u8 area
 
  u8 language
 
  u8 platform = 2
 
  u8 padding[3]
 
 
|-
 
|-
| 0x1D
+
| 0x1D || 3 || Padding
| 3
 
| Padding
 
 
|-
 
|-
 
+
| 0x20 || 0x10 || [[Friend_Services#GameKey|GameKey]] of this friend's favorite title
| 0x20
+
|-
| 0x10
+
| 0x30 || (16 + 1) * 2 || 16-character UTF-16 personal message (comment) of this friend (16 characters + NULL termination)
| GameKey of friend favorite game:
+
|-
  u64 title_id
+
| 0x52 || 0x6 || padding
  u32 title_version
 
  u32 unknown
 
 
|-
 
|-
| 0x30
+
| 0x58 || 8 || NEX timestamp for the last time this friend updated their personal comment (message)
| 16 * 2
 
| UTF16 string of personal message
 
 
|-
 
|-
| 0x50
+
| 0x60 || 8 || NEX timestamp for the last time this friend updated their Mii
| 0x8
 
| Unknown
 
 
|-
 
|-
| 0x58
+
| 0x68 || 8 || NEX timestamp for the last time this friend was seen online
| 8
 
| Message update [https://github.com/kinnay/NintendoClients/wiki/NEX-Common-Types#datetime timestamp]
 
 
|-
 
|-
| 0x60
+
| 0x70 || 0x60 || [[Friend_Services#Mii_Data|Mii data]]
| 8
 
| Mii update [https://github.com/kinnay/NintendoClients/wiki/NEX-Common-Types#datetime timestamp]
 
 
|-
 
|-
| 0x68
+
| 0xD0 || (10 + 1) * 2 || 10-character UTF-16 Display name (10 characters + NULL termination)
| 8
 
| Last online [https://github.com/kinnay/NintendoClients/wiki/NEX-Common-Types#datetime timestamp]
 
 
|-
 
|-
| 0x70
+
| 0xE6 || 1 || bool, profanity flag
| 0x60
 
| [[Mii#Mii_format|Mii data]]
 
 
|-
 
|-
| 0xD0
+
| 0xE7 || 1 || u8, [[Mii#Mii_format|Mii character set]]
| (10 + 1) * 2
 
| UTF16 string of display name
 
 
|-
 
|-
| 0xE8
+
| 0xE8 || 8 || NEX timestamp for when this friend was added
| 8
 
| Friendship? [https://github.com/kinnay/NintendoClients/wiki/NEX-Common-Types#datetime timestamp]
 
 
|-
 
|-
| 0xF0
+
| 0xF0 || 8 || Appears to be identical to the timestamp at offset 0x58.
| 8
 
| Same as 0x58?
 
 
|-
 
|-
| 0xF8
+
| 0xF8 || 8 || Appears to be identical to the timestamp at offset 0x60.
| 8
 
| Same as 0x60?
 
 
|}
 
|}

Latest revision as of 22:05, 10 January 2025

This page describes the contents of the friends sysmodule savegame.

Save data for the sysmodule has the following general structure:

data
├── config
└── <Local Account ID>
    ├── account
    ├── friendlist
    └── mydata

Despite being generally unused, the sysmodule supports the usage of multiple accounts.

Each account gets its own "Local Account ID", and a directory named after this ID. The directory contains all relevant account information.

config[edit]

This file only contains the local account ID of the currently active account.

The friends sysmodule uses this file to determine which account to load by default.

Offset Size Description
0x00 4 File magic "FPCF" (Friends Preference Config)
0x04 4 File magic number (0x20101021)
0x08 8 Padding
0x10 4 Current Local Account ID

account[edit]

This file stores various essential data related to the corresponding account.

Offset Size Description
0x00 4 File magic "FPAC" (Friends Preference Account Config)
0x04 4 File magic number (0x20101021)
0x08 8 Padding
0x10 4 Local Account ID
0x14 4 PrincipalID
0x18 8 LocalFriendCode
0x20 (16 + 1) * 2 16-character UTF-16 NEX Password (16 characters + NULL termination)
0x42 (8 + 1) * 2 8-character UTF-16 PrincipalID HMAC (Used for logging into NASC server) (8 characters + NULL termination)
0x54 1 NASC Environment (0: Production, 1: Testing, 2: Development)
0x55 1 Server type letter value
0x56 1 Server type number value
0x57 1 Padding

mydata[edit]

Stores console-specific information related to the account.

Offset Size Description
0x00 4 File magic "FPMD" (Friends Preference My Data/Device)
0x04 4 File magic number (0x20101021)
0x08 8 Padding
0x10 4 My NC Principal ID
0x14 4 Unknown
0x18 4 Change bit flag
0x1C 3 Preferences
0x1F 1 Padding
0x20 0x10 GameKey of favorite title
0x30 (16 + 1) * 2 16-Character UTF-16 personal message (comment) (16 characters + NULL termination)
0x52 1 First byte of the console's LocalFriendCodeSeed
0x53 5 Padding
0x58 8 Profile
0x60 8 u64, LocalFriendCodeSeed
0x68 (12 + 1) * 2 12-character UTF-16 MAC address (only the digits) (12 characters + NULL termination)
0x82 (15 + 1) * 2 15-character UTF-16 console serial number without the checksum digit (15 characters + NULL termination)
0xA2 (10 + 1) * 2 10-character UTF-16 Display name (10 characters + NULL termination)
0xBB 0x60 Mii data
0x11B 5 Padding

Change Bit Flags[edit]

Value Description
1 Game Key changed.
2 Game mode description changed.
4 Join availability flag changed.
8 Matchmake system type changed.
16 Join game ID changed.
32 Join game mode changed.
64 Owner [PID] changed.
128 Join group ID changed.
256 Application argument changed.

friendlist[edit]

Contains the friend list associated with the account.

Header[edit]

Offset Size Description
0x00 4 File magic "FPFL" (Friends Preference Friend List)
0x04 4 File magic number (0x20101021)
0x08 8 Padding
0x10 100 * 0x100 Friend entries (maximum 100)

Friend entry[edit]

Offset Size Description
0x00 0x10 FriendKey of this friend
0x10 0x4 NC Principal ID of this friend
0x14 1 Relationship with this friend
0x15 8 Profile of this friend
0x1D 3 Padding
0x20 0x10 GameKey of this friend's favorite title
0x30 (16 + 1) * 2 16-character UTF-16 personal message (comment) of this friend (16 characters + NULL termination)
0x52 0x6 padding
0x58 8 NEX timestamp for the last time this friend updated their personal comment (message)
0x60 8 NEX timestamp for the last time this friend updated their Mii
0x68 8 NEX timestamp for the last time this friend was seen online
0x70 0x60 Mii data
0xD0 (10 + 1) * 2 10-character UTF-16 Display name (10 characters + NULL termination)
0xE6 1 bool, profanity flag
0xE7 1 u8, Mii character set
0xE8 8 NEX timestamp for when this friend was added
0xF0 8 Appears to be identical to the timestamp at offset 0x58.
0xF8 8 Appears to be identical to the timestamp at offset 0x60.