summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar german772023-09-10 21:58:18 -0600
committerGravatar german772023-09-10 22:18:25 -0600
commit27929d7ca2b5fffc8866941d08cda921d586c45d (patch)
tree34b87648144aeed0ceb14b51afbdfa976a2aa35e /src
parentservice: mii: Move all raw data to it's file (diff)
downloadyuzu-27929d7ca2b5fffc8866941d08cda921d586c45d.tar.gz
yuzu-27929d7ca2b5fffc8866941d08cda921d586c45d.tar.xz
yuzu-27929d7ca2b5fffc8866941d08cda921d586c45d.zip
service: mii: separate mii types into their own file
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt14
-rw-r--r--src/core/hle/service/am/applets/applet_mii_edit_types.h3
-rw-r--r--src/core/hle/service/mii/mii.cpp2
-rw-r--r--src/core/hle/service/mii/mii_manager.cpp38
-rw-r--r--src/core/hle/service/mii/mii_manager.h16
-rw-r--r--src/core/hle/service/mii/mii_types.h157
-rw-r--r--src/core/hle/service/mii/mii_util.h4
-rw-r--r--src/core/hle/service/mii/types.h509
-rw-r--r--src/core/hle/service/mii/types/char_info.cpp6
-rw-r--r--src/core/hle/service/mii/types/char_info.h76
-rw-r--r--src/core/hle/service/mii/types/core_data.cpp6
-rw-r--r--src/core/hle/service/mii/types/core_data.h105
-rw-r--r--src/core/hle/service/mii/types/raw_data.cpp (renamed from src/core/hle/service/mii/raw_data.cpp)2
-rw-r--r--src/core/hle/service/mii/types/raw_data.h (renamed from src/core/hle/service/mii/raw_data.h)2
-rw-r--r--src/core/hle/service/mii/types/store_data.cpp6
-rw-r--r--src/core/hle/service/mii/types/store_data.h29
-rw-r--r--src/core/hle/service/mii/types/ver3_store_data.cpp6
-rw-r--r--src/core/hle/service/mii/types/ver3_store_data.h141
-rw-r--r--src/core/hle/service/nfc/common/device.cpp1
-rw-r--r--src/core/hle/service/nfp/nfp_types.h5
20 files changed, 586 insertions, 542 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index e9095ac52..c33910ade 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -584,15 +584,23 @@ add_library(core STATIC
584 hle/service/lm/lm.h 584 hle/service/lm/lm.h
585 hle/service/mig/mig.cpp 585 hle/service/mig/mig.cpp
586 hle/service/mig/mig.h 586 hle/service/mig/mig.h
587 hle/service/mii/types/char_info.cpp
588 hle/service/mii/types/char_info.h
589 hle/service/mii/types/core_data.cpp
590 hle/service/mii/types/core_data.h
591 hle/service/mii/types/raw_data.cpp
592 hle/service/mii/types/raw_data.h
593 hle/service/mii/types/store_data.cpp
594 hle/service/mii/types/store_data.h
595 hle/service/mii/types/ver3_store_data.cpp
596 hle/service/mii/types/ver3_store_data.h
587 hle/service/mii/mii.cpp 597 hle/service/mii/mii.cpp
588 hle/service/mii/mii.h 598 hle/service/mii/mii.h
589 hle/service/mii/mii_manager.cpp 599 hle/service/mii/mii_manager.cpp
590 hle/service/mii/mii_manager.h 600 hle/service/mii/mii_manager.h
591 hle/service/mii/mii_result.h 601 hle/service/mii/mii_result.h
602 hle/service/mii/mii_types.h
592 hle/service/mii/mii_util.h 603 hle/service/mii/mii_util.h
593 hle/service/mii/raw_data.cpp
594 hle/service/mii/raw_data.h
595 hle/service/mii/types.h
596 hle/service/mm/mm_u.cpp 604 hle/service/mm/mm_u.cpp
597 hle/service/mm/mm_u.h 605 hle/service/mm/mm_u.h
598 hle/service/mnpp/mnpp_app.cpp 606 hle/service/mnpp/mnpp_app.cpp
diff --git a/src/core/hle/service/am/applets/applet_mii_edit_types.h b/src/core/hle/service/am/applets/applet_mii_edit_types.h
index 4705d019f..f3d764073 100644
--- a/src/core/hle/service/am/applets/applet_mii_edit_types.h
+++ b/src/core/hle/service/am/applets/applet_mii_edit_types.h
@@ -7,7 +7,8 @@
7 7
8#include "common/common_funcs.h" 8#include "common/common_funcs.h"
9#include "common/common_types.h" 9#include "common/common_types.h"
10#include "core/hle/service/mii/types.h" 10#include "common/uuid.h"
11#include "core/hle/service/mii/types/char_info.h"
11 12
12namespace Service::AM::Applets { 13namespace Service::AM::Applets {
13 14
diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp
index bf3ee5907..680f06beb 100644
--- a/src/core/hle/service/mii/mii.cpp
+++ b/src/core/hle/service/mii/mii.cpp
@@ -120,7 +120,7 @@ private:
120 120
121 std::vector<CharInfo> values; 121 std::vector<CharInfo> values;
122 for (const auto& element : default_miis) { 122 for (const auto& element : default_miis) {
123 values.emplace_back(element.info); 123 values.emplace_back(element.char_info);
124 } 124 }
125 125
126 ctx.WriteBuffer(SerializeArray(values)); 126 ctx.WriteBuffer(SerializeArray(values));
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp
index de70c3da6..035eed505 100644
--- a/src/core/hle/service/mii/mii_manager.cpp
+++ b/src/core/hle/service/mii/mii_manager.cpp
@@ -12,7 +12,8 @@
12#include "core/hle/service/mii/mii_manager.h" 12#include "core/hle/service/mii/mii_manager.h"
13#include "core/hle/service/mii/mii_result.h" 13#include "core/hle/service/mii/mii_result.h"
14#include "core/hle/service/mii/mii_util.h" 14#include "core/hle/service/mii/mii_util.h"
15#include "core/hle/service/mii/raw_data.h" 15#include "core/hle/service/mii/types/core_data.h"
16#include "core/hle/service/mii/types/raw_data.h"
16 17
17namespace Service::Mii { 18namespace Service::Mii {
18 19
@@ -29,13 +30,12 @@ std::array<T, DestArraySize> ResizeArray(const std::array<T, SourceArraySize>& i
29 return out; 30 return out;
30} 31}
31 32
32CharInfo ConvertStoreDataToInfo(const MiiStoreData& data) { 33CharInfo ConvertStoreDataToInfo(const StoreData& data) {
33 MiiStoreBitFields bf; 34 const StoreDataBitFields& bf = data.core_data.data;
34 std::memcpy(&bf, data.data.data.data(), sizeof(MiiStoreBitFields));
35 35
36 return { 36 return {
37 .uuid = data.data.uuid, 37 .create_id = data.create_id,
38 .name = ResizeArray<char16_t, 10, 11>(data.data.name), 38 .name = data.core_data.name,
39 .font_region = static_cast<u8>(bf.font_region.Value()), 39 .font_region = static_cast<u8>(bf.font_region.Value()),
40 .favorite_color = static_cast<u8>(bf.favorite_color.Value()), 40 .favorite_color = static_cast<u8>(bf.favorite_color.Value()),
41 .gender = static_cast<u8>(bf.gender.Value()), 41 .gender = static_cast<u8>(bf.gender.Value()),
@@ -89,8 +89,8 @@ CharInfo ConvertStoreDataToInfo(const MiiStoreData& data) {
89 }; 89 };
90} 90}
91 91
92MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Common::UUID& user_id) { 92StoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Common::UUID& user_id) {
93 MiiStoreBitFields bf{}; 93 StoreDataBitFields bf{};
94 94
95 if (gender == Gender::All) { 95 if (gender == Gender::All) {
96 gender = MiiUtil::GetRandomValue<Gender>(Gender::Maximum); 96 gender = MiiUtil::GetRandomValue<Gender>(Gender::Maximum);
@@ -270,8 +270,8 @@ MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Commo
270 return {DefaultMiiName, bf, user_id}; 270 return {DefaultMiiName, bf, user_id};
271} 271}
272 272
273MiiStoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& user_id) { 273StoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& user_id) {
274 MiiStoreBitFields bf{}; 274 StoreDataBitFields bf{};
275 275
276 bf.font_region.Assign(info.font_region); 276 bf.font_region.Assign(info.font_region);
277 bf.favorite_color.Assign(info.favorite_color); 277 bf.favorite_color.Assign(info.favorite_color);
@@ -328,15 +328,15 @@ MiiStoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& u
328 328
329} // namespace 329} // namespace
330 330
331MiiStoreData::MiiStoreData() = default; 331StoreData::StoreData() = default;
332 332
333MiiStoreData::MiiStoreData(const Nickname& name, const MiiStoreBitFields& bit_fields, 333StoreData::StoreData(const Nickname& name, const StoreDataBitFields& bit_fields,
334 const Common::UUID& user_id) { 334 const Common::UUID& user_id) {
335 data.name = name; 335 core_data.name = name;
336 data.uuid = Common::UUID::MakeRandomRFC4122V4(); 336 create_id = Common::UUID::MakeRandomRFC4122V4();
337 337
338 std::memcpy(data.data.data(), &bit_fields, sizeof(MiiStoreBitFields)); 338 core_data.data = bit_fields;
339 data_crc = MiiUtil::CalculateCrc16(data.data.data(), sizeof(data)); 339 data_crc = MiiUtil::CalculateCrc16(&core_data.data, sizeof(core_data.data));
340 device_crc = MiiUtil::CalculateCrc16(&user_id, sizeof(Common::UUID)); 340 device_crc = MiiUtil::CalculateCrc16(&user_id, sizeof(Common::UUID));
341} 341}
342 342
@@ -641,8 +641,8 @@ bool MiiManager::ValidateV3Info(const Ver3StoreData& mii_v3) const {
641 return is_valid; 641 return is_valid;
642} 642}
643 643
644std::vector<MiiInfoElement> MiiManager::GetDefault(SourceFlag source_flag) { 644std::vector<CharInfoElement> MiiManager::GetDefault(SourceFlag source_flag) {
645 std::vector<MiiInfoElement> result; 645 std::vector<CharInfoElement> result;
646 646
647 if ((source_flag & SourceFlag::Default) == SourceFlag::None) { 647 if ((source_flag & SourceFlag::Default) == SourceFlag::None) {
648 return result; 648 return result;
diff --git a/src/core/hle/service/mii/mii_manager.h b/src/core/hle/service/mii/mii_manager.h
index 0c8295ebe..1f5c9e16f 100644
--- a/src/core/hle/service/mii/mii_manager.h
+++ b/src/core/hle/service/mii/mii_manager.h
@@ -6,7 +6,10 @@
6#include <vector> 6#include <vector>
7 7
8#include "core/hle/result.h" 8#include "core/hle/result.h"
9#include "core/hle/service/mii/types.h" 9#include "core/hle/service/mii/mii_types.h"
10#include "core/hle/service/mii/types/char_info.h"
11#include "core/hle/service/mii/types/store_data.h"
12#include "core/hle/service/mii/types/ver3_store_data.h"
10 13
11namespace Service::Mii { 14namespace Service::Mii {
12 15
@@ -25,7 +28,7 @@ public:
25 CharInfo BuildDefault(std::size_t index); 28 CharInfo BuildDefault(std::size_t index);
26 CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const; 29 CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const;
27 bool ValidateV3Info(const Ver3StoreData& mii_v3) const; 30 bool ValidateV3Info(const Ver3StoreData& mii_v3) const;
28 std::vector<MiiInfoElement> GetDefault(SourceFlag source_flag); 31 std::vector<CharInfoElement> GetDefault(SourceFlag source_flag);
29 Result GetIndex(const CharInfo& info, u32& index); 32 Result GetIndex(const CharInfo& info, u32& index);
30 33
31 // This is nn::mii::detail::Ver::StoreDataRaw::BuildFromStoreData 34 // This is nn::mii::detail::Ver::StoreDataRaw::BuildFromStoreData
@@ -34,6 +37,15 @@ public:
34 // This is nn::mii::detail::NfpStoreDataExtentionRaw::SetFromStoreData 37 // This is nn::mii::detail::NfpStoreDataExtentionRaw::SetFromStoreData
35 NfpStoreDataExtension SetFromStoreData(const CharInfo& mii) const; 38 NfpStoreDataExtension SetFromStoreData(const CharInfo& mii) const;
36 39
40 struct MiiDatabase {
41 u32 magic{}; // 'NFDB'
42 std::array<StoreData, 0x64> miis{};
43 INSERT_PADDING_BYTES(1);
44 u8 count{};
45 u16 crc{};
46 };
47 static_assert(sizeof(MiiDatabase) == 0x1A98, "MiiDatabase has incorrect size.");
48
37private: 49private:
38 const Common::UUID user_id{}; 50 const Common::UUID user_id{};
39 u64 update_counter{}; 51 u64 update_counter{};
diff --git a/src/core/hle/service/mii/mii_types.h b/src/core/hle/service/mii/mii_types.h
new file mode 100644
index 000000000..ff836dcf2
--- /dev/null
+++ b/src/core/hle/service/mii/mii_types.h
@@ -0,0 +1,157 @@
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7#include <type_traits>
8
9#include "common/bit_field.h"
10#include "common/common_funcs.h"
11#include "common/common_types.h"
12#include "common/uuid.h"
13
14namespace Service::Mii {
15
16enum class Age : u32 {
17 Young,
18 Normal,
19 Old,
20 All,
21};
22
23enum class BeardType : u32 {
24 None,
25 Beard1,
26 Beard2,
27 Beard3,
28 Beard4,
29 Beard5,
30};
31
32enum class BeardAndMustacheFlag : u32 {
33 Beard = 1,
34 Mustache,
35 All = Beard | Mustache,
36};
37DECLARE_ENUM_FLAG_OPERATORS(BeardAndMustacheFlag);
38
39enum class FontRegion : u32 {
40 Standard,
41 China,
42 Korea,
43 Taiwan,
44};
45
46enum class Gender : u32 {
47 Male,
48 Female,
49 All,
50 Maximum = Female,
51};
52
53enum class HairFlip : u32 {
54 Left,
55 Right,
56 Maximum = Right,
57};
58
59enum class MustacheType : u32 {
60 None,
61 Mustache1,
62 Mustache2,
63 Mustache3,
64 Mustache4,
65 Mustache5,
66};
67
68enum class Race : u32 {
69 Black,
70 White,
71 Asian,
72 All,
73};
74
75enum class Source : u32 {
76 Database = 0,
77 Default = 1,
78 Account = 2,
79 Friend = 3,
80};
81
82enum class SourceFlag : u32 {
83 None = 0,
84 Database = 1 << 0,
85 Default = 1 << 1,
86};
87DECLARE_ENUM_FLAG_OPERATORS(SourceFlag);
88
89using Nickname = std::array<char16_t, 10>;
90
91struct NfpStoreDataExtension {
92 u8 faceline_color;
93 u8 hair_color;
94 u8 eye_color;
95 u8 eyebrow_color;
96 u8 mouth_color;
97 u8 beard_color;
98 u8 glass_color;
99 u8 glass_type;
100};
101static_assert(sizeof(NfpStoreDataExtension) == 0x8, "NfpStoreDataExtension is an invalid size");
102
103struct DefaultMii {
104 u32 face_type{};
105 u32 face_color{};
106 u32 face_wrinkle{};
107 u32 face_makeup{};
108 u32 hair_type{};
109 u32 hair_color{};
110 HairFlip hair_flip{};
111 u32 eye_type{};
112 u32 eye_color{};
113 u32 eye_scale{};
114 u32 eye_aspect{};
115 u32 eye_rotate{};
116 u32 eye_x{};
117 u32 eye_y{};
118 u32 eyebrow_type{};
119 u32 eyebrow_color{};
120 u32 eyebrow_scale{};
121 u32 eyebrow_aspect{};
122 u32 eyebrow_rotate{};
123 u32 eyebrow_x{};
124 u32 eyebrow_y{};
125 u32 nose_type{};
126 u32 nose_scale{};
127 u32 nose_y{};
128 u32 mouth_type{};
129 u32 mouth_color{};
130 u32 mouth_scale{};
131 u32 mouth_aspect{};
132 u32 mouth_y{};
133 MustacheType mustache_type{};
134 BeardType beard_type{};
135 u32 beard_color{};
136 u32 mustache_scale{};
137 u32 mustache_y{};
138 u32 glasses_type{};
139 u32 glasses_color{};
140 u32 glasses_scale{};
141 u32 glasses_y{};
142 u32 mole_type{};
143 u32 mole_scale{};
144 u32 mole_x{};
145 u32 mole_y{};
146 u32 height{};
147 u32 weight{};
148 Gender gender{};
149 u32 favorite_color{};
150 u32 region_move{};
151 FontRegion font_region{};
152 u32 type{};
153 Nickname nickname;
154};
155static_assert(sizeof(DefaultMii) == 0xd8, "MiiStoreData has incorrect size.");
156
157} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/mii_util.h b/src/core/hle/service/mii/mii_util.h
index d98f83825..782ffe22f 100644
--- a/src/core/hle/service/mii/mii_util.h
+++ b/src/core/hle/service/mii/mii_util.h
@@ -1,4 +1,4 @@
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#pragma once 4#pragma once
@@ -8,7 +8,7 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "common/swap.h" 9#include "common/swap.h"
10#include "common/uuid.h" 10#include "common/uuid.h"
11#include "core/hle/service/mii/types.h" 11#include "core/hle/service/mii/mii_types.h"
12 12
13namespace Service::Mii { 13namespace Service::Mii {
14class MiiUtil { 14class MiiUtil {
diff --git a/src/core/hle/service/mii/types.h b/src/core/hle/service/mii/types.h
deleted file mode 100644
index cc8286189..000000000
--- a/src/core/hle/service/mii/types.h
+++ /dev/null
@@ -1,509 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7#include <type_traits>
8
9#include "common/bit_field.h"
10#include "common/common_funcs.h"
11#include "common/common_types.h"
12#include "common/uuid.h"
13
14namespace Service::Mii {
15
16enum class Age : u32 {
17 Young,
18 Normal,
19 Old,
20 All,
21};
22
23enum class BeardType : u32 {
24 None,
25 Beard1,
26 Beard2,
27 Beard3,
28 Beard4,
29 Beard5,
30};
31
32enum class BeardAndMustacheFlag : u32 {
33 Beard = 1,
34 Mustache,
35 All = Beard | Mustache,
36};
37DECLARE_ENUM_FLAG_OPERATORS(BeardAndMustacheFlag);
38
39enum class FontRegion : u32 {
40 Standard,
41 China,
42 Korea,
43 Taiwan,
44};
45
46enum class Gender : u32 {
47 Male,
48 Female,
49 All,
50 Maximum = Female,
51};
52
53enum class HairFlip : u32 {
54 Left,
55 Right,
56 Maximum = Right,
57};
58
59enum class MustacheType : u32 {
60 None,
61 Mustache1,
62 Mustache2,
63 Mustache3,
64 Mustache4,
65 Mustache5,
66};
67
68enum class Race : u32 {
69 Black,
70 White,
71 Asian,
72 All,
73};
74
75enum class Source : u32 {
76 Database = 0,
77 Default = 1,
78 Account = 2,
79 Friend = 3,
80};
81
82enum class SourceFlag : u32 {
83 None = 0,
84 Database = 1 << 0,
85 Default = 1 << 1,
86};
87DECLARE_ENUM_FLAG_OPERATORS(SourceFlag);
88
89using Nickname = std::array<char16_t, 10>;
90
91// nn::mii::CharInfo
92struct CharInfo {
93 Common::UUID uuid;
94 std::array<char16_t, 11> name;
95 u8 font_region;
96 u8 favorite_color;
97 u8 gender;
98 u8 height;
99 u8 build;
100 u8 type;
101 u8 region_move;
102 u8 faceline_type;
103 u8 faceline_color;
104 u8 faceline_wrinkle;
105 u8 faceline_make;
106 u8 hair_type;
107 u8 hair_color;
108 u8 hair_flip;
109 u8 eye_type;
110 u8 eye_color;
111 u8 eye_scale;
112 u8 eye_aspect;
113 u8 eye_rotate;
114 u8 eye_x;
115 u8 eye_y;
116 u8 eyebrow_type;
117 u8 eyebrow_color;
118 u8 eyebrow_scale;
119 u8 eyebrow_aspect;
120 u8 eyebrow_rotate;
121 u8 eyebrow_x;
122 u8 eyebrow_y;
123 u8 nose_type;
124 u8 nose_scale;
125 u8 nose_y;
126 u8 mouth_type;
127 u8 mouth_color;
128 u8 mouth_scale;
129 u8 mouth_aspect;
130 u8 mouth_y;
131 u8 beard_color;
132 u8 beard_type;
133 u8 mustache_type;
134 u8 mustache_scale;
135 u8 mustache_y;
136 u8 glasses_type;
137 u8 glasses_color;
138 u8 glasses_scale;
139 u8 glasses_y;
140 u8 mole_type;
141 u8 mole_scale;
142 u8 mole_x;
143 u8 mole_y;
144 u8 padding;
145};
146static_assert(sizeof(CharInfo) == 0x58, "CharInfo has incorrect size.");
147static_assert(std::has_unique_object_representations_v<CharInfo>,
148 "All bits of CharInfo must contribute to its value.");
149
150#pragma pack(push, 4)
151
152struct MiiInfoElement {
153 MiiInfoElement(const CharInfo& info_, Source source_) : info{info_}, source{source_} {}
154
155 CharInfo info{};
156 Source source{};
157};
158static_assert(sizeof(MiiInfoElement) == 0x5c, "MiiInfoElement has incorrect size.");
159
160struct MiiStoreBitFields {
161 union {
162 u32 word_0{};
163
164 BitField<0, 8, u32> hair_type;
165 BitField<8, 7, u32> height;
166 BitField<15, 1, u32> mole_type;
167 BitField<16, 7, u32> build;
168 BitField<23, 1, HairFlip> hair_flip;
169 BitField<24, 7, u32> hair_color;
170 BitField<31, 1, u32> type;
171 };
172
173 union {
174 u32 word_1{};
175
176 BitField<0, 7, u32> eye_color;
177 BitField<7, 1, Gender> gender;
178 BitField<8, 7, u32> eyebrow_color;
179 BitField<16, 7, u32> mouth_color;
180 BitField<24, 7, u32> beard_color;
181 };
182
183 union {
184 u32 word_2{};
185
186 BitField<0, 7, u32> glasses_color;
187 BitField<8, 6, u32> eye_type;
188 BitField<14, 2, u32> region_move;
189 BitField<16, 6, u32> mouth_type;
190 BitField<22, 2, FontRegion> font_region;
191 BitField<24, 5, u32> eye_y;
192 BitField<29, 3, u32> glasses_scale;
193 };
194
195 union {
196 u32 word_3{};
197
198 BitField<0, 5, u32> eyebrow_type;
199 BitField<5, 3, MustacheType> mustache_type;
200 BitField<8, 5, u32> nose_type;
201 BitField<13, 3, BeardType> beard_type;
202 BitField<16, 5, u32> nose_y;
203 BitField<21, 3, u32> mouth_aspect;
204 BitField<24, 5, u32> mouth_y;
205 BitField<29, 3, u32> eyebrow_aspect;
206 };
207
208 union {
209 u32 word_4{};
210
211 BitField<0, 5, u32> mustache_y;
212 BitField<5, 3, u32> eye_rotate;
213 BitField<8, 5, u32> glasses_y;
214 BitField<13, 3, u32> eye_aspect;
215 BitField<16, 5, u32> mole_x;
216 BitField<21, 3, u32> eye_scale;
217 BitField<24, 5, u32> mole_y;
218 };
219
220 union {
221 u32 word_5{};
222
223 BitField<0, 5, u32> glasses_type;
224 BitField<8, 4, u32> favorite_color;
225 BitField<12, 4, u32> faceline_type;
226 BitField<16, 4, u32> faceline_color;
227 BitField<20, 4, u32> faceline_wrinkle;
228 BitField<24, 4, u32> faceline_makeup;
229 BitField<28, 4, u32> eye_x;
230 };
231
232 union {
233 u32 word_6{};
234
235 BitField<0, 4, u32> eyebrow_scale;
236 BitField<4, 4, u32> eyebrow_rotate;
237 BitField<8, 4, u32> eyebrow_x;
238 BitField<12, 4, u32> eyebrow_y;
239 BitField<16, 4, u32> nose_scale;
240 BitField<20, 4, u32> mouth_scale;
241 BitField<24, 4, u32> mustache_scale;
242 BitField<28, 4, u32> mole_scale;
243 };
244};
245static_assert(sizeof(MiiStoreBitFields) == 0x1c, "MiiStoreBitFields has incorrect size.");
246static_assert(std::is_trivially_copyable_v<MiiStoreBitFields>,
247 "MiiStoreBitFields is not trivially copyable.");
248
249// This is nn::mii::Ver3StoreData
250// Based on citra HLE::Applets::MiiData and PretendoNetwork.
251// https://github.com/citra-emu/citra/blob/master/src/core/hle/applets/mii_selector.h#L48
252// https://github.com/PretendoNetwork/mii-js/blob/master/mii.js#L299
253struct Ver3StoreData {
254 u8 version;
255 union {
256 u8 raw;
257
258 BitField<0, 1, u8> allow_copying;
259 BitField<1, 1, u8> profanity_flag;
260 BitField<2, 2, u8> region_lock;
261 BitField<4, 2, u8> character_set;
262 } region_information;
263 u16_be mii_id;
264 u64_be system_id;
265 u32_be specialness_and_creation_date;
266 std::array<u8, 0x6> creator_mac;
267 u16_be padding;
268 union {
269 u16 raw;
270
271 BitField<0, 1, u16> gender;
272 BitField<1, 4, u16> birth_month;
273 BitField<5, 5, u16> birth_day;
274 BitField<10, 4, u16> favorite_color;
275 BitField<14, 1, u16> favorite;
276 } mii_information;
277 std::array<char16_t, 0xA> mii_name;
278 u8 height;
279 u8 build;
280 union {
281 u8 raw;
282
283 BitField<0, 1, u8> disable_sharing;
284 BitField<1, 4, u8> face_shape;
285 BitField<5, 3, u8> skin_color;
286 } appearance_bits1;
287 union {
288 u8 raw;
289
290 BitField<0, 4, u8> wrinkles;
291 BitField<4, 4, u8> makeup;
292 } appearance_bits2;
293 u8 hair_style;
294 union {
295 u8 raw;
296
297 BitField<0, 3, u8> hair_color;
298 BitField<3, 1, u8> flip_hair;
299 } appearance_bits3;
300 union {
301 u32 raw;
302
303 BitField<0, 6, u32> eye_type;
304 BitField<6, 3, u32> eye_color;
305 BitField<9, 4, u32> eye_scale;
306 BitField<13, 3, u32> eye_vertical_stretch;
307 BitField<16, 5, u32> eye_rotation;
308 BitField<21, 4, u32> eye_spacing;
309 BitField<25, 5, u32> eye_y_position;
310 } appearance_bits4;
311 union {
312 u32 raw;
313
314 BitField<0, 5, u32> eyebrow_style;
315 BitField<5, 3, u32> eyebrow_color;
316 BitField<8, 4, u32> eyebrow_scale;
317 BitField<12, 3, u32> eyebrow_yscale;
318 BitField<16, 4, u32> eyebrow_rotation;
319 BitField<21, 4, u32> eyebrow_spacing;
320 BitField<25, 5, u32> eyebrow_y_position;
321 } appearance_bits5;
322 union {
323 u16 raw;
324
325 BitField<0, 5, u16> nose_type;
326 BitField<5, 4, u16> nose_scale;
327 BitField<9, 5, u16> nose_y_position;
328 } appearance_bits6;
329 union {
330 u16 raw;
331
332 BitField<0, 6, u16> mouth_type;
333 BitField<6, 3, u16> mouth_color;
334 BitField<9, 4, u16> mouth_scale;
335 BitField<13, 3, u16> mouth_horizontal_stretch;
336 } appearance_bits7;
337 union {
338 u8 raw;
339
340 BitField<0, 5, u8> mouth_y_position;
341 BitField<5, 3, u8> mustache_type;
342 } appearance_bits8;
343 u8 allow_copying;
344 union {
345 u16 raw;
346
347 BitField<0, 3, u16> bear_type;
348 BitField<3, 3, u16> facial_hair_color;
349 BitField<6, 4, u16> mustache_scale;
350 BitField<10, 5, u16> mustache_y_position;
351 } appearance_bits9;
352 union {
353 u16 raw;
354
355 BitField<0, 4, u16> glasses_type;
356 BitField<4, 3, u16> glasses_color;
357 BitField<7, 4, u16> glasses_scale;
358 BitField<11, 5, u16> glasses_y_position;
359 } appearance_bits10;
360 union {
361 u16 raw;
362
363 BitField<0, 1, u16> mole_enabled;
364 BitField<1, 4, u16> mole_scale;
365 BitField<5, 5, u16> mole_x_position;
366 BitField<10, 5, u16> mole_y_position;
367 } appearance_bits11;
368
369 std::array<u16_le, 0xA> author_name;
370 INSERT_PADDING_BYTES(0x2);
371 u16_be crc;
372};
373static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size");
374
375struct NfpStoreDataExtension {
376 u8 faceline_color;
377 u8 hair_color;
378 u8 eye_color;
379 u8 eyebrow_color;
380 u8 mouth_color;
381 u8 beard_color;
382 u8 glass_color;
383 u8 glass_type;
384};
385static_assert(sizeof(NfpStoreDataExtension) == 0x8, "NfpStoreDataExtension is an invalid size");
386
387struct MiiStoreData {
388
389 MiiStoreData();
390 MiiStoreData(const Nickname& name, const MiiStoreBitFields& bit_fields,
391 const Common::UUID& user_id);
392
393 // This corresponds to the above structure MiiStoreBitFields. I did it like this because the
394 // BitField<> type makes this (and any thing that contains it) not trivially copyable, which is
395 // not suitable for our uses.
396 struct {
397 std::array<u8, 0x1C> data{};
398 static_assert(sizeof(MiiStoreBitFields) == sizeof(data), "data field has incorrect size.");
399
400 Nickname name{};
401 Common::UUID uuid{};
402 } data;
403
404 u16 data_crc{};
405 u16 device_crc{};
406};
407static_assert(sizeof(MiiStoreData) == 0x44, "MiiStoreData has incorrect size.");
408
409struct MiiStoreDataElement {
410 MiiStoreData data{};
411 Source source{};
412};
413static_assert(sizeof(MiiStoreDataElement) == 0x48, "MiiStoreDataElement has incorrect size.");
414
415struct MiiDatabase {
416 u32 magic{}; // 'NFDB'
417 std::array<MiiStoreData, 0x64> miis{};
418 INSERT_PADDING_BYTES(1);
419 u8 count{};
420 u16 crc{};
421};
422static_assert(sizeof(MiiDatabase) == 0x1A98, "MiiDatabase has incorrect size.");
423
424struct RandomMiiValues {
425 std::array<u8, 0xbc> values{};
426};
427static_assert(sizeof(RandomMiiValues) == 0xbc, "RandomMiiValues has incorrect size.");
428
429struct RandomMiiData4 {
430 Gender gender{};
431 Age age{};
432 Race race{};
433 u32 values_count{};
434 std::array<u32, 47> values{};
435};
436static_assert(sizeof(RandomMiiData4) == 0xcc, "RandomMiiData4 has incorrect size.");
437
438struct RandomMiiData3 {
439 u32 arg_1;
440 u32 arg_2;
441 u32 values_count;
442 std::array<u32, 47> values{};
443};
444static_assert(sizeof(RandomMiiData3) == 0xc8, "RandomMiiData3 has incorrect size.");
445
446struct RandomMiiData2 {
447 u32 arg_1;
448 u32 values_count;
449 std::array<u32, 47> values{};
450};
451static_assert(sizeof(RandomMiiData2) == 0xc4, "RandomMiiData2 has incorrect size.");
452
453struct DefaultMii {
454 u32 face_type{};
455 u32 face_color{};
456 u32 face_wrinkle{};
457 u32 face_makeup{};
458 u32 hair_type{};
459 u32 hair_color{};
460 HairFlip hair_flip{};
461 u32 eye_type{};
462 u32 eye_color{};
463 u32 eye_scale{};
464 u32 eye_aspect{};
465 u32 eye_rotate{};
466 u32 eye_x{};
467 u32 eye_y{};
468 u32 eyebrow_type{};
469 u32 eyebrow_color{};
470 u32 eyebrow_scale{};
471 u32 eyebrow_aspect{};
472 u32 eyebrow_rotate{};
473 u32 eyebrow_x{};
474 u32 eyebrow_y{};
475 u32 nose_type{};
476 u32 nose_scale{};
477 u32 nose_y{};
478 u32 mouth_type{};
479 u32 mouth_color{};
480 u32 mouth_scale{};
481 u32 mouth_aspect{};
482 u32 mouth_y{};
483 MustacheType mustache_type{};
484 BeardType beard_type{};
485 u32 beard_color{};
486 u32 mustache_scale{};
487 u32 mustache_y{};
488 u32 glasses_type{};
489 u32 glasses_color{};
490 u32 glasses_scale{};
491 u32 glasses_y{};
492 u32 mole_type{};
493 u32 mole_scale{};
494 u32 mole_x{};
495 u32 mole_y{};
496 u32 height{};
497 u32 weight{};
498 Gender gender{};
499 u32 favorite_color{};
500 u32 region_move{};
501 FontRegion font_region{};
502 u32 type{};
503 Nickname nickname;
504};
505static_assert(sizeof(DefaultMii) == 0xd8, "MiiStoreData has incorrect size.");
506
507#pragma pack(pop)
508
509} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/char_info.cpp b/src/core/hle/service/mii/types/char_info.cpp
new file mode 100644
index 000000000..250fad44b
--- /dev/null
+++ b/src/core/hle/service/mii/types/char_info.cpp
@@ -0,0 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/mii/types/char_info.h"
5
6namespace Service::Mii {} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/char_info.h b/src/core/hle/service/mii/types/char_info.h
new file mode 100644
index 000000000..5741b5089
--- /dev/null
+++ b/src/core/hle/service/mii/types/char_info.h
@@ -0,0 +1,76 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/mii/mii_types.h"
7
8namespace Service::Mii {
9
10// This is nn::mii::detail::CharInfoRaw
11struct CharInfo {
12 Common::UUID create_id;
13 Nickname name;
14 u16 null_terminator;
15 u8 font_region;
16 u8 favorite_color;
17 u8 gender;
18 u8 height;
19 u8 build;
20 u8 type;
21 u8 region_move;
22 u8 faceline_type;
23 u8 faceline_color;
24 u8 faceline_wrinkle;
25 u8 faceline_make;
26 u8 hair_type;
27 u8 hair_color;
28 u8 hair_flip;
29 u8 eye_type;
30 u8 eye_color;
31 u8 eye_scale;
32 u8 eye_aspect;
33 u8 eye_rotate;
34 u8 eye_x;
35 u8 eye_y;
36 u8 eyebrow_type;
37 u8 eyebrow_color;
38 u8 eyebrow_scale;
39 u8 eyebrow_aspect;
40 u8 eyebrow_rotate;
41 u8 eyebrow_x;
42 u8 eyebrow_y;
43 u8 nose_type;
44 u8 nose_scale;
45 u8 nose_y;
46 u8 mouth_type;
47 u8 mouth_color;
48 u8 mouth_scale;
49 u8 mouth_aspect;
50 u8 mouth_y;
51 u8 beard_color;
52 u8 beard_type;
53 u8 mustache_type;
54 u8 mustache_scale;
55 u8 mustache_y;
56 u8 glasses_type;
57 u8 glasses_color;
58 u8 glasses_scale;
59 u8 glasses_y;
60 u8 mole_type;
61 u8 mole_scale;
62 u8 mole_x;
63 u8 mole_y;
64 u8 padding;
65};
66static_assert(sizeof(CharInfo) == 0x58, "CharInfo has incorrect size.");
67static_assert(std::has_unique_object_representations_v<CharInfo>,
68 "All bits of CharInfo must contribute to its value.");
69
70struct CharInfoElement {
71 CharInfo char_info{};
72 Source source{};
73};
74static_assert(sizeof(CharInfoElement) == 0x5c, "CharInfoElement has incorrect size.");
75
76}; // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/core_data.cpp b/src/core/hle/service/mii/types/core_data.cpp
new file mode 100644
index 000000000..a7b12ad8d
--- /dev/null
+++ b/src/core/hle/service/mii/types/core_data.cpp
@@ -0,0 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/mii/types/core_data.h"
5
6namespace Service::Mii {} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/core_data.h b/src/core/hle/service/mii/types/core_data.h
new file mode 100644
index 000000000..9dd7a5380
--- /dev/null
+++ b/src/core/hle/service/mii/types/core_data.h
@@ -0,0 +1,105 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/mii/mii_types.h"
7
8namespace Service::Mii {
9
10struct StoreDataBitFields {
11 union {
12 u32 word_0{};
13
14 BitField<0, 8, u32> hair_type;
15 BitField<8, 7, u32> height;
16 BitField<15, 1, u32> mole_type;
17 BitField<16, 7, u32> build;
18 BitField<23, 1, HairFlip> hair_flip;
19 BitField<24, 7, u32> hair_color;
20 BitField<31, 1, u32> type;
21 };
22
23 union {
24 u32 word_1{};
25
26 BitField<0, 7, u32> eye_color;
27 BitField<7, 1, Gender> gender;
28 BitField<8, 7, u32> eyebrow_color;
29 BitField<16, 7, u32> mouth_color;
30 BitField<24, 7, u32> beard_color;
31 };
32
33 union {
34 u32 word_2{};
35
36 BitField<0, 7, u32> glasses_color;
37 BitField<8, 6, u32> eye_type;
38 BitField<14, 2, u32> region_move;
39 BitField<16, 6, u32> mouth_type;
40 BitField<22, 2, FontRegion> font_region;
41 BitField<24, 5, u32> eye_y;
42 BitField<29, 3, u32> glasses_scale;
43 };
44
45 union {
46 u32 word_3{};
47
48 BitField<0, 5, u32> eyebrow_type;
49 BitField<5, 3, MustacheType> mustache_type;
50 BitField<8, 5, u32> nose_type;
51 BitField<13, 3, BeardType> beard_type;
52 BitField<16, 5, u32> nose_y;
53 BitField<21, 3, u32> mouth_aspect;
54 BitField<24, 5, u32> mouth_y;
55 BitField<29, 3, u32> eyebrow_aspect;
56 };
57
58 union {
59 u32 word_4{};
60
61 BitField<0, 5, u32> mustache_y;
62 BitField<5, 3, u32> eye_rotate;
63 BitField<8, 5, u32> glasses_y;
64 BitField<13, 3, u32> eye_aspect;
65 BitField<16, 5, u32> mole_x;
66 BitField<21, 3, u32> eye_scale;
67 BitField<24, 5, u32> mole_y;
68 };
69
70 union {
71 u32 word_5{};
72
73 BitField<0, 5, u32> glasses_type;
74 BitField<8, 4, u32> favorite_color;
75 BitField<12, 4, u32> faceline_type;
76 BitField<16, 4, u32> faceline_color;
77 BitField<20, 4, u32> faceline_wrinkle;
78 BitField<24, 4, u32> faceline_makeup;
79 BitField<28, 4, u32> eye_x;
80 };
81
82 union {
83 u32 word_6{};
84
85 BitField<0, 4, u32> eyebrow_scale;
86 BitField<4, 4, u32> eyebrow_rotate;
87 BitField<8, 4, u32> eyebrow_x;
88 BitField<12, 4, u32> eyebrow_y;
89 BitField<16, 4, u32> nose_scale;
90 BitField<20, 4, u32> mouth_scale;
91 BitField<24, 4, u32> mustache_scale;
92 BitField<28, 4, u32> mole_scale;
93 };
94};
95static_assert(sizeof(StoreDataBitFields) == 0x1c, "StoreDataBitFields has incorrect size.");
96static_assert(std::is_trivially_copyable_v<StoreDataBitFields>,
97 "StoreDataBitFields is not trivially copyable.");
98
99struct CoreData {
100 StoreDataBitFields data{};
101 Nickname name{};
102};
103static_assert(sizeof(CoreData) == 0x30, "CoreData has incorrect size.");
104
105}; // namespace Service::Mii
diff --git a/src/core/hle/service/mii/raw_data.cpp b/src/core/hle/service/mii/types/raw_data.cpp
index 070e2d199..ef678c527 100644
--- a/src/core/hle/service/mii/raw_data.cpp
+++ b/src/core/hle/service/mii/types/raw_data.cpp
@@ -1,7 +1,7 @@
1// SPDX-FileCopyrightText: Ryujinx Team and Contributors 1// SPDX-FileCopyrightText: Ryujinx Team and Contributors
2// SPDX-License-Identifier: MIT 2// SPDX-License-Identifier: MIT
3 3
4#include "core/hle/service/mii/raw_data.h" 4#include "core/hle/service/mii/types/raw_data.h"
5 5
6namespace Service::Mii::RawData { 6namespace Service::Mii::RawData {
7 7
diff --git a/src/core/hle/service/mii/raw_data.h b/src/core/hle/service/mii/types/raw_data.h
index ab84d09a1..180f49fd0 100644
--- a/src/core/hle/service/mii/raw_data.h
+++ b/src/core/hle/service/mii/types/raw_data.h
@@ -5,7 +5,7 @@
5 5
6#include <array> 6#include <array>
7 7
8#include "core/hle/service/mii/types.h" 8#include "core/hle/service/mii/mii_types.h"
9 9
10namespace Service::Mii::RawData { 10namespace Service::Mii::RawData {
11 11
diff --git a/src/core/hle/service/mii/types/store_data.cpp b/src/core/hle/service/mii/types/store_data.cpp
new file mode 100644
index 000000000..aadc0e1af
--- /dev/null
+++ b/src/core/hle/service/mii/types/store_data.cpp
@@ -0,0 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/mii/types/store_data.h"
5
6namespace Service::Mii {} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/store_data.h b/src/core/hle/service/mii/types/store_data.h
new file mode 100644
index 000000000..54a263b05
--- /dev/null
+++ b/src/core/hle/service/mii/types/store_data.h
@@ -0,0 +1,29 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/mii/mii_types.h"
7#include "core/hle/service/mii/types/core_data.h"
8
9namespace Service::Mii {
10
11struct StoreData {
12 StoreData();
13 StoreData(const Nickname& name, const StoreDataBitFields& bit_fields,
14 const Common::UUID& user_id);
15
16 CoreData core_data{};
17 Common::UUID create_id{};
18 u16 data_crc{};
19 u16 device_crc{};
20};
21static_assert(sizeof(StoreData) == 0x44, "StoreData has incorrect size.");
22
23struct StoreDataElement {
24 StoreData store_data{};
25 Source source{};
26};
27static_assert(sizeof(StoreDataElement) == 0x48, "StoreDataElement has incorrect size.");
28
29}; // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/ver3_store_data.cpp b/src/core/hle/service/mii/types/ver3_store_data.cpp
new file mode 100644
index 000000000..4c8904c12
--- /dev/null
+++ b/src/core/hle/service/mii/types/ver3_store_data.cpp
@@ -0,0 +1,6 @@
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/mii/types/ver3_store_data.h"
5
6namespace Service::Mii {} // namespace Service::Mii
diff --git a/src/core/hle/service/mii/types/ver3_store_data.h b/src/core/hle/service/mii/types/ver3_store_data.h
new file mode 100644
index 000000000..c3963548c
--- /dev/null
+++ b/src/core/hle/service/mii/types/ver3_store_data.h
@@ -0,0 +1,141 @@
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/mii/mii_types.h"
7#include "core/hle/service/mii/types/core_data.h"
8#include "core/hle/service/mii/types/store_data.h"
9
10namespace Service::Mii {
11
12// This is nn::mii::Ver3StoreData
13// Based on citra HLE::Applets::MiiData and PretendoNetwork.
14// https://github.com/citra-emu/citra/blob/master/src/core/hle/applets/mii_selector.h#L48
15// https://github.com/PretendoNetwork/mii-js/blob/master/mii.js#L299
16
17#pragma pack(push, 4)
18struct Ver3StoreData {
19 u8 version;
20 union {
21 u8 raw;
22
23 BitField<0, 1, u8> allow_copying;
24 BitField<1, 1, u8> profanity_flag;
25 BitField<2, 2, u8> region_lock;
26 BitField<4, 2, u8> character_set;
27 } region_information;
28 u16_be mii_id;
29 u64_be system_id;
30 u32_be specialness_and_creation_date;
31 std::array<u8, 0x6> creator_mac;
32 u16_be padding;
33 union {
34 u16 raw;
35
36 BitField<0, 1, u16> gender;
37 BitField<1, 4, u16> birth_month;
38 BitField<5, 5, u16> birth_day;
39 BitField<10, 4, u16> favorite_color;
40 BitField<14, 1, u16> favorite;
41 } mii_information;
42 std::array<char16_t, 0xA> mii_name;
43 u8 height;
44 u8 build;
45 union {
46 u8 raw;
47
48 BitField<0, 1, u8> disable_sharing;
49 BitField<1, 4, u8> face_shape;
50 BitField<5, 3, u8> skin_color;
51 } appearance_bits1;
52 union {
53 u8 raw;
54
55 BitField<0, 4, u8> wrinkles;
56 BitField<4, 4, u8> makeup;
57 } appearance_bits2;
58 u8 hair_style;
59 union {
60 u8 raw;
61
62 BitField<0, 3, u8> hair_color;
63 BitField<3, 1, u8> flip_hair;
64 } appearance_bits3;
65 union {
66 u32 raw;
67
68 BitField<0, 6, u32> eye_type;
69 BitField<6, 3, u32> eye_color;
70 BitField<9, 4, u32> eye_scale;
71 BitField<13, 3, u32> eye_vertical_stretch;
72 BitField<16, 5, u32> eye_rotation;
73 BitField<21, 4, u32> eye_spacing;
74 BitField<25, 5, u32> eye_y_position;
75 } appearance_bits4;
76 union {
77 u32 raw;
78
79 BitField<0, 5, u32> eyebrow_style;
80 BitField<5, 3, u32> eyebrow_color;
81 BitField<8, 4, u32> eyebrow_scale;
82 BitField<12, 3, u32> eyebrow_yscale;
83 BitField<16, 4, u32> eyebrow_rotation;
84 BitField<21, 4, u32> eyebrow_spacing;
85 BitField<25, 5, u32> eyebrow_y_position;
86 } appearance_bits5;
87 union {
88 u16 raw;
89
90 BitField<0, 5, u16> nose_type;
91 BitField<5, 4, u16> nose_scale;
92 BitField<9, 5, u16> nose_y_position;
93 } appearance_bits6;
94 union {
95 u16 raw;
96
97 BitField<0, 6, u16> mouth_type;
98 BitField<6, 3, u16> mouth_color;
99 BitField<9, 4, u16> mouth_scale;
100 BitField<13, 3, u16> mouth_horizontal_stretch;
101 } appearance_bits7;
102 union {
103 u8 raw;
104
105 BitField<0, 5, u8> mouth_y_position;
106 BitField<5, 3, u8> mustache_type;
107 } appearance_bits8;
108 u8 allow_copying;
109 union {
110 u16 raw;
111
112 BitField<0, 3, u16> bear_type;
113 BitField<3, 3, u16> facial_hair_color;
114 BitField<6, 4, u16> mustache_scale;
115 BitField<10, 5, u16> mustache_y_position;
116 } appearance_bits9;
117 union {
118 u16 raw;
119
120 BitField<0, 4, u16> glasses_type;
121 BitField<4, 3, u16> glasses_color;
122 BitField<7, 4, u16> glasses_scale;
123 BitField<11, 5, u16> glasses_y_position;
124 } appearance_bits10;
125 union {
126 u16 raw;
127
128 BitField<0, 1, u16> mole_enabled;
129 BitField<1, 4, u16> mole_scale;
130 BitField<5, 5, u16> mole_x_position;
131 BitField<10, 5, u16> mole_y_position;
132 } appearance_bits11;
133
134 std::array<u16_le, 0xA> author_name;
135 INSERT_PADDING_BYTES(0x2);
136 u16_be crc;
137};
138static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size");
139#pragma pack(pop)
140
141}; // namespace Service::Mii
diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp
index 5df40f9a0..44ac8cc71 100644
--- a/src/core/hle/service/nfc/common/device.cpp
+++ b/src/core/hle/service/nfc/common/device.cpp
@@ -28,7 +28,6 @@
28#include "core/hle/kernel/k_event.h" 28#include "core/hle/kernel/k_event.h"
29#include "core/hle/service/ipc_helpers.h" 29#include "core/hle/service/ipc_helpers.h"
30#include "core/hle/service/mii/mii_manager.h" 30#include "core/hle/service/mii/mii_manager.h"
31#include "core/hle/service/mii/types.h"
32#include "core/hle/service/nfc/common/amiibo_crypto.h" 31#include "core/hle/service/nfc/common/amiibo_crypto.h"
33#include "core/hle/service/nfc/common/device.h" 32#include "core/hle/service/nfc/common/device.h"
34#include "core/hle/service/nfc/mifare_result.h" 33#include "core/hle/service/nfc/mifare_result.h"
diff --git a/src/core/hle/service/nfp/nfp_types.h b/src/core/hle/service/nfp/nfp_types.h
index aed12a7f8..adcaa8e84 100644
--- a/src/core/hle/service/nfp/nfp_types.h
+++ b/src/core/hle/service/nfp/nfp_types.h
@@ -6,7 +6,8 @@
6#include <array> 6#include <array>
7 7
8#include "common/swap.h" 8#include "common/swap.h"
9#include "core/hle/service/mii/types.h" 9#include "core/hle/service/mii/types/char_info.h"
10#include "core/hle/service/mii/types/ver3_store_data.h"
10#include "core/hle/service/nfc/nfc_types.h" 11#include "core/hle/service/nfc/nfc_types.h"
11 12
12namespace Service::NFP { 13namespace Service::NFP {
@@ -322,7 +323,7 @@ static_assert(sizeof(RegisterInfo) == 0x100, "RegisterInfo is an invalid size");
322 323
323// This is nn::nfp::RegisterInfoPrivate 324// This is nn::nfp::RegisterInfoPrivate
324struct RegisterInfoPrivate { 325struct RegisterInfoPrivate {
325 Service::Mii::MiiStoreData mii_store_data; 326 Service::Mii::StoreData mii_store_data;
326 WriteDate creation_date; 327 WriteDate creation_date;
327 AmiiboName amiibo_name; 328 AmiiboName amiibo_name;
328 u8 font_region; 329 u8 font_region;