service: mii: separate mii types into their own file
This commit is contained in:
parent
63b239f5c6
commit
27929d7ca2
20 changed files with 586 additions and 542 deletions
|
@ -584,15 +584,23 @@ add_library(core STATIC
|
||||||
hle/service/lm/lm.h
|
hle/service/lm/lm.h
|
||||||
hle/service/mig/mig.cpp
|
hle/service/mig/mig.cpp
|
||||||
hle/service/mig/mig.h
|
hle/service/mig/mig.h
|
||||||
|
hle/service/mii/types/char_info.cpp
|
||||||
|
hle/service/mii/types/char_info.h
|
||||||
|
hle/service/mii/types/core_data.cpp
|
||||||
|
hle/service/mii/types/core_data.h
|
||||||
|
hle/service/mii/types/raw_data.cpp
|
||||||
|
hle/service/mii/types/raw_data.h
|
||||||
|
hle/service/mii/types/store_data.cpp
|
||||||
|
hle/service/mii/types/store_data.h
|
||||||
|
hle/service/mii/types/ver3_store_data.cpp
|
||||||
|
hle/service/mii/types/ver3_store_data.h
|
||||||
hle/service/mii/mii.cpp
|
hle/service/mii/mii.cpp
|
||||||
hle/service/mii/mii.h
|
hle/service/mii/mii.h
|
||||||
hle/service/mii/mii_manager.cpp
|
hle/service/mii/mii_manager.cpp
|
||||||
hle/service/mii/mii_manager.h
|
hle/service/mii/mii_manager.h
|
||||||
hle/service/mii/mii_result.h
|
hle/service/mii/mii_result.h
|
||||||
|
hle/service/mii/mii_types.h
|
||||||
hle/service/mii/mii_util.h
|
hle/service/mii/mii_util.h
|
||||||
hle/service/mii/raw_data.cpp
|
|
||||||
hle/service/mii/raw_data.h
|
|
||||||
hle/service/mii/types.h
|
|
||||||
hle/service/mm/mm_u.cpp
|
hle/service/mm/mm_u.cpp
|
||||||
hle/service/mm/mm_u.h
|
hle/service/mm/mm_u.h
|
||||||
hle/service/mnpp/mnpp_app.cpp
|
hle/service/mnpp/mnpp_app.cpp
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
|
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
#include "common/uuid.h"
|
||||||
|
#include "core/hle/service/mii/types/char_info.h"
|
||||||
|
|
||||||
namespace Service::AM::Applets {
|
namespace Service::AM::Applets {
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ private:
|
||||||
|
|
||||||
std::vector<CharInfo> values;
|
std::vector<CharInfo> values;
|
||||||
for (const auto& element : default_miis) {
|
for (const auto& element : default_miis) {
|
||||||
values.emplace_back(element.info);
|
values.emplace_back(element.char_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.WriteBuffer(SerializeArray(values));
|
ctx.WriteBuffer(SerializeArray(values));
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
#include "core/hle/service/mii/mii_manager.h"
|
#include "core/hle/service/mii/mii_manager.h"
|
||||||
#include "core/hle/service/mii/mii_result.h"
|
#include "core/hle/service/mii/mii_result.h"
|
||||||
#include "core/hle/service/mii/mii_util.h"
|
#include "core/hle/service/mii/mii_util.h"
|
||||||
#include "core/hle/service/mii/raw_data.h"
|
#include "core/hle/service/mii/types/core_data.h"
|
||||||
|
#include "core/hle/service/mii/types/raw_data.h"
|
||||||
|
|
||||||
namespace Service::Mii {
|
namespace Service::Mii {
|
||||||
|
|
||||||
|
@ -29,13 +30,12 @@ std::array<T, DestArraySize> ResizeArray(const std::array<T, SourceArraySize>& i
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
CharInfo ConvertStoreDataToInfo(const MiiStoreData& data) {
|
CharInfo ConvertStoreDataToInfo(const StoreData& data) {
|
||||||
MiiStoreBitFields bf;
|
const StoreDataBitFields& bf = data.core_data.data;
|
||||||
std::memcpy(&bf, data.data.data.data(), sizeof(MiiStoreBitFields));
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
.uuid = data.data.uuid,
|
.create_id = data.create_id,
|
||||||
.name = ResizeArray<char16_t, 10, 11>(data.data.name),
|
.name = data.core_data.name,
|
||||||
.font_region = static_cast<u8>(bf.font_region.Value()),
|
.font_region = static_cast<u8>(bf.font_region.Value()),
|
||||||
.favorite_color = static_cast<u8>(bf.favorite_color.Value()),
|
.favorite_color = static_cast<u8>(bf.favorite_color.Value()),
|
||||||
.gender = static_cast<u8>(bf.gender.Value()),
|
.gender = static_cast<u8>(bf.gender.Value()),
|
||||||
|
@ -89,8 +89,8 @@ CharInfo ConvertStoreDataToInfo(const MiiStoreData& data) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Common::UUID& user_id) {
|
StoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Common::UUID& user_id) {
|
||||||
MiiStoreBitFields bf{};
|
StoreDataBitFields bf{};
|
||||||
|
|
||||||
if (gender == Gender::All) {
|
if (gender == Gender::All) {
|
||||||
gender = MiiUtil::GetRandomValue<Gender>(Gender::Maximum);
|
gender = MiiUtil::GetRandomValue<Gender>(Gender::Maximum);
|
||||||
|
@ -270,8 +270,8 @@ MiiStoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Commo
|
||||||
return {DefaultMiiName, bf, user_id};
|
return {DefaultMiiName, bf, user_id};
|
||||||
}
|
}
|
||||||
|
|
||||||
MiiStoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& user_id) {
|
StoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& user_id) {
|
||||||
MiiStoreBitFields bf{};
|
StoreDataBitFields bf{};
|
||||||
|
|
||||||
bf.font_region.Assign(info.font_region);
|
bf.font_region.Assign(info.font_region);
|
||||||
bf.favorite_color.Assign(info.favorite_color);
|
bf.favorite_color.Assign(info.favorite_color);
|
||||||
|
@ -328,15 +328,15 @@ MiiStoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& u
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MiiStoreData::MiiStoreData() = default;
|
StoreData::StoreData() = default;
|
||||||
|
|
||||||
MiiStoreData::MiiStoreData(const Nickname& name, const MiiStoreBitFields& bit_fields,
|
StoreData::StoreData(const Nickname& name, const StoreDataBitFields& bit_fields,
|
||||||
const Common::UUID& user_id) {
|
const Common::UUID& user_id) {
|
||||||
data.name = name;
|
core_data.name = name;
|
||||||
data.uuid = Common::UUID::MakeRandomRFC4122V4();
|
create_id = Common::UUID::MakeRandomRFC4122V4();
|
||||||
|
|
||||||
std::memcpy(data.data.data(), &bit_fields, sizeof(MiiStoreBitFields));
|
core_data.data = bit_fields;
|
||||||
data_crc = MiiUtil::CalculateCrc16(data.data.data(), sizeof(data));
|
data_crc = MiiUtil::CalculateCrc16(&core_data.data, sizeof(core_data.data));
|
||||||
device_crc = MiiUtil::CalculateCrc16(&user_id, sizeof(Common::UUID));
|
device_crc = MiiUtil::CalculateCrc16(&user_id, sizeof(Common::UUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,8 +641,8 @@ bool MiiManager::ValidateV3Info(const Ver3StoreData& mii_v3) const {
|
||||||
return is_valid;
|
return is_valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MiiInfoElement> MiiManager::GetDefault(SourceFlag source_flag) {
|
std::vector<CharInfoElement> MiiManager::GetDefault(SourceFlag source_flag) {
|
||||||
std::vector<MiiInfoElement> result;
|
std::vector<CharInfoElement> result;
|
||||||
|
|
||||||
if ((source_flag & SourceFlag::Default) == SourceFlag::None) {
|
if ((source_flag & SourceFlag::Default) == SourceFlag::None) {
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "core/hle/result.h"
|
#include "core/hle/result.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
#include "core/hle/service/mii/mii_types.h"
|
||||||
|
#include "core/hle/service/mii/types/char_info.h"
|
||||||
|
#include "core/hle/service/mii/types/store_data.h"
|
||||||
|
#include "core/hle/service/mii/types/ver3_store_data.h"
|
||||||
|
|
||||||
namespace Service::Mii {
|
namespace Service::Mii {
|
||||||
|
|
||||||
|
@ -25,7 +28,7 @@ public:
|
||||||
CharInfo BuildDefault(std::size_t index);
|
CharInfo BuildDefault(std::size_t index);
|
||||||
CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const;
|
CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const;
|
||||||
bool ValidateV3Info(const Ver3StoreData& mii_v3) const;
|
bool ValidateV3Info(const Ver3StoreData& mii_v3) const;
|
||||||
std::vector<MiiInfoElement> GetDefault(SourceFlag source_flag);
|
std::vector<CharInfoElement> GetDefault(SourceFlag source_flag);
|
||||||
Result GetIndex(const CharInfo& info, u32& index);
|
Result GetIndex(const CharInfo& info, u32& index);
|
||||||
|
|
||||||
// This is nn::mii::detail::Ver::StoreDataRaw::BuildFromStoreData
|
// This is nn::mii::detail::Ver::StoreDataRaw::BuildFromStoreData
|
||||||
|
@ -34,6 +37,15 @@ public:
|
||||||
// This is nn::mii::detail::NfpStoreDataExtentionRaw::SetFromStoreData
|
// This is nn::mii::detail::NfpStoreDataExtentionRaw::SetFromStoreData
|
||||||
NfpStoreDataExtension SetFromStoreData(const CharInfo& mii) const;
|
NfpStoreDataExtension SetFromStoreData(const CharInfo& mii) const;
|
||||||
|
|
||||||
|
struct MiiDatabase {
|
||||||
|
u32 magic{}; // 'NFDB'
|
||||||
|
std::array<StoreData, 0x64> miis{};
|
||||||
|
INSERT_PADDING_BYTES(1);
|
||||||
|
u8 count{};
|
||||||
|
u16 crc{};
|
||||||
|
};
|
||||||
|
static_assert(sizeof(MiiDatabase) == 0x1A98, "MiiDatabase has incorrect size.");
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Common::UUID user_id{};
|
const Common::UUID user_id{};
|
||||||
u64 update_counter{};
|
u64 update_counter{};
|
||||||
|
|
157
src/core/hle/service/mii/mii_types.h
Normal file
157
src/core/hle/service/mii/mii_types.h
Normal file
|
@ -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,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -8,7 +8,7 @@
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "common/uuid.h"
|
#include "common/uuid.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
#include "core/hle/service/mii/mii_types.h"
|
||||||
|
|
||||||
namespace Service::Mii {
|
namespace Service::Mii {
|
||||||
class MiiUtil {
|
class MiiUtil {
|
||||||
|
|
|
@ -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
|
|
6
src/core/hle/service/mii/types/char_info.cpp
Normal file
6
src/core/hle/service/mii/types/char_info.cpp
Normal file
|
@ -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
|
76
src/core/hle/service/mii/types/char_info.h
Normal file
76
src/core/hle/service/mii/types/char_info.h
Normal file
|
@ -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
|
6
src/core/hle/service/mii/types/core_data.cpp
Normal file
6
src/core/hle/service/mii/types/core_data.cpp
Normal file
|
@ -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
|
105
src/core/hle/service/mii/types/core_data.h
Normal file
105
src/core/hle/service/mii/types/core_data.h
Normal file
|
@ -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 {
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
#include "core/hle/service/mii/types.h"
|
#include "core/hle/service/mii/mii_types.h"
|
||||||
|
|
||||||
namespace Service::Mii::RawData {
|
namespace Service::Mii::RawData {
|
||||||
|
|
6
src/core/hle/service/mii/types/store_data.cpp
Normal file
6
src/core/hle/service/mii/types/store_data.cpp
Normal file
|
@ -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
|
29
src/core/hle/service/mii/types/store_data.h
Normal file
29
src/core/hle/service/mii/types/store_data.h
Normal file
|
@ -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
|
6
src/core/hle/service/mii/types/ver3_store_data.cpp
Normal file
6
src/core/hle/service/mii/types/ver3_store_data.cpp
Normal file
|
@ -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
|
141
src/core/hle/service/mii/types/ver3_store_data.h
Normal file
141
src/core/hle/service/mii/types/ver3_store_data.h
Normal file
|
@ -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
|
|
@ -28,7 +28,6 @@
|
||||||
#include "core/hle/kernel/k_event.h"
|
#include "core/hle/kernel/k_event.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
#include "core/hle/service/mii/mii_manager.h"
|
#include "core/hle/service/mii/mii_manager.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
|
||||||
#include "core/hle/service/nfc/common/amiibo_crypto.h"
|
#include "core/hle/service/nfc/common/amiibo_crypto.h"
|
||||||
#include "core/hle/service/nfc/common/device.h"
|
#include "core/hle/service/nfc/common/device.h"
|
||||||
#include "core/hle/service/nfc/mifare_result.h"
|
#include "core/hle/service/nfc/mifare_result.h"
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/hle/service/mii/types.h"
|
#include "core/hle/service/mii/types/char_info.h"
|
||||||
|
#include "core/hle/service/mii/types/ver3_store_data.h"
|
||||||
#include "core/hle/service/nfc/nfc_types.h"
|
#include "core/hle/service/nfc/nfc_types.h"
|
||||||
|
|
||||||
namespace Service::NFP {
|
namespace Service::NFP {
|
||||||
|
@ -322,7 +323,7 @@ static_assert(sizeof(RegisterInfo) == 0x100, "RegisterInfo is an invalid size");
|
||||||
|
|
||||||
// This is nn::nfp::RegisterInfoPrivate
|
// This is nn::nfp::RegisterInfoPrivate
|
||||||
struct RegisterInfoPrivate {
|
struct RegisterInfoPrivate {
|
||||||
Service::Mii::MiiStoreData mii_store_data;
|
Service::Mii::StoreData mii_store_data;
|
||||||
WriteDate creation_date;
|
WriteDate creation_date;
|
||||||
AmiiboName amiibo_name;
|
AmiiboName amiibo_name;
|
||||||
u8 font_region;
|
u8 font_region;
|
||||||
|
|
Loading…
Reference in a new issue