Line 2:
Line 2:
See [[Mii Maker]] for the application chiefly designed to create, edit, delete, and trade Miis or convert them from and to a QR code.
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==
==Mii Database==
Line 18:
Line 20:
| 0x4
| 0x4
| 0x4
| 0x4
−
| Header 0x00010000
+
| Header 0x00000100
|-
|-
| 0x8
| 0x8
−
| 0x23F7
+
| 0x23F0 (100 * 0x5C)
| Array of owned (saved in Mii Maker) Miis. Order in file is unrelated to canonical order in-app.
| Array of owned (saved in Mii Maker) Miis. Order in file is unrelated to canonical order in-app.
|-
|-
−
| 0x23FC
+
| 0x23F8
| 0x4
| 0x4
| Header "CFHE"
| Header "CFHE"
|-
|-
−
| 0x23F8
+
| 0x23FC
−
| 0x4
+
| 0x2
−
| Header 0xFFFFFFFF
+
| Linked list tail index. 0xFFFF if the list is empty
+
|-
+
| 0x23FE
+
| 0x2
+
| Linked list head index. 0xFFFF if the list is empty
|-
|-
| 0x2400
| 0x2400
−
| 0xA410
+
| 0xA410 (3000 * 0xE)
−
| Array of objects? See chapter
+
| Linked list of objects? See chapter
|-
|-
| 0xC810
| 0xC810
−
| 0x10
+
| 0xE
−
| Terminator? 00 [..] 00 08 83
+
| Padding?
+
|-
+
| 0xC81E
+
| 0x2
+
| Checksum of all of the above (the first 0xC81E byte). See section [[#Checksum|below]].
|-
|-
| 0xC820
| 0xC820
Line 46:
Line 56:
| 0xC824
| 0xC824
| 0x4
| 0x4
−
| Header? 0x39000000
+
| Mii count in this section. Maximum 100
|-
|-
−
| 0xC861
+
| 0xC828
−
| 0x2B
+
| 0x64 (100 * 0x1)
−
| Weird padding? 0x00
+
| Order index of Mii in this section?
|-
|-
| 0xC88C
| 0xC88C
−
| 0x1C20 (?)
+
| 0x1C20 (100 * 0x48)
−
| Array of Miis contributed from games, used for Mii Plaza "invitations" feature.<br/>The format isn't that of a full Mii.
+
| Array of Miis contributed from games, used for Mii Plaza "invitations" feature.<br/>The format isn't that of a full Mii. The "author" field is missing
|-
|-
| 0xE4AC
| 0xE4AC
−
| 0x14
+
| 0x12
−
| 01 00 [..] 00 D2 74
+
| 01 00 [..] 00
+
|-
+
| 0xE4BE
+
| 0x2
+
| Checksum over the data above starting from 0xC820
|-
|-
| 0xE4C0
| 0xE4C0
−
| 0x3D860
+
| 0x3D860 (3000 * 0x54)
−
| Empty (00)
+
| Another array of Miis. Seems related to the CFHE section. <br/>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 additionnal 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.
+
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 [http://wiibrew.org/wiki/Mii_Data#Block_format 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 [https://gbatemp.net/threads/tutorial-give-your-mii-gold-pants-and-use-it-for-streetpass.379146/page-24#post-6569186 FixCRC]; alternativly a pseudocode implementation of the checksum algorithm is given below:
+
+
<source lang="python">
+
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
+
</source>
==Mii format==
==Mii format==
−
−
Note: 0x18-3B have been copied as-is from [https://www.3dbrew.org/w/index.php?title=Mii_Maker&oldid=11464 the QR code specification], so they're unverified.
{| class="wikitable"
{| class="wikitable"
Line 77:
Line 131:
|-
|-
| 0x0
| 0x0
−
| 0x4
+
| 0x1
−
| Mii ID
+
| Mii Version - Always 3
|-
|-
−
| 0x4
−
| 0x4
−
| System ID (identifies owner, for purpose of enforcing editing restrictions and blue pants).<br/>Is not tied to the MAC address anymore.
−
|-
−
| 0x8
| 0x1
| 0x1
−
| Unknown (always 71?)
+
| 0x1
+
| bit 0: allow copying<br/>bit 1: profanity flag (whether in Mii name or creator name does not matter)<br/>bit 2-3: region lock (0=no lock, 1=JPN, 2=USA, 3=EUR)<br/>bit4-5:character set(0=JPN+USA+EUR, 1=CHN, 2=KOR, 3=TWN)
|-
|-
−
| 0x9
+
| 0x2
| 0x1
| 0x1
−
| Allow Copying (?) (A2=on?)
+
| Mii position shown on the selection screen<br/>bit 0-3: page index <br/>bit 4-7: slot index
|-
|-
−
| 0xA
| 0x3
| 0x3
−
| unknown; apparently constant for the same source console
+
| 0x1
+
| bit 0-3: ?<br/>bit 4-6: Device Mii was originally made on (1=Wii, 2=DS, 3=3DS, 4=Wii U/Switch)
|-
|-
−
| 0xD
+
| 0x4
−
| 0x1
+
| 0x8
−
| unknown; apparently constant for the same source console - subtract 2 for personal Mii?
+
| System ID (identifies owner, for purpose of enforcing editing restrictions and blue pants).<br/>Is not tied to the MAC address anymore.
|-
|-
−
| 0xE
+
| 0xC
−
| 0x2
+
| 0x4
−
| unknown; variable (range A-F may alternatively be a timestamp?)
+
| Mii ID (big-endian 32bit unsigned integer):<br/>Bit 0..27: (bit[0..27] * 2) = date of creation (seconds since 01/01/2010 00:00:00)<br/>Bit 28: Always set?<br/>Bit 29: set for temporary Mii<br/>Bit 30: Set for DSi mii?<br/>Bit 31: not set if Mii is special
|-
|-
| 0x10
| 0x10
Line 114:
Line 164:
| 0x18
| 0x18
| 0x2
| 0x2
−
| Bit-mapped: Birthday (4bit-day,5bit-month), Sex, Shirt, ??
+
| bit 0: sex (0 if male, 1 if female)<br/>bit 1-4: birthday month<br/>bit 5-9: birthday day<br/>bit 10-13: favorite color<br/>bit 14: favorite mii (0 if false, 1 if true)
|-
|-
| 0x1A
| 0x1A
Line 142:
Line 192:
| 0x34
| 0x34
| 0x4
| 0x4
−
| unknown
+
| bit 0-5: eye style<br/>bit 6-8: eye color <br/>bit 9-12: eye scale <br/>bit 13-15: eye yscale<br/>bit 16-20: eye rotation<br/>bit 21-24: eye x spacing<br/>bit 25-29: eye y position
|-
|-
| 0x38
| 0x38
−
| 0x1
+
| 0x4
−
| bit 0-4: eyebrow style<br/>bit 5-7: eyebrow color
+
| bit 0-4: eyebrow style<br/>bit 5-7: eyebrow color <br/>bit 8-11: eyebrow scale<br/>bit 12-14: eyebrow yscale <br/>bit 16-19: eyebrow rotation<br/>bit 21-24: eyebrow x spacing<br/>bit 25-29: eyebrow y position
+
|-
+
| 0x3C
+
| 0x2
+
| bit 0-4: nose style<br/>bit 5-8: nose scale<br/>bit 9-13: nose y position
|-
|-
−
| 0x39
+
| 0x3E
−
| 0x1
+
| 0x2
−
| bit 0-3: eyebrow scale<br/>bit 4-6: eyebrow yscale
+
| bit 0-5: mouth style<br/>bit 6-8: mouth color<br/>bit 9-12: mouth scale<br/>bit 13-15: mouth yscale
|-
|-
−
| 0x3A
+
| 0x40
| 0x2
| 0x2
−
| note that the bytes are swapped over (little-endian layout)<br/>bit 0-3: eyebrow rotation<br/>bit 5-8: eyebrow x spacing<br/>bit 9-13: eyebrow y position
+
| bit 0-4: mouth y position<br/>bit 5-7: mustach style
|-
|-
−
| 0x3C
+
| 0x42
−
| 0x4
+
| 0x2
−
| unknown
+
| bit 0-2: beard style<br/>bit 3-5: beard color<br/>bit 6-9: mustache scale<br/>bit 10-14:mustache y position
|-
|-
−
| 0x40
+
| 0x44
−
| 0x1
+
| 0x2
−
| Allow Copying (?) (0D on 0E off 8D on)
+
| bit 0-3: glasses style<br/>bit 4-6: glasses color<br/>bit 7-10: glasses scale<br/>bit 11-15: glasses y position
|-
|-
−
| 0x41
+
| 0x46
−
| 0x7
+
| 0x2
−
| unknown
+
| bit 0: enable mole<br/>bit 1-4: mole scale<br/>bit 5-9: mole x position<br/>bit 10-14: mole y position
|-
|-
| 0x48
| 0x48
Line 172:
Line 226:
| UTF-16 Author Name (10 chars max, 0000 terminated)
| UTF-16 Author Name (10 chars max, 0000 terminated)
|}
|}
−
−
==CFHE object==
−
−
A 0xE-byte long item.
−
−
On my database, they're all 0000 0000 0000 0000 0000 FF7F FF7F.
−
−
Wild speculation: blacklist of already scanned celebrity (gold) Mii QRs?
−
−
Alternative interpretation: FFFF FFFF 0000 0000 0000 0000 0000 is the 1st item; FF7F FF7F 0000 [...] the 2nd, etc;
==Mii categories (pants colors)==
==Mii categories (pants colors)==
−
Initial digits have been mirrored from David Hawley's defunct Wii research. Some information may be outdated.
+
====Special (gold) Miis====
+
Specialness will override any other pants color.
−
===Special (gold) Miis===
+
A special Mii cannot have sharing on or else it will be deemed invalid.
−
Specialness will override any other color and make the Mii non-editable.
−
Copying is rumored to have to be disabled.
+
Zeroed system-id and timestamp?
−
First digit of Mii ID: 0, 1, 4, 5
+
====Imported (blue) Miis====
−
−
===Imported (blue) Miis===
Any (non-gold) Mii with a different System ID will appear as a foreign one.
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:
There is also a range of Mii IDs that are always foreign and uneditable, regardless of the System ID:
−
First digit of Mii ID: C, D
−
===Regular (black/red) Miis===
+
====Regular (black/red) Miis====
Always editable, since they can only appear as such on the console that created them.
Always editable, since they can only appear as such on the console that created them.
−
First digit of Mii ID: 2, 3, 6, 7, 8, 9, A, B, E, F
+
+
====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==
==Mii values==
Line 538:
Line 583:
0x64,0x06,0x14,
0x64,0x06,0x14,
0x5d,0x66,0x1b,
0x5d,0x66,0x1b,
−
0x04,0x11,0x6e]
+
0x04,0x11,0x6e],
[0x7b,0x08,0x6a,
[0x7b,0x08,0x6a,
0x48,0x03,0x15,
0x48,0x03,0x15,
Line 569:
Line 614:
0x0f,0x0d,0x16,
0x0f,0x0d,0x16,
0x12,0x10,0x17]
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: [
nose: [