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
-
36src/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-FileCopyrightText: Ryujinx Team and Contributors
|
||||
// SPDX-License-Identifier: MIT
|
// 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 { |
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