summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nfp/amiibo_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/nfp/amiibo_types.h')
-rw-r--r--src/core/hle/service/nfp/amiibo_types.h161
1 files changed, 26 insertions, 135 deletions
diff --git a/src/core/hle/service/nfp/amiibo_types.h b/src/core/hle/service/nfp/amiibo_types.h
index 49875cff4..bd0424ffd 100644
--- a/src/core/hle/service/nfp/amiibo_types.h
+++ b/src/core/hle/service/nfp/amiibo_types.h
@@ -5,6 +5,8 @@
#include <array>
+#include "core/hle/service/mii/types.h"
+
namespace Service::NFP {
enum class ServiceType : u32 {
User,
@@ -74,13 +76,17 @@ using HashData = std::array<u8, 0x20>;
using ApplicationArea = std::array<u8, 0xD8>;
struct AmiiboDate {
- union {
- u16_be raw{};
-
- BitField<0, 5, u16> day;
- BitField<5, 4, u16> month;
- BitField<9, 7, u16> year;
- };
+ u16_be raw_date{};
+
+ u16 GetYear() const {
+ return ((raw_date & 0xFE00) >> 9) + 2000;
+ }
+ u8 GetMonth() const {
+ return ((raw_date & 0x01E0) >> 5) - 1;
+ }
+ u8 GetDay() const {
+ return raw_date & 0x001F;
+ }
};
static_assert(sizeof(AmiiboDate) == 2, "AmiiboDate is an invalid size");
@@ -123,135 +129,20 @@ struct NTAG215Password {
};
static_assert(sizeof(NTAG215Password) == 0x8, "NTAG215Password is an invalid size");
-// 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(1)
-struct AmiiboRegisterInfo {
- u32_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(0x4);
-};
-static_assert(sizeof(AmiiboRegisterInfo) == 0x60, "AmiiboRegisterInfo is an invalid size");
-
struct EncryptedAmiiboFile {
- u8 constant_value; // Must be A5
- u16 write_counter; // Number of times the amiibo has been written?
- INSERT_PADDING_BYTES(0x1); // Unknown 1
- AmiiboSettings settings; // Encrypted amiibo settings
- HashData locked_hash; // Hash
- AmiiboModelInfo model_info; // Encrypted amiibo model info
- HashData keygen_salt; // Salt
- HashData unfixed_hash; // Hash
- AmiiboRegisterInfo owner_mii; // Encrypted Mii data
- u64_be title_id; // Encrypted Game id
- u16_be applicaton_write_counter; // Encrypted Counter
- u32_be application_area_id; // Encrypted Game id
+ u8 constant_value; // Must be A5
+ u16 write_counter; // Number of times the amiibo has been written?
+ INSERT_PADDING_BYTES(0x1); // Unknown 1
+ AmiiboSettings settings; // Encrypted amiibo settings
+ HashData locked_hash; // Hash
+ AmiiboModelInfo model_info; // Encrypted amiibo model info
+ HashData keygen_salt; // Salt
+ HashData unfixed_hash; // Hash
+ Service::Mii::Ver3StoreData owner_mii; // Encrypted Mii data
+ u64_be title_id; // Encrypted Game id
+ u16_be applicaton_write_counter; // Encrypted Counter
+ u32_be application_area_id; // Encrypted Game id
std::array<u8, 0x2> unknown;
HashData hash; // Probably a SHA256-HMAC hash?
ApplicationArea application_area; // Encrypted Game data
@@ -267,7 +158,7 @@ struct NTAG215File {
u16 write_counter; // Number of times the amiibo has been written?
INSERT_PADDING_BYTES(0x1); // Unknown 1
AmiiboSettings settings;
- AmiiboRegisterInfo owner_mii; // Encrypted Mii data
+ Service::Mii::Ver3StoreData owner_mii; // Encrypted Mii data
u64_be title_id;
u16_be applicaton_write_counter; // Encrypted Counter
u32_be application_area_id;