Jump to content

Ver3StoreData

From Mii Technical Wiki
Revision as of 20:08, 23 September 2025 by Jo (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

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

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

  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