Mii

Mii

Originally 🔗 created for the Nintendo Wii (and backported to a selection of DS/i games), the Mii format was expanded with a larger selection of facial features and a new “copying” permission for the 3DS family, and later implemented as-is on Wii U.

See Mii Maker for the application chiefly designed to create, edit, delete, and trade Miis or convert them from and to a QR code.

The default endianness in this page is little-endian, unless explicitly specified.

Mii Database #

Format of the Mii main database CFL_DB.dat, found in shared extdata archive f0000000b.

OffsetLength
0x00x4Header "CFOG" (Mii Maker section)
0x40x4Header 0x00000100
0x80x23F0 (100 * 0x5C)Array of owned (saved in Mii Maker) Miis. Order in file is unrelated to canonical order in-app.
0x23F80x4Header "CFHE"
0x23FC0x2Linked list tail index. 0xFFFF if the list is empty
0x23FE0x2Linked list head index. 0xFFFF if the list is empty
0x24000xA410 (3000 * 0xE)Linked list of objects? See chapter
0xC8100xEPadding?
0xC81E0x2Checksum of all of the above (the first 0xC81E byte). See section below.
0xC8200x4Header "CFRA" (Invitations section)
0xC8240x4Mii count in this section. Maximum 100
0xC8280x64 (100 * 0x1)Order index of Mii in this section?
0xC88C0x1C20 (100 * 0x48)Array of Miis contributed from games, used for Mii Plaza "invitations" feature.
The format isn't that of a full Mii. The "author" field is missing
0xE4AC0x1201 00 [..] 00
0xE4BE0x2Checksum over the data above starting from 0xC820
0xE4C00x3D860 (3000 * 0x54)Another array of Miis. Seems related to the CFHE section.
The Mii format in this section is modified. The "author" field is missing, A 4-byte timestamp (seconds since 2000) together with 8-byte zeros(?) is appended at the end.

When encrypted in QR codes, 4 additional bytes are added. Two null bytes and a CRC-16. It’s the exact same CRC-16 as for the Wii blocks on the 0x5e first bytes. It seems that the CRC is ignored, the Mii Maker expecting the result of APT:Unwrap to detect integrity loss.

CFHE object #

A 0xE-byte long linked list node. The format is 4-byte Mii ID (See Mii format) + 6-byte MAC + 2-byte previous node index (prev) + 2-byte next node index (next).

An invalid node has value: ID = 0, MAC = 0, prev = 0x7FFF, next = 0x7FFF.

The highest bit of these fields has some special meaning and isn’t part of the index value.

Checksum #

The algorithm used to verify the integrity of the database is based on CRC-16/XMODEM. It is the same algorithm used to verify 🔗 Mii Data on the Wii.

To obtain the correct value for the checksum, apply the algorithm to the first 0xC81E bytes of the database. This can be done using 🔗 FixCRC; alternativly a pseudocode implementation of the checksum algorithm is given below:

def crc16_CCITTWii(u8[]: data) -> u16:
    """Calculate a checksum of data using the CRC-16/XMODEM implementation

    CRC-16/XMODEM implementation uses 0x0000 as the starting value
    """

    u32 crc := 0x0

    for byte in data:
        # Iterate over every of the 8 bits in byte.
        # Begin with the most significant bit. (7, 6, ... , 1, 0)
        for bit in 7..0:
            # & - binary `and'; <</>> - bitshift left/right; ^ - binary `xor'
            crc := (
                     (crc << 1) | ((byte >> bit) & 0x1)
                     ^ (0x1021 if crc & 0x8000 else 0)
                   )

    for _ in 0..15:
        crc := (crc << 1) ^ (0x1021 if crc & 0x8000 else 0)

    # only return the lowest 16 bit of crc
    return (u16) (crc & 0xffff)

checksum := crc16_CCITTWii(miidb[0:0xc81e]) # checksum over the first 0xc81e bytes

Mii format #

OffsetLength
0x00x1Mii Version - Always 3
0x10x1bit 0: allow copying
bit 1: profanity flag (whether in Mii name or creator name does not matter)
bit 2-3: region lock (0=no lock, 1=JPN, 2=USA, 3=EUR)
bit4-5:character set(0=JPN+USA+EUR, 1=CHN, 2=KOR, 3=TWN)
0x20x1Mii position shown on the selection screen
bit 0-3: page index
bit 4-7: slot index
0x30x1bit 0-3: ?
bit 4-6: Device Mii was originally made on (1=Wii, 2=DS, 3=3DS, 4=Wii U/Switch)
0x40x8System ID (identifies owner, for purpose of enforcing editing restrictions and blue pants).
Is not tied to the MAC address anymore.
0xC0x4Mii ID (big-endian 32bit unsigned integer):
Bit 0..27: (bit[0..27] * 2) = date of creation (seconds since 01/01/2010 00:00:00)
Bit 28: Always set?
Bit 29: set for temporary Mii
Bit 30: Set for DSi mii?
Bit 31: not set if Mii is special
0x100x6Creator's full MAC
0x160x2Padding (0000)
0x180x2bit 0: sex (0 if male, 1 if female)
bit 1-4: birthday month
bit 5-9: birthday day
bit 10-13: favorite color
bit 14: favorite mii (0 if false, 1 if true)
0x1A0x14UTF-16 Mii Name (10 chars max, 0000 terminated)
0x2E0x2width & height
0x300x1bit 0: disable sharing
bit 1-4: face shape
bit 5-7: skin color
0x310x1bit 0-3: wrinkles
bit 4-7: makeup
0x320x1hair style
0x330x1bit 0-2: hair color
bit 3: flip hair
0x340x4bit 0-5: eye style
bit 6-8: eye color
bit 9-12: eye scale
bit 13-15: eye yscale
bit 16-20: eye rotation
bit 21-24: eye x spacing
bit 25-29: eye y position
0x380x4bit 0-4: eyebrow style
bit 5-7: eyebrow color
bit 8-11: eyebrow scale
bit 12-14: eyebrow yscale
bit 16-19: eyebrow rotation
bit 21-24: eyebrow x spacing
bit 25-29: eyebrow y position
0x3C0x2bit 0-4: nose style
bit 5-8: nose scale
bit 9-13: nose y position
0x3E0x2bit 0-5: mouth style
bit 6-8: mouth color
bit 9-12: mouth scale
bit 13-15: mouth yscale
0x400x2bit 0-4: mouth y position
bit 5-7: mustach style
0x420x2bit 0-2: beard style
bit 3-5: beard color
bit 6-9: mustache scale
bit 10-14:mustache y position
0x440x2bit 0-3: glasses style
bit 4-6: glasses color
bit 7-10: glasses scale
bit 11-15: glasses y position
0x460x2bit 0: enable mole
bit 1-4: mole scale
bit 5-9: mole x position
bit 10-14: mole y position
0x480x14UTF-16 Author Name (10 chars max, 0000 terminated)

Mii categories (pants colors) #

Special (gold) Miis #

Specialness will override any other pants color.

A special Mii cannot have sharing on or else it will be deemed invalid.

Zeroed system-id and timestamp?

Imported (blue) Miis #

Any (non-gold) Mii with a different System ID will appear as a foreign one.

There is also a range of Mii IDs that are always foreign and uneditable, regardless of the System ID:

Regular (black/red) Miis #

Always editable, since they can only appear as such on the console that created them.

Personal (red) Mii #

A red Mii that happens to be the first in the file!

The Mii doesn’t really need to be red, it is only red because the personal Mii is always favorited.

Mii values #

Each of the following values were found with NTR Debugger: If you want to access the value, grab the given “NTR address” and add 0x08815000.

DataNTR addressVariation (hex)Notes
Face style0x89400-0BNot ordered as in editor, read below
Face color0x89800-05From top to bottom
Wrinkles0x89C00-0BSame order as displayed in editor
Makeup0x8A000-0BSame order as displayed in editor
Hair style0x8A400-84Not ordered as in editor, read below
Hair color0x8A800-07From top to bottom
Hair flipped0x8AC1 if trueFrom top to bottom
Eye style0x8B000-3CNot ordered as in editor, read below
Eyes color0x8B400-05From top to bottom
Eyes size0x8B807-00Left button increases value.
Eyes thickness0x8BC06-00Left button increases value.
Eyes rotation0x8C000-07
Eyes spacing0x8C400-0C
Eyes height0x8C800-12
Eyebrows style0x8CC00-18Not ordered as in editor, read below
Eyebrows color0x8D000-07From top to bottom
Eyebrows size0x8D408-00Left button increases value.
Eyebrows thickness0x8D806-00Left button increases value.
Eyebrows rotation0x8DC00-0B
Eyebrows spacing0x8E000-0C
Eyebrows height0x8E403-12Yup, minimum is 0x03
Nose style0x8E800-11Not ordered as in editor, read below
Nose size0x8EC08-00Left button increases value.
Nose height0x8F000-12
Mouth style0x8F400-23Not ordered as in editor, read below
Mouth color0x8F800-04From top to bottom.
Mouth size0x8FC08-00Left button increases value.
Mouth thickness0x90006-00Left button increases value.
Mouth height0x90400-12
Mustache style0x90800-05Order like in editor.
Beard style0x90C00-05Order like in editor.
Mustache/Beard color0x91000-07From top to button.
Mustache size0x91408-00Left button increases value.
Mustache height0x91800-10
Glasses style0x91C00-08Order like in editor.
Glasses color0x92000-05From top to bottom
Glasses size0x92407-00Left button increases value.
Glasses height0x92800-14
Mole enable0x92C1 if enabled, 0 else.
Mole size0x93008-00Left button increases value.
Mole horiz pos0x93400-10
Mole vert pos0x93800-1E
Mii height0x93C00-7F
Mii weight0x94000-7F
Mii name0x944-0x959UTF-16Terminated with 0x0000. Not updated immediatly?
Creator’s name0x95A-96FUTF-16Terminated with 0x0000. Not updated immediatly?
Mii gender0x9700: Male, 1: Female
Birthdate month0x97401-0C
Birthdate day0x97801-1F
Mii shirt color0x97C00-0BOrdered like in editor.
Favorite0x9800: false, 1: true
Allow copy0x9810: false, 1: true
Unused byte?0x982
Allow sharing0x9830: true, 1: false
???0x984-0x98FAll zero?
???0x990-0x9974?

0x08815998: Same 4 bytes as encrypted Mii: first 4 bits for Mii type, 4 next for number of seconds since 01/01/2010 00:00:00 UTC+3 (should be verified by other country and region 3DS) divided by 2. 0x0881599C: 6 bytes of MAC address of the 3DS that created the Mii. 0x088159A2: 6 unknow uses bytes 0x088159A8: Same 8 bytes as decrypted Mii at 0x04 through 0x0B. Seems NAND specific, kept the same on Miis created on same NAND but different 3DS via System Transfer. Might be a coincidence but the two first bytes are in ID0 folder name in the Nintendo 3DS folder.

Mapped Editor <-> Hex values #

Most of the values are ordered (left button decreases, right increases, color choices are top to bottom…) but for most “main” part of the UI, where you choose the style of the part being edited, hex values has no correlation with displayed order. Here is a JSON that can go from a Part, a Page and Position to the right hex value. This is 0 indexed (eg: datas[“face”][0][11]).

{
face: [
    0x00,0x01,0x08,
    0x02,0x03,0x09,
    0x04,0x05,0x0a,
    0x06,0x07,0x0b
],
hairs: [
    [0x21,0x2f,0x28,
    0x25,0x20,0x6b,
    0x30,0x33,0x37,
    0x46,0x2c,0x42],
    [0x34,0x32,0x26,
    0x31,0x2b,0x1f,
    0x38,0x44,0x3e,
    0x73,0x4c,0x77],
    [0x40,0x51,0x74,
    0x79,0x16,0x3a,
    0x3c,0x57,0x7d,
    0x75,0x49,0x4b],
    [0x2a,0x59,0x39,
    0x36,0x50,0x22,
    0x17,0x56,0x58,
    0x76,0x27,0x24],
    [0x2d,0x43,0x3b,
    0x41,0x29,0x1e,
    0x0c,0x10,0x0a,
    0x52,0x80,0x81],
    [0x0e,0x5f,0x69,
    0x64,0x06,0x14,
    0x5d,0x66,0x1b,
    0x04,0x11,0x6e],
    [0x7b,0x08,0x6a,
    0x48,0x03,0x15,
    0x00,0x62,0x3f,
    0x5a,0x0b,0x78],
    [0x05,0x4a,0x6c,
    0x5e,0x7c,0x19,
    0x63,0x45,0x23,
    0x0d,0x7a,0x71],
    [0x35,0x18,0x55,
    0x53,0x47,0x83,
    0x60,0x65,0x1d,
    0x07,0x0f,0x70],
    [0x4f,0x01,0x6d,
    0x7f,0x5b,0x1a,
    0x3d,0x67,0x02,
    0x4d,0x12,0x5c],
    [0x54,0x09,0x13,
    0x82,0x61,0x68,
    0x2e,0x4e,0x1c,
    0x72,0x7e,0x6f]
],
eyebrows: [
    [0x06,0x00,0x0c,
    0x01,0x09,0x13,
    0x07,0x15,0x08,
    0x11,0x05,0x04],
    [0x0b,0x0a,0x02,
    0x03,0x0e,0x14,
    0x0f,0x0d,0x16,
    0x12,0x10,0x17]
],
eyes: [
    [0x02,0x04,0x00,
    0x08,0x27,0x11,
    0x01,0x1a,0x10,
    0x0f,0x1b,0x14],
    [0x21,0x0b,0x13,
    0x20,0x09,0x0c,
    0x17,0x22,0x15,
    0x19,0x28,0x23],
    [0x05,0x29,0x0d,
    0x24,0x25,0x06,
    0x18,0x1e,0x1f,
    0x12,0x1c,0x2e],
    [0x07,0x2c,0x26,
    0x2a,0x2d,0x1d,
    0x03,0x2b,0x16,
    0x0a,0x0e,0x2f],
    [0x30,0x31,0x32,
    0x35,0x3b,0x38,
    0x36,0x3a,0x39,
    0x37,0x33,0x34]
],
nose: [
    [0x01,0x0a,0x02,
    0x03,0x06,0x00,
    0x05,0x04,0x08,
    0x09,0x07,0x0B],
    [0x0d,0x0e,0x0c,
    0x11,0x10,0x0f]
],
mouth: [
    [0x17,0x01,0x13,
    0x15,0x16,0x05,
    0x00,0x08,0x0a,
    0x10,0x06,0x0d],
    [0x07,0x09,0x02,
    0x11,0x03,0x04,
    0x0f,0x0b,0x14,
    0x12,0x0e,0x0c],
    [0x1b,0x1e,0x18,
    0x19,0x1d,0x1c,
    0x1a,0x23,0x1f,
    0x22,0x21,0x20]
]
}