20 changed files with 586 additions and 542 deletions
-
14src/core/CMakeLists.txt
-
3src/core/hle/service/am/applets/applet_mii_edit_types.h
-
2src/core/hle/service/mii/mii.cpp
-
38src/core/hle/service/mii/mii_manager.cpp
-
16src/core/hle/service/mii/mii_manager.h
-
157src/core/hle/service/mii/mii_types.h
-
4src/core/hle/service/mii/mii_util.h
-
509src/core/hle/service/mii/types.h
-
6src/core/hle/service/mii/types/char_info.cpp
-
76src/core/hle/service/mii/types/char_info.h
-
6src/core/hle/service/mii/types/core_data.cpp
-
105src/core/hle/service/mii/types/core_data.h
-
2src/core/hle/service/mii/types/raw_data.cpp
-
2src/core/hle/service/mii/types/raw_data.h
-
6src/core/hle/service/mii/types/store_data.cpp
-
29src/core/hle/service/mii/types/store_data.h
-
6src/core/hle/service/mii/types/ver3_store_data.cpp
-
141src/core/hle/service/mii/types/ver3_store_data.h
-
1src/core/hle/service/nfc/common/device.cpp
-
5src/core/hle/service/nfp/nfp_types.h
@ -0,0 +1,157 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <array> |
|||
#include <type_traits> |
|||
|
|||
#include "common/bit_field.h" |
|||
#include "common/common_funcs.h" |
|||
#include "common/common_types.h" |
|||
#include "common/uuid.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
enum class Age : u32 { |
|||
Young, |
|||
Normal, |
|||
Old, |
|||
All, |
|||
}; |
|||
|
|||
enum class BeardType : u32 { |
|||
None, |
|||
Beard1, |
|||
Beard2, |
|||
Beard3, |
|||
Beard4, |
|||
Beard5, |
|||
}; |
|||
|
|||
enum class BeardAndMustacheFlag : u32 { |
|||
Beard = 1, |
|||
Mustache, |
|||
All = Beard | Mustache, |
|||
}; |
|||
DECLARE_ENUM_FLAG_OPERATORS(BeardAndMustacheFlag); |
|||
|
|||
enum class FontRegion : u32 { |
|||
Standard, |
|||
China, |
|||
Korea, |
|||
Taiwan, |
|||
}; |
|||
|
|||
enum class Gender : u32 { |
|||
Male, |
|||
Female, |
|||
All, |
|||
Maximum = Female, |
|||
}; |
|||
|
|||
enum class HairFlip : u32 { |
|||
Left, |
|||
Right, |
|||
Maximum = Right, |
|||
}; |
|||
|
|||
enum class MustacheType : u32 { |
|||
None, |
|||
Mustache1, |
|||
Mustache2, |
|||
Mustache3, |
|||
Mustache4, |
|||
Mustache5, |
|||
}; |
|||
|
|||
enum class Race : u32 { |
|||
Black, |
|||
White, |
|||
Asian, |
|||
All, |
|||
}; |
|||
|
|||
enum class Source : u32 { |
|||
Database = 0, |
|||
Default = 1, |
|||
Account = 2, |
|||
Friend = 3, |
|||
}; |
|||
|
|||
enum class SourceFlag : u32 { |
|||
None = 0, |
|||
Database = 1 << 0, |
|||
Default = 1 << 1, |
|||
}; |
|||
DECLARE_ENUM_FLAG_OPERATORS(SourceFlag); |
|||
|
|||
using Nickname = std::array<char16_t, 10>; |
|||
|
|||
struct NfpStoreDataExtension { |
|||
u8 faceline_color; |
|||
u8 hair_color; |
|||
u8 eye_color; |
|||
u8 eyebrow_color; |
|||
u8 mouth_color; |
|||
u8 beard_color; |
|||
u8 glass_color; |
|||
u8 glass_type; |
|||
}; |
|||
static_assert(sizeof(NfpStoreDataExtension) == 0x8, "NfpStoreDataExtension is an invalid size"); |
|||
|
|||
struct DefaultMii { |
|||
u32 face_type{}; |
|||
u32 face_color{}; |
|||
u32 face_wrinkle{}; |
|||
u32 face_makeup{}; |
|||
u32 hair_type{}; |
|||
u32 hair_color{}; |
|||
HairFlip hair_flip{}; |
|||
u32 eye_type{}; |
|||
u32 eye_color{}; |
|||
u32 eye_scale{}; |
|||
u32 eye_aspect{}; |
|||
u32 eye_rotate{}; |
|||
u32 eye_x{}; |
|||
u32 eye_y{}; |
|||
u32 eyebrow_type{}; |
|||
u32 eyebrow_color{}; |
|||
u32 eyebrow_scale{}; |
|||
u32 eyebrow_aspect{}; |
|||
u32 eyebrow_rotate{}; |
|||
u32 eyebrow_x{}; |
|||
u32 eyebrow_y{}; |
|||
u32 nose_type{}; |
|||
u32 nose_scale{}; |
|||
u32 nose_y{}; |
|||
u32 mouth_type{}; |
|||
u32 mouth_color{}; |
|||
u32 mouth_scale{}; |
|||
u32 mouth_aspect{}; |
|||
u32 mouth_y{}; |
|||
MustacheType mustache_type{}; |
|||
BeardType beard_type{}; |
|||
u32 beard_color{}; |
|||
u32 mustache_scale{}; |
|||
u32 mustache_y{}; |
|||
u32 glasses_type{}; |
|||
u32 glasses_color{}; |
|||
u32 glasses_scale{}; |
|||
u32 glasses_y{}; |
|||
u32 mole_type{}; |
|||
u32 mole_scale{}; |
|||
u32 mole_x{}; |
|||
u32 mole_y{}; |
|||
u32 height{}; |
|||
u32 weight{}; |
|||
Gender gender{}; |
|||
u32 favorite_color{}; |
|||
u32 region_move{}; |
|||
FontRegion font_region{}; |
|||
u32 type{}; |
|||
Nickname nickname; |
|||
}; |
|||
static_assert(sizeof(DefaultMii) == 0xd8, "MiiStoreData has incorrect size."); |
|||
|
|||
} // namespace Service::Mii |
|||
@ -1,509 +0,0 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <array> |
|||
#include <type_traits> |
|||
|
|||
#include "common/bit_field.h" |
|||
#include "common/common_funcs.h" |
|||
#include "common/common_types.h" |
|||
#include "common/uuid.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
enum class Age : u32 { |
|||
Young, |
|||
Normal, |
|||
Old, |
|||
All, |
|||
}; |
|||
|
|||
enum class BeardType : u32 { |
|||
None, |
|||
Beard1, |
|||
Beard2, |
|||
Beard3, |
|||
Beard4, |
|||
Beard5, |
|||
}; |
|||
|
|||
enum class BeardAndMustacheFlag : u32 { |
|||
Beard = 1, |
|||
Mustache, |
|||
All = Beard | Mustache, |
|||
}; |
|||
DECLARE_ENUM_FLAG_OPERATORS(BeardAndMustacheFlag); |
|||
|
|||
enum class FontRegion : u32 { |
|||
Standard, |
|||
China, |
|||
Korea, |
|||
Taiwan, |
|||
}; |
|||
|
|||
enum class Gender : u32 { |
|||
Male, |
|||
Female, |
|||
All, |
|||
Maximum = Female, |
|||
}; |
|||
|
|||
enum class HairFlip : u32 { |
|||
Left, |
|||
Right, |
|||
Maximum = Right, |
|||
}; |
|||
|
|||
enum class MustacheType : u32 { |
|||
None, |
|||
Mustache1, |
|||
Mustache2, |
|||
Mustache3, |
|||
Mustache4, |
|||
Mustache5, |
|||
}; |
|||
|
|||
enum class Race : u32 { |
|||
Black, |
|||
White, |
|||
Asian, |
|||
All, |
|||
}; |
|||
|
|||
enum class Source : u32 { |
|||
Database = 0, |
|||
Default = 1, |
|||
Account = 2, |
|||
Friend = 3, |
|||
}; |
|||
|
|||
enum class SourceFlag : u32 { |
|||
None = 0, |
|||
Database = 1 << 0, |
|||
Default = 1 << 1, |
|||
}; |
|||
DECLARE_ENUM_FLAG_OPERATORS(SourceFlag); |
|||
|
|||
using Nickname = std::array<char16_t, 10>; |
|||
|
|||
// nn::mii::CharInfo |
|||
struct CharInfo { |
|||
Common::UUID uuid; |
|||
std::array<char16_t, 11> name; |
|||
u8 font_region; |
|||
u8 favorite_color; |
|||
u8 gender; |
|||
u8 height; |
|||
u8 build; |
|||
u8 type; |
|||
u8 region_move; |
|||
u8 faceline_type; |
|||
u8 faceline_color; |
|||
u8 faceline_wrinkle; |
|||
u8 faceline_make; |
|||
u8 hair_type; |
|||
u8 hair_color; |
|||
u8 hair_flip; |
|||
u8 eye_type; |
|||
u8 eye_color; |
|||
u8 eye_scale; |
|||
u8 eye_aspect; |
|||
u8 eye_rotate; |
|||
u8 eye_x; |
|||
u8 eye_y; |
|||
u8 eyebrow_type; |
|||
u8 eyebrow_color; |
|||
u8 eyebrow_scale; |
|||
u8 eyebrow_aspect; |
|||
u8 eyebrow_rotate; |
|||
u8 eyebrow_x; |
|||
u8 eyebrow_y; |
|||
u8 nose_type; |
|||
u8 nose_scale; |
|||
u8 nose_y; |
|||
u8 mouth_type; |
|||
u8 mouth_color; |
|||
u8 mouth_scale; |
|||
u8 mouth_aspect; |
|||
u8 mouth_y; |
|||
u8 beard_color; |
|||
u8 beard_type; |
|||
u8 mustache_type; |
|||
u8 mustache_scale; |
|||
u8 mustache_y; |
|||
u8 glasses_type; |
|||
u8 glasses_color; |
|||
u8 glasses_scale; |
|||
u8 glasses_y; |
|||
u8 mole_type; |
|||
u8 mole_scale; |
|||
u8 mole_x; |
|||
u8 mole_y; |
|||
u8 padding; |
|||
}; |
|||
static_assert(sizeof(CharInfo) == 0x58, "CharInfo has incorrect size."); |
|||
static_assert(std::has_unique_object_representations_v<CharInfo>, |
|||
"All bits of CharInfo must contribute to its value."); |
|||
|
|||
#pragma pack(push, 4) |
|||
|
|||
struct MiiInfoElement { |
|||
MiiInfoElement(const CharInfo& info_, Source source_) : info{info_}, source{source_} {} |
|||
|
|||
CharInfo info{}; |
|||
Source source{}; |
|||
}; |
|||
static_assert(sizeof(MiiInfoElement) == 0x5c, "MiiInfoElement has incorrect size."); |
|||
|
|||
struct MiiStoreBitFields { |
|||
union { |
|||
u32 word_0{}; |
|||
|
|||
BitField<0, 8, u32> hair_type; |
|||
BitField<8, 7, u32> height; |
|||
BitField<15, 1, u32> mole_type; |
|||
BitField<16, 7, u32> build; |
|||
BitField<23, 1, HairFlip> hair_flip; |
|||
BitField<24, 7, u32> hair_color; |
|||
BitField<31, 1, u32> type; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_1{}; |
|||
|
|||
BitField<0, 7, u32> eye_color; |
|||
BitField<7, 1, Gender> gender; |
|||
BitField<8, 7, u32> eyebrow_color; |
|||
BitField<16, 7, u32> mouth_color; |
|||
BitField<24, 7, u32> beard_color; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_2{}; |
|||
|
|||
BitField<0, 7, u32> glasses_color; |
|||
BitField<8, 6, u32> eye_type; |
|||
BitField<14, 2, u32> region_move; |
|||
BitField<16, 6, u32> mouth_type; |
|||
BitField<22, 2, FontRegion> font_region; |
|||
BitField<24, 5, u32> eye_y; |
|||
BitField<29, 3, u32> glasses_scale; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_3{}; |
|||
|
|||
BitField<0, 5, u32> eyebrow_type; |
|||
BitField<5, 3, MustacheType> mustache_type; |
|||
BitField<8, 5, u32> nose_type; |
|||
BitField<13, 3, BeardType> beard_type; |
|||
BitField<16, 5, u32> nose_y; |
|||
BitField<21, 3, u32> mouth_aspect; |
|||
BitField<24, 5, u32> mouth_y; |
|||
BitField<29, 3, u32> eyebrow_aspect; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_4{}; |
|||
|
|||
BitField<0, 5, u32> mustache_y; |
|||
BitField<5, 3, u32> eye_rotate; |
|||
BitField<8, 5, u32> glasses_y; |
|||
BitField<13, 3, u32> eye_aspect; |
|||
BitField<16, 5, u32> mole_x; |
|||
BitField<21, 3, u32> eye_scale; |
|||
BitField<24, 5, u32> mole_y; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_5{}; |
|||
|
|||
BitField<0, 5, u32> glasses_type; |
|||
BitField<8, 4, u32> favorite_color; |
|||
BitField<12, 4, u32> faceline_type; |
|||
BitField<16, 4, u32> faceline_color; |
|||
BitField<20, 4, u32> faceline_wrinkle; |
|||
BitField<24, 4, u32> faceline_makeup; |
|||
BitField<28, 4, u32> eye_x; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_6{}; |
|||
|
|||
BitField<0, 4, u32> eyebrow_scale; |
|||
BitField<4, 4, u32> eyebrow_rotate; |
|||
BitField<8, 4, u32> eyebrow_x; |
|||
BitField<12, 4, u32> eyebrow_y; |
|||
BitField<16, 4, u32> nose_scale; |
|||
BitField<20, 4, u32> mouth_scale; |
|||
BitField<24, 4, u32> mustache_scale; |
|||
BitField<28, 4, u32> mole_scale; |
|||
}; |
|||
}; |
|||
static_assert(sizeof(MiiStoreBitFields) == 0x1c, "MiiStoreBitFields has incorrect size."); |
|||
static_assert(std::is_trivially_copyable_v<MiiStoreBitFields>, |
|||
"MiiStoreBitFields is not trivially copyable."); |
|||
|
|||
// This is nn::mii::Ver3StoreData |
|||
// Based on citra HLE::Applets::MiiData and PretendoNetwork. |
|||
// https://github.com/citra-emu/citra/blob/master/src/core/hle/applets/mii_selector.h#L48 |
|||
// https://github.com/PretendoNetwork/mii-js/blob/master/mii.js#L299 |
|||
struct Ver3StoreData { |
|||
u8 version; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 1, u8> allow_copying; |
|||
BitField<1, 1, u8> profanity_flag; |
|||
BitField<2, 2, u8> region_lock; |
|||
BitField<4, 2, u8> character_set; |
|||
} region_information; |
|||
u16_be mii_id; |
|||
u64_be system_id; |
|||
u32_be specialness_and_creation_date; |
|||
std::array<u8, 0x6> creator_mac; |
|||
u16_be padding; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 1, u16> gender; |
|||
BitField<1, 4, u16> birth_month; |
|||
BitField<5, 5, u16> birth_day; |
|||
BitField<10, 4, u16> favorite_color; |
|||
BitField<14, 1, u16> favorite; |
|||
} mii_information; |
|||
std::array<char16_t, 0xA> mii_name; |
|||
u8 height; |
|||
u8 build; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 1, u8> disable_sharing; |
|||
BitField<1, 4, u8> face_shape; |
|||
BitField<5, 3, u8> skin_color; |
|||
} appearance_bits1; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 4, u8> wrinkles; |
|||
BitField<4, 4, u8> makeup; |
|||
} appearance_bits2; |
|||
u8 hair_style; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 3, u8> hair_color; |
|||
BitField<3, 1, u8> flip_hair; |
|||
} appearance_bits3; |
|||
union { |
|||
u32 raw; |
|||
|
|||
BitField<0, 6, u32> eye_type; |
|||
BitField<6, 3, u32> eye_color; |
|||
BitField<9, 4, u32> eye_scale; |
|||
BitField<13, 3, u32> eye_vertical_stretch; |
|||
BitField<16, 5, u32> eye_rotation; |
|||
BitField<21, 4, u32> eye_spacing; |
|||
BitField<25, 5, u32> eye_y_position; |
|||
} appearance_bits4; |
|||
union { |
|||
u32 raw; |
|||
|
|||
BitField<0, 5, u32> eyebrow_style; |
|||
BitField<5, 3, u32> eyebrow_color; |
|||
BitField<8, 4, u32> eyebrow_scale; |
|||
BitField<12, 3, u32> eyebrow_yscale; |
|||
BitField<16, 4, u32> eyebrow_rotation; |
|||
BitField<21, 4, u32> eyebrow_spacing; |
|||
BitField<25, 5, u32> eyebrow_y_position; |
|||
} appearance_bits5; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 5, u16> nose_type; |
|||
BitField<5, 4, u16> nose_scale; |
|||
BitField<9, 5, u16> nose_y_position; |
|||
} appearance_bits6; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 6, u16> mouth_type; |
|||
BitField<6, 3, u16> mouth_color; |
|||
BitField<9, 4, u16> mouth_scale; |
|||
BitField<13, 3, u16> mouth_horizontal_stretch; |
|||
} appearance_bits7; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 5, u8> mouth_y_position; |
|||
BitField<5, 3, u8> mustache_type; |
|||
} appearance_bits8; |
|||
u8 allow_copying; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 3, u16> bear_type; |
|||
BitField<3, 3, u16> facial_hair_color; |
|||
BitField<6, 4, u16> mustache_scale; |
|||
BitField<10, 5, u16> mustache_y_position; |
|||
} appearance_bits9; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 4, u16> glasses_type; |
|||
BitField<4, 3, u16> glasses_color; |
|||
BitField<7, 4, u16> glasses_scale; |
|||
BitField<11, 5, u16> glasses_y_position; |
|||
} appearance_bits10; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 1, u16> mole_enabled; |
|||
BitField<1, 4, u16> mole_scale; |
|||
BitField<5, 5, u16> mole_x_position; |
|||
BitField<10, 5, u16> mole_y_position; |
|||
} appearance_bits11; |
|||
|
|||
std::array<u16_le, 0xA> author_name; |
|||
INSERT_PADDING_BYTES(0x2); |
|||
u16_be crc; |
|||
}; |
|||
static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); |
|||
|
|||
struct NfpStoreDataExtension { |
|||
u8 faceline_color; |
|||
u8 hair_color; |
|||
u8 eye_color; |
|||
u8 eyebrow_color; |
|||
u8 mouth_color; |
|||
u8 beard_color; |
|||
u8 glass_color; |
|||
u8 glass_type; |
|||
}; |
|||
static_assert(sizeof(NfpStoreDataExtension) == 0x8, "NfpStoreDataExtension is an invalid size"); |
|||
|
|||
struct MiiStoreData { |
|||
|
|||
MiiStoreData(); |
|||
MiiStoreData(const Nickname& name, const MiiStoreBitFields& bit_fields, |
|||
const Common::UUID& user_id); |
|||
|
|||
// This corresponds to the above structure MiiStoreBitFields. I did it like this because the |
|||
// BitField<> type makes this (and any thing that contains it) not trivially copyable, which is |
|||
// not suitable for our uses. |
|||
struct { |
|||
std::array<u8, 0x1C> data{}; |
|||
static_assert(sizeof(MiiStoreBitFields) == sizeof(data), "data field has incorrect size."); |
|||
|
|||
Nickname name{}; |
|||
Common::UUID uuid{}; |
|||
} data; |
|||
|
|||
u16 data_crc{}; |
|||
u16 device_crc{}; |
|||
}; |
|||
static_assert(sizeof(MiiStoreData) == 0x44, "MiiStoreData has incorrect size."); |
|||
|
|||
struct MiiStoreDataElement { |
|||
MiiStoreData data{}; |
|||
Source source{}; |
|||
}; |
|||
static_assert(sizeof(MiiStoreDataElement) == 0x48, "MiiStoreDataElement has incorrect size."); |
|||
|
|||
struct MiiDatabase { |
|||
u32 magic{}; // 'NFDB' |
|||
std::array<MiiStoreData, 0x64> miis{}; |
|||
INSERT_PADDING_BYTES(1); |
|||
u8 count{}; |
|||
u16 crc{}; |
|||
}; |
|||
static_assert(sizeof(MiiDatabase) == 0x1A98, "MiiDatabase has incorrect size."); |
|||
|
|||
struct RandomMiiValues { |
|||
std::array<u8, 0xbc> values{}; |
|||
}; |
|||
static_assert(sizeof(RandomMiiValues) == 0xbc, "RandomMiiValues has incorrect size."); |
|||
|
|||
struct RandomMiiData4 { |
|||
Gender gender{}; |
|||
Age age{}; |
|||
Race race{}; |
|||
u32 values_count{}; |
|||
std::array<u32, 47> values{}; |
|||
}; |
|||
static_assert(sizeof(RandomMiiData4) == 0xcc, "RandomMiiData4 has incorrect size."); |
|||
|
|||
struct RandomMiiData3 { |
|||
u32 arg_1; |
|||
u32 arg_2; |
|||
u32 values_count; |
|||
std::array<u32, 47> values{}; |
|||
}; |
|||
static_assert(sizeof(RandomMiiData3) == 0xc8, "RandomMiiData3 has incorrect size."); |
|||
|
|||
struct RandomMiiData2 { |
|||
u32 arg_1; |
|||
u32 values_count; |
|||
std::array<u32, 47> values{}; |
|||
}; |
|||
static_assert(sizeof(RandomMiiData2) == 0xc4, "RandomMiiData2 has incorrect size."); |
|||
|
|||
struct DefaultMii { |
|||
u32 face_type{}; |
|||
u32 face_color{}; |
|||
u32 face_wrinkle{}; |
|||
u32 face_makeup{}; |
|||
u32 hair_type{}; |
|||
u32 hair_color{}; |
|||
HairFlip hair_flip{}; |
|||
u32 eye_type{}; |
|||
u32 eye_color{}; |
|||
u32 eye_scale{}; |
|||
u32 eye_aspect{}; |
|||
u32 eye_rotate{}; |
|||
u32 eye_x{}; |
|||
u32 eye_y{}; |
|||
u32 eyebrow_type{}; |
|||
u32 eyebrow_color{}; |
|||
u32 eyebrow_scale{}; |
|||
u32 eyebrow_aspect{}; |
|||
u32 eyebrow_rotate{}; |
|||
u32 eyebrow_x{}; |
|||
u32 eyebrow_y{}; |
|||
u32 nose_type{}; |
|||
u32 nose_scale{}; |
|||
u32 nose_y{}; |
|||
u32 mouth_type{}; |
|||
u32 mouth_color{}; |
|||
u32 mouth_scale{}; |
|||
u32 mouth_aspect{}; |
|||
u32 mouth_y{}; |
|||
MustacheType mustache_type{}; |
|||
BeardType beard_type{}; |
|||
u32 beard_color{}; |
|||
u32 mustache_scale{}; |
|||
u32 mustache_y{}; |
|||
u32 glasses_type{}; |
|||
u32 glasses_color{}; |
|||
u32 glasses_scale{}; |
|||
u32 glasses_y{}; |
|||
u32 mole_type{}; |
|||
u32 mole_scale{}; |
|||
u32 mole_x{}; |
|||
u32 mole_y{}; |
|||
u32 height{}; |
|||
u32 weight{}; |
|||
Gender gender{}; |
|||
u32 favorite_color{}; |
|||
u32 region_move{}; |
|||
FontRegion font_region{}; |
|||
u32 type{}; |
|||
Nickname nickname; |
|||
}; |
|||
static_assert(sizeof(DefaultMii) == 0xd8, "MiiStoreData has incorrect size."); |
|||
|
|||
#pragma pack(pop) |
|||
|
|||
} // namespace Service::Mii |
|||
@ -0,0 +1,6 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/mii/types/char_info.h"
|
|||
|
|||
namespace Service::Mii {} // namespace Service::Mii
|
|||
@ -0,0 +1,76 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/mii/mii_types.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
// This is nn::mii::detail::CharInfoRaw |
|||
struct CharInfo { |
|||
Common::UUID create_id; |
|||
Nickname name; |
|||
u16 null_terminator; |
|||
u8 font_region; |
|||
u8 favorite_color; |
|||
u8 gender; |
|||
u8 height; |
|||
u8 build; |
|||
u8 type; |
|||
u8 region_move; |
|||
u8 faceline_type; |
|||
u8 faceline_color; |
|||
u8 faceline_wrinkle; |
|||
u8 faceline_make; |
|||
u8 hair_type; |
|||
u8 hair_color; |
|||
u8 hair_flip; |
|||
u8 eye_type; |
|||
u8 eye_color; |
|||
u8 eye_scale; |
|||
u8 eye_aspect; |
|||
u8 eye_rotate; |
|||
u8 eye_x; |
|||
u8 eye_y; |
|||
u8 eyebrow_type; |
|||
u8 eyebrow_color; |
|||
u8 eyebrow_scale; |
|||
u8 eyebrow_aspect; |
|||
u8 eyebrow_rotate; |
|||
u8 eyebrow_x; |
|||
u8 eyebrow_y; |
|||
u8 nose_type; |
|||
u8 nose_scale; |
|||
u8 nose_y; |
|||
u8 mouth_type; |
|||
u8 mouth_color; |
|||
u8 mouth_scale; |
|||
u8 mouth_aspect; |
|||
u8 mouth_y; |
|||
u8 beard_color; |
|||
u8 beard_type; |
|||
u8 mustache_type; |
|||
u8 mustache_scale; |
|||
u8 mustache_y; |
|||
u8 glasses_type; |
|||
u8 glasses_color; |
|||
u8 glasses_scale; |
|||
u8 glasses_y; |
|||
u8 mole_type; |
|||
u8 mole_scale; |
|||
u8 mole_x; |
|||
u8 mole_y; |
|||
u8 padding; |
|||
}; |
|||
static_assert(sizeof(CharInfo) == 0x58, "CharInfo has incorrect size."); |
|||
static_assert(std::has_unique_object_representations_v<CharInfo>, |
|||
"All bits of CharInfo must contribute to its value."); |
|||
|
|||
struct CharInfoElement { |
|||
CharInfo char_info{}; |
|||
Source source{}; |
|||
}; |
|||
static_assert(sizeof(CharInfoElement) == 0x5c, "CharInfoElement has incorrect size."); |
|||
|
|||
}; // namespace Service::Mii |
|||
@ -0,0 +1,6 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/mii/types/core_data.h"
|
|||
|
|||
namespace Service::Mii {} // namespace Service::Mii
|
|||
@ -0,0 +1,105 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/mii/mii_types.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
struct StoreDataBitFields { |
|||
union { |
|||
u32 word_0{}; |
|||
|
|||
BitField<0, 8, u32> hair_type; |
|||
BitField<8, 7, u32> height; |
|||
BitField<15, 1, u32> mole_type; |
|||
BitField<16, 7, u32> build; |
|||
BitField<23, 1, HairFlip> hair_flip; |
|||
BitField<24, 7, u32> hair_color; |
|||
BitField<31, 1, u32> type; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_1{}; |
|||
|
|||
BitField<0, 7, u32> eye_color; |
|||
BitField<7, 1, Gender> gender; |
|||
BitField<8, 7, u32> eyebrow_color; |
|||
BitField<16, 7, u32> mouth_color; |
|||
BitField<24, 7, u32> beard_color; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_2{}; |
|||
|
|||
BitField<0, 7, u32> glasses_color; |
|||
BitField<8, 6, u32> eye_type; |
|||
BitField<14, 2, u32> region_move; |
|||
BitField<16, 6, u32> mouth_type; |
|||
BitField<22, 2, FontRegion> font_region; |
|||
BitField<24, 5, u32> eye_y; |
|||
BitField<29, 3, u32> glasses_scale; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_3{}; |
|||
|
|||
BitField<0, 5, u32> eyebrow_type; |
|||
BitField<5, 3, MustacheType> mustache_type; |
|||
BitField<8, 5, u32> nose_type; |
|||
BitField<13, 3, BeardType> beard_type; |
|||
BitField<16, 5, u32> nose_y; |
|||
BitField<21, 3, u32> mouth_aspect; |
|||
BitField<24, 5, u32> mouth_y; |
|||
BitField<29, 3, u32> eyebrow_aspect; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_4{}; |
|||
|
|||
BitField<0, 5, u32> mustache_y; |
|||
BitField<5, 3, u32> eye_rotate; |
|||
BitField<8, 5, u32> glasses_y; |
|||
BitField<13, 3, u32> eye_aspect; |
|||
BitField<16, 5, u32> mole_x; |
|||
BitField<21, 3, u32> eye_scale; |
|||
BitField<24, 5, u32> mole_y; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_5{}; |
|||
|
|||
BitField<0, 5, u32> glasses_type; |
|||
BitField<8, 4, u32> favorite_color; |
|||
BitField<12, 4, u32> faceline_type; |
|||
BitField<16, 4, u32> faceline_color; |
|||
BitField<20, 4, u32> faceline_wrinkle; |
|||
BitField<24, 4, u32> faceline_makeup; |
|||
BitField<28, 4, u32> eye_x; |
|||
}; |
|||
|
|||
union { |
|||
u32 word_6{}; |
|||
|
|||
BitField<0, 4, u32> eyebrow_scale; |
|||
BitField<4, 4, u32> eyebrow_rotate; |
|||
BitField<8, 4, u32> eyebrow_x; |
|||
BitField<12, 4, u32> eyebrow_y; |
|||
BitField<16, 4, u32> nose_scale; |
|||
BitField<20, 4, u32> mouth_scale; |
|||
BitField<24, 4, u32> mustache_scale; |
|||
BitField<28, 4, u32> mole_scale; |
|||
}; |
|||
}; |
|||
static_assert(sizeof(StoreDataBitFields) == 0x1c, "StoreDataBitFields has incorrect size."); |
|||
static_assert(std::is_trivially_copyable_v<StoreDataBitFields>, |
|||
"StoreDataBitFields is not trivially copyable."); |
|||
|
|||
struct CoreData { |
|||
StoreDataBitFields data{}; |
|||
Nickname name{}; |
|||
}; |
|||
static_assert(sizeof(CoreData) == 0x30, "CoreData has incorrect size."); |
|||
|
|||
}; // namespace Service::Mii |
|||
@ -1,7 +1,7 @@ |
|||
// SPDX-FileCopyrightText: Ryujinx Team and Contributors
|
|||
// SPDX-License-Identifier: MIT
|
|||
|
|||
#include "core/hle/service/mii/raw_data.h"
|
|||
#include "core/hle/service/mii/types/raw_data.h"
|
|||
|
|||
namespace Service::Mii::RawData { |
|||
|
|||
@ -0,0 +1,6 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/mii/types/store_data.h"
|
|||
|
|||
namespace Service::Mii {} // namespace Service::Mii
|
|||
@ -0,0 +1,29 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/mii/mii_types.h" |
|||
#include "core/hle/service/mii/types/core_data.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
struct StoreData { |
|||
StoreData(); |
|||
StoreData(const Nickname& name, const StoreDataBitFields& bit_fields, |
|||
const Common::UUID& user_id); |
|||
|
|||
CoreData core_data{}; |
|||
Common::UUID create_id{}; |
|||
u16 data_crc{}; |
|||
u16 device_crc{}; |
|||
}; |
|||
static_assert(sizeof(StoreData) == 0x44, "StoreData has incorrect size."); |
|||
|
|||
struct StoreDataElement { |
|||
StoreData store_data{}; |
|||
Source source{}; |
|||
}; |
|||
static_assert(sizeof(StoreDataElement) == 0x48, "StoreDataElement has incorrect size."); |
|||
|
|||
}; // namespace Service::Mii |
|||
@ -0,0 +1,6 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/mii/types/ver3_store_data.h"
|
|||
|
|||
namespace Service::Mii {} // namespace Service::Mii
|
|||
@ -0,0 +1,141 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/mii/mii_types.h" |
|||
#include "core/hle/service/mii/types/core_data.h" |
|||
#include "core/hle/service/mii/types/store_data.h" |
|||
|
|||
namespace Service::Mii { |
|||
|
|||
// This is nn::mii::Ver3StoreData |
|||
// Based on citra HLE::Applets::MiiData and PretendoNetwork. |
|||
// https://github.com/citra-emu/citra/blob/master/src/core/hle/applets/mii_selector.h#L48 |
|||
// https://github.com/PretendoNetwork/mii-js/blob/master/mii.js#L299 |
|||
|
|||
#pragma pack(push, 4) |
|||
struct Ver3StoreData { |
|||
u8 version; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 1, u8> allow_copying; |
|||
BitField<1, 1, u8> profanity_flag; |
|||
BitField<2, 2, u8> region_lock; |
|||
BitField<4, 2, u8> character_set; |
|||
} region_information; |
|||
u16_be mii_id; |
|||
u64_be system_id; |
|||
u32_be specialness_and_creation_date; |
|||
std::array<u8, 0x6> creator_mac; |
|||
u16_be padding; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 1, u16> gender; |
|||
BitField<1, 4, u16> birth_month; |
|||
BitField<5, 5, u16> birth_day; |
|||
BitField<10, 4, u16> favorite_color; |
|||
BitField<14, 1, u16> favorite; |
|||
} mii_information; |
|||
std::array<char16_t, 0xA> mii_name; |
|||
u8 height; |
|||
u8 build; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 1, u8> disable_sharing; |
|||
BitField<1, 4, u8> face_shape; |
|||
BitField<5, 3, u8> skin_color; |
|||
} appearance_bits1; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 4, u8> wrinkles; |
|||
BitField<4, 4, u8> makeup; |
|||
} appearance_bits2; |
|||
u8 hair_style; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 3, u8> hair_color; |
|||
BitField<3, 1, u8> flip_hair; |
|||
} appearance_bits3; |
|||
union { |
|||
u32 raw; |
|||
|
|||
BitField<0, 6, u32> eye_type; |
|||
BitField<6, 3, u32> eye_color; |
|||
BitField<9, 4, u32> eye_scale; |
|||
BitField<13, 3, u32> eye_vertical_stretch; |
|||
BitField<16, 5, u32> eye_rotation; |
|||
BitField<21, 4, u32> eye_spacing; |
|||
BitField<25, 5, u32> eye_y_position; |
|||
} appearance_bits4; |
|||
union { |
|||
u32 raw; |
|||
|
|||
BitField<0, 5, u32> eyebrow_style; |
|||
BitField<5, 3, u32> eyebrow_color; |
|||
BitField<8, 4, u32> eyebrow_scale; |
|||
BitField<12, 3, u32> eyebrow_yscale; |
|||
BitField<16, 4, u32> eyebrow_rotation; |
|||
BitField<21, 4, u32> eyebrow_spacing; |
|||
BitField<25, 5, u32> eyebrow_y_position; |
|||
} appearance_bits5; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 5, u16> nose_type; |
|||
BitField<5, 4, u16> nose_scale; |
|||
BitField<9, 5, u16> nose_y_position; |
|||
} appearance_bits6; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 6, u16> mouth_type; |
|||
BitField<6, 3, u16> mouth_color; |
|||
BitField<9, 4, u16> mouth_scale; |
|||
BitField<13, 3, u16> mouth_horizontal_stretch; |
|||
} appearance_bits7; |
|||
union { |
|||
u8 raw; |
|||
|
|||
BitField<0, 5, u8> mouth_y_position; |
|||
BitField<5, 3, u8> mustache_type; |
|||
} appearance_bits8; |
|||
u8 allow_copying; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 3, u16> bear_type; |
|||
BitField<3, 3, u16> facial_hair_color; |
|||
BitField<6, 4, u16> mustache_scale; |
|||
BitField<10, 5, u16> mustache_y_position; |
|||
} appearance_bits9; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 4, u16> glasses_type; |
|||
BitField<4, 3, u16> glasses_color; |
|||
BitField<7, 4, u16> glasses_scale; |
|||
BitField<11, 5, u16> glasses_y_position; |
|||
} appearance_bits10; |
|||
union { |
|||
u16 raw; |
|||
|
|||
BitField<0, 1, u16> mole_enabled; |
|||
BitField<1, 4, u16> mole_scale; |
|||
BitField<5, 5, u16> mole_x_position; |
|||
BitField<10, 5, u16> mole_y_position; |
|||
} appearance_bits11; |
|||
|
|||
std::array<u16_le, 0xA> author_name; |
|||
INSERT_PADDING_BYTES(0x2); |
|||
u16_be crc; |
|||
}; |
|||
static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); |
|||
#pragma pack(pop) |
|||
|
|||
}; // namespace Service::Mii |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue