Mii: Difference between revisions
No edit summary |
TimmSkiller (talk | contribs) move CFLStoreData here |
||
(43 intermediate revisions by 12 users not shown) | |||
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 | | Header 0x00000100 | ||
|- | |- | ||
| 0x8 | | 0x8 | ||
| | | 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. | ||
|- | |- | ||
| | | 0x23F8 | ||
| 0x4 | | 0x4 | ||
| Header "CFHE" | | Header "CFHE" | ||
|- | |- | ||
| | | 0x23FC | ||
| | | 0x2 | ||
| | | 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) | ||
| | | Linked list of objects? See chapter | ||
|- | |- | ||
| 0xC810 | | 0xC810 | ||
| | | 0xE | ||
| | | 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 | ||
| | | Mii count in this section. Maximum 100 | ||
|- | |- | ||
| | | 0xC828 | ||
| | | 0x64 (100 * 0x1) | ||
| | | 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 | ||
| | | 0x12 | ||
| 01 00 [..] 00 | | 01 00 [..] 00 | ||
|- | |||
| 0xE4BE | |||
| 0x2 | |||
| Checksum over the data above starting from 0xC820 | |||
|- | |- | ||
| 0xE4C0 | | 0xE4C0 | ||
| 0x3D860 | | 0x3D860 (3000 * 0x54) | ||
| | | 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 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== | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 76: | Line 131: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| | | 0x1 | ||
| Mii | | Mii Version - Always 3 | ||
|- | |- | ||
| 0x1 | | 0x1 | ||
| | | 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) | |||
|- | |- | ||
| | | 0x2 | ||
| 0x1 | | 0x1 | ||
| | | Mii position shown on the selection screen<br/>bit 0-3: page index <br/>bit 4-7: slot index | ||
|- | |- | ||
| 0x3 | | 0x3 | ||
| | | 0x1 | ||
| bit 0-3: ?<br/>bit 4-6: Device Mii was originally made on (1=Wii, 2=DS, 3=3DS, 4=Wii U/Switch) | |||
|- | |- | ||
| | | 0x4 | ||
| | | 0x8 | ||
| | | System ID (identifies owner, for purpose of enforcing editing restrictions and blue pants).<br/>Is not tied to the MAC address anymore. | ||
|- | |- | ||
| | | 0xC | ||
| | | 0x4 | ||
| | | 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 113: | Line 164: | ||
| 0x18 | | 0x18 | ||
| 0x2 | | 0x2 | ||
| | | 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 141: | Line 192: | ||
| 0x34 | | 0x34 | ||
| 0x4 | | 0x4 | ||
| | | 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 | ||
| | | 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 | |||
|- | |- | ||
| | | 0x3E | ||
| | | 0x2 | ||
| bit 0- | | bit 0-5: mouth style<br/>bit 6-8: mouth color<br/>bit 9-12: mouth scale<br/>bit 13-15: mouth yscale | ||
|- | |- | ||
| | | 0x40 | ||
| 0x2 | | 0x2 | ||
| | | bit 0-4: mouth y position<br/>bit 5-7: mustach style | ||
|- | |- | ||
| | | 0x42 | ||
| | | 0x2 | ||
| | | bit 0-2: beard style<br/>bit 3-5: beard color<br/>bit 6-9: mustache scale<br/>bit 10-14:mustache y position | ||
|- | |- | ||
| | | 0x44 | ||
| | | 0x2 | ||
| | | bit 0-3: glasses style<br/>bit 4-6: glasses color<br/>bit 7-10: glasses scale<br/>bit 11-15: glasses y position | ||
|- | |- | ||
| | | 0x46 | ||
| | | 0x2 | ||
| | | 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 227: | ||
|} | |} | ||
== | == CFLStoreData == | ||
This is a common Mii container object, used in games and system modules like [[Friend_Services|FRD]] and [[ACT_Services|ACT]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset !! Size !! Description | |||
|- | |||
| 0x0 || 0x5C || Base Mii data in the above format | |||
|- | |||
| 0x5C || 0x2 || padding, left as zeros usually | |||
|- | |||
| 0x5E || 0x2 || CRC16 over the previous 0x5E of data | |||
|} | |||
==Mii categories (pants colors)== | ==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==== | |||
===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: | ||
===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. | ||
====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== | ||
Each of the following values were found with NTR Debugger: | 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. | If you want to access the value, grab the given "NTR address" and add 0x08815000. | ||
Line 510: | Line 566: | ||
<nowiki>{ | <nowiki>{ | ||
face: [ | |||
0x00,0x01,0x08, | 0x00,0x01,0x08, | ||
0x02,0x03,0x09, | 0x02,0x03,0x09, | ||
Line 540: | Line 596: | ||
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 571: | Line 627: | ||
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: [ |