Ver3StoreData: Difference between revisions
Appearance
m Jo moved page Format:Ver3StoreData to Ver3StoreData: no prefix |
No edit summary |
||
| (2 intermediate revisions by the same user not shown) | |||
| Line 3: | Line 3: | ||
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. | ||
== | == 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] | ||
# 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}} | {{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]- FFL 1.3.10 decompilation by AboodXD: ffl/include/nn/ffl/FFLiMiiDataCore.h > FFLiStoreData
- includes
FFLiMiiDataOfficial,FFLiMiiDataCore
- includes
- MiiPort: mii_ext.h > ver3StoreData
- decaf-emu (libdecaf): src/nn/ffl/nn_ffl_miidata.h > FFLStoreData
- includes
FFLiMiiDataOfficial,FFLiMiiDataCore
- includes
- Vee Face Library