Jump to content

Ver3StoreData: Difference between revisions

From Mii Technical Wiki
No edit summary
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
This is the [[Mii Character Data|Mii data format]] ([[Mii Character Versions|''Version 3'']]) used on [[CFL|3DS]] and [[FFL|Wii U]]. It's also read/written on [[nn::mii|Switch]] for amiibo.
This is the [[Mii Character Data|Mii data format]] ''([[Mii Character Versions|Version 3]])'' used on [[CFL|3DS]] and [[FFL|Wii U]]. It's also read/written on [[nn::mii|Switch]] for amiibo.


It is 96 bytes long, and contains a [[CRC-16]] checksum at the end.
It is 96 bytes long, and contains a [[CRC-16]] checksum at the end.


===== Names =====
== Other Names ==
This format is known by many different names, which is a source for confusion. It was introduced on the 3DS.
This format is known by many different names, which is a source for confusion. It was introduced on the 3DS.


Line 18: Line 18:
* Switch (NintendoSDK, nn::mii)
* Switch (NintendoSDK, nn::mii)
** nn::mii::Ver3StoreData
** nn::mii::Ver3StoreData
== Struct Format ==
This sample is given in Rust, with libraries binrw and bilge. This sample is edited for clarity and the full sample can be found here<ref>https://github.com/j0lol/vee/blob/f134e28eec22bdf8587d5abbf0f2d0f1ffc5b8a5/crates/vee_parse/src/ctr.rs#L1</ref>.<syntaxhighlight lang="rust">
#[bitfield(32)]
pub struct PersonalInfo1Field {
    pub char_version: u8,
    pub copyable: u1,
    pub ng_word: u1,
    pub region_move: u2,
    pub font_region: u2,
    pub reserved_0: u2,
    pub room_index: u4,
    pub position_in_room: u4,
    pub author_type: u4,
    pub birth_platform: u3,
    pub reserved_1: u1,
}
#[bitfield(16)]
pub struct PersonalInfo2Field {
    pub gender: u1,
    pub birth_month: u4,
    pub birth_day: u5,
    pub favorite_color: u4,
    pub favorite: u1,
    pub padding: u1,
}
#[bitfield(16)]
pub struct FaceField {
    pub local_only: u1,
    pub face_type: u4,
    pub face_color: u3,
    pub face_texture: u4,
    pub face_makeup: u4,
}
#[bitfield(16)]
pub struct HairField {
    pub hair_type: u8,
    pub hair_color: u3,
    pub hair_flip: u1,
    pub padding: u4,
}
#[bitfield(16)]
pub struct EyeField {
    pub eye_type: u6,
    pub eye_color: u3,
    pub eye_scale: u4,
    pub eye_aspect: u3,
}
#[bitfield(16)]
pub struct EyePositionField {
    pub eye_rotate: u5,
    pub eye_x: u4,
    pub eye_y: u5,
    pub padding: u2,
}
#[bitfield(16)]
pub struct EyebrowField {
    pub eyebrow_type: u5,
    pub eyebrow_color: u3,
    pub eyebrow_scale: u4,
    pub eyebrow_aspect: u3,
    pub padding_3: u1,
}
#[bitfield(16)]
pub struct EyebrowPositionField {
    pub eyebrow_rotate: u5,
    pub eyebrow_x: u4,
    pub eyebrow_y: u5,
    pub padding: u2,
}
#[bitfield(16)]
pub struct NoseField {
    pub nose_type: u5,
    pub nose_scale: u4,
    pub nose_y: u5,
    pub padding: u2,
}
#[bitfield(16)]
pub struct MouthField {
    pub mouth_type: u6,
    pub mouth_color: u3,
    pub mouth_scale: u4,
    pub mouth_aspect: u3,
}
#[bitfield(16)]
pub struct MouthPositionField {
    pub mouth_y: u5,
    pub mustache_type: u3,
    pub padding: u8,
}
#[bitfield(16)]
pub struct BeardField {
    pub beard_type: u3,
    pub beard_color: u3,
    pub mustache_scale: u4,
    pub mustache_y: u5,
    pub padding_7: u1,
}
#[bitfield(16)]
pub struct GlassField {
    pub glass_type: u4,
    pub glass_color: u3,
    pub glass_scale: u4,
    pub glass_y: u5,
}
#[bitfield(16)]
pub struct MoleField {
    pub mole_type: u1,
    pub mole_scale: u4,
    pub mole_x: u5,
    pub mole_y: u5,
    pub padding_8: u1,
}
#[binrw]
pub struct CtrAuthorId {
    pub data: [u8; 8],
}
// FFLiCreateID
#[binrw]
pub struct CtrCreateId {
    pub data: [u8; 10],
}
/// A packed character info format.
/// This structure has a lot of bitfields.
/// These fields have been given speculative names.
///
/// This format is known as `.ffsd`.
#[binrw]
#[brw(little)]
#[derive(Debug)]
pub struct CtrStoreData {
    pub personal_info_1: PersonalInfo1Field,
    pub author_id: CtrAuthorId,
    pub create_id: CtrCreateId,
    pub reserved: [u8; 2],
    pub personal_info_2: PersonalInfo2Field,
    pub name: FixedLengthWideString<10>, // 10 character utf-16 string
    pub height: u8,
    pub build: u8,
    pub face: FaceField,
    pub hair: HairField,
    pub eye: EyeField,
    pub eye_position: EyePositionField,
    pub eyebrow: EyebrowField,
    pub eyebrow_position: EyebrowPositionField,
    pub nose: NoseField,
    pub mouth: MouthField,
    pub mouth_position: MouthPositionField,
    pub beard: BeardField,
    pub glass: GlassField,
    pub mole: MoleField,
    pub creator_name: FixedLengthWideString<10>,
    pub padding: u16,
    pub crc: u16,
}
</syntaxhighlight>


== In codebases ==
== In codebases ==
# FFL 1.3.10 decompilation by AboodXD: [https://github.com/aboood40091/ffl/blob/73fe9fc70c0f96ebea373122e50f6d3acc443180/include/nn/ffl/FFLiMiiDataCore.h#L886 ffl/include/nn/ffl/FFLiMiiDataCore.h > FFLiStoreData]
#* ''includes'' <code>FFLiMiiDataOfficial</code>'','' <code>FFLiMiiDataCore</code>
# MiiPort: [https://github.com/Genwald/MiiPort/blob/4ee38bbb8aa68a2365e9c48d59d7709f760f9b5d/include/mii_ext.h#L264 mii_ext.h > ver3StoreData]
# MiiPort: [https://github.com/Genwald/MiiPort/blob/4ee38bbb8aa68a2365e9c48d59d7709f760f9b5d/include/mii_ext.h#L264 mii_ext.h > ver3StoreData]
# FFL 1.3.10 decompilation by AboodXD: [https://github.com/aboood40091/ffl/blob/73fe9fc70c0f96ebea373122e50f6d3acc443180/include/nn/ffl/FFLiMiiDataCore.h#L886 ffl/include/nn/ffl/FFLiMiiDataCore.h > FFLiStoreData]
#* ''includes'' <code>FFLiMiiDataOfficial</code>'','' <code>FFLiMiiDataCore</code>
# decaf-emu (libdecaf): [https://github.com/flTobi/decaf-emu/blob/070e29c977c87ff05cce2fc29007d497a4b7cdcf/src/libdecaf/src/nn/ffl/nn_ffl_miidata.h#L137 src/nn/ffl/nn_ffl_miidata.h > FFLStoreData]  
# decaf-emu (libdecaf): [https://github.com/flTobi/decaf-emu/blob/070e29c977c87ff05cce2fc29007d497a4b7cdcf/src/libdecaf/src/nn/ffl/nn_ffl_miidata.h#L137 src/nn/ffl/nn_ffl_miidata.h > FFLStoreData]  
#* ''includes'' <code>FFLiMiiDataOfficial</code>'','' <code>FFLiMiiDataCore</code>
#* ''includes'' <code>FFLiMiiDataOfficial</code>'','' <code>FFLiMiiDataCore</code>
#[https://github.com/j0lol/vee/blob/f134e28eec22bdf8587d5abbf0f2d0f1ffc5b8a5/crates/vee_parse/src/ctr.rs#L159 Vee Face Library]
{{Format-Navbox}}

Latest revision as of 20:08, 23 September 2025

This is the Mii data format (Version 3) used on 3DS and Wii U. It's also read/written on Switch for amiibo.

It is 96 bytes long, and contains a CRC-16 checksum at the end.

Other Names

[edit | edit source]

This format is known by many different names, which is a source for confusion. It was introduced on the 3DS.

  • 3DS (CFL)
    • CFLStoreData
    • CFLiMiiDataPacket
    • nnmiiStoreData
  • Wii U (FFL)
    • FFLStoreData
    • FFLiStoreData
    • FFLiStoreDataCFL
  • Switch (NintendoSDK, nn::mii)
    • nn::mii::Ver3StoreData

Struct Format

[edit | edit source]

This sample is given in Rust, with libraries binrw and bilge. This sample is edited for clarity and the full sample can be found here[1].

#[bitfield(32)]
pub struct PersonalInfo1Field {
    pub char_version: u8,
    pub copyable: u1,
    pub ng_word: u1,
    pub region_move: u2,
    pub font_region: u2,
    pub reserved_0: u2,
    pub room_index: u4,
    pub position_in_room: u4,
    pub author_type: u4,
    pub birth_platform: u3,
    pub reserved_1: u1,
}

#[bitfield(16)]
pub struct PersonalInfo2Field {
    pub gender: u1,
    pub birth_month: u4,
    pub birth_day: u5,
    pub favorite_color: u4,
    pub favorite: u1,
    pub padding: u1,
}

#[bitfield(16)]
pub struct FaceField {
    pub local_only: u1,
    pub face_type: u4,
    pub face_color: u3,
    pub face_texture: u4,
    pub face_makeup: u4,
}

#[bitfield(16)]
pub struct HairField {
    pub hair_type: u8,
    pub hair_color: u3,
    pub hair_flip: u1,
    pub padding: u4,
}

#[bitfield(16)]
pub struct EyeField {
    pub eye_type: u6,
    pub eye_color: u3,
    pub eye_scale: u4,
    pub eye_aspect: u3,
}

#[bitfield(16)]
pub struct EyePositionField {
    pub eye_rotate: u5,
    pub eye_x: u4,
    pub eye_y: u5,
    pub padding: u2,
}

#[bitfield(16)]
pub struct EyebrowField {
    pub eyebrow_type: u5,
    pub eyebrow_color: u3,
    pub eyebrow_scale: u4,
    pub eyebrow_aspect: u3,
    pub padding_3: u1,
}

#[bitfield(16)]
pub struct EyebrowPositionField {
    pub eyebrow_rotate: u5,
    pub eyebrow_x: u4,
    pub eyebrow_y: u5,
    pub padding: u2,
}

#[bitfield(16)]
pub struct NoseField {
    pub nose_type: u5,
    pub nose_scale: u4,
    pub nose_y: u5,
    pub padding: u2,
}

#[bitfield(16)]
pub struct MouthField {
    pub mouth_type: u6,
    pub mouth_color: u3,
    pub mouth_scale: u4,
    pub mouth_aspect: u3,
}

#[bitfield(16)]
pub struct MouthPositionField {
    pub mouth_y: u5,
    pub mustache_type: u3,
    pub padding: u8,
}

#[bitfield(16)]
pub struct BeardField {
    pub beard_type: u3,
    pub beard_color: u3,
    pub mustache_scale: u4,
    pub mustache_y: u5,
    pub padding_7: u1,
}

#[bitfield(16)]
pub struct GlassField {
    pub glass_type: u4,
    pub glass_color: u3,
    pub glass_scale: u4,
    pub glass_y: u5,
}

#[bitfield(16)]
pub struct MoleField {
    pub mole_type: u1,
    pub mole_scale: u4,
    pub mole_x: u5,
    pub mole_y: u5,
    pub padding_8: u1,
}

#[binrw]
pub struct CtrAuthorId {
    pub data: [u8; 8],
}

// FFLiCreateID
#[binrw]
pub struct CtrCreateId {
    pub data: [u8; 10],
}

/// A packed character info format.
/// This structure has a lot of bitfields.
/// These fields have been given speculative names.
///
/// This format is known as `.ffsd`.
#[binrw]
#[brw(little)]
#[derive(Debug)]
pub struct CtrStoreData {
    pub personal_info_1: PersonalInfo1Field,
    pub author_id: CtrAuthorId,
    pub create_id: CtrCreateId,
    pub reserved: [u8; 2],
    pub personal_info_2: PersonalInfo2Field,
    pub name: FixedLengthWideString<10>, // 10 character utf-16 string
    pub height: u8,
    pub build: u8,
    pub face: FaceField,
    pub hair: HairField,
    pub eye: EyeField,
    pub eye_position: EyePositionField,
    pub eyebrow: EyebrowField,
    pub eyebrow_position: EyebrowPositionField,
    pub nose: NoseField,
    pub mouth: MouthField,
    pub mouth_position: MouthPositionField,
    pub beard: BeardField,
    pub glass: GlassField,
    pub mole: MoleField,
    pub creator_name: FixedLengthWideString<10>,
    pub padding: u16,
    pub crc: u16,
}

In codebases

[edit | edit source]
  1. FFL 1.3.10 decompilation by AboodXD: ffl/include/nn/ffl/FFLiMiiDataCore.h > FFLiStoreData
    • includes FFLiMiiDataOfficial, FFLiMiiDataCore
  2. MiiPort: mii_ext.h > ver3StoreData
  3. decaf-emu (libdecaf): src/nn/ffl/nn_ffl_miidata.h > FFLStoreData
    • includes FFLiMiiDataOfficial, FFLiMiiDataCore
  4. Vee Face Library