1#[derive(Copy, Clone, Debug, Eq, PartialEq)]
9pub enum RegionLock {
10 None,
12 Japan,
14 USA,
16 Europe,
18}
19
20#[derive(Copy, Clone, Debug, Eq, PartialEq)]
22pub enum Charset {
23 JapanUSAEurope,
25 China,
27 Korea,
29 Taiwan,
31}
32
33#[derive(Copy, Clone, Debug)]
35pub struct Options {
36 pub is_copying_allowed: bool,
38 pub is_profanity_flag_enabled: bool,
40 pub region_lock: RegionLock,
42 pub charset: Charset,
44}
45
46#[derive(Copy, Clone, Debug)]
48pub struct SelectorPosition {
49 pub page_index: u8,
51 pub slot_index: u8,
53}
54
55#[derive(Copy, Clone, Debug, Eq, PartialEq)]
57pub enum OriginConsole {
58 Wii,
60 DSi,
62 N3DS,
66 WiiUSwitch,
68}
69
70#[derive(Copy, Clone, Debug)]
72pub struct ConsoleIdentity {
73 pub origin_console: OriginConsole,
75}
76
77#[derive(Copy, Clone, Debug, Eq, PartialEq)]
79pub enum Sex {
80 Male,
82 Female,
84}
85
86#[derive(Copy, Clone, Debug)]
88pub struct Details {
89 pub sex: Sex,
91 pub birthday_month: u8,
93 pub birthday_day: u8,
95 pub shirt_color: u8,
97 pub is_favorite: bool,
99 pub is_sharing_enabled: bool,
101}
102
103#[derive(Copy, Clone, Debug)]
105pub struct FaceStyle {
106 pub shape: u8,
108 pub skin_color: u8,
110}
111
112#[derive(Copy, Clone, Debug)]
114pub struct FaceDetails {
115 pub style: FaceStyle,
117 pub wrinkles: u8,
119 pub makeup: u8,
121}
122
123#[derive(Copy, Clone, Debug)]
125pub struct HairDetails {
126 pub style: u8,
128 pub color: u8,
130 pub is_flipped: bool,
132}
133
134#[derive(Copy, Clone, Debug)]
136pub struct EyeDetails {
137 pub style: u8,
139 pub color: u8,
141 pub scale: u8,
143 pub y_scale: u8,
145 pub rotation: u8,
147 pub x_spacing: u8,
149 pub y_position: u8,
151}
152
153#[derive(Copy, Clone, Debug)]
155pub struct EyebrowDetails {
156 pub style: u8,
158 pub color: u8,
160 pub scale: u8,
162 pub y_scale: u8,
164 pub rotation: u8,
166 pub x_spacing: u8,
168 pub y_position: u8,
170}
171
172#[derive(Copy, Clone, Debug)]
174pub struct NoseDetails {
175 pub style: u8,
177 pub scale: u8,
179 pub y_position: u8,
181}
182
183#[derive(Copy, Clone, Debug)]
185pub struct MouthDetails {
186 pub style: u8,
188 pub color: u8,
190 pub scale: u8,
192 pub y_scale: u8,
194 pub y_position: u8,
196}
197
198#[derive(Copy, Clone, Debug)]
200pub struct MustacheDetails {
201 pub mustache_style: u8,
203}
204
205#[derive(Copy, Clone, Debug)]
207pub struct BeardDetails {
208 pub style: u8,
210 pub color: u8,
212 pub scale: u8,
214 pub y_position: u8,
216}
217
218#[derive(Copy, Clone, Debug)]
220pub struct GlassesDetails {
221 pub style: u8,
223 pub color: u8,
225 pub scale: u8,
227 pub y_position: u8,
229}
230
231#[derive(Copy, Clone, Debug)]
233pub struct MoleDetails {
234 pub is_enabled: bool,
236 pub scale: u8,
238 pub x_position: u8,
240 pub y_position: u8,
242}
243
244#[derive(Clone, Debug)]
250pub struct Mii {
251 pub options: Options,
253 pub selector_position: SelectorPosition,
255 pub console_identity: ConsoleIdentity,
257
258 pub system_id: u64,
260 pub mac_address: [u8; 6],
262
263 pub details: Details,
265 pub name: String,
267
268 pub height: u8,
270 pub width: u8,
272
273 pub face_details: FaceDetails,
275 pub hair_details: HairDetails,
277 pub eye_details: EyeDetails,
279 pub eyebrow_details: EyebrowDetails,
281 pub nose_details: NoseDetails,
283 pub mouth_details: MouthDetails,
285 pub mustache_details: MustacheDetails,
287 pub beard_details: BeardDetails,
289 pub glasses_details: GlassesDetails,
291 pub mole_details: MoleDetails,
293
294 pub author_name: String,
296}
297
298impl From<ctru_sys::MiiData> for Mii {
299 fn from(mii_data: ctru_sys::MiiData) -> Self {
300 let raw_options = mii_data.mii_options._bitfield_1;
302 let raw_position = mii_data.mii_pos._bitfield_1;
303 let raw_device = mii_data.console_identity._bitfield_1;
304 let system_id = mii_data.system_id;
305 let mac_address = mii_data.mac;
306 let raw_details = mii_data.mii_details._bitfield_1;
307 let raw_utf16_name = mii_data.mii_name;
308 let height = mii_data.height;
309 let width = mii_data.width;
310 let raw_face_style = mii_data.face_style._bitfield_1;
311 let raw_face_details = mii_data.face_details._bitfield_1;
312 let raw_hair_style = mii_data.hair_style;
313 let raw_hair_details = mii_data.hair_details._bitfield_1;
314 let raw_eye_details = mii_data.eye_details._bitfield_1;
315 let raw_eyebrow_details = mii_data.eyebrow_details._bitfield_1;
316 let raw_nose_details = mii_data.nose_details._bitfield_1;
317 let raw_mouth_details = mii_data.mouth_details._bitfield_1;
318 let raw_mustache_details = mii_data.mustache_details._bitfield_1;
319 let raw_beard_details = mii_data.beard_details._bitfield_1;
320 let raw_glasses_details = mii_data.glasses_details._bitfield_1;
321 let raw_mole_details = mii_data.mole_details._bitfield_1;
322 let raw_utf16_author = mii_data.author_name;
323
324 let name = String::from_utf16_lossy(&raw_utf16_name).replace('\0', "");
325 let author_name = String::from_utf16_lossy(&raw_utf16_author).replace('\0', "");
326
327 let options = Options {
328 is_copying_allowed: raw_options.get_bit(0),
329 is_profanity_flag_enabled: raw_options.get_bit(1),
330 region_lock: {
331 match (raw_options.get_bit(3), raw_options.get_bit(2)) {
332 (false, false) => RegionLock::None,
333 (false, true) => RegionLock::Japan,
334 (true, false) => RegionLock::USA,
335 (true, true) => RegionLock::Europe,
336 }
337 },
338 charset: {
339 match (raw_options.get_bit(5), raw_options.get_bit(4)) {
340 (false, false) => Charset::JapanUSAEurope,
341 (false, true) => Charset::China,
342 (true, false) => Charset::Korea,
343 (true, true) => Charset::Taiwan,
344 }
345 },
346 };
347
348 let selector_position = SelectorPosition {
349 page_index: raw_position.get(0, 4) as u8, slot_index: raw_position.get(4, 4) as u8, };
352
353 let console_identity = ConsoleIdentity {
354 origin_console: {
355 match (
356 raw_device.get_bit(6),
357 raw_device.get_bit(5),
358 raw_device.get_bit(4),
359 ) {
360 (false, false, true) => OriginConsole::Wii,
361 (false, true, false) => OriginConsole::DSi,
362 (false, true, true) => OriginConsole::N3DS,
363 _ => OriginConsole::WiiUSwitch,
364 }
365 },
366 };
367
368 let details = Details {
369 sex: {
370 match raw_details.get_bit(0) {
371 true => Sex::Female,
372 false => Sex::Male,
373 }
374 },
375 birthday_month: raw_details.get(1, 4) as u8, birthday_day: raw_details.get(5, 5) as u8, shirt_color: raw_details.get(10, 4) as u8, is_favorite: raw_details.get_bit(14),
379 is_sharing_enabled: !raw_face_style.get_bit(0),
380 };
381
382 let face_details = FaceDetails {
383 style: FaceStyle {
384 shape: raw_face_style.get(1, 4) as u8, skin_color: raw_face_style.get(5, 3) as u8, },
387 wrinkles: raw_face_details.get(0, 4) as u8, makeup: raw_face_details.get(4, 4) as u8, };
390
391 let hair_details = HairDetails {
392 style: raw_hair_style,
393 color: raw_hair_details.get(0, 3) as u8, is_flipped: raw_hair_details.get_bit(3),
395 };
396
397 let eye_details = EyeDetails {
398 style: raw_eye_details.get(0, 6) as u8, color: raw_eye_details.get(6, 3) as u8, scale: raw_eye_details.get(9, 4) as u8, y_scale: raw_eye_details.get(13, 3) as u8, rotation: raw_eye_details.get(16, 5) as u8, x_spacing: raw_eye_details.get(21, 4) as u8, y_position: raw_eye_details.get(25, 5) as u8, };
406
407 let eyebrow_details = EyebrowDetails {
408 style: raw_eyebrow_details.get(0, 5) as u8, color: raw_eyebrow_details.get(5, 3) as u8, scale: raw_eyebrow_details.get(8, 4) as u8, y_scale: raw_eyebrow_details.get(12, 3) as u8, rotation: raw_eyebrow_details.get(16, 4) as u8, x_spacing: raw_eyebrow_details.get(21, 4) as u8, y_position: raw_eyebrow_details.get(25, 5) as u8, };
418
419 let nose_details = NoseDetails {
420 style: raw_nose_details.get(0, 5) as u8, scale: raw_nose_details.get(5, 4) as u8, y_position: raw_nose_details.get(9, 5) as u8, };
424
425 let mouth_details = MouthDetails {
426 style: raw_mouth_details.get(0, 6) as u8, color: raw_mouth_details.get(6, 3) as u8, scale: raw_mouth_details.get(9, 4) as u8, y_scale: raw_mouth_details.get(13, 3) as u8, y_position: raw_mustache_details.get(0, 5) as u8, };
432
433 let mustache_details = MustacheDetails {
434 mustache_style: raw_mustache_details.get(5, 3) as u8, };
436
437 let beard_details = BeardDetails {
438 style: raw_beard_details.get(0, 3) as u8, color: raw_beard_details.get(3, 6) as u8, scale: raw_beard_details.get(6, 4) as u8, y_position: raw_beard_details.get(10, 5) as u8, };
443
444 let glasses_details = GlassesDetails {
445 style: raw_glasses_details.get(0, 4) as u8, color: raw_glasses_details.get(4, 3) as u8, scale: raw_glasses_details.get(7, 4) as u8, y_position: raw_glasses_details.get(11, 5) as u8, };
450
451 let mole_details = MoleDetails {
452 is_enabled: raw_mole_details.get_bit(0),
453 scale: raw_mole_details.get(1, 4) as u8, x_position: raw_mole_details.get(5, 5) as u8, y_position: raw_mole_details.get(10, 5) as u8, };
457
458 Mii {
459 options,
460 selector_position,
461 console_identity,
462 system_id,
463 mac_address,
464 details,
465 name,
466 height,
467 width,
468 face_details,
469 hair_details,
470 eye_details,
471 eyebrow_details,
472 nose_details,
473 mouth_details,
474 mustache_details,
475 beard_details,
476 glasses_details,
477 mole_details,
478 author_name,
479 }
480 }
481}