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
−
| 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?
|}
|}